diff options
author | Kelvin Nilsen <kelvin@gcc.gnu.org> | 2020-05-11 10:13:14 -0500 |
---|---|---|
committer | Bill Schmidt <wschmidt@linux.ibm.com> | 2020-05-11 10:13:14 -0500 |
commit | 7c00c55914f89bf46ca5d01c7d76e2fcedf795f9 (patch) | |
tree | e4a8d38848522133e27ca8cc30df265c04285bb1 /gcc/testsuite | |
parent | 894ac7bce590dc5036c7f1477b881dc767ce2e5a (diff) | |
download | gcc-7c00c55914f89bf46ca5d01c7d76e2fcedf795f9.zip gcc-7c00c55914f89bf46ca5d01c7d76e2fcedf795f9.tar.gz gcc-7c00c55914f89bf46ca5d01c7d76e2fcedf795f9.tar.bz2 |
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/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-0.c | 75 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-1.c | 75 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-10.c | 72 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-2.c | 73 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-3.c | 72 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-4.c | 71 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-5.c | 71 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-6.c | 71 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-7.c | 71 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-8.c | 75 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-gnb-9.c | 74 |
12 files changed, 815 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05b409a..65feee5 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 0000000..a95c29c --- /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 0000000..e8ceed5 --- /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 0000000..73ff0d9 --- /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 0000000..eb51a8d --- /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 0000000..f36b91a --- /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 0000000..df312ae --- /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 0000000..1c3c3fa --- /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 0000000..a6dc78a --- /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 0000000..bbacff9 --- /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 0000000..23c16e5 --- /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 0000000..659e802 --- /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; +} |