diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -5048,6 +5048,32 @@ PCC |= getBranchHint(PCC, FuncInfo, N->getOperand(4)); SDValue CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC, dl); + + if (PPCSubTarget->hasSPE() && + N->getOperand(2).getValueType().isFloatingPoint()) { + // For SPE instructions, the result is in GT bit of the CR + switch (CC) { + case ISD::SETOEQ: + case ISD::SETEQ: + case ISD::SETOLT: + case ISD::SETLT: + case ISD::SETOGT: + case ISD::SETGT: + PCC = PPC::PRED_GT; + break; + case ISD::SETUNE: + case ISD::SETNE: + case ISD::SETULE: + case ISD::SETLE: + case ISD::SETUGE: + case ISD::SETGE: + PCC = PPC::PRED_LE; + break; + default: + break; + } + } + SDValue Ops[] = { getI32Imm(PCC, dl), CondCode, N->getOperand(4), N->getOperand(0) }; CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops);