Hi Segher, Thanks for the review comments!
on 2023/2/16 19:14, Segher Boessenkool wrote: > Hi! > > On Thu, Feb 16, 2023 at 05:23:40PM +0800, Kewen.Lin wrote: >> This patch is to fix the handling with one more pre-insn >> vpopcntb. It also fixes an oversight having V8HI in VEC_IP, >> replaces VParity with VEC_IP, and adjusts the existing >> UNSPEC_PARITY to a more meaningful name UNSPEC_PARITYB. > > Please don't do that. UNSPEC_PARITYB is worse than UNSPEC_PARITY, > even more so for the prtyw etc. instructions. I thought the scalar insns prty[wd] also operate on byte (especially on the least significant bit in each byte), PARITYB(yte) seems better ... > > You might want to express the vector parity insns separately, but then > *do that*, don't rename the normal stuff as well, and use a more obvious > name like UNSPEC_VPARITY please. I'll update for vector only. Maybe it's better with UNSPEC_VPARITY*B*? since the mnemonic has "b"(yte). > >> const vsll __builtin_altivec_vprtybd (vsll); >> - VPRTYBD parityv2di2 {} >> + VPRTYBD p9v_paritybv2di2 {} > > Why this? Please keep the simpler names if at all possible. The bif would like to map with the vector parity byte insns directly, the parity<mode>2 can't work here any more. The name is updated from previous *p9v_parity<mode>2 (becoming to a named define_insn), I noticed there are some names with p8v_, p9v_, meant to keep it consistent with the context. You want this to be simplified as parity*b*v2di2? > >> { >> emit_insn (gen_popcntbsi2 (tmp, src)); >> - emit_insn (gen_paritysi2_cmpb (dst, tmp)); >> + emit_insn (gen_paritybsi2 (dst, tmp)); >> } > > It is completely non-obvious what a "paritybsi2" is. There is no such > thing as a "parityb", not for normal people anyway. It is very > important that names give a hint of what they stand for. > > The _cmpb of the existing name indicates that a cmpb insn is generated > here as well. Has that changed> > I got the same understanding initially, but as you may have noticed there isn't a cmpb, it seems just to be different from the name parity<mode>2 so put the condition as one suffix. >> -(define_insn "parity<mode>2_cmpb" >> +(define_insn "parityb<mode>2" >> [(set (match_operand:GPR 0 "gpc_reg_operand" "=r") >> - (unspec:GPR [(match_operand:GPR 1 "gpc_reg_operand" "r")] >> UNSPEC_PARITY))] >> + (unspec:GPR [(match_operand:GPR 1 "gpc_reg_operand" "r")] >> + UNSPEC_PARITYB))] >> "TARGET_CMPB && TARGET_POPCNTB" >> "prty<wd> %0,%1" >> [(set_attr "type" "popcnt")]) > > Hrm, the original name was not so good apparently. Still, please don't > change multiple independent things in one patch, it makes the patch hard > to read and understand and very hard to spot mistakes in. Got it, good point. > >> @@ -1226,7 +1225,16 @@ (define_expand "popcount<mode>2" >> (define_expand "parity<mode>2" >> [(set (match_operand:VEC_IP 0 "register_operand") >> (parity:VEC_IP (match_operand:VEC_IP 1 "register_operand")))] >> - "TARGET_P9_VECTOR") >> + "TARGET_P9_VECTOR" >> +{ >> + rtx op1 = gen_lowpart (V16QImode, operands[1]); >> + rtx res = gen_reg_rtx (V16QImode); >> + emit_insn (gen_popcountv16qi2 (res, op1)); >> + emit_insn (gen_p9v_parityb<mode>2 (operands[0], >> + gen_lowpart (<MODE>mode, res))); >> + >> + DONE; >> +}) > > So first do a patch that is essentially just this? OK, will update and test it again. > > Later patches can do all other things (also, not do this expand for > TImode at all, ho hum). OK, I guess all the others are for next stage1. :) BR, Kewen