Commit f2879a90 by Kyrylo Tkachov Committed by Kyrylo Tkachov

[AArch64] Tie operand 1 to operand 0 in AESMC pattern when AES/AESMC fusion is enabled

	* config/aarch64/aarch64.c (aarch64_fusion_enabled_p): New function.
	* config/aarch64/aarch64-protos.h (aarch64_fusion_enabled_p): Declare
	prototype.
	* config/aarch64/aarch64-simd.md (aarch64_crypto_aes<aesmc_op>v16qi):
	Add "=w,0" alternative.  Enable it when AES/AESMC fusion is enabled.

From-SVN: r236820
parent 88e3bdd1
2016-05-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_fusion_enabled_p): New function.
* config/aarch64/aarch64-protos.h (aarch64_fusion_enabled_p): Declare
prototype.
* config/aarch64/aarch64-simd.md (aarch64_crypto_aes<aesmc_op>v16qi):
Add "=w,0" alternative. Enable it when AES/AESMC fusion is enabled.
2016-05-27 Jiong Wang <jiong.wang@arm.com> 2016-05-27 Jiong Wang <jiong.wang@arm.com>
PR target/63596 PR target/63596
......
...@@ -287,6 +287,7 @@ bool aarch64_constant_address_p (rtx); ...@@ -287,6 +287,7 @@ bool aarch64_constant_address_p (rtx);
bool aarch64_expand_movmem (rtx *); bool aarch64_expand_movmem (rtx *);
bool aarch64_float_const_zero_rtx_p (rtx); bool aarch64_float_const_zero_rtx_p (rtx);
bool aarch64_function_arg_regno_p (unsigned); bool aarch64_function_arg_regno_p (unsigned);
bool aarch64_fusion_enabled_p (enum aarch64_fusion_pairs);
bool aarch64_gen_movmemqi (rtx *); bool aarch64_gen_movmemqi (rtx *);
bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *); bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *);
bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx); bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx);
......
...@@ -5401,13 +5401,25 @@ ...@@ -5401,13 +5401,25 @@
[(set_attr "type" "crypto_aese")] [(set_attr "type" "crypto_aese")]
) )
;; 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 "aarch64_crypto_aes<aesmc_op>v16qi" (define_insn "aarch64_crypto_aes<aesmc_op>v16qi"
[(set (match_operand:V16QI 0 "register_operand" "=w") [(set (match_operand:V16QI 0 "register_operand" "=w,w")
(unspec:V16QI [(match_operand:V16QI 1 "register_operand" "w")] (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0,w")]
CRYPTO_AESMC))] CRYPTO_AESMC))]
"TARGET_SIMD && TARGET_CRYPTO" "TARGET_SIMD && TARGET_CRYPTO"
"aes<aesmc_op>\\t%0.16b, %1.16b" "aes<aesmc_op>\\t%0.16b, %1.16b"
[(set_attr "type" "crypto_aesmc")] [(set_attr "type" "crypto_aesmc")
(set_attr_alternative "enabled"
[(if_then_else (match_test
"aarch64_fusion_enabled_p (AARCH64_FUSE_AES_AESMC)")
(const_string "yes" )
(const_string "no"))
(const_string "yes")])]
) )
;; sha1 ;; sha1
......
...@@ -13181,6 +13181,14 @@ aarch_macro_fusion_pair_p (rtx_insn *prev, rtx_insn *curr) ...@@ -13181,6 +13181,14 @@ aarch_macro_fusion_pair_p (rtx_insn *prev, rtx_insn *curr)
return false; return false;
} }
/* Return true iff the instruction fusion described by OP is enabled. */
bool
aarch64_fusion_enabled_p (enum aarch64_fusion_pairs op)
{
return (aarch64_tune_params.fusible_ops & op) != 0;
}
/* If MEM is in the form of [base+offset], extract the two parts /* If MEM is in the form of [base+offset], extract the two parts
of address and set to BASE and OFFSET, otherwise return false of address and set to BASE and OFFSET, otherwise return false
after clearing BASE and OFFSET. */ after clearing BASE and OFFSET. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment