]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
AArch64: use movi d0, #0 to clear SVE registers instead of mov z0.d, #0
authorTamar Christina <tamar.christina@arm.com>
Fri, 18 Oct 2024 08:44:15 +0000 (09:44 +0100)
committerTamar Christina <tamar.christina@arm.com>
Fri, 18 Oct 2024 08:44:15 +0000 (09:44 +0100)
This patch changes SVE to use Adv. SIMD movi 0 to clear SVE registers when not
in SVE streaming mode.  As the Neoverse Software Optimization guides indicate
SVE mov #0 is not a zero cost move.

When In streaming mode we continue to use SVE's mov to clear the registers.

Tests have already been updated.

gcc/ChangeLog:

* config/aarch64/aarch64.cc (aarch64_output_sve_mov_immediate): Use
fmov for SVE zeros.

gcc/config/aarch64/aarch64.cc

index e65b24e2ad6aec014811c847be29c2f6f83951dd..3ab550acc7cdb7c0c4bfb148e643891f701b776e 100644 (file)
@@ -25516,8 +25516,11 @@ aarch64_output_sve_mov_immediate (rtx const_vector)
        }
     }
 
-  snprintf (templ, sizeof (templ), "mov\t%%0.%c, #" HOST_WIDE_INT_PRINT_DEC,
-           element_char, INTVAL (info.u.mov.value));
+  if (info.u.mov.value == const0_rtx && TARGET_NON_STREAMING)
+    snprintf (templ, sizeof (templ), "movi\t%%d0, #0");
+  else
+    snprintf (templ, sizeof (templ), "mov\t%%0.%c, #" HOST_WIDE_INT_PRINT_DEC,
+             element_char, INTVAL (info.u.mov.value));
   return templ;
 }