gcc/
authoryroux <yroux@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Jun 2014 12:12:37 +0000 (12:12 +0000)
committeryroux <yroux@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Jun 2014 12:12:37 +0000 (12:12 +0000)
2014-05-23  Yvan Roux  <yvan.roux@linaro.org>

       Backport from trunk r209736.
       2014-04-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

       * config/aarch64/aarch64-builtins.c
       (aarch64_builtin_vectorized_function): Handle BUILT_IN_BSWAP16,
       BUILT_IN_BSWAP32, BUILT_IN_BSWAP64.
       * config/aarch64/aarch64-simd.md (bswap<mode>): New pattern.
       * config/aarch64/aarch64-simd-builtins.def: Define vector bswap
       builtins.
       * config/aarch64/iterator.md (VDQHSD): New mode iterator.
       (Vrevsuff): New mode attribute.

gcc/testsuite/
2014-05-23  Yvan Roux  <yvan.roux@linaro.org>

       Backport from trunk r209736.
       2014-04-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

       * lib/target-supports.exp (check_effective_target_vect_bswap): New.
       * gcc.dg/vect/vect-bswap16: New test.
       * gcc.dg/vect/vect-bswap32: Likewise.
       * gcc.dg/vect/vect-bswap64: Likewise.

git-svn-id: svn://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_9-branch@211573 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog.linaro
gcc/config/aarch64/aarch64-builtins.c
gcc/config/aarch64/aarch64-simd-builtins.def
gcc/config/aarch64/aarch64-simd.md
gcc/config/aarch64/iterators.md
gcc/testsuite/ChangeLog.linaro
gcc/testsuite/gcc.dg/vect/vect-bswap16.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-bswap32.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-bswap64.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index 5426da4..a24989e 100644 (file)
@@ -1,5 +1,19 @@
 2014-05-23  Yvan Roux  <yvan.roux@linaro.org>
 
+       Backport from trunk r209736.
+       2014-04-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/aarch64/aarch64-builtins.c
+       (aarch64_builtin_vectorized_function): Handle BUILT_IN_BSWAP16,
+       BUILT_IN_BSWAP32, BUILT_IN_BSWAP64.
+       * config/aarch64/aarch64-simd.md (bswap<mode>): New pattern.
+       * config/aarch64/aarch64-simd-builtins.def: Define vector bswap
+       builtins.
+       * config/aarch64/iterator.md (VDQHSD): New mode iterator.
+       (Vrevsuff): New mode attribute.
+
+2014-05-23  Yvan Roux  <yvan.roux@linaro.org>
+
        Backport from trunk r209712.
        2014-04-23 Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
index 591260f..4616ad2 100644 (file)
@@ -1104,7 +1104,29 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in)
 
            return aarch64_builtin_decls[builtin];
          }
-
+       case BUILT_IN_BSWAP16:
+#undef AARCH64_CHECK_BUILTIN_MODE
+#define AARCH64_CHECK_BUILTIN_MODE(C, N) \
+  (out_mode == N##Imode && out_n == C \
+   && in_mode == N##Imode && in_n == C)
+         if (AARCH64_CHECK_BUILTIN_MODE (4, H))
+           return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv4hi];
+         else if (AARCH64_CHECK_BUILTIN_MODE (8, H))
+           return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv8hi];
+         else
+           return NULL_TREE;
+       case BUILT_IN_BSWAP32:
+         if (AARCH64_CHECK_BUILTIN_MODE (2, S))
+           return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv2si];
+         else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
+           return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv4si];
+         else
+           return NULL_TREE;
+       case BUILT_IN_BSWAP64:
+         if (AARCH64_CHECK_BUILTIN_MODE (2, D))
+           return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv2di];
+         else
+           return NULL_TREE;
        default:
          return NULL_TREE;
       }
index bfd2b75..fa332ae 100644 (file)
   VAR1 (UNOP, floatunsv4si, 2, v4sf)
   VAR1 (UNOP, floatunsv2di, 2, v2df)
 
+  VAR5 (UNOPU, bswap, 10, v4hi, v8hi, v2si, v4si, v2di)
+
   /* Implemented by
      aarch64_<PERMUTE:perm_insn><PERMUTE:perm_hilo><mode>.  */
   BUILTIN_VALL (BINOP, zip1, 0)
index 285d839..c05767b 100644 (file)
   [(set_attr "type" "neon_mul_<Vetype><q>")]
 )
 
+(define_insn "bswap<mode>"
+  [(set (match_operand:VDQHSD 0 "register_operand" "=w")
+        (bswap:VDQHSD (match_operand:VDQHSD 1 "register_operand" "w")))]
+  "TARGET_SIMD"
+  "rev<Vrevsuff>\\t%0.<Vbtype>, %1.<Vbtype>"
+  [(set_attr "type" "neon_rev<q>")]
+)
+
 (define_insn "*aarch64_mul3_elt<mode>"
  [(set (match_operand:VMUL 0 "register_operand" "=w")
     (mult:VMUL
index f1339b8..2b5ebd1 100644 (file)
 ;; Vector modes for H and S types.
 (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI])
 
+;; Vector modes for H, S and D types.
+(define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI])
+
 ;; Vector modes for Q, H and S types.
 (define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI])
 
                          (V2DI "2d") (V2SF "2s")
                         (V4SF "4s") (V2DF "2d")])
 
