[AArch64, PATCH] Improve Neon store of zero
authorJackson Woodruff <jackson.woodruff@arm.com>
Wed, 13 Sep 2017 16:49:42 +0000 (16:49 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Wed, 13 Sep 2017 16:49:42 +0000 (16:49 +0000)
Committed on behalf of Jackson Woodruff.

---
gcc/

* config/aarch64/constraints.md (Umq): New constraint.
* config/aarch64/aarch64-simd.md (*aarch64_simd_mov<mode>):
Change to use Umq.
(mov<mode>): Update condition.

gcc/testsuite/

* gcc.target/aarch64/simd/vect_str_zero.c: Update testcase.

From-SVN: r252387

gcc/ChangeLog
gcc/config/aarch64/aarch64-simd.md
gcc/config/aarch64/constraints.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/simd/vect_str_zero.c

index 0e0257d..1f941d4 100644 (file)
@@ -1,3 +1,10 @@
+2017-09-13  Jackson Woodruff  <jackson.woodruff@arm.com>
+
+       * config/aarch64/constraints.md (Umq): New constraint.
+       * config/aarch64/aarch64-simd.md (*aarch64_simd_mov<mode>):
+       Change to use Umq.
+       (mov<mode>): Update condition.
+
 2017-09-13  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gimple-ssa-store-merging.c (sort_by_bitpos): Compare store order
index 8f045c2..70e9339 100644 (file)
        (match_operand:VALL_F16 1 "general_operand" ""))]
   "TARGET_SIMD"
   "
-    if (GET_CODE (operands[0]) == MEM
-       && !(aarch64_simd_imm_zero (operands[1], <MODE>mode)
-            && aarch64_legitimate_address_p (<MODE>mode, operands[0],
-                                             PARALLEL, 1)))
+  /* Force the operand into a register if it is not an
+     immediate whose use can be replaced with xzr.
+     If the mode is 16 bytes wide, then we will be doing
+     a stp in DI mode, so we check the validity of that.
+     If the mode is 8 bytes wide, then we will do doing a
+     normal str, so the check need not apply.  */
+  if (GET_CODE (operands[0]) == MEM
+      && !(aarch64_simd_imm_zero (operands[1], <MODE>mode)
+          && ((GET_MODE_SIZE (<MODE>mode) == 16
+               && aarch64_mem_pair_operand (operands[0], DImode))
+              || GET_MODE_SIZE (<MODE>mode) == 8)))
       operands[1] = force_reg (<MODE>mode, operands[1]);
   "
 )
 
 (define_insn "*aarch64_simd_mov<mode>"
   [(set (match_operand:VQ 0 "nonimmediate_operand"
-               "=w, Ump,  m,  w, ?r, ?w, ?r, w")
+               "=w, Umq,  m,  w, ?r, ?w, ?r, w")
        (match_operand:VQ 1 "general_operand"
                "m,  Dz, w,  w,  w,  r,  r, Dn"))]
   "TARGET_SIMD
index 9ce3d4e..3649fb4 100644 (file)
  (and (match_code "mem")
       (match_test "REG_P (XEXP (op, 0))")))
 
+(define_memory_constraint "Umq"
+  "@internal
+   A memory address which uses a base register with an offset small enough for
+   a load/store pair operation in DI mode."
+   (and (match_code "mem")
+       (match_test "aarch64_legitimate_address_p (DImode, XEXP (op, 0),
+                                                  PARALLEL, false)")))
+
 (define_memory_constraint "Ump"
   "@internal
   A memory address suitable for a load/store pair operation."
index 1280e90..86d030d 100644 (file)
@@ -1,3 +1,7 @@
+2017-09-13  Jackson Woodruff  <jackson.woodruff@arm.com>
+
+       * gcc.target/aarch64/simd/vect_str_zero.c: Update testcase.
+
 2017-09-13  Marek Polacek  <polacek@redhat.com>
 
        PR c/82167
index 07198de..00cbf20 100644 (file)
@@ -7,7 +7,7 @@ void
 f (uint32x4_t *p)
 {
   uint32x4_t x = { 0, 0, 0, 0};
-  p[1] = x;
+  p[4] = x;
 
   /* { dg-final { scan-assembler "stp\txzr, xzr," } } */
 }
@@ -16,7 +16,9 @@ void
 g (float32x2_t *p)
 {
   float32x2_t x = {0.0, 0.0};
-  p[0] = x;
+  p[400] = x;
 
   /* { dg-final { scan-assembler "str\txzr, " } } */
 }
+
+/* { dg-final { scan-assembler-not "add\tx\[0-9\]\+, x0, \[0-9\]+" } } */