diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2017-01-16 15:05:35 +0000 |
---|---|---|
committer | William Schmidt <wschmidt@gcc.gnu.org> | 2017-01-16 15:05:35 +0000 |
commit | 290687fb4ee780292684e85d616269305629adc2 (patch) | |
tree | 49be24c00fe8cefd649b33b1ab23fcc11823221d | |
parent | 436afa16af10297db12680519f57800c0891bbe5 (diff) | |
download | gcc-290687fb4ee780292684e85d616269305629adc2.zip gcc-290687fb4ee780292684e85d616269305629adc2.tar.gz gcc-290687fb4ee780292684e85d616269305629adc2.tar.bz2 |
rs6000.c (rtx_is_swappable_p): Change UNSPEC_VSX__XXSPLTD to require special splat handling.
[gcc]
2017-01-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (rtx_is_swappable_p): Change
UNSPEC_VSX__XXSPLTD to require special splat handling.
[gcc/testsuite]
2017-01-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/swaps-p8-27.c: New.
From-SVN: r244495
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/swaps-p8-27.c | 36 |
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b1eeaf3..7520de8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-01-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + * config/rs6000/rs6000.c (rtx_is_swappable_p): Change + UNSPEC_VSX__XXSPLTD to require special splat handling. + 2017-01-16 David Malcolm <dmalcolm@redhat.com> PR bootstrap/78616 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f1d5d9d..29b3fd6 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -41318,6 +41318,7 @@ rtx_is_swappable_p (rtx op, unsigned int *special) case UNSPEC_VSX_VEC_INIT: return 0; case UNSPEC_VSPLT_DIRECT: + case UNSPEC_VSX_XXSPLTD: *special = SH_SPLAT; return 1; case UNSPEC_REDUC_PLUS: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aeb050a..e5fa65a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-01-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + * gcc.target/powerpc/swaps-p8-27.c: New. + 2017-01-16 Paolo Carlini <paolo.carlini@oracle.com> PR c++/71737 diff --git a/gcc/testsuite/gcc.target/powerpc/swaps-p8-27.c b/gcc/testsuite/gcc.target/powerpc/swaps-p8-27.c new file mode 100644 index 0000000..832f0c7 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/swaps-p8-27.c @@ -0,0 +1,36 @@ +/* { dg-do compile { target { powerpc64le-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-options "-mcpu=power8 -O3 " } */ +/* { dg-final { scan-assembler-times "lxvd2x" 2 } } */ +/* { dg-final { scan-assembler-times "stxvd2x" 1 } } */ +/* { dg-final { scan-assembler-times "xxpermdi" 3 } } */ + +/* Verify that swap optimization works correctly for a VSX direct splat. + The three xxpermdi's that are generated correspond to two splats + and the __builtin_vsx_xxpermdi. */ + +int printf (const char *__restrict __format, ...); +typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__)); + +double s1[] = {2134.3343, 6678.346}; +double s2[] = {41124.234, 6678.346}; +long long dd[] = {1, 2}, d[2]; +union{long long l[2]; double d[2];} e; + +void +foo () +{ + __m128d source1, source2, dest; + __m128d a, b, c; + + e.d[1] = s1[1]; + e.l[0] = !__builtin_isunordered(s1[0], s2[0]) + && s1[0] == s2[0] ? -1 : 0; + source1 = __builtin_vec_vsx_ld (0, s1); + source2 = __builtin_vec_vsx_ld (0, s2); + a = __builtin_vec_splat (source1, 0); + b = __builtin_vec_splat (source2, 0); + c = (__m128d)__builtin_vec_cmpeq (a, b); + dest = __builtin_vsx_xxpermdi (source1, c, 1); + *(__m128d *)d = dest; +} |