[PATCH] Move xx* builtins to vsx.md.
Move xx* builtins to vsx.md. I originally posted this patch in May. It needed a slight tune up as the souces have changed, so I'm reposting it now. I noticed that the xx built-in functions (xxspltiw, xxspltidp, xxsplti32dx, xxeval, xxblend, and xxpermx) were all defined in altivec.md. However, since the XX instructions can take both traditional floating point and Altivec registers, these built-in functions should be in vsx.md. This patch just moves the insns from altivec.md to vsx.md. I also moved the VM3 mode iterator and VM3_char mode attribute from altivec.md to vsx.md, since the only use of these were for the XXBLEND insns. I have built little endian power9 compilers, little endian power10 compilers, and big endian power8 compilers with this patch applied, and there were no regressions. Can I apply this patch to the master branch? Note this patch assumes the previous patch: Fix xxeval predicates (PR 99921). has been applied. 2021-08-12 Michael Meissner gcc/ * config/rs6000/altivec.md (UNSPEC_XXEVAL): Move to vsx.md. (UNSPEC_XXSPLTIW): Move to vsx.md. (UNSPEC_XXSPLTID): Move to vsx.md. (UNSPEC_XXSPLTI32DX): Move to vsx.md. (UNSPEC_XXBLEND): Move to vsx.md. (UNSPEC_XXPERMX): Move to vsx.md. (VM3): Move to vsx.md. (VM3_char): Move to vsx.md. (xxspltiw_v4si): Move to vsx.md. (xxspltiw_v4sf): Move to vsx.md. (xxspltiw_v4sf_inst): Move to vsx.md. (xxspltidp_v2df): Move to vsx.md. (xxspltidp_v2df_inst): Move to vsx.md. (xxsplti32dx_v4si_inst): Move to vsx.md. (xxsplti32dx_v4sf): Move to vsx.md. (xxsplti32dx_v4sf_inst): Move to vsx.md. (xxblend_): Move to vsx.md. (xxpermx): Move to vsx.md. (xxpermx_inst): Move to vsx.md. * config/rs6000/vsx.md (UNSPEC_XXEVAL): Move from altivec.md. (UNSPEC_XXSPLTIW): Move from altivec.md. (UNSPEC_XXSPLTID): Move from altivec.md. (UNSPEC_XXSPLTI32DX): Move from altivec.md. (UNSPEC_XXBLEND): Move from altivec.md. (UNSPEC_XXPERMX): Move from altivec.md. (VM3): Move from altivec.md. (VM3_char): Move from altivec.md. (xxspltiw_v4si): Move from altivec.md. (xxspltiw_v4sf): Move from altivec.md. (xxspltiw_v4sf_inst): Move from altivec.md. (xxspltidp_v2df): Move from altivec.md. (xxspltidp_v2df_inst): Move from altivec.md. (xxsplti32dx_v4si_inst): Move from altivec.md. (xxsplti32dx_v4sf): Move from altivec.md. (xxsplti32dx_v4sf_inst): Move from altivec.md. (xxblend_): Move from altivec.md. (xxpermx): Move from altivec.md. (xxpermx_inst): Move from altivec.md. --- gcc/config/rs6000/altivec.md | 197 - gcc/config/rs6000/vsx.md | 206 +++ 2 files changed, 206 insertions(+), 197 deletions(-) diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index fd86c300981..2c73ddea823 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -175,16 +175,10 @@ (define_c_enum "unspec" UNSPEC_VPEXTD UNSPEC_VCLRLB UNSPEC_VCLRRB - UNSPEC_XXEVAL UNSPEC_VSTRIR UNSPEC_VSTRIL UNSPEC_SLDB UNSPEC_SRDB - UNSPEC_XXSPLTIW - UNSPEC_XXSPLTID - UNSPEC_XXSPLTI32DX - UNSPEC_XXBLEND - UNSPEC_XXPERMX ]) (define_c_enum "unspecv" @@ -225,21 +219,6 @@ (define_mode_iterator VM2 [V4SI (KF "FLOAT128_VECTOR_P (KFmode)") (TF "FLOAT128_VECTOR_P (TFmode)")]) -;; Like VM2, just do char, short, int, long, float and double -(define_mode_iterator VM3 [V4SI - V8HI - V16QI - V4SF - V2DF - V2DI]) - -(define_mode_attr VM3_char [(V2DI "d") - (V4SI "w") - (V8HI "h") - (V16QI "b") - (V2DF "d") - (V4SF "w")]) - ;; Map the Vector convert single precision to double precision for integer ;; versus floating point (define_mode_attr VS_sxwsp [(V4SI "sxw") (V4SF "sp")]) @@ -859,170 +838,6 @@ (define_insn "vsdb_" "vsdbi %0,%1,%2,%3" [(set_attr "type" "vecsimple")]) -(define_insn "xxspltiw_v4si" - [(set (match_operand:V4SI 0 "register_operand" "=wa") - (unspec:V4SI [(match_operand:SI 1 "s32bit_cint_operand" "n")] -UNSPEC_XXSPLTIW))] - "TARGET_POWER10" - "xxspltiw %x0,%1" - [(set_attr "type" "vecsimple") - (set_attr "prefixed" "yes")]) - -(define_expand "xxspltiw_v4sf" - [(set (match_operand:V4SF 0 "register_operand" "=wa") - (unspec:V4SF [(match_operand:SF 1 "const_double_operand" "n")] -UNSPEC_XXSPLTIW))] - "TARGET_POWER10" -{ - long value = rs6000_const_f32_to_i32 (operands[1]); - emit_insn (gen_xxspltiw_v4
Re: [PATCH] Move xx* builtins to vsx.md.
Hi Mike, On 8/12/21 11:20 PM, Michael Meissner wrote: Move xx* builtins to vsx.md. I originally posted this patch in May. It needed a slight tune up as the souces have changed, so I'm reposting it now. I noticed that the xx built-in functions (xxspltiw, xxspltidp, xxsplti32dx, xxeval, xxblend, and xxpermx) were all defined in altivec.md. However, since the XX instructions can take both traditional floating point and Altivec registers, these built-in functions should be in vsx.md. This patch just moves the insns from altivec.md to vsx.md. I also moved the VM3 mode iterator and VM3_char mode attribute from altivec.md to vsx.md, since the only use of these were for the XXBLEND insns. I have built little endian power9 compilers, little endian power10 compilers, and big endian power8 compilers with this patch applied, and there were no regressions. Can I apply this patch to the master branch? Note this patch assumes the previous patch: Fix xxeval predicates (PR 99921). has been applied. This looks straightforward and fine to me. Recommend approval... Thanks, Bill 2021-08-12 Michael Meissner gcc/ * config/rs6000/altivec.md (UNSPEC_XXEVAL): Move to vsx.md. (UNSPEC_XXSPLTIW): Move to vsx.md. (UNSPEC_XXSPLTID): Move to vsx.md. (UNSPEC_XXSPLTI32DX): Move to vsx.md. (UNSPEC_XXBLEND): Move to vsx.md. (UNSPEC_XXPERMX): Move to vsx.md. (VM3): Move to vsx.md. (VM3_char): Move to vsx.md. (xxspltiw_v4si): Move to vsx.md. (xxspltiw_v4sf): Move to vsx.md. (xxspltiw_v4sf_inst): Move to vsx.md. (xxspltidp_v2df): Move to vsx.md. (xxspltidp_v2df_inst): Move to vsx.md. (xxsplti32dx_v4si_inst): Move to vsx.md. (xxsplti32dx_v4sf): Move to vsx.md. (xxsplti32dx_v4sf_inst): Move to vsx.md. (xxblend_): Move to vsx.md. (xxpermx): Move to vsx.md. (xxpermx_inst): Move to vsx.md. * config/rs6000/vsx.md (UNSPEC_XXEVAL): Move from altivec.md. (UNSPEC_XXSPLTIW): Move from altivec.md. (UNSPEC_XXSPLTID): Move from altivec.md. (UNSPEC_XXSPLTI32DX): Move from altivec.md. (UNSPEC_XXBLEND): Move from altivec.md. (UNSPEC_XXPERMX): Move from altivec.md. (VM3): Move from altivec.md. (VM3_char): Move from altivec.md. (xxspltiw_v4si): Move from altivec.md. (xxspltiw_v4sf): Move from altivec.md. (xxspltiw_v4sf_inst): Move from altivec.md. (xxspltidp_v2df): Move from altivec.md. (xxspltidp_v2df_inst): Move from altivec.md. (xxsplti32dx_v4si_inst): Move from altivec.md. (xxsplti32dx_v4sf): Move from altivec.md. (xxsplti32dx_v4sf_inst): Move from altivec.md. (xxblend_): Move from altivec.md. (xxpermx): Move from altivec.md. (xxpermx_inst): Move from altivec.md. --- gcc/config/rs6000/altivec.md | 197 - gcc/config/rs6000/vsx.md | 206 +++ 2 files changed, 206 insertions(+), 197 deletions(-) diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index fd86c300981..2c73ddea823 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -175,16 +175,10 @@ (define_c_enum "unspec" UNSPEC_VPEXTD UNSPEC_VCLRLB UNSPEC_VCLRRB - UNSPEC_XXEVAL UNSPEC_VSTRIR UNSPEC_VSTRIL UNSPEC_SLDB UNSPEC_SRDB - UNSPEC_XXSPLTIW - UNSPEC_XXSPLTID - UNSPEC_XXSPLTI32DX - UNSPEC_XXBLEND - UNSPEC_XXPERMX ]) (define_c_enum "unspecv" @@ -225,21 +219,6 @@ (define_mode_iterator VM2 [V4SI (KF "FLOAT128_VECTOR_P (KFmode)") (TF "FLOAT128_VECTOR_P (TFmode)")]) -;; Like VM2, just do char, short, int, long, float and double -(define_mode_iterator VM3 [V4SI - V8HI - V16QI - V4SF - V2DF - V2DI]) - -(define_mode_attr VM3_char [(V2DI "d") - (V4SI "w") - (V8HI "h") - (V16QI "b") - (V2DF "d") - (V4SF "w")]) - ;; Map the Vector convert single precision to double precision for integer ;; versus floating point (define_mode_attr VS_sxwsp [(V4SI "sxw") (V4SF "sp")]) @@ -859,170 +838,6 @@ (define_insn "vsdb_" "vsdbi %0,%1,%2,%3" [(set_attr "type" "vecsimple")]) -(define_insn "xxspltiw_v4si" - [(set (match_operand:V4SI 0 "register_operand" "=wa") - (unspec:V4SI [(match_operand:SI 1 "s32bit_cint_operand" "n")] -UNSPEC_XXSPLTIW))] - "TARGET_POWER10" - "xxspltiw %x0,%1" - [(set_attr "type" "vecsimple") - (set_attr "prefixed" "yes")]) - -(define_expand "xxspltiw_v4sf" - [(set (match_operand:V4SF 0 "register_operand" "=wa") - (unspec:V4SF [(match_operand:SF 1 "const_double_ope
Re: [PATCH] Move xx* builtins to vsx.md.
On Fri, Aug 13, 2021 at 12:20 AM Michael Meissner wrote: > > Move xx* builtins to vsx.md. > > I originally posted this patch in May. It needed a slight tune up as the > souces have changed, so I'm reposting it now. > > I noticed that the xx built-in functions (xxspltiw, xxspltidp, xxsplti32dx, > xxeval, xxblend, and xxpermx) were all defined in altivec.md. However, since > the XX instructions can take both traditional floating point and Altivec > registers, these built-in functions should be in vsx.md. > > This patch just moves the insns from altivec.md to vsx.md. > > I also moved the VM3 mode iterator and VM3_char mode attribute from altivec.md > to vsx.md, since the only use of these were for the XXBLEND insns. > > I have built little endian power9 compilers, little endian power10 compilers, > and big endian power8 compilers with this patch applied, and there were no > regressions. Can I apply this patch to the master branch? > > Note this patch assumes the previous patch: > > Fix xxeval predicates (PR 99921). > > has been applied. > > 2021-08-12 Michael Meissner > > gcc/ > * config/rs6000/altivec.md (UNSPEC_XXEVAL): Move to vsx.md. > (UNSPEC_XXSPLTIW): Move to vsx.md. > (UNSPEC_XXSPLTID): Move to vsx.md. > (UNSPEC_XXSPLTI32DX): Move to vsx.md. > (UNSPEC_XXBLEND): Move to vsx.md. > (UNSPEC_XXPERMX): Move to vsx.md. > (VM3): Move to vsx.md. > (VM3_char): Move to vsx.md. > (xxspltiw_v4si): Move to vsx.md. > (xxspltiw_v4sf): Move to vsx.md. > (xxspltiw_v4sf_inst): Move to vsx.md. > (xxspltidp_v2df): Move to vsx.md. > (xxspltidp_v2df_inst): Move to vsx.md. > (xxsplti32dx_v4si_inst): Move to vsx.md. > (xxsplti32dx_v4sf): Move to vsx.md. > (xxsplti32dx_v4sf_inst): Move to vsx.md. > (xxblend_): Move to vsx.md. > (xxpermx): Move to vsx.md. > (xxpermx_inst): Move to vsx.md. > * config/rs6000/vsx.md (UNSPEC_XXEVAL): Move from altivec.md. > (UNSPEC_XXSPLTIW): Move from altivec.md. > (UNSPEC_XXSPLTID): Move from altivec.md. > (UNSPEC_XXSPLTI32DX): Move from altivec.md. > (UNSPEC_XXBLEND): Move from altivec.md. > (UNSPEC_XXPERMX): Move from altivec.md. > (VM3): Move from altivec.md. > (VM3_char): Move from altivec.md. > (xxspltiw_v4si): Move from altivec.md. > (xxspltiw_v4sf): Move from altivec.md. > (xxspltiw_v4sf_inst): Move from altivec.md. > (xxspltidp_v2df): Move from altivec.md. > (xxspltidp_v2df_inst): Move from altivec.md. > (xxsplti32dx_v4si_inst): Move from altivec.md. > (xxsplti32dx_v4sf): Move from altivec.md. > (xxsplti32dx_v4sf_inst): Move from altivec.md. > (xxblend_): Move from altivec.md. > (xxpermx): Move from altivec.md. > (xxpermx_inst): Move from altivec.md Okay. I wanted to give Segher a chance to comment on the structure. You could have used "Same" or "Likewise" in the ChangeLog, but that's fine. Thanks, David
Re: [PATCH] Move xx* builtins to vsx.md.
On Wed, Aug 18, 2021 at 04:42:42PM -0400, David Edelsohn wrote: > I wanted to give Segher a chance to comment on the structure. I think the current vector.md / altivec.md / vsx.md / rs6000.md division is artificial at best. Most of the basic (movement etc.) things are in rs6000.md (and all should be), but nothing else is clear. The name "altivec.md" suggests it is only for the very old things, but it is not used that way, and that it untenable anyway: we have more recent insns to plug holes in that (for example 64-bit integer support), so it arguably is not just for that. Using it for instructions that only work on the high 32 VSRs (i.e. the VRs) is quite artificial as well -- sometimes there are equivalent insns for the other 32 VSRs already, sometimes it is just because of opcode scarcity, sometimes it is because it is for the slow vector unit only (but those seem to live in rs6000.md and crypto.md anyway). Maybe we should give up on dividing these things, and put both in one file, say vector.md? Segher
Re: [PATCH] Move xx* builtins to vsx.md.
On Wed, Aug 18, 2021 at 06:11:03PM -0500, Segher Boessenkool wrote: > On Wed, Aug 18, 2021 at 04:42:42PM -0400, David Edelsohn wrote: > > I wanted to give Segher a chance to comment on the structure. > > I think the current vector.md / altivec.md / vsx.md / rs6000.md > division is artificial at best. Most of the basic (movement etc.) > things are in rs6000.md (and all should be), but nothing else is clear. > > The name "altivec.md" suggests it is only for the very old things, but > it is not used that way, and that it untenable anyway: we have more > recent insns to plug holes in that (for example 64-bit integer support), > so it arguably is not just for that. > > Using it for instructions that only work on the high 32 VSRs (i.e. the > VRs) is quite artificial as well -- sometimes there are equivalent insns > for the other 32 VSRs already, sometimes it is just because of opcode > scarcity, sometimes it is because it is for the slow vector unit only > (but those seem to live in rs6000.md and crypto.md anyway). > > Maybe we should give up on dividing these things, and put both in one > file, say vector.md? Yes but that is more ambitious. Basically I have 2 patches coming that use and update the xxsplti instructions. I can avoid putting in this specific change and reformulate them for altivec.md instead of vsx.md. Or I can check in these changes. Which do you want? I don't want to do both insn movement and new patches at the same time. The original design of vector.md was to allow for alternate vector units, and vector.md was just the define_expands. But the likely hood of new vector units is probably low. When I wrote vsx.md in the power7 days, we were toying with the notion of doing VSX and not Altivec instructions. But I quickly realized you always need Altivec for VSX. In general, I would prefer not to have a flag day where everything gets moved all at once. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797
Re: [PATCH] Move xx* builtins to vsx.md.
On Thu, Aug 19, 2021 at 06:10:46PM -0400, Michael Meissner wrote: > On Wed, Aug 18, 2021 at 06:11:03PM -0500, Segher Boessenkool wrote: > > I think the current vector.md / altivec.md / vsx.md / rs6000.md > > division is artificial at best. Most of the basic (movement etc.) > > things are in rs6000.md (and all should be), but nothing else is clear. > > > > The name "altivec.md" suggests it is only for the very old things, but > > it is not used that way, and that it untenable anyway: we have more > > recent insns to plug holes in that (for example 64-bit integer support), > > so it arguably is not just for that. > > > > Using it for instructions that only work on the high 32 VSRs (i.e. the > > VRs) is quite artificial as well -- sometimes there are equivalent insns > > for the other 32 VSRs already, sometimes it is just because of opcode > > scarcity, sometimes it is because it is for the slow vector unit only > > (but those seem to live in rs6000.md and crypto.md anyway). > > > > Maybe we should give up on dividing these things, and put both in one > > file, say vector.md? > > Yes but that is more ambitious. Absolutely. But setting a destination before starting to walk is sometimes helpful ;-) > Basically I have 2 patches coming that use and > update the xxsplti instructions. I can avoid putting in this specific change > and reformulate them for altivec.md instead of vsx.md. Or I can check in > these > changes. Which do you want? I don't want to do both insn movement and new > patches at the same time. I am fine with this patch, it is a clear improvement already. > The original design of vector.md was to allow for alternate vector units, and > vector.md was just the define_expands. But the likely hood of new vector > units > is probably low. Right, history has caught up with us. > When I wrote vsx.md in the power7 days, we were toying with the notion of > doing > VSX and not Altivec instructions. But I quickly realized you always need > Altivec for VSX. There also were 8-byte vectors back then. Or was that completely separate code? > In general, I would prefer not to have a flag day where everything gets moved > all at once. Yup, it is too easy to make mistakes here, ordering in machine descriptions is significant. Although comparing the generated insn-* files before and after might help. Segher