summaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorKelvin Nilsen <kelvin@gcc.gnu.org>2020-05-11 10:13:14 -0500
committerBill Schmidt <wschmidt@linux.ibm.com>2020-05-11 10:13:14 -0500
commit7c00c55914f89bf46ca5d01c7d76e2fcedf795f9 (patch)
treee4a8d38848522133e27ca8cc30df265c04285bb1 /gcc/testsuite
parent894ac7bce590dc5036c7f1477b881dc767ce2e5a (diff)
rs6000: Add vgnb
Add support for the vgnb instruction, which gathers every Nth bit per vector element. [gcc] 2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org> Bill Schmidt <wschmidt@linux.ibm.com> * config/rs6000/altivec.h (vec_gnb): New #define. * config/rs6000/altivec.md (UNSPEC_VGNB): New constant. (vgnb): New insn. * config/rs6000/rs6000-builtin.def (BU_FUTURE_OVERLOAD_1): New #define. (BU_FUTURE_OVERLOAD_2): Likewise. (BU_FUTURE_OVERLOAD_3): Likewise. (__builtin_altivec_gnb): New built-in function. (__buiiltin_vec_gnb): New overloaded built-in function. * config/rs6000/rs6000-call.c (altivec_overloaded_builtins): Define overloaded forms of __builtin_vec_gnb. (rs6000_expand_binop_builtin): Add error checking for 2nd argument of __builtin_vec_gnb. (builtin_function_type): Mark return value and arguments unsigned for FUTURE_BUILTIN_VGNB. * doc/extend.texi (PowerPC AltiVec Built-in Functions Available for a Future Architecture): Add description of vec_gnb built-in function. [gcc/testsuite] 2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org> Bill Schmidt <wschmidt@linux.ibm.com> * gcc.target/powerpc/vec-gnb-0.c: New test. * gcc.target/powerpc/vec-gnb-1.c: New test. * gcc.target/powerpc/vec-gnb-10.c: New test. * gcc.target/powerpc/vec-gnb-2.c: New test. * gcc.target/powerpc/vec-gnb-3.c: New test. * gcc.target/powerpc/vec-gnb-4.c: New test. * gcc.target/powerpc/vec-gnb-5.c: New test. * gcc.target/powerpc/vec-gnb-6.c: New test. * gcc.target/powerpc/vec-gnb-7.c: New test. * gcc.target/powerpc/vec-gnb-8.c: New test. * gcc.target/powerpc/vec-gnb-9.c: New test.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog15
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-0.c75
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-1.c75
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-10.c72
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-2.c73
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-3.c72
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-4.c71
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-5.c71
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-6.c71
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-7.c71
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-8.c75
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-gnb-9.c74
12 files changed, 815 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 05b409a0587..65feee50c8b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,19 @@
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
+ Bill Schmidt <wschmidt@linux.ibm.com>
+
+ * gcc.target/powerpc/vec-gnb-0.c: New test.
+ * gcc.target/powerpc/vec-gnb-1.c: New test.
+ * gcc.target/powerpc/vec-gnb-10.c: New test.
+ * gcc.target/powerpc/vec-gnb-2.c: New test.
+ * gcc.target/powerpc/vec-gnb-3.c: New test.
+ * gcc.target/powerpc/vec-gnb-4.c: New test.
+ * gcc.target/powerpc/vec-gnb-5.c: New test.
+ * gcc.target/powerpc/vec-gnb-6.c: New test.
+ * gcc.target/powerpc/vec-gnb-7.c: New test.
+ * gcc.target/powerpc/vec-gnb-8.c: New test.
+ * gcc.target/powerpc/vec-gnb-9.c: New test.
+
+2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/vec-pdep-0.c: New.
* gcc.target/powerpc/vec-pdep-1.c: New.
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-0.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-0.c
new file mode 100644
index 00000000000..a95c29cf31d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-0.c
@@ -0,0 +1,75 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned char source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned char source_a = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88, 0x88, 0x88 };
+ vector unsigned char source_b = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+ vector unsigned char source_c = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 };
+ vector unsigned char source_d = {
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mvgnb\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-1.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-1.c
new file mode 100644
index 00000000000..e8ceed55994
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-1.c
@@ -0,0 +1,75 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned char source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned char source_a = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88, 0x88, 0x88 };
+ vector unsigned char source_b = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+ vector unsigned char source_c = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 };
+ vector unsigned char source_d = {
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-10.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-10.c
new file mode 100644
index 00000000000..73ff0d9fea7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-10.c
@@ -0,0 +1,72 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+unsigned long long int
+do_vec_gnb (vector unsigned char source, unsigned char stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 0); /* { dg-error "between 2 and 7" } */
+ case 3:
+ return vec_gnb (source, -1); /* { dg-error "between 2 and 7" } */
+ case 4:
+ return vec_gnb (source, 8); /* { dg-error "between 2 and 7" } */
+ case 5:
+ return vec_gnb (source, 1); /* { dg-error "between 2 and 7" } */
+ case 6:
+ return vec_gnb (source, stride); /* { dg-error "unsigned literal" } */
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned char source_a = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88, 0x88, 0x88 };
+ vector unsigned char source_b = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+ vector unsigned char source_c = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 };
+ vector unsigned char source_d = {
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-2.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-2.c
new file mode 100644
index 00000000000..eb51a8db219
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-2.c
@@ -0,0 +1,73 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned short int source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned short int source_a = { 0, 0, 0, 0, 0, 0, 0x8888, 0x8888 };
+ vector unsigned short int source_b = {
+ 0, 0, 0, 0, 0x8080, 0x8080, 0x8080, 0x8080 };
+ vector unsigned short int source_c = {
+ 0, 0, 0, 0, 0x8888, 0x8888, 0x8888, 0x8888 };
+ vector unsigned short int source_d = {
+ 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mvgnb\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-3.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-3.c
new file mode 100644
index 00000000000..f36b91a83e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-3.c
@@ -0,0 +1,72 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned short int source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned short int source_a = { 0, 0, 0, 0, 0, 0, 0x8888, 0x8888 };
+ vector unsigned short int source_b = {
+ 0, 0, 0, 0, 0x8080, 0x8080, 0x8080, 0x8080 };
+ vector unsigned short int source_c = {
+ 0, 0, 0, 0, 0x8888, 0x8888, 0x8888, 0x8888 };
+ vector unsigned short int source_d = {
+ 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-4.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-4.c
new file mode 100644
index 00000000000..df312ae1b28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-4.c
@@ -0,0 +1,71 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned int source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned int source_a = { 0, 0, 0, 0x88888888 };
+ vector unsigned int source_b = { 0, 0, 0x80808080, 0x80808080 };
+ vector unsigned int source_c = { 0, 0, 0x88888888, 0x88888888 };
+ vector unsigned int source_d =
+ { 0x80808080, 0x80808080, 0x80808080, 0x80808080 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mvgnb\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-5.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-5.c
new file mode 100644
index 00000000000..1c3c3fa72c0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-5.c
@@ -0,0 +1,71 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned int source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned int source_a = { 0, 0, 0, 0x88888888 };
+ vector unsigned int source_b = { 0, 0, 0x80808080, 0x80808080 };
+ vector unsigned int source_c = { 0, 0, 0x88888888, 0x88888888 };
+ vector unsigned int source_d =
+ { 0x80808080, 0x80808080, 0x80808080, 0x80808080 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-6.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-6.c
new file mode 100644
index 00000000000..a6dc78a3e98
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-6.c
@@ -0,0 +1,71 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned long long int source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned long long int source_a = { 0, 0x8888888800000000ull };
+ vector unsigned long long int source_b = { 0, 0x8080808080808080ull };
+ vector unsigned long long int source_c = { 0, 0x8888888888888888ull };
+ vector unsigned long long int source_d = { 0x8080808080808080ull,
+ 0x8080808080808080ull };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mvgnb\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-7.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-7.c
new file mode 100644
index 00000000000..bbacff986a0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-7.c
@@ -0,0 +1,71 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned long long int source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned long long int source_a = { 0, 0x8888888800000000ull };
+ vector unsigned long long int source_b = { 0, 0x8080808080808080ull };
+ vector unsigned long long int source_c = { 0, 0x8888888888888888ull };
+ vector unsigned long long int source_d = { 0x8080808080808080ull,
+ 0x8080808080808080ull };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-8.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-8.c
new file mode 100644
index 00000000000..23c16e51d48
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-8.c
@@ -0,0 +1,75 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned __int128 source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned __int128 source_a =
+ { ((unsigned __int128) 0x8888888800000000ull) << 64 };
+ vector unsigned __int128 source_b =
+ { ((unsigned __int128) 0x8080808080808080ull) << 64 };
+ vector unsigned __int128 source_c =
+ { ((unsigned __int128) 0x8888888888888888ull) << 64 };
+ vector unsigned __int128 source_d =
+ { 0x8080808080808080ull |
+ ((unsigned __int128) 0x8080808080808080ull) << 64 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mvgnb\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-gnb-9.c b/gcc/testsuite/gcc.target/powerpc/vec-gnb-9.c
new file mode 100644
index 00000000000..659e802d819
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-gnb-9.c
@@ -0,0 +1,74 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+/* This test is replicated for every different vector type since
+ vec_gnb is polymorphic. */
+unsigned long long int
+do_vec_gnb (vector unsigned __int128 source, int stride)
+{
+ switch (stride)
+ {
+ case 2:
+ return vec_gnb (source, 2);
+ case 3:
+ return vec_gnb (source, 3);
+ case 4:
+ return vec_gnb (source, 4);
+ case 5:
+ return vec_gnb (source, 5);
+ case 6:
+ return vec_gnb (source, 6);
+ case 7:
+ return vec_gnb (source, 7);
+
+ default:
+ /* Illegal value of stride */
+ abort ();
+ return 0;
+ }
+}
+
+int
+main (int argc, char *argv [])
+{
+ /* For result = 0xaaaa_0000_0000_0000, use:
+ stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
+ stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
+
+ For result = 0xaaaa_aaaa_0000_0000, use:
+ stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
+ stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
+ */
+
+ /* The last array element appears in the left-most (first) bit
+ positions of the vector register. */
+ vector unsigned __int128 source_a =
+ { ((unsigned __int128) 0x8888888800000000ull) << 64 };
+ vector unsigned __int128 source_b =
+ { ((unsigned __int128) 0x8080808080808080ull) << 64 };
+ vector unsigned __int128 source_c =
+ { ((unsigned __int128) 0x8888888888888888ull) << 64 };
+ vector unsigned __int128 source_d =
+ { 0x8080808080808080ull |
+ ((unsigned __int128) 0x8080808080808080ull) << 64 };
+
+ unsigned long long int results [] =
+ { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
+ 0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
+
+ if (do_vec_gnb (source_a, 2) != results [0])
+ abort ();
+ if (do_vec_gnb (source_b, 4) != results [1])
+ abort ();
+ if (do_vec_gnb (source_c, 2) != results [2])
+ abort ();
+ if (do_vec_gnb (source_d, 4) != results [3])
+ abort ();
+
+ return 0;
+}