[PATCH][AARCH64]Define vec_shr as an unspec, use shl for big-endian.
authorRenlin Li <renlin.li@arm.com>
Thu, 30 Apr 2015 15:52:24 +0000 (15:52 +0000)
committerRenlin Li <renlin@gcc.gnu.org>
Thu, 30 Apr 2015 15:52:24 +0000 (15:52 +0000)
gcc/

2015-04-30  Renlin Li  <renlin.li@arm.com>

* config/aarch64/aarch64-simd.md (vec_shr): Defined as an unspec.
* config/aarch64/iterators.md (unspec): Add UNSPEC_VEC_SHR.

gcc/testsuite/

2015-04-30  Renlin Li  <renlin.li@arm.com>
    Alan Lawrence  <alan.lawrence@arm.com>

* gcc.target/aarch64/vect-reduc-or_1.c: New.

From-SVN: r222635

gcc/ChangeLog
gcc/config/aarch64/aarch64-simd.md
gcc/config/aarch64/iterators.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/vect-reduc-or_1.c [new file with mode: 0644]

index 7fa0a1154f6fb2843afc01b055e3c4d80c990534..40d71fcbd12d8ae1e8f0a66d9e5099385503ff2a 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-30  Renlin Li  <renlin.li@arm.com>
+
+       * config/aarch64/aarch64-simd.md (vec_shr): Defined as an unspec.
+       * config/aarch64/iterators.md (unspec): Add UNSPEC_VEC_SHR.
+
 2015-04-30  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/65873
index b84374443a08a89a7b7c372b1585e128ac8b7fdd..5342c3d20d2a702585cbcd44ee981fa82606d252 100644 (file)
 ;; For 64-bit modes we use ushl/r, as this does not require a SIMD zero.
 (define_insn "vec_shr_<mode>"
   [(set (match_operand:VD 0 "register_operand" "=w")
-        (lshiftrt:VD (match_operand:VD 1 "register_operand" "w")
-                    (match_operand:SI 2 "immediate_operand" "i")))]
+        (unspec:VD [(match_operand:VD 1 "register_operand" "w")
+                   (match_operand:SI 2 "immediate_operand" "i")]
+                  UNSPEC_VEC_SHR))]
   "TARGET_SIMD"
   {
     if (BYTES_BIG_ENDIAN)
-      return "ushl %d0, %d1, %2";
+      return "shl %d0, %d1, %2";
     else
       return "ushr %d0, %d1, %2";
   }
index 1fdff040d1acc4532016ee4e92d94cd99d60da26..498358a6354fe3afc3032d5be7526d942d1ec3ac 100644 (file)
     UNSPEC_PMULL        ; Used in aarch64-simd.md.
     UNSPEC_PMULL2       ; Used in aarch64-simd.md.
     UNSPEC_REV_REGLIST  ; Used in aarch64-simd.md.
+    UNSPEC_VEC_SHR      ; Used in aarch64-simd.md.
 ])
 
 ;; -------------------------------------------------------------------
index 3ab0afee08b8f596506ba73d998372df05c5ed30..b6697843ae9ab627349c87003802f15d9ef1d97e 100644 (file)
@@ -1,3 +1,7 @@
+2015-04-30  Renlin Li  <renlin.li@arm.com>
+
+       * gcc.target/aarch64/vect-reduc-or_1.c: New.
+
 2015-04-30  Marek Polacek  <polacek@redhat.com>
 
        * c-c++-common/Wbool-compare-3.c: New test.
diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-or_1.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-or_1.c
new file mode 100644 (file)
index 0000000..c1d6b2f
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all" } */
+/* Write a reduction loop to be reduced using whole vector right shift.  */
+
+extern void abort (void);
+
+unsigned char in[8] __attribute__((__aligned__(16)));
+
+int
+main (unsigned char argc, char **argv)
+{
+  unsigned char i = 0;
+  unsigned char sum = 1;
+
+  for (i = 0; i < 8; i++)
+    in[i] = (i + i + 1) & 0xfd;
+
+  /* Prevent constant propagation of the entire loop below.  */
+  asm volatile ("" : : : "memory");
+
+  for (i = 0; i < 8; i++)
+    sum |= in[i];
+
+  if (sum != 13)
+    {
+      __builtin_printf ("Failed %d\n", sum);
+      abort ();
+    }
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "Reduce using vector shifts" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */