Hi! Ping, please. :) Bill
On 9/24/21 10:20 AM, Bill Schmidt wrote: > Hi! > > This fixes a bug reported in > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101985. > > The vec_cpsgn built-in function API differs in argument order from the > copysign<mode>3 convention. Currently that pattern is incorrctly used to > implement vec_cpsgn. Fix that while leaving the existing pattern in place > to implement copysignf for vector modes. > > Part of the fix when using the new built-in support requires an adjustment > to a pending patch that replaces much of altivec.h with an automatically > generated file. So that adjustment will be coming later... > > Also fix a bug in the new built-in overload infrastructure where we were > using the VSX form of the VEC_COPYSIGN built-in when we should default to > the VMX form. > > Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions. > Is this okay for trunk? > > Thanks! > Bill > > > 2021-09-24 Bill Schmidt <wschm...@linux.ibm.com> > > gcc/ > PR target/101985 > * config/rs6000/altivec.h (vec_cpsgn): Adjust. > * config/rs6000/rs6000-overload.def (VEC_COPYSIGN): Use SKIP to > avoid generating an automatic #define of vec_cpsgn. Use the > correct built-in for V4SFmode that doesn't depend on VSX. > > gcc/testsuite/ > PR target/101985 > * gcc.target/powerpc/pr101985.c: New. > --- > gcc/config/rs6000/altivec.h | 2 +- > gcc/config/rs6000/rs6000-overload.def | 4 ++-- > gcc/testsuite/gcc.target/powerpc/pr101985-1.c | 18 ++++++++++++++++++ > gcc/testsuite/gcc.target/powerpc/pr101985-2.c | 18 ++++++++++++++++++ > 4 files changed, 39 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/powerpc/pr101985-1.c > create mode 100644 gcc/testsuite/gcc.target/powerpc/pr101985-2.c > > diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h > index 5b631c7ebaf..ea72c9c1789 100644 > --- a/gcc/config/rs6000/altivec.h > +++ b/gcc/config/rs6000/altivec.h > @@ -129,7 +129,7 @@ > #define vec_vcfux __builtin_vec_vcfux > #define vec_cts __builtin_vec_cts > #define vec_ctu __builtin_vec_ctu > -#define vec_cpsgn __builtin_vec_copysign > +#define vec_cpsgn(x,y) __builtin_vec_copysign(y,x) > #define vec_double __builtin_vec_double > #define vec_doublee __builtin_vec_doublee > #define vec_doubleo __builtin_vec_doubleo > diff --git a/gcc/config/rs6000/rs6000-overload.def > b/gcc/config/rs6000/rs6000-overload.def > index 141f831e2c0..4f583312f36 100644 > --- a/gcc/config/rs6000/rs6000-overload.def > +++ b/gcc/config/rs6000/rs6000-overload.def > @@ -1154,9 +1154,9 @@ > vus __builtin_vec_convert_4f32_8f16 (vf, vf); > CONVERT_4F32_8F16 > > -[VEC_COPYSIGN, vec_cpsgn, __builtin_vec_copysign] > +[VEC_COPYSIGN, SKIP, __builtin_vec_copysign] > vf __builtin_vec_copysign (vf, vf); > - CPSGNSP > + COPYSIGN_V4SF > vd __builtin_vec_copysign (vd, vd); > CPSGNDP > > diff --git a/gcc/testsuite/gcc.target/powerpc/pr101985-1.c > b/gcc/testsuite/gcc.target/powerpc/pr101985-1.c > new file mode 100644 > index 00000000000..a1ec2d68d53 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr101985-1.c > @@ -0,0 +1,18 @@ > +/* PR target/101985 */ > +/* { dg-do run } */ > +/* { dg-require-effective-target vsx_hw } */ > +/* { dg-options "-O2" } */ > + > +#include <altivec.h> > + > +int > +main (void) > +{ > + vector float a = { 1, 2, - 3, - 4}; > + vector float b = {-10, 20, -30, 40}; > + vector float c = { 10, 20, -30, -40}; > + a = vec_cpsgn (a, b); > + if (! vec_all_eq (a, c)) > + __builtin_abort (); > + return 0; > +} > diff --git a/gcc/testsuite/gcc.target/powerpc/pr101985-2.c > b/gcc/testsuite/gcc.target/powerpc/pr101985-2.c > new file mode 100644 > index 00000000000..71cc254c170 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr101985-2.c > @@ -0,0 +1,18 @@ > +/* PR target/101985 */ > +/* { dg-do run } */ > +/* { dg-require-effective-target vsx_hw } */ > +/* { dg-options "-O2" } */ > + > +#include <altivec.h> > + > +int > +main (void) > +{ > + vector double a = { 1, -4}; > + vector double b = { -10, 40}; > + vector double c = { 10, -40}; > + a = vec_cpsgn (a, b); > + if (! vec_all_eq (a, c)) > + __builtin_abort (); > + return 0; > +}