From 290687fb4ee780292684e85d616269305629adc2 Mon Sep 17 00:00:00 2001 From: Bill Schmidt Date: Mon, 16 Jan 2017 15:05:35 +0000 Subject: [PATCH] rs6000.c (rtx_is_swappable_p): Change UNSPEC_VSX__XXSPLTD to require special splat handling. [gcc] 2017-01-16 Bill Schmidt * config/rs6000/rs6000.c (rtx_is_swappable_p): Change UNSPEC_VSX__XXSPLTD to require special splat handling. [gcc/testsuite] 2017-01-16 Bill Schmidt * gcc.target/powerpc/swaps-p8-27.c: New. From-SVN: r244495 --- gcc/ChangeLog | 5 +++ gcc/config/rs6000/rs6000.c | 1 + gcc/testsuite/ChangeLog | 4 +++ .../gcc.target/powerpc/swaps-p8-27.c | 36 +++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/swaps-p8-27.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b1eeaf3fa9b..7520de88a3c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-01-16 Bill Schmidt + + * config/rs6000/rs6000.c (rtx_is_swappable_p): Change + UNSPEC_VSX__XXSPLTD to require special splat handling. + 2017-01-16 David Malcolm PR bootstrap/78616 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f1d5d9d1f9d..29b3fd65624 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 aeb050a77c9..e5fa65af9b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-01-16 Bill Schmidt + + * gcc.target/powerpc/swaps-p8-27.c: New. + 2017-01-16 Paolo Carlini 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 00000000000..832f0c7d122 --- /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; +} -- 2.30.2