+(define_mode_attr Vrevsuff [(V4HI "16") (V8HI "16") (V2SI "32")
+                            (V4SI "32") (V2DI "64")])
+
 (define_mode_attr Vmtype [(V8QI ".8b") (V16QI ".16b")
                         (V4HI ".4h") (V8HI  ".8h")
                         (V2SI ".2s") (V4SI  ".4s")
index 702dd77..6ce94ff 100644 (file)
@@ -1,5 +1,15 @@
 2014-05-23  Yvan Roux  <yvan.roux@linaro.org>
 
+       Backport from trunk r209736.
+       2014-04-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * lib/target-supports.exp (check_effective_target_vect_bswap): New.
+       * gcc.dg/vect/vect-bswap16: New test.
+       * gcc.dg/vect/vect-bswap32: Likewise.
+       * gcc.dg/vect/vect-bswap64: Likewise.
+
+2014-05-23  Yvan Roux  <yvan.roux@linaro.org>
+
        Backport from trunk r209713.
        2014-04-23  Alex Velenko  <Alex.Velenko@arm.com>
 
diff --git a/gcc/testsuite/gcc.dg/vect/vect-bswap16.c b/gcc/testsuite/gcc.dg/vect/vect-bswap16.c
new file mode 100644 (file)
index 0000000..c562718
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-require-effective-target vect_bswap } */
+
+#include "tree-vect.h"
+
+#define N 128
+
+volatile int y = 0;
+
+static inline void
+vfoo16 (unsigned short int* a)
+{
+  int i = 0;
+  for (i = 0; i < N; ++i)
+    a[i] = __builtin_bswap16 (a[i]);
+}
+
+int
+main (void)
+{
+  unsigned short arr[N];
+  unsigned short expect[N];
+  int i;
+
+  for (i = 0; i < N; ++i)
+    {
+      arr[i] = i;
+      expect[i] = __builtin_bswap16 (i);
+      if (y) /* Avoid vectorisation.  */
+        abort ();
+    }
+
+  vfoo16 (arr);
+
+  for (i = 0; i < N; ++i)
+    {
+      if (arr[i] != expect[i])
+        abort ();
+    }
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-bswap32.c b/gcc/testsuite/gcc.dg/vect/vect-bswap32.c
new file mode 100644 (file)
index 0000000..9596677
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-require-effective-target vect_bswap } */
+
+#include "tree-vect.h"
+
+#define N 128
+
+volatile int y = 0;
+
+static inline void
+vfoo32 (unsigned int* a)
+{
+  int i = 0;
+  for (i = 0; i < N; ++i)
+    a[i] = __builtin_bswap32 (a[i]);
+}
+
+int
+main (void)
+{
+  unsigned int arr[N];
+  unsigned int expect[N];
+  int i;
+
+  for (i = 0; i < N; ++i)
+    {
+      arr[i] = i;
+      expect[i] = __builtin_bswap32 (i);
+      if (y) /* Avoid vectorisation.  */
+        abort ();
+    }
+
+  vfoo32 (arr);
+
+  for (i = 0; i < N; ++i)
+    {
+      if (arr[i] != expect[i])
+        abort ();
+    }
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-bswap64.c b/gcc/testsuite/gcc.dg/vect/vect-bswap64.c
new file mode 100644 (file)
index 0000000..088c8c6
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-require-effective-target vect_bswap } */
+
+#include "tree-vect.h"
+
+#define N 128
+
+volatile int y = 0;
+
+static inline void
+vfoo64 (unsigned long long* a)
+{
+  int i = 0;
+  for (i = 0; i < N; ++i)
+    a[i] = __builtin_bswap64 (a[i]);
+}
+
+int
+main (void)
+{
+  unsigned long long arr[N];
+  unsigned long long expect[N];
+  int i;
+
+  for (i = 0; i < N; ++i)
+    {
+      arr[i] = i;
+      expect[i] = __builtin_bswap64 (i);
+      if (y) /* Avoid vectorisation.  */
+        abort ();
+    }
+
+  vfoo64 (arr);
+
+  for (i = 0; i < N; ++i)
+    {
+      if (arr[i] != expect[i])
+        abort ();
+    }
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
index 7d296d9..5fab4b9 100644 (file)
@@ -3297,6 +3297,24 @@ proc check_effective_target_vect_shift { } {
     return $et_vect_shift_saved
 }
 
+# Return 1 if the target supports vector bswap operations.
+
+proc check_effective_target_vect_bswap { } {
+    global et_vect_bswap_saved
+
+    if [info exists et_vect_bswap_saved] {
+       verbose "check_effective_target_vect_bswap: using cached result" 2
+    } else {
+       set et_vect_bswap_saved 0
+       if { [istarget aarch64*-*-*] } {
+          set et_vect_bswap_saved 1
+       }
+    }
+
+    verbose "check_effective_target_vect_bswap: returning $et_vect_bswap_saved" 2
+    return $et_vect_bswap_saved
+}
+
 # Return 1 if the target supports hardware vector shift operation for char.
 
 proc check_effective_target_vect_shift_char { } {