On Tue, Jan 5, 2021 at 8:04 AM Uros Bizjak <[email protected]> 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.