On Tue, Jan 5, 2021 at 8:04 AM Uros Bizjak <ubiz...@gmail.com> wrote: > > > > +(define_split > > + [(set (match_operand:SI 0 "register_operand") > > + (zero_extend:SI > > + (not:HI > > + (subreg:HI > > + (unspec:SI > > + [(match_operand:V16QI 1 "register_operand")] > > + UNSPEC_MOVMSK) 0))))] > > + "TARGET_SSE2" > > + [(set (match_dup 2) > > + (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK)) > > + (set (match_dup 0) > > + (match_dup 3))] > > Just write: > > (set (match_dup 0) > (xor:SI (match_dup 2)(const_int 65535))
BTW: This could be a universal combine splitter to simplify unsigned int foo (unsigned short z) { return (unsigned short)~z; } Trying 7 -> 8: 7: r87:HI=~r88:SI#0 REG_DEAD r88:SI 8: r86:SI=zero_extend(r87:HI) REG_DEAD r87:HI Failed to match this instruction: (set (reg:SI 86) (zero_extend:SI (not:HI (subreg:HI (reg:SI 88) 0)))) But combine does not "split" to one insns. Uros.