Hi Carl, on 2024/7/24 01:06, Carl Love wrote: > GCC maintainers: > > version 2, Updated patch comments, added missing ChangeLog. Fixed unintended > line removal. > > The following patch removes the three __builtin_vsx_xvcmp[eq|ge|gt]sp > builtins as they similar to the overloaded vec_cmp[eq|ge|gt] built-ins. The > difference is the overloaded built-ins return a vector of boolean or a vector > of long long booleans where as the removed built-ins returned a vector of > floats or vector of doubles. > > The tests for __builtin_vsx_xvcmp[eq|ge|gt]sp and > __builtin_vsx_xvcmp[eq|ge|gt]dp are updated to use the overloaded > vec_cmp[eq|ge|gt] built-in with the required changes for the return type. > Note __builtin_vsx_xvcmp[eq|ge|gt]dp are used internally. > > The patches have been tested on a Power 10 LE system with no regressions. > > Please let me know if the patch is acceptable for mainline. Thanks. > > Carl > --------------------------------------------------------------------------------- > rs6000, remove __builtin_vsx_xvcmp* built-ins > > This patch removes the built-ins: > __builtin_vsx_xvcmpeqsp, __builtin_vsx_xvcmpgesp, > __builtin_vsx_xvcmpgtsp. > > which are similar to the recommended PVIPR documented overloaded > vec_cmpeq, vec_cmpgt and vec_cmpge built-ins. > > The difference is that the overloaded built-ins return a vector of > 32-bit booleans. The removed built-ins returned a vector of floats. > > The __builtin_vsx_xvcmpeqdp, __builtin_vsx_xvcmpgedp and > __builtin_vsx_xvcmpgtdp are not removed as they are used by the > overloaded vec_cmpeq, vec_cmpgt and vec_cmpge built-ins. > > The test cases for the __builtin_vsx_xvcmpeqsp, __builtin_vsx_xvcmpgesp, > __builtin_vsx_xvcmpgtsp, __builtin_vsx_xvcmpeqdp, > __builtin_vsx_xvcmpgedp and __builtin_vsx_xvcmpgtdp are changed to use > the overloaded vec_cmpeq, vec_cmpgt, vec_cmpge built-ins. Use of the > overloaded built-ins requires the result to be stored in a vector of > boolean of the appropriate size or the result must be cast to the return > type used by the original __builtin_vsx_xvcmp* built-ins. > > gcc/ChangeLog: > * config/rs6000/rs6000-builtins.def (__builtin_vsx_xvcmpeqsp, > __builtin_vsx_xvcmpgesp, __builtin_vsx_xvcmpgtsp): Remove > definitions. > > gcc/testsuite/ChangeLog: > * gcc.target/powerpc/vsx-builtin-3.c (__builtin_vsx_xvcmpeqdp, > __builtin_vsx_xvcmpgtdp, __builtin_vsx_xvcmpgedp, > __builtin_vsx_xvcmpeqsp, __builtin_vsx_xvcmpgtsp, > __builtin_vsx_xvcmpgesp): Remove. > (vec_cmpeq, vec_cmpgt, vec_cmpge): Add tests for float > arguments that store result in boolean and cast result to > store result in float. Add tests for double arguments that > store the result in long long boolean and cast result to > double.
Nit: Normally the one in "()" is the name of the function you changed, so how about: (do_cmp): Replace __builtin_vsx_xvcmp{eq,gt,ge}{sp,dp} by vec_cmp{eq,gt,ge} respectively and add explicit casts to vector {float,double}. Add more testing code assigning to vector boolean types. OK for trunk with this nit tweaked, thanks! BR, Kewen > --- > gcc/config/rs6000/rs6000-builtins.def | 9 ------ > .../gcc.target/powerpc/vsx-builtin-3.c | 28 ++++++++++++++----- > 2 files changed, 21 insertions(+), 16 deletions(-) > > diff --git a/gcc/config/rs6000/rs6000-builtins.def > b/gcc/config/rs6000/rs6000-builtins.def > index 77eb0f7e406..47830b7dcb0 100644 > --- a/gcc/config/rs6000/rs6000-builtins.def > +++ b/gcc/config/rs6000/rs6000-builtins.def > @@ -1579,18 +1579,12 @@ > const signed int __builtin_vsx_xvcmpeqdp_p (signed int, vd, vd); > XVCMPEQDP_P vector_eq_v2df_p {pred} > > - const vf __builtin_vsx_xvcmpeqsp (vf, vf); > - XVCMPEQSP vector_eqv4sf {} > - > const vd __builtin_vsx_xvcmpgedp (vd, vd); > XVCMPGEDP vector_gev2df {} > > const signed int __builtin_vsx_xvcmpgedp_p (signed int, vd, vd); > XVCMPGEDP_P vector_ge_v2df_p {pred} > > - const vf __builtin_vsx_xvcmpgesp (vf, vf); > - XVCMPGESP vector_gev4sf {} > - > const signed int __builtin_vsx_xvcmpgesp_p (signed int, vf, vf); > XVCMPGESP_P vector_ge_v4sf_p {pred} > > @@ -1600,9 +1594,6 @@ > const signed int __builtin_vsx_xvcmpgtdp_p (signed int, vd, vd); > XVCMPGTDP_P vector_gt_v2df_p {pred} > > - const vf __builtin_vsx_xvcmpgtsp (vf, vf); > - XVCMPGTSP vector_gtv4sf {} > - > const signed int __builtin_vsx_xvcmpgtsp_p (signed int, vf, vf); > XVCMPGTSP_P vector_gt_v4sf_p {pred} > > diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c > b/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c > index 60f91aad23c..d67f97c8011 100644 > --- a/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c > +++ b/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c > @@ -156,13 +156,27 @@ int do_cmp (void) > { > int i = 0; > > - d[i][0] = __builtin_vsx_xvcmpeqdp (d[i][1], d[i][2]); i++; > - d[i][0] = __builtin_vsx_xvcmpgtdp (d[i][1], d[i][2]); i++; > - d[i][0] = __builtin_vsx_xvcmpgedp (d[i][1], d[i][2]); i++; > - > - f[i][0] = __builtin_vsx_xvcmpeqsp (f[i][1], f[i][2]); i++; > - f[i][0] = __builtin_vsx_xvcmpgtsp (f[i][1], f[i][2]); i++; > - f[i][0] = __builtin_vsx_xvcmpgesp (f[i][1], f[i][2]); i++; > + /* The __builtin_vsx_xvcmp[gt|ge|eq]dp and __builtin_vsx_xvcmp[gt|ge|eq]sp > + have been removed in favor of the overloaded vec_cmpeq, vec_cmpgt and > + vec_cmpge built-ins. The __builtin_vsx_xvcmp* builtins returned a > vector > + result of the same type as the arguments. The vec_cmp* built-ins return > + a vector of boolenas of the same size as the arguments. Thus the result > + assignment must be to a boolean or cast to a boolean. Test both cases. > + */ > + > + d[i][0] = (vector double) vec_cmpeq (d[i][1], d[i][2]); i++; > + d[i][0] = (vector double) vec_cmpgt (d[i][1], d[i][2]); i++; > + d[i][0] = (vector double) vec_cmpge (d[i][1], d[i][2]); i++; > + bl[i][0] = vec_cmpeq (d[i][1], d[i][2]); i++; > + bl[i][0] = vec_cmpgt (d[i][1], d[i][2]); i++; > + bl[i][0] = vec_cmpge (d[i][1], d[i][2]); i++; > + > + f[i][0] = (vector float) vec_cmpeq (f[i][1], f[i][2]); i++; > + f[i][0] = (vector float) vec_cmpgt (f[i][1], f[i][2]); i++; > + f[i][0] = (vector float) vec_cmpge (f[i][1], f[i][2]); i++; > + bi[i][0] = vec_cmpeq (f[i][1], f[i][2]); i++; > + bi[i][0] = vec_cmpgt (f[i][1], f[i][2]); i++; > + bi[i][0] = vec_cmpge (f[i][1], f[i][2]); i++; > return i; > } >