[AArch64 array_mode 8/8] Add d-registers to TARGET_ARRAY_MODE_SUPPORTED_P
authoralalaw01 <alalaw01@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Sep 2015 13:16:58 +0000 (13:16 +0000)
committeralalaw01 <alalaw01@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Sep 2015 13:16:58 +0000 (13:16 +0000)
gcc/:

* config/aarch64/aarch64.h (AARCH64_VALID_SIMD_DREG_MODE): New.

* config/aarch64/aarch64.c (aarch64_array_mode_supported_p): Add
AARCH64_VALID_SIMD_DREG_MODE.

gcc/testsuite/:

* gcc.target/aarch64/vect_int32x2x4_1.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227794 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/vect_int32x2x4_1.c [new file with mode: 0644]

index a4911a0..38719b9 100644 (file)
@@ -1,5 +1,12 @@
 2015-09-15  Alan Lawrence  <alan.lawrence@arm.com>
 
+       * config/aarch64/aarch64.h (AARCH64_VALID_SIMD_DREG_MODE): New.
+
+       * config/aarch64/aarch64.c (aarch64_array_mode_supported_p): Add
+       AARCH64_VALID_SIMD_DREG_MODE.
+
+2015-09-15  Alan Lawrence  <alan.lawrence@arm.com>
+
        * config/aarch64/aarch64-simd.md (aarch64_ld2r<mode>,
        aarch64_ld3r<mode>, aarch64_ld4r<mode>): Combine together, making...
        (aarch64_simd_ld<VSTRUCT:nregs>r<VALLDIF:mode>): ...this.
index 9c5cf4c..bbac271 100644 (file)
@@ -677,7 +677,8 @@ aarch64_array_mode_supported_p (machine_mode mode,
                                unsigned HOST_WIDE_INT nelems)
 {
   if (TARGET_SIMD
-      && AARCH64_VALID_SIMD_QREG_MODE (mode)
+      && (AARCH64_VALID_SIMD_QREG_MODE (mode)
+         || AARCH64_VALID_SIMD_DREG_MODE (mode))
       && (nelems >= 2 && nelems <= 4))
     return true;
 
index 9669e01..5a8db76 100644 (file)
@@ -872,6 +872,12 @@ extern enum aarch64_code_model aarch64_cmodel;
   (aarch64_cmodel == AARCH64_CMODEL_TINY               \
    || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC)
 
+/* Modes valid for AdvSIMD D registers, i.e. that fit in half a Q register.  */
+#define AARCH64_VALID_SIMD_DREG_MODE(MODE) \
+  ((MODE) == V2SImode || (MODE) == V4HImode || (MODE) == V8QImode \
+   || (MODE) == V2SFmode || (MODE) == V4HFmode || (MODE) == DImode \
+   || (MODE) == DFmode)
+
 /* Modes valid for AdvSIMD Q registers.  */
 #define AARCH64_VALID_SIMD_QREG_MODE(MODE) \
   ((MODE) == V4SImode || (MODE) == V8HImode || (MODE) == V16QImode \
index 2355856..6cea108 100644 (file)
@@ -1,3 +1,7 @@
+2015-09-15  Alan Lawrence  <alan.lawrence@arm.com>
+
+       * gcc.target/aarch64/vect_int32x2x4_1.c: New.
+
 2015-09-15  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/67563
diff --git a/gcc/testsuite/gcc.target/aarch64/vect_int32x2x4_1.c b/gcc/testsuite/gcc.target/aarch64/vect_int32x2x4_1.c
new file mode 100644 (file)
index 0000000..734cfd6
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-rtl-expand" } */
+
+#include <arm_neon.h>
+
+uint32x2x4_t
+test_1 (uint32x2x4_t a, uint32x2x4_t b)
+{
+   uint32x2x4_t result;
+
+   for (unsigned index = 0; index < 4; ++index)
+     result.val[index] = a.val[index] + b.val[index];
+
+   return result;
+}
+
+/* Should not use the stack in expand.  */
+/* { dg-final { scan-rtl-dump-not "virtual-stack-vars" "expand" } } */
+/* Should not have to modify the stack pointer.  */
+/* { dg-final { scan-assembler-not "\t(add|sub).*sp" } } */
+/* Should not have to store or load anything.  */
+/* { dg-final { scan-assembler-not "\t(ld|st)\[rp\]" } } */