forked from OSchip/llvm-project
So that we can include target lowering in the subtarget, remove include
circular dependency with the subtarget by inlining accessor methods and outlining a routine. llvm-svn: 212234
This commit is contained in:
parent
5899e19def
commit
bf33a3cf70
|
@ -251,7 +251,7 @@ MipsTargetLowering::MipsTargetLowering(MipsTargetMachine &TM)
|
|||
setOperationAction(ISD::FCOPYSIGN, MVT::f64, Custom);
|
||||
setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom);
|
||||
|
||||
if (isGP64bit()) {
|
||||
if (Subtarget->isGP64bit()) {
|
||||
setOperationAction(ISD::GlobalAddress, MVT::i64, Custom);
|
||||
setOperationAction(ISD::BlockAddress, MVT::i64, Custom);
|
||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i64, Custom);
|
||||
|
@ -263,14 +263,14 @@ MipsTargetLowering::MipsTargetLowering(MipsTargetMachine &TM)
|
|||
setOperationAction(ISD::FP_TO_SINT, MVT::i64, Custom);
|
||||
}
|
||||
|
||||
if (!isGP64bit()) {
|
||||
if (!Subtarget->isGP64bit()) {
|
||||
setOperationAction(ISD::SHL_PARTS, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SRA_PARTS, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SRL_PARTS, MVT::i32, Custom);
|
||||
}
|
||||
|
||||
setOperationAction(ISD::ADD, MVT::i32, Custom);
|
||||
if (isGP64bit())
|
||||
if (Subtarget->isGP64bit())
|
||||
setOperationAction(ISD::ADD, MVT::i64, Custom);
|
||||
|
||||
setOperationAction(ISD::SDIV, MVT::i32, Expand);
|
||||
|
@ -369,7 +369,7 @@ MipsTargetLowering::MipsTargetLowering(MipsTargetMachine &TM)
|
|||
if (!Subtarget->hasMips64r2())
|
||||
setOperationAction(ISD::BSWAP, MVT::i64, Expand);
|
||||
|
||||
if (isGP64bit()) {
|
||||
if (Subtarget->isGP64bit()) {
|
||||
setLoadExtAction(ISD::SEXTLOAD, MVT::i32, Custom);
|
||||
setLoadExtAction(ISD::ZEXTLOAD, MVT::i32, Custom);
|
||||
setLoadExtAction(ISD::EXTLOAD, MVT::i32, Custom);
|
||||
|
@ -385,12 +385,13 @@ MipsTargetLowering::MipsTargetLowering(MipsTargetMachine &TM)
|
|||
setTargetDAGCombine(ISD::OR);
|
||||
setTargetDAGCombine(ISD::ADD);
|
||||
|
||||
setMinFunctionAlignment(isGP64bit() ? 3 : 2);
|
||||
setMinFunctionAlignment(Subtarget->isGP64bit() ? 3 : 2);
|
||||
|
||||
setStackPointerRegisterToSaveRestore(isN64() ? Mips::SP_64 : Mips::SP);
|
||||
setStackPointerRegisterToSaveRestore(Subtarget->isABI_N64() ? Mips::SP_64
|
||||
: Mips::SP);
|
||||
|
||||
setExceptionPointerRegister(isN64() ? Mips::A0_64 : Mips::A0);
|
||||
setExceptionSelectorRegister(isN64() ? Mips::A1_64 : Mips::A1);
|
||||
setExceptionPointerRegister(Subtarget->isABI_N64() ? Mips::A0_64 : Mips::A0);
|
||||
setExceptionSelectorRegister(Subtarget->isABI_N64() ? Mips::A1_64 : Mips::A1);
|
||||
|
||||
MaxStoresPerMemcpy = 16;
|
||||
|
||||
|
@ -1484,7 +1485,8 @@ SDValue MipsTargetLowering::lowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
|
|||
0);
|
||||
Chain = Addr.getValue(1);
|
||||
|
||||
if ((getTargetMachine().getRelocationModel() == Reloc::PIC_) || isN64()) {
|
||||
if ((getTargetMachine().getRelocationModel() == Reloc::PIC_) ||
|
||||
Subtarget->isABI_N64()) {
|
||||
// For PIC, the sequence is:
|
||||
// BRIND(load(Jumptable + index) + RelocBase)
|
||||
// RelocBase can be JumpTable, GOT or some sort of global base.
|
||||
|
@ -1568,7 +1570,8 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
|
|||
GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op);
|
||||
const GlobalValue *GV = N->getGlobal();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !isN64()) {
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget->isABI_N64()) {
|
||||
const MipsTargetObjectFile &TLOF =
|
||||
(const MipsTargetObjectFile&)getObjFileLowering();
|
||||
|
||||
|
@ -1587,15 +1590,18 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
|
|||
}
|
||||
|
||||
if (GV->hasInternalLinkage() || (GV->hasLocalLinkage() && !isa<Function>(GV)))
|
||||
return getAddrLocal(N, Ty, DAG, isN32() || isN64());
|
||||
return getAddrLocal(N, Ty, DAG,
|
||||
Subtarget->isABI_N32() || Subtarget->isABI_N64());
|
||||
|
||||
if (LargeGOT)
|
||||
return getAddrGlobalLargeGOT(N, Ty, DAG, MipsII::MO_GOT_HI16,
|
||||
MipsII::MO_GOT_LO16, DAG.getEntryNode(),
|
||||
MachinePointerInfo::getGOT());
|
||||
|
||||
return getAddrGlobal(N, Ty, DAG, (isN32() || isN64()) ? MipsII::MO_GOT_DISP
|
||||
: MipsII::MO_GOT16,
|
||||
return getAddrGlobal(N, Ty, DAG,
|
||||
(Subtarget->isABI_N32() || Subtarget->isABI_N64())
|
||||
? MipsII::MO_GOT_DISP
|
||||
: MipsII::MO_GOT16,
|
||||
DAG.getEntryNode(), MachinePointerInfo::getGOT());
|
||||
}
|
||||
|
||||
|
@ -1604,10 +1610,12 @@ SDValue MipsTargetLowering::lowerBlockAddress(SDValue Op,
|
|||
BlockAddressSDNode *N = cast<BlockAddressSDNode>(Op);
|
||||
EVT Ty = Op.getValueType();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !isN64())
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget->isABI_N64())
|
||||
return getAddrNonPIC(N, Ty, DAG);
|
||||
|
||||
return getAddrLocal(N, Ty, DAG, isN32() || isN64());
|
||||
return getAddrLocal(N, Ty, DAG,
|
||||
Subtarget->isABI_N32() || Subtarget->isABI_N64());
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::
|
||||
|
@ -1695,10 +1703,12 @@ lowerJumpTable(SDValue Op, SelectionDAG &DAG) const
|
|||
JumpTableSDNode *N = cast<JumpTableSDNode>(Op);
|
||||
EVT Ty = Op.getValueType();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !isN64())
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget->isABI_N64())
|
||||
return getAddrNonPIC(N, Ty, DAG);
|
||||
|
||||
return getAddrLocal(N, Ty, DAG, isN32() || isN64());
|
||||
return getAddrLocal(N, Ty, DAG,
|
||||
Subtarget->isABI_N32() || Subtarget->isABI_N64());
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::
|
||||
|
@ -1716,10 +1726,12 @@ lowerConstantPool(SDValue Op, SelectionDAG &DAG) const
|
|||
ConstantPoolSDNode *N = cast<ConstantPoolSDNode>(Op);
|
||||
EVT Ty = Op.getValueType();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !isN64())
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget->isABI_N64())
|
||||
return getAddrNonPIC(N, Ty, DAG);
|
||||
|
||||
return getAddrLocal(N, Ty, DAG, isN32() || isN64());
|
||||
return getAddrLocal(N, Ty, DAG,
|
||||
Subtarget->isABI_N32() || Subtarget->isABI_N64());
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
@ -1850,8 +1862,9 @@ lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
|
|||
MFI->setFrameAddressIsTaken(true);
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc DL(Op);
|
||||
SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), DL,
|
||||
isN64() ? Mips::FP_64 : Mips::FP, VT);
|
||||
SDValue FrameAddr =
|
||||
DAG.getCopyFromReg(DAG.getEntryNode(), DL,
|
||||
Subtarget->isABI_N64() ? Mips::FP_64 : Mips::FP, VT);
|
||||
return FrameAddr;
|
||||
}
|
||||
|
||||
|
@ -1867,7 +1880,7 @@ SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op,
|
|||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MVT VT = Op.getSimpleValueType();
|
||||
unsigned RA = isN64() ? Mips::RA_64 : Mips::RA;
|
||||
unsigned RA = Subtarget->isABI_N64() ? Mips::RA_64 : Mips::RA;
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
// Return RA, which contains the return address. Mark it an implicit live-in.
|
||||
|
@ -1889,12 +1902,12 @@ SDValue MipsTargetLowering::lowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
|
|||
SDValue Offset = Op.getOperand(1);
|
||||
SDValue Handler = Op.getOperand(2);
|
||||
SDLoc DL(Op);
|
||||
EVT Ty = isN64() ? MVT::i64 : MVT::i32;
|
||||
EVT Ty = Subtarget->isABI_N64() ? MVT::i64 : MVT::i32;
|
||||
|
||||
// Store stack offset in V1, store jump target in V0. Glue CopyToReg and
|
||||
// EH_RETURN nodes, so that instructions are emitted back-to-back.
|
||||
unsigned OffsetReg = isN64() ? Mips::V1_64 : Mips::V1;
|
||||
unsigned AddrReg = isN64() ? Mips::V0_64 : Mips::V0;
|
||||
unsigned OffsetReg = Subtarget->isABI_N64() ? Mips::V1_64 : Mips::V1;
|
||||
unsigned AddrReg = Subtarget->isABI_N64() ? Mips::V0_64 : Mips::V0;
|
||||
Chain = DAG.getCopyToReg(Chain, DL, OffsetReg, Offset, SDValue());
|
||||
Chain = DAG.getCopyToReg(Chain, DL, AddrReg, Handler, Chain.getValue(1));
|
||||
return DAG.getNode(MipsISD::EH_RETURN, DL, MVT::Other, Chain,
|
||||
|
@ -2322,8 +2335,8 @@ getOpndList(SmallVectorImpl<SDValue> &Ops,
|
|||
// in PIC mode) allow symbols to be resolved via lazy binding.
|
||||
// The lazy binding stub requires GP to point to the GOT.
|
||||
if (IsPICCall && !InternalLinkage) {
|
||||
unsigned GPReg = isN64() ? Mips::GP_64 : Mips::GP;
|
||||
EVT Ty = isN64() ? MVT::i64 : MVT::i32;
|
||||
unsigned GPReg = Subtarget->isABI_N64() ? Mips::GP_64 : Mips::GP;
|
||||
EVT Ty = Subtarget->isABI_N64() ? MVT::i64 : MVT::i32;
|
||||
RegsToPass.push_back(std::make_pair(GPReg, getGlobalReg(CLI.DAG, Ty)));
|
||||
}
|
||||
|
||||
|
@ -2392,8 +2405,8 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||
getTargetMachine(), ArgLocs, *DAG.getContext());
|
||||
MipsCC::SpecialCallingConvType SpecialCallingConv =
|
||||
getSpecialCallingConv(Callee);
|
||||
MipsCC MipsCCInfo(CallConv, isO32(), Subtarget->isFP64bit(), CCInfo,
|
||||
SpecialCallingConv);
|
||||
MipsCC MipsCCInfo(CallConv, Subtarget->isABI_O32(), Subtarget->isFP64bit(),
|
||||
CCInfo, SpecialCallingConv);
|
||||
|
||||
MipsCCInfo.analyzeCallOperands(Outs, IsVarArg,
|
||||
Subtarget->mipsSEUsesSoftFloat(),
|
||||
|
@ -2426,7 +2439,8 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||
Chain = DAG.getCALLSEQ_START(Chain, NextStackOffsetVal, DL);
|
||||
|
||||
SDValue StackPtr = DAG.getCopyFromReg(
|
||||
Chain, DL, isN64() ? Mips::SP_64 : Mips::SP, getPointerTy());
|
||||
Chain, DL, Subtarget->isABI_N64() ? Mips::SP_64 : Mips::SP,
|
||||
getPointerTy());
|
||||
|
||||
// With EABI is it possible to have 16 args on registers.
|
||||
std::deque< std::pair<unsigned, SDValue> > RegsToPass;
|
||||
|
@ -2512,8 +2526,9 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||
// If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
|
||||
// direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
|
||||
// node so that legalize doesn't hack it.
|
||||
bool IsPICCall = (isN64() || IsPIC); // true if calls are translated to
|
||||
// jalr $25
|
||||
bool IsPICCall =
|
||||
(Subtarget->isABI_N64() || IsPIC); // true if calls are translated to
|
||||
// jalr $25
|
||||
bool GlobalOrExternal = false, InternalLinkage = false;
|
||||
SDValue CalleeLo;
|
||||
EVT Ty = Callee.getValueType();
|
||||
|
@ -2524,7 +2539,8 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||
InternalLinkage = Val->hasInternalLinkage();
|
||||
|
||||
if (InternalLinkage)
|
||||
Callee = getAddrLocal(G, Ty, DAG, isN32() || isN64());
|
||||
Callee = getAddrLocal(G, Ty, DAG,
|
||||
Subtarget->isABI_N32() || Subtarget->isABI_N64());
|
||||
else if (LargeGOT)
|
||||
Callee = getAddrGlobalLargeGOT(G, Ty, DAG, MipsII::MO_CALL_HI16,
|
||||
MipsII::MO_CALL_LO16, Chain,
|
||||
|
@ -2540,7 +2556,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||
else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
const char *Sym = S->getSymbol();
|
||||
|
||||
if (!isN64() && !IsPIC) // !N64 && static
|
||||
if (!Subtarget->isABI_N64() && !IsPIC) // !N64 && static
|
||||
Callee = DAG.getTargetExternalSymbol(Sym, getPointerTy(),
|
||||
MipsII::MO_NO_FLAG);
|
||||
else if (LargeGOT)
|
||||
|
@ -2591,7 +2607,8 @@ MipsTargetLowering::LowerCallResult(SDValue Chain, SDValue InFlag,
|
|||
SmallVector<CCValAssign, 16> RVLocs;
|
||||
CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(),
|
||||
getTargetMachine(), RVLocs, *DAG.getContext());
|
||||
MipsCC MipsCCInfo(CallConv, isO32(), Subtarget->isFP64bit(), CCInfo);
|
||||
MipsCC MipsCCInfo(CallConv, Subtarget->isABI_O32(), Subtarget->isFP64bit(),
|
||||
CCInfo);
|
||||
|
||||
MipsCCInfo.analyzeCallResult(Ins, Subtarget->mipsSEUsesSoftFloat(),
|
||||
CallNode, RetTy);
|
||||
|
@ -2638,7 +2655,8 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(),
|
||||
getTargetMachine(), ArgLocs, *DAG.getContext());
|
||||
MipsCC MipsCCInfo(CallConv, isO32(), Subtarget->isFP64bit(), CCInfo);
|
||||
MipsCC MipsCCInfo(CallConv, Subtarget->isABI_O32(), Subtarget->isFP64bit(),
|
||||
CCInfo);
|
||||
Function::const_arg_iterator FuncArg =
|
||||
DAG.getMachineFunction().getFunction()->arg_begin();
|
||||
bool UseSoftFloat = Subtarget->mipsSEUsesSoftFloat();
|
||||
|
@ -2700,7 +2718,8 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
(RegVT == MVT::i64 && ValVT == MVT::f64) ||
|
||||
(RegVT == MVT::f64 && ValVT == MVT::i64))
|
||||
ArgValue = DAG.getNode(ISD::BITCAST, DL, ValVT, ArgValue);
|
||||
else if (isO32() && RegVT == MVT::i32 && ValVT == MVT::f64) {
|
||||
else if (Subtarget->isABI_O32() && RegVT == MVT::i32 &&
|
||||
ValVT == MVT::f64) {
|
||||
unsigned Reg2 = addLiveIn(DAG.getMachineFunction(),
|
||||
getNextIntArgReg(ArgReg), RC);
|
||||
SDValue ArgValue2 = DAG.getCopyFromReg(Chain, DL, Reg2, RegVT);
|
||||
|
@ -2738,7 +2757,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
unsigned Reg = MipsFI->getSRetReturnReg();
|
||||
if (!Reg) {
|
||||
Reg = MF.getRegInfo().createVirtualRegister(
|
||||
getRegClassFor(isN64() ? MVT::i64 : MVT::i32));
|
||||
getRegClassFor(Subtarget->isABI_N64() ? MVT::i64 : MVT::i32));
|
||||
MipsFI->setSRetReturnReg(Reg);
|
||||
}
|
||||
SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[i]);
|
||||
|
@ -2789,7 +2808,8 @@ MipsTargetLowering::LowerReturn(SDValue Chain,
|
|||
// CCState - Info about the registers and stack slot.
|
||||
CCState CCInfo(CallConv, IsVarArg, MF, getTargetMachine(), RVLocs,
|
||||
*DAG.getContext());
|
||||
MipsCC MipsCCInfo(CallConv, isO32(), Subtarget->isFP64bit(), CCInfo);
|
||||
MipsCC MipsCCInfo(CallConv, Subtarget->isABI_O32(), Subtarget->isFP64bit(),
|
||||
CCInfo);
|
||||
|
||||
// Analyze return values.
|
||||
MipsCCInfo.analyzeReturn(Outs, Subtarget->mipsSEUsesSoftFloat(),
|
||||
|
@ -2825,7 +2845,7 @@ MipsTargetLowering::LowerReturn(SDValue Chain,
|
|||
if (!Reg)
|
||||
llvm_unreachable("sret virtual register not created in the entry block");
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy());
|
||||
unsigned V0 = isN64() ? Mips::V0_64 : Mips::V0;
|
||||
unsigned V0 = Subtarget->isABI_N64() ? Mips::V0_64 : Mips::V0;
|
||||
|
||||
Chain = DAG.getCopyToReg(Chain, DL, V0, Val, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
|
@ -3046,9 +3066,9 @@ getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const
|
|||
return std::make_pair(0U, &Mips::CPU16RegsRegClass);
|
||||
return std::make_pair(0U, &Mips::GPR32RegClass);
|
||||
}
|
||||
if (VT == MVT::i64 && !isGP64bit())
|
||||
if (VT == MVT::i64 && !Subtarget->isGP64bit())
|
||||
return std::make_pair(0U, &Mips::GPR32RegClass);
|
||||
if (VT == MVT::i64 && isGP64bit())
|
||||
if (VT == MVT::i64 && Subtarget->isGP64bit())
|
||||
return std::make_pair(0U, &Mips::GPR64RegClass);
|
||||
// This will generate an error message
|
||||
return std::make_pair(0U, nullptr);
|
||||
|
@ -3235,7 +3255,7 @@ bool MipsTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
|
|||
}
|
||||
|
||||
unsigned MipsTargetLowering::getJumpTableEncoding() const {
|
||||
if (isN64())
|
||||
if (Subtarget->isABI_N64())
|
||||
return MachineJumpTableInfo::EK_GPRel64BlockAddress;
|
||||
|
||||
return TargetLowering::getJumpTableEncoding();
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||
#include "Mips.h"
|
||||
#include "MipsSubtarget.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
@ -210,6 +209,7 @@ namespace llvm {
|
|||
// TargetLowering Implementation
|
||||
//===--------------------------------------------------------------------===//
|
||||
class MipsFunctionInfo;
|
||||
class MipsSubtarget;
|
||||
|
||||
class MipsTargetLowering : public TargetLowering {
|
||||
bool isMicroMips;
|
||||
|
@ -438,12 +438,6 @@ namespace llvm {
|
|||
// Subtarget Info
|
||||
const MipsSubtarget *Subtarget;
|
||||
|
||||
bool hasMips64() const { return Subtarget->hasMips64(); }
|
||||
bool isGP64bit() const { return Subtarget->isGP64bit(); }
|
||||
bool isO32() const { return Subtarget->isABI_O32(); }
|
||||
bool isN32() const { return Subtarget->isABI_N32(); }
|
||||
bool isN64() const { return Subtarget->isABI_N64(); }
|
||||
|
||||
private:
|
||||
// Create a TargetGlobalAddress node.
|
||||
SDValue getTargetNode(GlobalAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
|
||||
|
|
|
@ -39,7 +39,7 @@ MipsSETargetLowering::MipsSETargetLowering(MipsTargetMachine &TM)
|
|||
// Set up the register classes
|
||||
addRegisterClass(MVT::i32, &Mips::GPR32RegClass);
|
||||
|
||||
if (isGP64bit())
|
||||
if (Subtarget->isGP64bit())
|
||||
addRegisterClass(MVT::i64, &Mips::GPR64RegClass);
|
||||
|
||||
if (Subtarget->hasDSP() || Subtarget->hasMSA()) {
|
||||
|
@ -120,10 +120,10 @@ MipsSETargetLowering::MipsSETargetLowering(MipsTargetMachine &TM)
|
|||
|
||||
if (Subtarget->hasCnMips())
|
||||
setOperationAction(ISD::MUL, MVT::i64, Legal);
|
||||
else if (isGP64bit())
|
||||
else if (Subtarget->isGP64bit())
|
||||
setOperationAction(ISD::MUL, MVT::i64, Custom);
|
||||
|
||||
if (isGP64bit()) {
|
||||
if (Subtarget->isGP64bit()) {
|
||||
setOperationAction(ISD::MULHS, MVT::i64, Custom);
|
||||
setOperationAction(ISD::MULHU, MVT::i64, Custom);
|
||||
}
|
||||
|
@ -230,6 +230,14 @@ llvm::createMipsSETargetLowering(MipsTargetMachine &TM) {
|
|||
return new MipsSETargetLowering(TM);
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
MipsSETargetLowering::getRepRegClassFor(MVT VT) const {
|
||||
if (VT == MVT::Untyped)
|
||||
return Subtarget->hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
|
||||
|
||||
return TargetLowering::getRepRegClassFor(VT);
|
||||
}
|
||||
|
||||
// Enable MSA support for the given integer type and Register class.
|
||||
void MipsSETargetLowering::
|
||||
addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC) {
|
||||
|
@ -1724,7 +1732,7 @@ SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op,
|
|||
case Intrinsic::mips_copy_s_w:
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
|
||||
case Intrinsic::mips_copy_s_d:
|
||||
if (hasMips64())
|
||||
if (Subtarget->hasMips64())
|
||||
// Lower directly into VEXTRACT_SEXT_ELT since i64 is legal on Mips64.
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
|
||||
else {
|
||||
|
@ -1739,7 +1747,7 @@ SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op,
|
|||
case Intrinsic::mips_copy_u_w:
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
|
||||
case Intrinsic::mips_copy_u_d:
|
||||
if (hasMips64())
|
||||
if (Subtarget->hasMips64())
|
||||
// Lower directly into VEXTRACT_ZEXT_ELT since i64 is legal on Mips64.
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
|
||||
else {
|
||||
|
@ -3016,8 +3024,8 @@ MipsSETargetLowering::emitINSERT_DF_VIDX(MachineInstr *MI,
|
|||
unsigned SrcValReg = MI->getOperand(3).getReg();
|
||||
|
||||
const TargetRegisterClass *VecRC = nullptr;
|
||||
const TargetRegisterClass *GPRRC = isGP64bit() ? &Mips::GPR64RegClass
|
||||
: &Mips::GPR32RegClass;
|
||||
const TargetRegisterClass *GPRRC =
|
||||
Subtarget->isGP64bit() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
|
||||
unsigned EltLog2Size;
|
||||
unsigned InsertOp = 0;
|
||||
unsigned InsveOp = 0;
|
||||
|
|
|
@ -46,13 +46,7 @@ namespace llvm {
|
|||
return false;
|
||||
}
|
||||
|
||||
const TargetRegisterClass *getRepRegClassFor(MVT VT) const override {
|
||||
if (VT == MVT::Untyped)
|
||||
return Subtarget->hasDSP() ? &Mips::ACC64DSPRegClass :
|
||||
&Mips::ACC64RegClass;
|
||||
|
||||
return TargetLowering::getRepRegClassFor(VT);
|
||||
}
|
||||
const TargetRegisterClass *getRepRegClassFor(MVT VT) const override;
|
||||
|
||||
private:
|
||||
bool isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo,
|
||||
|
|
Loading…
Reference in New Issue