summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Mips/MipsISelLowering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/Mips/MipsISelLowering.cpp')
-rw-r--r--llvm/lib/Target/Mips/MipsISelLowering.cpp80
1 files changed, 62 insertions, 18 deletions
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp
index 694ff9b4943..1c4a5446f69 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.cpp
+++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp
@@ -265,7 +265,8 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
// Without this, every float setcc comes with a AND/OR with the result,
// we don't want this, since the fpcmp result goes to a flag register,
// which is used implicitly by brcond and select operations.
- AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
+ AddPromotedToType(ISD::SETCC, MVT::i1,
+ ABI.AreGprs64bit() ? MVT::i64 : MVT::i32);
// Mips Custom Operations
setOperationAction(ISD::BR_JT, MVT::Other, Custom);
@@ -462,9 +463,10 @@ MipsTargetLowering::createFastISel(FunctionLoweringInfo &funcInfo,
EVT MipsTargetLowering::getSetCCResultType(const DataLayout &, LLVMContext &,
EVT VT) const {
- if (!VT.isVector())
- return MVT::i32;
- return VT.changeVectorElementTypeToInteger();
+ if (VT.isVector())
+ return VT.changeVectorElementTypeToInteger();
+
+ return ABI.AreGprs64bit() ? MVT::i64 : MVT::i32;
}
static SDValue performDivRemCombine(SDNode *N, SelectionDAG &DAG,
@@ -627,19 +629,19 @@ static SDValue performSELECTCombine(SDNode *N, SelectionDAG &DAG,
if (!TrueC || !True.getValueType().isInteger())
return SDValue();
- // We'll also ignore MVT::i64 operands as this optimizations proves
- // to be ineffective because of the required sign extensions as the result
- // of a SETCC operator is always MVT::i32 for non-vector types.
- if (True.getValueType() == MVT::i64)
- return SDValue();
-
int64_t Diff = TrueC->getSExtValue() - FalseC->getSExtValue();
// 1) (a < x) ? y : y-1
// slti $reg1, a, x
// addiu $reg2, $reg1, y-1
- if (Diff == 1)
- return DAG.getNode(ISD::ADD, DL, SetCC.getValueType(), SetCC, False);
+ if (Diff == 1) {
+ if (SetCC.getValueType().getSizeInBits() >
+ False.getValueType().getSizeInBits())
+ SetCC = DAG.getNode(ISD::TRUNCATE, DL, False.getValueType(), SetCC);
+
+ SDValue Ret = DAG.getNode(ISD::ADD, DL, False.getValueType(), SetCC, False);
+ return Ret;
+ }
// 2) (a < x) ? y-1 : y
// slti $reg1, a, x
@@ -649,6 +651,11 @@ static SDValue performSELECTCombine(SDNode *N, SelectionDAG &DAG,
ISD::CondCode CC = cast<CondCodeSDNode>(SetCC.getOperand(2))->get();
SetCC = DAG.getSetCC(DL, SetCC.getValueType(), SetCC.getOperand(0),
SetCC.getOperand(1), ISD::getSetCCInverse(CC, true));
+
+ if (SetCC.getValueType().getSizeInBits() >
+ True.getValueType().getSizeInBits())
+ SetCC = DAG.getNode(ISD::TRUNCATE, DL, True.getValueType(), SetCC);
+
return DAG.getNode(ISD::ADD, DL, SetCC.getValueType(), SetCC, True);
}
@@ -1027,19 +1034,30 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
return insertDivByZeroTrap(MI, *BB, *Subtarget.getInstrInfo(), true);
case Mips::SEL_D:
return emitSEL_D(MI, BB);
+ case Mips::SEL64_S:
+ return emitSEL64_S(MI, BB);
case Mips::PseudoSELECT_I:
case Mips::PseudoSELECT_I64:
case Mips::PseudoSELECT_S:
case Mips::PseudoSELECT_D32:
case Mips::PseudoSELECT_D64:
- return emitPseudoSELECT(MI, BB, false, Mips::BNE);
+ // 64-bit version
+ case Mips::PseudoSELECT64_I:
+ case Mips::PseudoSELECT64_I64:
+ case Mips::PseudoSELECT64_S:
+ case Mips::PseudoSELECT64_D32:
+ case Mips::PseudoSELECT64_D64:
+ return emitPseudoSELECT(MI, BB, false,
+ Subtarget.isGP32bit() ? Mips::BNE : Mips::BNE64);
+
case Mips::PseudoSELECTFP_F_I:
case Mips::PseudoSELECTFP_F_I64:
case Mips::PseudoSELECTFP_F_S:
case Mips::PseudoSELECTFP_F_D32:
case Mips::PseudoSELECTFP_F_D64:
return emitPseudoSELECT(MI, BB, true, Mips::BC1F);
+
case Mips::PseudoSELECTFP_T_I:
case Mips::PseudoSELECTFP_T_I64:
case Mips::PseudoSELECTFP_T_S:
@@ -1574,6 +1592,30 @@ MachineBasicBlock *MipsTargetLowering::emitSEL_D(MachineInstr *MI,
return BB;
}
+MachineBasicBlock *
+MipsTargetLowering::emitSEL64_S(MachineInstr *MI, MachineBasicBlock *BB) const {
+ MachineFunction *MF = BB->getParent();
+ const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
+ const TargetInstrInfo *TII = Subtarget.getInstrInfo();
+ MachineRegisterInfo &RegInfo = MF->getRegInfo();
+ DebugLoc DL = MI->getDebugLoc();
+ MachineBasicBlock::iterator II(MI);
+
+ unsigned Fc64 = MI->getOperand(1).getReg();
+
+ const auto &FGR32RegClass = TRI->getRegClass(Mips::FGR32RegClassID);
+ unsigned Fc32 = RegInfo.createVirtualRegister(FGR32RegClass);
+
+ BuildMI(*BB, II, DL, TII->get(Mips::COPY), Fc32)
+ .addReg(Fc64, 0, Mips::sub_lo);
+
+ // We don't erase the original instruction, we just replace the condition
+ // register with the 32-bit sub-register.
+ MI->getOperand(1).setReg(Fc32);
+
+ return BB;
+}
+
//===----------------------------------------------------------------------===//
// Misc Lower Operation implementation
//===----------------------------------------------------------------------===//
@@ -1655,8 +1697,10 @@ SDValue MipsTargetLowering::lowerSETCC(SDValue Op, SelectionDAG &DAG) const {
"Floating point operand expected.");
SDLoc DL(Op);
- SDValue True = DAG.getConstant(1, DL, MVT::i32);
- SDValue False = DAG.getConstant(0, DL, MVT::i32);
+ EVT VT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
+ Op.getValueType());
+ SDValue True = DAG.getConstant(1, DL, VT);
+ SDValue False = DAG.getConstant(0, DL, VT);
return createCMovFP(DAG, Cond, True, False, DL);
}
@@ -3910,9 +3954,9 @@ MipsTargetLowering::emitPseudoSELECT(MachineInstr *MI, MachineBasicBlock *BB,
} else {
// bne rs, $0, sinkMBB
BuildMI(BB, DL, TII->get(Opc))
- .addReg(MI->getOperand(1).getReg())
- .addReg(Mips::ZERO)
- .addMBB(sinkMBB);
+ .addReg(MI->getOperand(1).getReg())
+ .addReg(ABI.GetZeroReg())
+ .addMBB(sinkMBB);
}
// copy0MBB:
OpenPOWER on IntegriCloud