Hi Carl, on 2024/8/8 01:15, Carl Love wrote: > > > GCC maintainers: > > The following patch fixes errors in the definition of the > __builtin_vsx_uns_floate_v2di, __builtin_vsx_uns_floato_v2di and > __builtin_vsx_uns_float2_v2di built-ins. The arguments should be unsigned > but are listed as signed. > > Additionally, there are a number of test cases that are missing for the > various instances of the built-ins. Additionally, the documentation for the > various built-ins is missing. > > This patch adds the missing test cases and documentation. > > The patch has been tested on Power 10 LE and BE with no regressions. > > Please let me know if it is acceptable for mainline. Thanks. > > Carl > ------------------------------------------------------------------------------------- > rs6000, Add tests and documentation for vector conversions between integer > and float > > The arguments for the __builtin_vsx_uns_floate_v2di, > __builtin_vsx_uns_floato_v2di and __builtin_vsx_uns_float2_v2di built-ins > should be unsigned. > > Add tests for the following existing integer and long long int to float > built-ins: > __builtin_altivecfloat_sisf (vsi); > __builtin_altivec_uns_float_sisf (vui); > __builtin_vsxfloate_v2di (vsll); > __builtin_vsx_uns_floate_v2di (vull); > __builtin_vsx_floato_v2di (vsll); > __builtin_vsx_uns_floato_v2di (vull); > __builtin_vsx_float2_v2di (vsll, vsll); > __builtin_vsx_uns_float2_v2di (vull, vull); > > Add tests for the vector float to vector int built-ins: > __builtin_altivec_fix_sfsi > __builtin_altivec_fixuns_sfsi > > The various built-ins are not documented. The patch adds the missing > documentation for the variouls built-ins. > > This patch fixes the incorrect __builtin_vsx_uns_float[o|e|2]_v2di > argument types and adds test cases for each of the built-ins listed above. > > gcc/ChangeLog: > * config/rs6000/rs6000-builtins.def (__builtin_vsx_uns_floate_v2di, > __builtin_vsx_uns_floato_v2di,__builtin_vsx_uns_float2_v2di): Change > argument from signed to unsigned. > * doc/extend.texi: Add documentation for each of the built-ins. > > gcc/testsuite/ChangeLog: > * gcc.target/powerpc/vsx-int-to-float-runnable.c: New file. > --- > gcc/config/rs6000/rs6000-builtins.def | 6 +- > gcc/doc/extend.texi | 37 +++ > .../powerpc/vsx-int-to-float-runnable.c | 260 ++++++++++++++++++ > 3 files changed, 300 insertions(+), 3 deletions(-) > create mode 100644 > gcc/testsuite/gcc.target/powerpc/vsx-int-to-float-runnable.c > > diff --git a/gcc/config/rs6000/rs6000-builtins.def > b/gcc/config/rs6000/rs6000-builtins.def > index f2bebd299b2..1227daa1555 100644 > --- a/gcc/config/rs6000/rs6000-builtins.def > +++ b/gcc/config/rs6000/rs6000-builtins.def > @@ -1463,10 +1463,10 @@ > const vd __builtin_vsx_uns_doubleo_v4si (vsi); > UNS_DOUBLEO_V4SI unsdoubleov4si2 {} I noticed there are extra four that should be updated together:
const vd __builtin_vsx_uns_doublee_v4si (vsi); UNS_DOUBLEE_V4SI unsdoubleev4si2 {} const vd __builtin_vsx_uns_doubleh_v4si (vsi); UNS_DOUBLEH_V4SI unsdoublehv4si2 {} const vd __builtin_vsx_uns_doublel_v4si (vsi); UNS_DOUBLEL_V4SI unsdoublelv4si2 {} const vd __builtin_vsx_uns_doubleo_v4si (vsi); UNS_DOUBLEO_V4SI unsdoubleov4si2 {} > > - const vf __builtin_vsx_uns_floate_v2di (vsll); > + const vf __builtin_vsx_uns_floate_v2di (vull); > UNS_FLOATE_V2DI unsfloatev2di {} > > - const vf __builtin_vsx_uns_floato_v2di (vsll); > + const vf __builtin_vsx_uns_floato_v2di (vull); > UNS_FLOATO_V2DI unsfloatov2di {} > > const vsll __builtin_vsx_vsigned_v2df (vd); > @@ -2272,7 +2272,7 @@ > const vss __builtin_vsx_revb_v8hi (vss); > REVB_V8HI revb_v8hi {} > > - const vf __builtin_vsx_uns_float2_v2di (vsll, vsll); > + const vf __builtin_vsx_uns_float2_v2di (vull, vull); > UNS_FLOAT2_V2DI uns_float2_v2di {} > > const vsi __builtin_vsx_vsigned2_v2df (vd, vd); > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index bf6f4094040..7ec4f19a6bf 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -22919,6 +22919,43 @@ but the index value must be 0. > > Only functions excluded from the PVIPR are listed here. > > +The following built-ins convert signed and unsigned vectors of ints and > +long long ints to a vector of 32-bit floating point values. > + > +@smallexample > +vector float __builtin_altivec_float_sisf (vector int); > +vector float __builtin_altivec_uns_float_sisf (vector unsigned int); These functions are to convert vector {un,}signed int to vector float, PVIPR has defined "vec_float" for this kind of conversion. For now, this function only considers VSX: [VEC_FLOAT, vec_float, __builtin_vec_float] vf __builtin_vec_float (vsi); XVCVSXWSP vf __builtin_vec_float (vui); XVCVUXWSP I think we should fix it to have it also supported without VSX but with ALTIVEC. We can change the associated instance XVCVSXWSP with FLOAT_V4SI_V4SF, and update its associated expander floatv4siv4sf2 to consider VSX support, such as: if (<MODE>mode == V4SFmode) { if (VECTOR_UNIT_VSX_P (<MODE>mode)) emit_insn (gen_vsx_floatv4siv4sf2 (operands[0], operands[1])); else emit_insn (gen_altivec_vcfsx (operands[0], operands[1], const0_rtx)); DONE; } (untested), then vec_float can route to altivec_vcfsx with only ALTIVEC but not VSX, and to XVCVSXWSP with VSX supported. Similar for XVCVUXWSP with UNSFLOAT_V4SI_V4SF and expander floatunsv4siv4sf2, and I think we can drop XVCVSXWSP and XVCVUXWSP definitions as well as they gets only used for overloading. > +vector float __builtin_vsx_floate_v2di (vector signed long long int); > +vector float __builtin_vsx_uns_floate_v2di (vector unsigned long long int); These two are instances of overloaded function vec_floate, see the definition of vec_floate below, so I think we shouldn't document them and users should use "vec_floate" which is well defined in PVIPR. [VEC_FLOATE, vec_floate, __builtin_vec_floate] vf __builtin_vec_floate (vsll); FLOATE_V2DI vf __builtin_vec_floate (vull); UNS_FLOATE_V2DI vf __builtin_vec_floate (vd); FLOATE_V2DF > +vector float __builtin_vsx_floato_v2di (vector signed long long int); > +vector float __builtin_vsx_uns_floato_v2di (vector unsigned long long int); Similarly, these are instances of vec_floato, users should use vec_floato instead. > +vector float __builtin_vsx_float2_v2di (vector signed long long int, > + vector signed long long int); > +vector float __builtin_vsx_uns_float2_v2di (vector unsigned long long int, > + vector signed long long int); Similarly, these are instances of vec_float2, users should use vec_float2 instead. BR, Kewen