diff options
author | Kelvin Nilsen <kelvin@gcc.gnu.org> | 2020-05-11 10:04:03 -0500 |
---|---|---|
committer | Bill Schmidt <wschmidt@linux.ibm.com> | 2020-05-11 10:04:03 -0500 |
commit | 894ac7bce590dc5036c7f1477b881dc767ce2e5a (patch) | |
tree | d9db3eeb9215e08be7f2d60f934326d31d29ad9a /gcc/testsuite | |
parent | a1821a249d998894dd38b14d5298647e8d7b5dc8 (diff) | |
download | gcc-894ac7bce590dc5036c7f1477b881dc767ce2e5a.zip gcc-894ac7bce590dc5036c7f1477b881dc767ce2e5a.tar.gz gcc-894ac7bce590dc5036c7f1477b881dc767ce2e5a.tar.bz2 |
rs6000: Add vector pdep/pext
Add support for the vpdepd and vpextd instructions that perform
vector parallel bit deposit and vector parallel bit extract.
[gcc]
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/altivec.h (vec_pdep): New macro implementing new
built-in function.
(vec_pext): Likewise.
* config/rs6000/altivec.md (UNSPEC_VPDEPD): New constant.
(UNSPEC_VPEXTD): Likewise.
(vpdepd): New insn.
(vpextd): Likewise.
* config/rs6000/rs6000-builtin.def (__builtin_altivec_vpdepd): New
built-in function.
(__builtin_altivec_vpextd): Likewise.
* config/rs6000/rs6000-call.c (builtin_function_type): Add
handling for FUTURE_BUILTIN_VPDEPD and FUTURE_BUILTIN_VPEXTD
cases.
* doc/extend.texi (PowerPC Altivec Built-in Functions Available
for a Future Architecture): Add description of vec_pdep and
vec_pext built-in functions.
[gcc/testsuite]
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.
* gcc.target/powerpc/vec-pext-0.c: New.
* gcc.target/powerpc/vec-pext-1.c: New.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-pdep-0.c | 61 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-pdep-1.c | 53 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-pext-0.c | 53 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/vec-pext-1.c | 52 |
5 files changed, 226 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db274ee..05b409a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +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. + * gcc.target/powerpc/vec-pext-0.c: New. + * gcc.target/powerpc/vec-pext-1.c: New. + 2020-05-11 Richard Biener <rguenther@suse.de> PR tree-optimization/94988 diff --git a/gcc/testsuite/gcc.target/powerpc/vec-pdep-0.c b/gcc/testsuite/gcc.target/powerpc/vec-pdep-0.c new file mode 100644 index 0000000..541b0aa --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/vec-pdep-0.c @@ -0,0 +1,61 @@ +/* { dg-do compile } */ +/* { dg-options "-mdejagnu-cpu=future" } */ + +#include <altivec.h> + +extern void abort (void); + +vector unsigned long long int +do_vec_pdep (vector unsigned long long int source, + vector unsigned long long int mask) { + return vec_pdep (source, mask); +} + +int +vectors_equal (vector unsigned long long int a, + vector unsigned long long int b) +{ + return (a[0] == b[0]) && (a[1] == b[1]); +} + +int +main (int argc, char *argv []) +{ + vector unsigned long long int source_a = { 0xa5f07e3cull, 0x7e3ca5f0ull }; + vector unsigned long long int source_b = { 0x3ca5f07eull, 0x5a0fe7c3ull }; + + vector unsigned long long int mask_a = { 0xffff0000ull, 0x0000ffffull }; + vector unsigned long long int mask_b = { 0x0f0f0f0full, 0xf0f0f0f0ull }; + + /* See pdepd-0.c for derivation of expected results. + + result_aa [0] is compute (source [0], mask [0]; + result_aa [1] is compute (source [1], mask [1]. + + result_ab [0] is compute (source [0], mask [2]; + result_ab [1] is compute (source [1], mask [3]. + + result_ba [0] is compute (source [2], mask [0]; + result_ba [1] is compute (source [3], mask [1]. + + result_bb [0] is compute (source [2], mask [2]; + result_bb [1] is compute (source [3], mask [3]. */ + + vector unsigned long long int result_aa = { 0x7e3c0000ull, 0x0000a5f0ull }; + vector unsigned long long int result_ab = { 0x070e030cull, 0xa050f000ull }; + vector unsigned long long int result_ba = { 0xf07e0000ull, 0x0000e7c3ull }; + vector unsigned long long int result_bb = { 0x0f00070eull, 0xe070c030ull }; + + if (!vec_all_eq (do_vec_pdep (source_a, mask_a), result_aa)) + abort (); + if (!vec_all_eq (do_vec_pdep (source_a, mask_b), result_ab)) + abort (); + if (!vec_all_eq (do_vec_pdep (source_b, mask_a), result_ba)) + abort (); + if (!vec_all_eq (do_vec_pdep (source_b, mask_b), result_bb)) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler {\mvpdepd\M} } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/vec-pdep-1.c b/gcc/testsuite/gcc.target/powerpc/vec-pdep-1.c new file mode 100644 index 0000000..75249c5 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/vec-pdep-1.c @@ -0,0 +1,53 @@ +/* { dg-do run } */ +/* { dg-require-effective-target powerpc_future_hw } */ +/* { dg-options "-mdejagnu-cpu=future" } */ + +#include <altivec.h> + +extern void abort (void); + +vector unsigned long long int +do_vec_pdep (vector unsigned long long int source, + vector unsigned long long int mask) { + return vec_pdep (source, mask); +} + +int +main (int argc, char *argv []) +{ + vector unsigned long long int source_a = { 0xa5f07e3cull, 0x7e3ca5f0ull }; + vector unsigned long long int source_b = { 0x3ca5f07eull, 0x5a0fe7c3ull }; + + vector unsigned long long int mask_a = { 0xffff0000ull, 0x0000ffffull }; + vector unsigned long long int mask_b = { 0x0f0f0f0full, 0xf0f0f0f0ull }; + + /* See pdepd-0.c for derivation of expected results. + + result_aa [0] is compute (source [0], mask [0]; + result_aa [1] is compute (source [1], mask [1]. + + result_ab [0] is compute (source [0], mask [2]; + result_ab [1] is compute (source [1], mask [3]. + + result_ba [0] is compute (source [2], mask [0]; + result_ba [1] is compute (source [3], mask [1]. + + result_bb [0] is compute (source [2], mask [2]; + result_bb [1] is compute (source [3], mask [3]. */ + + vector unsigned long long int result_aa = { 0x7e3c0000ull, 0x0000a5f0ull }; + vector unsigned long long int result_ab = { 0x070e030cull, 0xa050f000ull }; + vector unsigned long long int result_ba = { 0xf07e0000ull, 0x0000e7c3ull }; + vector unsigned long long int result_bb = { 0x0f00070eull, 0xe070c030ull }; + + if (!vec_all_eq (do_vec_pdep (source_a, mask_a), result_aa)) + abort (); + if (!vec_all_eq (do_vec_pdep (source_a, mask_b), result_ab)) + abort (); + if (!vec_all_eq (do_vec_pdep (source_b, mask_a), result_ba)) + abort (); + if (!vec_all_eq (do_vec_pdep (source_b, mask_b), result_bb)) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/powerpc/vec-pext-0.c b/gcc/testsuite/gcc.target/powerpc/vec-pext-0.c new file mode 100644 index 0000000..1d12f04 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/vec-pext-0.c @@ -0,0 +1,53 @@ +/* { dg-do compile } */ +/* { dg-options "-mdejagnu-cpu=future" } */ + +#include <altivec.h> + +extern void abort (void); + +vector unsigned long long int +do_vec_pext (vector unsigned long long int source, + vector unsigned long long int mask) { + return vec_pext (source, mask); +} + +int main (int argc, char *argv []) +{ + vector unsigned long long int source_a = { 0xa5f07e3cull, 0x7e3ca5f0ull }; + vector unsigned long long int source_b = { 0x3ca5f07eull, 0x5a0fe7c3ull }; + + vector unsigned long long int mask_a = { 0xffff0000ull, 0x0000ffffull }; + vector unsigned long long int mask_b = { 0x0f0f0f0full, 0xf0f0f0f0ull }; + + /* See pextd-0.c for derivation of expected results. + + result_aa [0] is compute (source [0], mask [0]; + result_aa [1] is compute (source [1], mask [1]. + + result_ab [0] is compute (source [0], mask [2]; + result_ab [1] is compute (source [1], mask [3]. + + result_ba [0] is compute (source [2], mask [0]; + result_ba [1] is compute (source [3], mask [1]. + + result_bb [0] is compute (source [2], mask [2]; + result_bb [1] is compute (source [3], mask [3]. */ + + vector unsigned long long int result_aa = { 0x0000a5f0ull, 0x0000a5f0ull }; + vector unsigned long long int result_ab = { 0x000050ecull, 0x000073afull }; + vector unsigned long long int result_ba = { 0x00003ca5ull, 0x0000e7c3ull }; + vector unsigned long long int result_bb = { 0x0000c50eull, 0x000050ecull }; + + if (!vec_all_eq (do_vec_pext (source_a, mask_a), result_aa)) + abort (); + if (!vec_all_eq (do_vec_pext (source_a, mask_b),result_ab)) + abort (); + if (!vec_all_eq (do_vec_pext (source_b, mask_a), result_ba)) + abort (); + if (!vec_all_eq (do_vec_pext (source_b, mask_b), result_bb)) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler {\mvpextd\M} } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/vec-pext-1.c b/gcc/testsuite/gcc.target/powerpc/vec-pext-1.c new file mode 100644 index 0000000..db1b95e --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/vec-pext-1.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target powerpc_future_hw } */ +/* { dg-options "-mdejagnu-cpu=future" } */ + +#include <altivec.h> + +extern void abort (void); + +vector unsigned long long int +do_vec_pext (vector unsigned long long int source, + vector unsigned long long int mask) { + return vec_pext (source, mask); +} + +int main (int argc, char *argv []) +{ + vector unsigned long long int source_a = { 0xa5f07e3cull, 0x7e3ca5f0ull }; + vector unsigned long long int source_b = { 0x3ca5f07eull, 0x5a0fe7c3ull }; + + vector unsigned long long int mask_a = { 0xffff0000ull, 0x0000ffffull }; + vector unsigned long long int mask_b = { 0x0f0f0f0full, 0xf0f0f0f0ull }; + + /* See pextd-0.c for derivation of expected results. + + result_aa [0] is compute (source [0], mask [0]; + result_aa [1] is compute (source [1], mask [1]. + + result_ab [0] is compute (source [0], mask [2]; + result_ab [1] is compute (source [1], mask [3]. + + result_ba [0] is compute (source [2], mask [0]; + result_ba [1] is compute (source [3], mask [1]. + + result_bb [0] is compute (source [2], mask [2]; + result_bb [1] is compute (source [3], mask [3]. */ + + vector unsigned long long int result_aa = { 0x0000a5f0ull, 0x0000a5f0ull }; + vector unsigned long long int result_ab = { 0x000050ecull, 0x000073afull }; + vector unsigned long long int result_ba = { 0x00003ca5ull, 0x0000e7c3ull }; + vector unsigned long long int result_bb = { 0x0000c50eull, 0x000050ecull }; + + if (!vec_all_eq (do_vec_pext (source_a, mask_a), result_aa)) + abort (); + if (!vec_all_eq (do_vec_pext (source_a, mask_b),result_ab)) + abort (); + if (!vec_all_eq (do_vec_pext (source_b, mask_a), result_ba)) + abort (); + if (!vec_all_eq (do_vec_pext (source_b, mask_b), result_bb)) + abort (); + + return 0; +} |