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

Reply via email to