On Wed, Jul 21, 2021 at 5:05 AM Hongtao Liu <crazy...@gmail.com> wrote: > > On Tue, Jul 20, 2021 at 9:41 PM Uros Bizjak <ubiz...@gmail.com> wrote: > > > > On Tue, Jul 20, 2021 at 2:33 PM liuhongt <hongtao....@intel.com> wrote: > > > > > > Hi: > > > As mention in > > > https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575420.html > > > > > > ----cut start----- > > > > note for the lowpart we can just view-convert away the excess bits, > > > > fully re-using the mask. We generate surprisingly "good" code: > > > > > > > > kmovb %k1, %edi > > > > shrb $4, %dil > > > > kmovb %edi, %k2 > > > > > > > > besides the lack of using kshiftrb. I guess we're just lacking > > > > a mask register alternative for > > > Yes, we can do it similar as kor/kand/kxor. > > > ---cut end-------- > > > > > > Bootstrap and regtested on x86_64-linux-gnu{-m32,}. > > > Ok for trunk? > > > > > > gcc/ChangeLog: > > > > > > * config/i386/constraints.md (Wb): New constraint. > > > (Ww): Ditto. > > > * config/i386/i386.md (*ashlhi3_1): Extend to avx512 mask > > > shift. > > > (*ashlqi3_1): Ditto. > > > (*<insn><mode>3_1): Ditto. > > > (*<insn><mode>3_1): Ditto. > > > * config/i386/sse.md (k<code><mode>): New define_split after > > > it to convert generic shift pattern to mask shift ones. > > > > > > gcc/testsuite/ChangeLog: > > > > > > * gcc.target/i386/mask-shift.c: New test.
+(define_insn "*lshr<mode>3_1" + [(set (match_operand:SWI12 0 "nonimmediate_operand" "=<r>m, ?k") + (lshiftrt:SWI12 + (match_operand:SWI12 1 "nonimmediate_operand" "0, k") + (match_operand:QI 2 "nonmemory_operand" "c<S>, <KS>"))) + (clobber (reg:CC FLAGS_REG))] + "ix86_binary_operator_ok (LSHIFTRT, <MODE>mode, operands)" Also split this one to QImode and HImode to avoid conditions in isa attribute. OK with this change. Thanks, Uros.