forked from OSchip/llvm-project
[PATCH] Support select-cc for VSFRC when VSX is enabled
A previous patch enabled SELECT_VSRC and SELECT_CC_VSRC for VSX to handle <2 x double> cases. This patch adds SELECT_VSFRC and SELECT_CC_VSFRC to allow use of all 64 vector-scalar registers for the f64 type when VSX is enabled. The changes are analogous to those in the previous patch. I've added a new variant to vsx.ll to test the code generation. (I also cleaned up a little formatting in PPCInstrVSX.td from the previous patch.) llvm-svn: 220395
This commit is contained in:
parent
b368b7d558
commit
9c54bbd791
|
@ -1322,7 +1322,10 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
else if (N->getValueType(0) == MVT::f32)
|
||||
SelectCCOp = PPC::SELECT_CC_F4;
|
||||
else if (N->getValueType(0) == MVT::f64)
|
||||
SelectCCOp = PPC::SELECT_CC_F8;
|
||||
if (PPCSubTarget->hasVSX())
|
||||
SelectCCOp = PPC::SELECT_CC_VSFRC;
|
||||
else
|
||||
SelectCCOp = PPC::SELECT_CC_F8;
|
||||
else if (N->getValueType(0) == MVT::v2f64 ||
|
||||
N->getValueType(0) == MVT::v2i64)
|
||||
SelectCCOp = PPC::SELECT_CC_VSRC;
|
||||
|
@ -1690,6 +1693,7 @@ void PPCDAGToDAGISel::PeepholeCROps() {
|
|||
case PPC::SELECT_F4:
|
||||
case PPC::SELECT_F8:
|
||||
case PPC::SELECT_VRRC:
|
||||
case PPC::SELECT_VSFRC:
|
||||
case PPC::SELECT_VSRC: {
|
||||
SDValue Op = MachineNode->getOperand(0);
|
||||
if (Op.isMachineOpcode()) {
|
||||
|
@ -1996,6 +2000,7 @@ void PPCDAGToDAGISel::PeepholeCROps() {
|
|||
case PPC::SELECT_F4:
|
||||
case PPC::SELECT_F8:
|
||||
case PPC::SELECT_VRRC:
|
||||
case PPC::SELECT_VSFRC:
|
||||
case PPC::SELECT_VSRC:
|
||||
if (Op1Set)
|
||||
ResNode = MachineNode->getOperand(1).getNode();
|
||||
|
|
|
@ -7062,12 +7062,14 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
|||
MI->getOpcode() == PPC::SELECT_CC_F4 ||
|
||||
MI->getOpcode() == PPC::SELECT_CC_F8 ||
|
||||
MI->getOpcode() == PPC::SELECT_CC_VRRC ||
|
||||
MI->getOpcode() == PPC::SELECT_CC_VSFRC ||
|
||||
MI->getOpcode() == PPC::SELECT_CC_VSRC ||
|
||||
MI->getOpcode() == PPC::SELECT_I4 ||
|
||||
MI->getOpcode() == PPC::SELECT_I8 ||
|
||||
MI->getOpcode() == PPC::SELECT_F4 ||
|
||||
MI->getOpcode() == PPC::SELECT_F8 ||
|
||||
MI->getOpcode() == PPC::SELECT_VRRC ||
|
||||
MI->getOpcode() == PPC::SELECT_VSFRC ||
|
||||
MI->getOpcode() == PPC::SELECT_VSRC) {
|
||||
// The incoming instruction knows the destination vreg to set, the
|
||||
// condition code register to branch on, the true/false values to
|
||||
|
@ -7100,6 +7102,7 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
|||
MI->getOpcode() == PPC::SELECT_F4 ||
|
||||
MI->getOpcode() == PPC::SELECT_F8 ||
|
||||
MI->getOpcode() == PPC::SELECT_VRRC ||
|
||||
MI->getOpcode() == PPC::SELECT_VSFRC ||
|
||||
MI->getOpcode() == PPC::SELECT_VSRC) {
|
||||
BuildMI(BB, dl, TII->get(PPC::BC))
|
||||
.addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
|
||||
|
|
|
@ -717,7 +717,6 @@ let Uses = [RM] in {
|
|||
(outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
|
||||
"xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
|
||||
} // neverHasSideEffects
|
||||
} // AddedComplexity
|
||||
|
||||
// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
|
||||
// instruction selection into a branch sequence.
|
||||
|
@ -728,11 +727,22 @@ let usesCustomInserter = 1, // Expanded after instruction selection.
|
|||
(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",
|
||||
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 SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
|
||||
(ins crrc:$cond, f8rc:$T, f8rc:$F,
|
||||
i32imm:$BROPC), "#SELECT_CC_VSFRC",
|
||||
[]>;
|
||||
def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
|
||||
(ins crbitrc:$cond, f8rc:$T, f8rc:$F),
|
||||
"#SELECT_VSFRC",
|
||||
[(set f64:$dst,
|
||||
(select i1:$cond, f64:$T, f64:$F))]>;
|
||||
} // usesCustomInserter
|
||||
} // AddedComplexity
|
||||
|
||||
def : InstAlias<"xvmovdp $XT, $XB",
|
||||
(XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
|
||||
|
@ -849,6 +859,19 @@ def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
|
|||
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
|
||||
(SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
|
||||
|
||||
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
|
||||
(SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
|
||||
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
|
||||
(SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
|
||||
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
|
||||
(SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
|
||||
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
|
||||
(SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
|
||||
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
|
||||
(SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
|
||||
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
|
||||
(SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
|
||||
|
||||
} // AddedComplexity
|
||||
} // HasVSX
|
||||
|
||||
|
|
|
@ -706,3 +706,14 @@ define <2 x double> @test81(<4 x float> %b) {
|
|||
; CHECK: blr
|
||||
}
|
||||
|
||||
define double @test82(double %a, double %b, double %c, double %d) {
|
||||
entry:
|
||||
%m = fcmp oeq double %c, %d
|
||||
%v = select i1 %m, double %a, double %b
|
||||
ret double %v
|
||||
|
||||
; CHECK-LABEL: @test82
|
||||
; CHECK: xscmpudp [[REG:[0-9]+]], 3, 4
|
||||
; CHECK: beqlr [[REG]]
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue