Teach Legalize how to scalarize VSETCC
Teach X86 a few more vsetcc patterns. Custom lowering for unsupported ones is next. llvm-svn: 51009
This commit is contained in:
parent
b980f6fb3d
commit
b87e63a730
|
@ -7117,6 +7117,16 @@ SDOperand SelectionDAGLegalize::ScalarizeVectorOp(SDOperand Op) {
|
||||||
ScalarizeVectorOp(Op.getOperand(1)),
|
ScalarizeVectorOp(Op.getOperand(1)),
|
||||||
ScalarizeVectorOp(Op.getOperand(2)));
|
ScalarizeVectorOp(Op.getOperand(2)));
|
||||||
break;
|
break;
|
||||||
|
case ISD::VSETCC: {
|
||||||
|
SDOperand Op0 = ScalarizeVectorOp(Op.getOperand(0));
|
||||||
|
SDOperand Op1 = ScalarizeVectorOp(Op.getOperand(1));
|
||||||
|
Result = DAG.getNode(ISD::SETCC, TLI.getSetCCResultType(Op0), Op0, Op1,
|
||||||
|
Op.getOperand(2));
|
||||||
|
Result = DAG.getNode(ISD::SELECT, NewVT, Result,
|
||||||
|
DAG.getConstant(-1ULL, NewVT),
|
||||||
|
DAG.getConstant(0ULL, NewVT));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TLI.isTypeLegal(NewVT))
|
if (TLI.isTypeLegal(NewVT))
|
||||||
|
|
|
@ -1966,6 +1966,33 @@ defm PCMPGTB : PDI_binop_rm_int<0x64, "pcmpgtb", int_x86_sse2_pcmpgt_b>;
|
||||||
defm PCMPGTW : PDI_binop_rm_int<0x65, "pcmpgtw", int_x86_sse2_pcmpgt_w>;
|
defm PCMPGTW : PDI_binop_rm_int<0x65, "pcmpgtw", int_x86_sse2_pcmpgt_w>;
|
||||||
defm PCMPGTD : PDI_binop_rm_int<0x66, "pcmpgtd", int_x86_sse2_pcmpgt_d>;
|
defm PCMPGTD : PDI_binop_rm_int<0x66, "pcmpgtd", int_x86_sse2_pcmpgt_d>;
|
||||||
|
|
||||||
|
def : Pat<(v16i8 (vsetcc (v16i8 VR128:$src1), VR128:$src2, SETEQ)),
|
||||||
|
(PCMPEQBrr VR128:$src1, VR128:$src2)>;
|
||||||
|
def : Pat<(v16i8 (vsetcc (v16i8 VR128:$src1), (memop addr:$src2), SETEQ)),
|
||||||
|
(PCMPEQBrm VR128:$src1, addr:$src2)>;
|
||||||
|
def : Pat<(v8i16 (vsetcc (v8i16 VR128:$src1), VR128:$src2, SETEQ)),
|
||||||
|
(PCMPEQWrr VR128:$src1, VR128:$src2)>;
|
||||||
|
def : Pat<(v8i16 (vsetcc (v8i16 VR128:$src1), (memop addr:$src2), SETEQ)),
|
||||||
|
(PCMPEQWrm VR128:$src1, addr:$src2)>;
|
||||||
|
def : Pat<(v4i32 (vsetcc (v4i32 VR128:$src1), VR128:$src2, SETEQ)),
|
||||||
|
(PCMPEQDrr VR128:$src1, VR128:$src2)>;
|
||||||
|
def : Pat<(v4i32 (vsetcc (v4i32 VR128:$src1), (memop addr:$src2), SETEQ)),
|
||||||
|
(PCMPEQDrm VR128:$src1, addr:$src2)>;
|
||||||
|
|
||||||
|
def : Pat<(v16i8 (vsetcc (v16i8 VR128:$src1), VR128:$src2, SETGT)),
|
||||||
|
(PCMPGTBrr VR128:$src1, VR128:$src2)>;
|
||||||
|
def : Pat<(v16i8 (vsetcc (v16i8 VR128:$src1), (memop addr:$src2), SETGT)),
|
||||||
|
(PCMPGTBrm VR128:$src1, addr:$src2)>;
|
||||||
|
def : Pat<(v8i16 (vsetcc (v8i16 VR128:$src1), VR128:$src2, SETGT)),
|
||||||
|
(PCMPGTWrr VR128:$src1, VR128:$src2)>;
|
||||||
|
def : Pat<(v8i16 (vsetcc (v8i16 VR128:$src1), (memop addr:$src2), SETGT)),
|
||||||
|
(PCMPGTWrm VR128:$src1, addr:$src2)>;
|
||||||
|
def : Pat<(v4i32 (vsetcc (v4i32 VR128:$src1), VR128:$src2, SETGT)),
|
||||||
|
(PCMPGTDrr VR128:$src1, VR128:$src2)>;
|
||||||
|
def : Pat<(v4i32 (vsetcc (v4i32 VR128:$src1), (memop addr:$src2), SETGT)),
|
||||||
|
(PCMPGTDrm VR128:$src1, addr:$src2)>;
|
||||||
|
|
||||||
|
|
||||||
// Pack instructions
|
// Pack instructions
|
||||||
defm PACKSSWB : PDI_binop_rm_int<0x63, "packsswb", int_x86_sse2_packsswb_128>;
|
defm PACKSSWB : PDI_binop_rm_int<0x63, "packsswb", int_x86_sse2_packsswb_128>;
|
||||||
defm PACKSSDW : PDI_binop_rm_int<0x6B, "packssdw", int_x86_sse2_packssdw_128>;
|
defm PACKSSDW : PDI_binop_rm_int<0x6B, "packssdw", int_x86_sse2_packssdw_128>;
|
||||||
|
|
Loading…
Reference in New Issue