This avoids unnecessary moves when either the initial CRC
value or the data operand is a constant zero. For example:
__crc32w(0, x) previously generated "mov w1, 0; crc32w w0, w1, w0"
whereas now it generates "crc32w w0, wzr, w0".
gcc/ChangeLog:
* config/aarch64/aarch64.md: allow usage of zero reg for CRC32
instructions
Signed-off-by: Shreesh Adiga <[email protected]>
---
gcc/config/aarch64/aarch64.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 9cb55602c36..9f26e558e48 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -4959,8 +4959,8 @@ (define_expand "<neg_not_op><mode>cc"
;; CRC32 instructions.
(define_insn "aarch64_<crc_variant>"
[(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "register_operand" "r")
- (match_operand:<crc_mode> 2 "register_operand" "r")]
+ (unspec:SI [(match_operand:SI 1 "aarch64_reg_or_zero" "rZ")
+ (match_operand:<crc_mode> 2 "aarch64_reg_or_zero" "rZ")]
CRC))]
"TARGET_CRC32"
{
--
2.54.0