Re: [PATCH v4, rs6000] Change mode and insn condition for VSX scalar extract/insert instructions
Hi Haochen, Sorry for the late reply. on 2022/11/7 14:45, HAO CHEN GUI wrote: > Hi, > For scalar extract/insert instructions, exponent field can be stored in a > 32-bit register. So this patch changes the mode of exponent field from DI to > SI. So these instructions can be generated in a 32-bit environment. The patch > removes TARGET_64BIT check for these instructiions. > > The instructions using DI registers can be invoked with -mpowerpc64 in a > 32-bit environment. The patch changes insn condition from TARGET_64BIT to > TARGET_POWERPC64 for those instructions. > > This patch also changes prototypes and catagories of relevant built-ins and > effective target checks of test cases. > > Compared to last version, main changes are to set catagories of relevant > built-ins from power9-64 to power9 and remove some unnecessary test cases. > Last version: > https://gcc.gnu.org/pipermail/gcc-patches/2022-September/601196.html Nice, but this still missed to update the documentation on scalar_extract_exp and scalar_insert_exp, both are ducumented as "require a 64-bit environment". We need some corresponding updates in gcc/doc/extend.texi. The others look good to me excepting for one nit in test cases ... > > Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. > Is this okay for trunk? Any recommendations? Thanks a lot. > > > ChangeLog > 2022-11-07 Haochen Gui > > gcc/ > * config/rs6000/rs6000-builtins.def > (__builtin_vsx_scalar_extract_exp): Set return type to const unsigned > int and move it from power9-64 to power9 catatlog. > (__builtin_vsx_scalar_extract_sig): Set return type to const unsigned > long long. > (__builtin_vsx_scalar_insert_exp): Set type of second argument to > unsigned int. > (__builtin_vsx_scalar_insert_exp_dp): Set type of second argument to > unsigned int and move it from power9-64 to power9 catatlog. > * config/rs6000/vsx.md (xsxexpdp): Set mode of first operand to > SImode. Remove TARGET_64BIT from insn condition. > (xsxsigdp): Change insn condition from TARGET_64BIT to TARGET_POWERPC64. > (xsiexpdp): Change insn condition from TARGET_64BIT to > TARGET_POWERPC64. Set mode of third operand to SImode. > (xsiexpdpf): Set mode of third operand to SImode. Remove TARGET_64BIT > from insn condition. > > gcc/testsuite/ > * gcc.target/powerpc/bfp/scalar-extract-exp-0.c: Remove lp64 check. > * gcc.target/powerpc/bfp/scalar-extract-exp-1.c: Remove lp64 check. > * gcc.target/powerpc/bfp/scalar-extract-exp-2.c: Deleted as case is > invalid now. > * gcc.target/powerpc/bfp/scalar-extract-exp-6.c: Replace lp64 check > with has_arch_ppc64. > * gcc.target/powerpc/bfp/scalar-extract-sig-0.c: Likewise. > * gcc.target/powerpc/bfp/scalar-extract-sig-6.c: Likewise. > * gcc.target/powerpc/bfp/scalar-insert-exp-0.c: Replace lp64 check > with has_arch_ppc64. Set type of exponent to unsigned int. > * gcc.target/powerpc/bfp/scalar-insert-exp-1.c: Set type of exponent > to unsigned int. > * gcc.target/powerpc/bfp/scalar-insert-exp-12.c: Replace lp64 check > with has_arch_ppc64. Set type of exponent to unsigned int. > * gcc.target/powerpc/bfp/scalar-insert-exp-13.c: Remove lp64 check. > Set type of exponent to unsigned int. > * gcc.target/powerpc/bfp/scalar-insert-exp-2.c: Set type of exponent to > unsigned int. > * gcc.target/powerpc/bfp/scalar-insert-exp-3.c: Remove lp64 check. Set > type of exponent to unsigned int. > * gcc.target/powerpc/bfp/scalar-insert-exp-4.c: Likewise. > * gcc.target/powerpc/bfp/scalar-insert-exp-5.c: Deleted as case is > invalid now. > > patch.diff > diff --git a/gcc/config/rs6000/rs6000-builtins.def > b/gcc/config/rs6000/rs6000-builtins.def > index f76f54793d7..d8d67fa0cad 100644 > --- a/gcc/config/rs6000/rs6000-builtins.def > +++ b/gcc/config/rs6000/rs6000-builtins.def > @@ -2833,6 +2833,11 @@ >const signed int __builtin_dtstsfi_ov_td (const int<6>, _Decimal128); > TSTSFI_OV_TD dfptstsfi_unordered_td {} > > + const unsigned int __builtin_vsx_scalar_extract_exp (double); > +VSEEDP xsxexpdp {} > + > + const double __builtin_vsx_scalar_insert_exp_dp (double, unsigned int); > +VSIEDPF xsiexpdpf {} > > [power9-64] >void __builtin_altivec_xst_len_r (vsc, void *, long); > @@ -2847,19 +2852,13 @@ >pure vsc __builtin_vsx_lxvl (const void *, signed long); > LXVL lxvl {} > > - const signed long __builtin_vsx_scalar_extract_exp (double); > -VSEEDP xsxexpdp {} > - > - const signed long __builtin_vsx_scalar_extract_sig (double); > + const unsigned long long __builtin_vsx_scalar_extract_sig (double); > VSESDP xsxsigdp {} > >const double __builtin_vsx_scalar_insert_exp (unsigned long long, \ > -unsigned long long); > +
[PATCH v4, rs6000] Change mode and insn condition for VSX scalar extract/insert instructions
Hi, For scalar extract/insert instructions, exponent field can be stored in a 32-bit register. So this patch changes the mode of exponent field from DI to SI. So these instructions can be generated in a 32-bit environment. The patch removes TARGET_64BIT check for these instructiions. The instructions using DI registers can be invoked with -mpowerpc64 in a 32-bit environment. The patch changes insn condition from TARGET_64BIT to TARGET_POWERPC64 for those instructions. This patch also changes prototypes and catagories of relevant built-ins and effective target checks of test cases. Compared to last version, main changes are to set catagories of relevant built-ins from power9-64 to power9 and remove some unnecessary test cases. Last version: https://gcc.gnu.org/pipermail/gcc-patches/2022-September/601196.html Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. Is this okay for trunk? Any recommendations? Thanks a lot. ChangeLog 2022-11-07 Haochen Gui gcc/ * config/rs6000/rs6000-builtins.def (__builtin_vsx_scalar_extract_exp): Set return type to const unsigned int and move it from power9-64 to power9 catatlog. (__builtin_vsx_scalar_extract_sig): Set return type to const unsigned long long. (__builtin_vsx_scalar_insert_exp): Set type of second argument to unsigned int. (__builtin_vsx_scalar_insert_exp_dp): Set type of second argument to unsigned int and move it from power9-64 to power9 catatlog. * config/rs6000/vsx.md (xsxexpdp): Set mode of first operand to SImode. Remove TARGET_64BIT from insn condition. (xsxsigdp): Change insn condition from TARGET_64BIT to TARGET_POWERPC64. (xsiexpdp): Change insn condition from TARGET_64BIT to TARGET_POWERPC64. Set mode of third operand to SImode. (xsiexpdpf): Set mode of third operand to SImode. Remove TARGET_64BIT from insn condition. gcc/testsuite/ * gcc.target/powerpc/bfp/scalar-extract-exp-0.c: Remove lp64 check. * gcc.target/powerpc/bfp/scalar-extract-exp-1.c: Remove lp64 check. * gcc.target/powerpc/bfp/scalar-extract-exp-2.c: Deleted as case is invalid now. * gcc.target/powerpc/bfp/scalar-extract-exp-6.c: Replace lp64 check with has_arch_ppc64. * gcc.target/powerpc/bfp/scalar-extract-sig-0.c: Likewise. * gcc.target/powerpc/bfp/scalar-extract-sig-6.c: Likewise. * gcc.target/powerpc/bfp/scalar-insert-exp-0.c: Replace lp64 check with has_arch_ppc64. Set type of exponent to unsigned int. * gcc.target/powerpc/bfp/scalar-insert-exp-1.c: Set type of exponent to unsigned int. * gcc.target/powerpc/bfp/scalar-insert-exp-12.c: Replace lp64 check with has_arch_ppc64. Set type of exponent to unsigned int. * gcc.target/powerpc/bfp/scalar-insert-exp-13.c: Remove lp64 check. Set type of exponent to unsigned int. * gcc.target/powerpc/bfp/scalar-insert-exp-2.c: Set type of exponent to unsigned int. * gcc.target/powerpc/bfp/scalar-insert-exp-3.c: Remove lp64 check. Set type of exponent to unsigned int. * gcc.target/powerpc/bfp/scalar-insert-exp-4.c: Likewise. * gcc.target/powerpc/bfp/scalar-insert-exp-5.c: Deleted as case is invalid now. patch.diff diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def index f76f54793d7..d8d67fa0cad 100644 --- a/gcc/config/rs6000/rs6000-builtins.def +++ b/gcc/config/rs6000/rs6000-builtins.def @@ -2833,6 +2833,11 @@ const signed int __builtin_dtstsfi_ov_td (const int<6>, _Decimal128); TSTSFI_OV_TD dfptstsfi_unordered_td {} + const unsigned int __builtin_vsx_scalar_extract_exp (double); +VSEEDP xsxexpdp {} + + const double __builtin_vsx_scalar_insert_exp_dp (double, unsigned int); +VSIEDPF xsiexpdpf {} [power9-64] void __builtin_altivec_xst_len_r (vsc, void *, long); @@ -2847,19 +2852,13 @@ pure vsc __builtin_vsx_lxvl (const void *, signed long); LXVL lxvl {} - const signed long __builtin_vsx_scalar_extract_exp (double); -VSEEDP xsxexpdp {} - - const signed long __builtin_vsx_scalar_extract_sig (double); + const unsigned long long __builtin_vsx_scalar_extract_sig (double); VSESDP xsxsigdp {} const double __builtin_vsx_scalar_insert_exp (unsigned long long, \ -unsigned long long); + unsigned int); VSIEDP xsiexpdp {} - const double __builtin_vsx_scalar_insert_exp_dp (double, unsigned long long); -VSIEDPF xsiexpdpf {} - pure vsc __builtin_vsx_xl_len_r (void *, signed long); XL_LEN_R xl_len_r {} diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index e226a93bbe5..9d3a2340a79 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -5095,10 +5095,10 @@ (define_insn "xsxexpqp_"