From 39fa4aec86086b874af53424da8a6d4f5217729b Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Wed, 1 Jun 2016 10:37:27 +0000 Subject: [PATCH] [ARM] Tie operand 1 to operand 0 in AESMC pattern when fusing AES/AESMC * config/arm/arm.c (arm_fusion_enabled_p): New function. * config/arm/arm-protos.h (arm_fusion_enabled_p): Declare prototype. * config/arm/crypto.md (crypto_, CRYPTO_UNARY): Add "=w,0" alternative. Enable it when AES/AESMC fusion is enabled. From-SVN: r236982 --- gcc/ChangeLog | 7 +++++++ gcc/config/arm/arm-protos.h | 1 + gcc/config/arm/arm.c | 7 +++++++ gcc/config/arm/crypto.md | 19 ++++++++++++++++--- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83a96bd5dc5..b9baf4c9c0a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-06-01 Kyrylo Tkachov + + * config/arm/arm.c (arm_fusion_enabled_p): New function. + * config/arm/arm-protos.h (arm_fusion_enabled_p): Declare prototype. + * config/arm/crypto.md (crypto_, CRYPTO_UNARY): + Add "=w,0" alternative. Enable it when AES/AESMC fusion is enabled. + 2016-06-01 Eric Botcazou * tree-vect-loop.c (vect_determine_vectorization_factor): Also take diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index 34fd06a92d9..aaaabb761cf 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -321,6 +321,7 @@ extern int vfp3_const_double_for_bits (rtx); extern void arm_emit_coreregs_64bit_shift (enum rtx_code, rtx, rtx, rtx, rtx, rtx); +extern bool arm_fusion_enabled_p (tune_params::fuse_ops); extern bool arm_valid_symbolic_address_p (rtx); extern bool arm_validize_comparison (rtx *, rtx *, rtx *); #endif /* RTX_CODE */ diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 16499ce647b..e9240908ea9 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -29858,6 +29858,13 @@ aarch_macro_fusion_pair_p (rtx_insn* prev, rtx_insn* curr) return false; } +/* Return true iff the instruction fusion described by OP is enabled. */ +bool +arm_fusion_enabled_p (tune_params::fuse_ops op) +{ + return current_tune->fusible_ops & op; +} + /* Implement the TARGET_ASAN_SHADOW_OFFSET hook. */ static unsigned HOST_WIDE_INT diff --git a/gcc/config/arm/crypto.md b/gcc/config/arm/crypto.md index c6f17270b1d..0f510f06940 100644 --- a/gcc/config/arm/crypto.md +++ b/gcc/config/arm/crypto.md @@ -18,14 +18,27 @@ ;; along with GCC; see the file COPYING3. If not see ;; . + +;; When AES/AESMC fusion is enabled we want the register allocation to +;; look like: +;; AESE Vn, _ +;; AESMC Vn, Vn +;; So prefer to tie operand 1 to operand 0 when fusing. + (define_insn "crypto_" - [(set (match_operand: 0 "register_operand" "=w") + [(set (match_operand: 0 "register_operand" "=w,w") (unspec: [(match_operand: 1 - "register_operand" "w")] + "register_operand" "0,w")] CRYPTO_UNARY))] "TARGET_CRYPTO" ".\\t%q0, %q1" - [(set_attr "type" "")] + [(set_attr "type" "") + (set_attr_alternative "enabled" + [(if_then_else (match_test + "arm_fusion_enabled_p (tune_params::FUSE_AES_AESMC)") + (const_string "yes" ) + (const_string "no")) + (const_string "yes")])] ) (define_insn "crypto_" -- 2.30.2