aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2014-04-24 08:05:07 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2014-04-24 08:05:07 +0000
commitc7f28cd58e12391f8e4e5c50968ed1c76ddbddb0 (patch)
treed75eb1689e288d18f6af7502ba97ab07a3ee2e05 /gcc/testsuite
parentb041949151f3ba686dc6e8fe0ced121aef9347f2 (diff)
downloadgcc-c7f28cd58e12391f8e4e5c50968ed1c76ddbddb0.zip
gcc-c7f28cd58e12391f8e4e5c50968ed1c76ddbddb0.tar.gz
gcc-c7f28cd58e12391f8e4e5c50968ed1c76ddbddb0.tar.bz2
[AArch64] Vectorise bswap[16,32,64]
* 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. * 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. From-SVN: r209736
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-bswap16.c44
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-bswap32.c44
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-bswap64.c44
-rw-r--r--gcc/testsuite/lib/target-supports.exp18
5 files changed, 157 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 62b07f4..40df580 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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-04-23 Jeff Law <law@redhat.com>
PR tree-optimization/60902
diff --git a/gcc/testsuite/gcc.dg/vect/vect-bswap16.c b/gcc/testsuite/gcc.dg/vect/vect-bswap16.c
new file mode 100644
index 0000000..c562718
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-bswap16.c
@@ -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
index 0000000..9596677
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-bswap32.c
@@ -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
index 0000000..088c8c6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-bswap64.c
@@ -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" } } */
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 541a428..badfac3 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -3271,6 +3271,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 { } {