forked from OSchip/llvm-project
[PowerPC] Support select-cc for VSX
The tests test/CodeGen/Generic/select-cc.ll and test/CodeGen/PowerPC/select-cc.ll both fail with VSX enabled. The problem is that the lowering logic for the SELECT and SELECT_CC operations doesn't currently support the VSX registers. This patch fixes that. In lib/Target/PowerPC/PPCInstrInfo.td, we have pseudos to handle this for other register classes. Similar pseudos are added in PPCInstrVSX.td (they must be there, because the "vsrc" register class definition appears there) for the VSRC register class. The SELECT_VSRC pseudo is then used in pattern matching for SELECT_CC. The rest of the patch just adds logic for SELECT_VSRC wherever similar logic appears for SELECT_VRRC. There are no new test cases because the existing tests above test this, along with a variant in test/CodeGen/PowerPC/vsx.ll. After discussion with Hal, a future patch will add similar _VSFRC variants to override f64 type handling (currently using F8RC). llvm-svn: 220385
This commit is contained in:
parent
4934e4b598
commit
61e652334f
|
@ -1323,6 +1323,9 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
||||||
SelectCCOp = PPC::SELECT_CC_F4;
|
SelectCCOp = PPC::SELECT_CC_F4;
|
||||||
else if (N->getValueType(0) == MVT::f64)
|
else if (N->getValueType(0) == MVT::f64)
|
||||||
SelectCCOp = PPC::SELECT_CC_F8;
|
SelectCCOp = PPC::SELECT_CC_F8;
|
||||||
|
else if (N->getValueType(0) == MVT::v2f64 ||
|
||||||
|
N->getValueType(0) == MVT::v2i64)
|
||||||
|
SelectCCOp = PPC::SELECT_CC_VSRC;
|
||||||
else
|
else
|
||||||
SelectCCOp = PPC::SELECT_CC_VRRC;
|
SelectCCOp = PPC::SELECT_CC_VRRC;
|
||||||
|
|
||||||
|
@ -1686,7 +1689,8 @@ void PPCDAGToDAGISel::PeepholeCROps() {
|
||||||
case PPC::SELECT_I8:
|
case PPC::SELECT_I8:
|
||||||
case PPC::SELECT_F4:
|
case PPC::SELECT_F4:
|
||||||
case PPC::SELECT_F8:
|
case PPC::SELECT_F8:
|
||||||
case PPC::SELECT_VRRC: {
|
case PPC::SELECT_VRRC:
|
||||||
|
case PPC::SELECT_VSRC: {
|
||||||
SDValue Op = MachineNode->getOperand(0);
|
SDValue Op = MachineNode->getOperand(0);
|
||||||
if (Op.isMachineOpcode()) {
|
if (Op.isMachineOpcode()) {
|
||||||
if (Op.getMachineOpcode() == PPC::CRSET)
|
if (Op.getMachineOpcode() == PPC::CRSET)
|
||||||
|
@ -1992,6 +1996,7 @@ void PPCDAGToDAGISel::PeepholeCROps() {
|
||||||
case PPC::SELECT_F4:
|
case PPC::SELECT_F4:
|
||||||
case PPC::SELECT_F8:
|
case PPC::SELECT_F8:
|
||||||
case PPC::SELECT_VRRC:
|
case PPC::SELECT_VRRC:
|
||||||
|
case PPC::SELECT_VSRC:
|
||||||
if (Op1Set)
|
if (Op1Set)
|
||||||
ResNode = MachineNode->getOperand(1).getNode();
|
ResNode = MachineNode->getOperand(1).getNode();
|
||||||
else if (Op1Unset)
|
else if (Op1Unset)
|
||||||
|
|
|
@ -7062,11 +7062,13 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||||
MI->getOpcode() == PPC::SELECT_CC_F4 ||
|
MI->getOpcode() == PPC::SELECT_CC_F4 ||
|
||||||
MI->getOpcode() == PPC::SELECT_CC_F8 ||
|
MI->getOpcode() == PPC::SELECT_CC_F8 ||
|
||||||
MI->getOpcode() == PPC::SELECT_CC_VRRC ||
|
MI->getOpcode() == PPC::SELECT_CC_VRRC ||
|
||||||
|
MI->getOpcode() == PPC::SELECT_CC_VSRC ||
|
||||||
MI->getOpcode() == PPC::SELECT_I4 ||
|
MI->getOpcode() == PPC::SELECT_I4 ||
|
||||||
MI->getOpcode() == PPC::SELECT_I8 ||
|
MI->getOpcode() == PPC::SELECT_I8 ||
|
||||||
MI->getOpcode() == PPC::SELECT_F4 ||
|
MI->getOpcode() == PPC::SELECT_F4 ||
|
||||||
MI->getOpcode() == PPC::SELECT_F8 ||
|
MI->getOpcode() == PPC::SELECT_F8 ||
|
||||||
MI->getOpcode() == PPC::SELECT_VRRC) {
|
MI->getOpcode() == PPC::SELECT_VRRC ||
|
||||||
|
MI->getOpcode() == PPC::SELECT_VSRC) {
|
||||||
// The incoming instruction knows the destination vreg to set, the
|
// The incoming instruction knows the destination vreg to set, the
|
||||||
// condition code register to branch on, the true/false values to
|
// condition code register to branch on, the true/false values to
|
||||||
// select between, and a branch opcode to use.
|
// select between, and a branch opcode to use.
|
||||||
|
@ -7097,7 +7099,8 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||||
MI->getOpcode() == PPC::SELECT_I8 ||
|
MI->getOpcode() == PPC::SELECT_I8 ||
|
||||||
MI->getOpcode() == PPC::SELECT_F4 ||
|
MI->getOpcode() == PPC::SELECT_F4 ||
|
||||||
MI->getOpcode() == PPC::SELECT_F8 ||
|
MI->getOpcode() == PPC::SELECT_F8 ||
|
||||||
MI->getOpcode() == PPC::SELECT_VRRC) {
|
MI->getOpcode() == PPC::SELECT_VRRC ||
|
||||||
|
MI->getOpcode() == PPC::SELECT_VSRC) {
|
||||||
BuildMI(BB, dl, TII->get(PPC::BC))
|
BuildMI(BB, dl, TII->get(PPC::BC))
|
||||||
.addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
|
.addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -719,6 +719,21 @@ let Uses = [RM] in {
|
||||||
} // neverHasSideEffects
|
} // neverHasSideEffects
|
||||||
} // AddedComplexity
|
} // AddedComplexity
|
||||||
|
|
||||||
|
// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
|
||||||
|
// instruction selection into a branch sequence.
|
||||||
|
let usesCustomInserter = 1, // Expanded after instruction selection.
|
||||||
|
PPC970_Single = 1 in {
|
||||||
|
|
||||||
|
def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
|
||||||
|
(ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
|
||||||
|
"#SELECT_CC_VSRC",
|
||||||
|
[]>;
|
||||||
|
def SELECT_VSRC: Pseudo<(outs vsrc:$dst), (ins crbitrc:$cond,
|
||||||
|
vsrc:$T, vsrc:$F), "#SELECT_VSRC",
|
||||||
|
[(set v2f64:$dst,
|
||||||
|
(select i1:$cond, v2f64:$T, v2f64:$F))]>;
|
||||||
|
}
|
||||||
|
|
||||||
def : InstAlias<"xvmovdp $XT, $XB",
|
def : InstAlias<"xvmovdp $XT, $XB",
|
||||||
(XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
|
(XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
|
||||||
def : InstAlias<"xvmovsp $XT, $XB",
|
def : InstAlias<"xvmovsp $XT, $XB",
|
||||||
|
@ -820,6 +835,20 @@ def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
|
||||||
def : Pat<(store v4i32:$rS, xoaddr:$dst),
|
def : Pat<(store v4i32:$rS, xoaddr:$dst),
|
||||||
(STXVW4X $rS, xoaddr:$dst)>;
|
(STXVW4X $rS, xoaddr:$dst)>;
|
||||||
|
|
||||||
|
// Selects.
|
||||||
|
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
|
||||||
|
(SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
|
||||||
|
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
|
||||||
|
(SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
|
||||||
|
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
|
||||||
|
(SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
|
||||||
|
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
|
||||||
|
(SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
|
||||||
|
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
|
||||||
|
(SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
|
||||||
|
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
|
||||||
|
(SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
|
||||||
|
|
||||||
} // AddedComplexity
|
} // AddedComplexity
|
||||||
} // HasVSX
|
} // HasVSX
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue