mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Remove most of the TargetMachine::getSubtarget/getSubtargetImpl
calls that don't take a Function argument from Mips. Notable exceptions: the AsmPrinter and MipsTargetObjectFile. The latter needs to be fixed, and the former will be fixed when the general AsmPrinter changes happen. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227512 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
370056ca5d
commit
2d64c553b4
@ -22,7 +22,6 @@ namespace llvm {
|
||||
class MipsTargetMachine;
|
||||
class FunctionPass;
|
||||
|
||||
FunctionPass *createMipsISelDag(MipsTargetMachine &TM);
|
||||
FunctionPass *createMipsOptimizePICCallPass(MipsTargetMachine &TM);
|
||||
FunctionPass *createMipsDelaySlotFillerPass(MipsTargetMachine &TM);
|
||||
FunctionPass *createMipsLongBranchPass(MipsTargetMachine &TM);
|
||||
|
@ -36,7 +36,7 @@ void Mips16FrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const Mips16InstrInfo &TII =
|
||||
*static_cast<const Mips16InstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
*static_cast<const Mips16InstrInfo *>(STI.getInstrInfo());
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
|
||||
uint64_t StackSize = MFI->getStackSize();
|
||||
@ -84,7 +84,7 @@ void Mips16FrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const Mips16InstrInfo &TII =
|
||||
*static_cast<const Mips16InstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
*static_cast<const Mips16InstrInfo *>(STI.getInstrInfo());
|
||||
DebugLoc dl = MBBI->getDebugLoc();
|
||||
uint64_t StackSize = MFI->getStackSize();
|
||||
|
||||
@ -154,7 +154,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
Amount = -Amount;
|
||||
|
||||
const Mips16InstrInfo &TII =
|
||||
*static_cast<const Mips16InstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
*static_cast<const Mips16InstrInfo *>(STI.getInstrInfo());
|
||||
|
||||
TII.adjustStackPtr(Mips::SP, Amount, MBB, I);
|
||||
}
|
||||
@ -174,7 +174,7 @@ void Mips16FrameLowering::
|
||||
processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
RegScavenger *RS) const {
|
||||
const Mips16InstrInfo &TII =
|
||||
*static_cast<const Mips16InstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
*static_cast<const Mips16InstrInfo *>(STI.getInstrInfo());
|
||||
const MipsRegisterInfo &RI = TII.getRegisterInfo();
|
||||
const BitVector Reserved = RI.getReservedRegs(MF);
|
||||
bool SaveS2 = Reserved[Mips::S2];
|
||||
|
@ -37,7 +37,7 @@ using namespace llvm;
|
||||
#define DEBUG_TYPE "mips-isel"
|
||||
|
||||
bool Mips16DAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||
Subtarget = &TM.getSubtarget<MipsSubtarget>();
|
||||
Subtarget = &static_cast<const MipsSubtarget &>(MF.getSubtarget());
|
||||
if (!Subtarget->inMips16Mode())
|
||||
return false;
|
||||
return MipsDAGToDAGISel::runOnMachineFunction(MF);
|
||||
@ -72,7 +72,7 @@ void Mips16DAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
|
||||
MachineBasicBlock &MBB = MF.front();
|
||||
MachineBasicBlock::iterator I = MBB.begin();
|
||||
MachineRegisterInfo &RegInfo = MF.getRegInfo();
|
||||
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
|
||||
const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
|
||||
DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
|
||||
unsigned V0, V1, V2, GlobalBaseReg = MipsFI->getGlobalBaseReg();
|
||||
const TargetRegisterClass *RC = &Mips::CPU16RegsRegClass;
|
||||
@ -102,7 +102,7 @@ void Mips16DAGToDAGISel::initMips16SPAliasReg(MachineFunction &MF) {
|
||||
|
||||
MachineBasicBlock &MBB = MF.front();
|
||||
MachineBasicBlock::iterator I = MBB.begin();
|
||||
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
|
||||
const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
|
||||
DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
|
||||
unsigned Mips16SPAliasReg = MipsFI->getMips16SPAliasReg();
|
||||
|
||||
@ -134,7 +134,7 @@ void Mips16DAGToDAGISel::getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg) {
|
||||
switch (SD->getMemoryVT().getSizeInBits()) {
|
||||
case 8:
|
||||
case 16:
|
||||
AliasReg = TM.getSubtargetImpl()->getFrameLowering()->hasFP(*MF)
|
||||
AliasReg = Subtarget->getFrameLowering()->hasFP(*MF)
|
||||
? AliasFPReg
|
||||
: getMips16SPAliasReg();
|
||||
return;
|
||||
@ -146,7 +146,7 @@ void Mips16DAGToDAGISel::getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg) {
|
||||
switch (SD->getMemoryVT().getSizeInBits()) {
|
||||
case 8:
|
||||
case 16:
|
||||
AliasReg = TM.getSubtargetImpl()->getFrameLowering()->hasFP(*MF)
|
||||
AliasReg = Subtarget->getFrameLowering()->hasFP(*MF)
|
||||
? AliasFPReg
|
||||
: getMips16SPAliasReg();
|
||||
return;
|
||||
|
@ -522,8 +522,7 @@ MachineBasicBlock *Mips16TargetLowering::
|
||||
emitSel16(unsigned Opc, MachineInstr *MI, MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
// To "insert" a SELECT_CC instruction, we actually have to insert the
|
||||
// diamond control-flow pattern. The incoming instruction knows the
|
||||
@ -580,13 +579,12 @@ emitSel16(unsigned Opc, MachineInstr *MI, MachineBasicBlock *BB) const {
|
||||
return BB;
|
||||
}
|
||||
|
||||
MachineBasicBlock *Mips16TargetLowering::emitSelT16
|
||||
(unsigned Opc1, unsigned Opc2,
|
||||
MachineInstr *MI, MachineBasicBlock *BB) const {
|
||||
MachineBasicBlock *
|
||||
Mips16TargetLowering::emitSelT16(unsigned Opc1, unsigned Opc2, MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
// To "insert" a SELECT_CC instruction, we actually have to insert the
|
||||
// diamond control-flow pattern. The incoming instruction knows the
|
||||
@ -645,13 +643,13 @@ MachineBasicBlock *Mips16TargetLowering::emitSelT16
|
||||
|
||||
}
|
||||
|
||||
MachineBasicBlock *Mips16TargetLowering::emitSeliT16
|
||||
(unsigned Opc1, unsigned Opc2,
|
||||
MachineInstr *MI, MachineBasicBlock *BB) const {
|
||||
MachineBasicBlock *
|
||||
Mips16TargetLowering::emitSeliT16(unsigned Opc1, unsigned Opc2,
|
||||
MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
// To "insert" a SELECT_CC instruction, we actually have to insert the
|
||||
// diamond control-flow pattern. The incoming instruction knows the
|
||||
@ -710,14 +708,13 @@ MachineBasicBlock *Mips16TargetLowering::emitSeliT16
|
||||
|
||||
}
|
||||
|
||||
MachineBasicBlock
|
||||
*Mips16TargetLowering::emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
|
||||
MachineBasicBlock *
|
||||
Mips16TargetLowering::emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
|
||||
MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
unsigned regX = MI->getOperand(0).getReg();
|
||||
unsigned regY = MI->getOperand(1).getReg();
|
||||
MachineBasicBlock *target = MI->getOperand(2).getMBB();
|
||||
@ -733,8 +730,7 @@ MachineBasicBlock *Mips16TargetLowering::emitFEXT_T8I8I16_ins(
|
||||
MachineInstr *MI, MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
unsigned regX = MI->getOperand(0).getReg();
|
||||
int64_t imm = MI->getOperand(1).getImm();
|
||||
MachineBasicBlock *target = MI->getOperand(2).getMBB();
|
||||
@ -763,13 +759,12 @@ static unsigned Mips16WhichOp8uOr16simm
|
||||
llvm_unreachable("immediate field not usable");
|
||||
}
|
||||
|
||||
MachineBasicBlock *Mips16TargetLowering::emitFEXT_CCRX16_ins(
|
||||
unsigned SltOpc,
|
||||
MachineInstr *MI, MachineBasicBlock *BB) const {
|
||||
MachineBasicBlock *
|
||||
Mips16TargetLowering::emitFEXT_CCRX16_ins(unsigned SltOpc, MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
unsigned CC = MI->getOperand(0).getReg();
|
||||
unsigned regX = MI->getOperand(1).getReg();
|
||||
unsigned regY = MI->getOperand(2).getReg();
|
||||
@ -781,13 +776,13 @@ MachineBasicBlock *Mips16TargetLowering::emitFEXT_CCRX16_ins(
|
||||
return BB;
|
||||
}
|
||||
|
||||
MachineBasicBlock *Mips16TargetLowering::emitFEXT_CCRXI16_ins(
|
||||
unsigned SltiOpc, unsigned SltiXOpc,
|
||||
MachineInstr *MI, MachineBasicBlock *BB )const {
|
||||
MachineBasicBlock *
|
||||
Mips16TargetLowering::emitFEXT_CCRXI16_ins(unsigned SltiOpc, unsigned SltiXOpc,
|
||||
MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
if (DontExpandCondPseudos16)
|
||||
return BB;
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
unsigned CC = MI->getOperand(0).getReg();
|
||||
unsigned regX = MI->getOperand(1).getReg();
|
||||
int64_t Imm = MI->getOperand(2).getImm();
|
||||
|
@ -65,7 +65,7 @@ bool Mips16RegisterInfo::saveScavengerRegister
|
||||
const TargetRegisterClass *RC,
|
||||
unsigned Reg) const {
|
||||
DebugLoc DL;
|
||||
const TargetInstrInfo &TII = *MBB.getParent()->getSubtarget().getInstrInfo();
|
||||
const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
|
||||
TII.copyPhysReg(MBB, I, DL, Mips::T0, Reg, true);
|
||||
TII.copyPhysReg(MBB, UseMI, DL, Reg, Mips::T0, true);
|
||||
return true;
|
||||
@ -106,7 +106,7 @@ void Mips16RegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
|
||||
if (FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI)
|
||||
FrameReg = Mips::SP;
|
||||
else {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
|
||||
if (TFI->hasFP(MF)) {
|
||||
FrameReg = Mips::S0;
|
||||
}
|
||||
@ -140,8 +140,7 @@ void Mips16RegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
|
||||
DebugLoc DL = II->getDebugLoc();
|
||||
unsigned NewImm;
|
||||
const Mips16InstrInfo &TII =
|
||||
*static_cast<const Mips16InstrInfo *>(
|
||||
MBB.getParent()->getSubtarget().getInstrInfo());
|
||||
*static_cast<const Mips16InstrInfo *>(Subtarget.getInstrInfo());
|
||||
FrameReg = TII.loadImmediate(FrameReg, Offset, MBB, II, DL, NewImm);
|
||||
Offset = SignExtend64<16>(NewImm);
|
||||
IsKill = true;
|
||||
|
@ -448,14 +448,12 @@ bool MipsConstantIslands::runOnMachineFunction(MachineFunction &mf) {
|
||||
// FIXME:
|
||||
MF = &mf;
|
||||
MCP = mf.getConstantPool();
|
||||
STI = &mf.getTarget().getSubtarget<MipsSubtarget>();
|
||||
STI = &static_cast<const MipsSubtarget &>(mf.getSubtarget());
|
||||
DEBUG(dbgs() << "constant island machine function " << "\n");
|
||||
if (!STI->inMips16Mode() || !MipsSubtarget::useConstantIslands()) {
|
||||
return false;
|
||||
}
|
||||
TII = (const Mips16InstrInfo *)MF->getTarget()
|
||||
.getSubtargetImpl()
|
||||
->getInstrInfo();
|
||||
TII = (const Mips16InstrInfo *)STI->getInstrInfo();
|
||||
MFI = MF->getInfo<MipsFunctionInfo>();
|
||||
DEBUG(dbgs() << "constant island processing " << "\n");
|
||||
//
|
||||
|
@ -69,7 +69,7 @@ namespace {
|
||||
|
||||
class RegDefsUses {
|
||||
public:
|
||||
RegDefsUses(TargetMachine &TM);
|
||||
RegDefsUses(const TargetRegisterInfo &TRI);
|
||||
void init(const MachineInstr &MI);
|
||||
|
||||
/// This function sets all caller-saved registers in Defs.
|
||||
@ -278,11 +278,7 @@ static void addLiveInRegs(Iter Filler, MachineBasicBlock &MBB) {
|
||||
|
||||
#ifndef NDEBUG
|
||||
const MachineFunction &MF = *MBB.getParent();
|
||||
assert(MF.getTarget()
|
||||
.getSubtargetImpl()
|
||||
->getRegisterInfo()
|
||||
->getAllocatableSet(MF)
|
||||
.test(R) &&
|
||||
assert(MF.getSubtarget().getRegisterInfo()->getAllocatableSet(MF).test(R) &&
|
||||
"Shouldn't move an instruction with unallocatable registers across "
|
||||
"basic block boundaries.");
|
||||
#endif
|
||||
@ -292,9 +288,8 @@ static void addLiveInRegs(Iter Filler, MachineBasicBlock &MBB) {
|
||||
}
|
||||
}
|
||||
|
||||
RegDefsUses::RegDefsUses(TargetMachine &TM)
|
||||
: TRI(*TM.getSubtargetImpl()->getRegisterInfo()),
|
||||
Defs(TRI.getNumRegs(), false), Uses(TRI.getNumRegs(), false) {}
|
||||
RegDefsUses::RegDefsUses(const TargetRegisterInfo &TRI)
|
||||
: TRI(TRI), Defs(TRI.getNumRegs(), false), Uses(TRI.getNumRegs(), false) {}
|
||||
|
||||
void RegDefsUses::init(const MachineInstr &MI) {
|
||||
// Add all register operands which are explicit and non-variadic.
|
||||
@ -500,8 +495,8 @@ getUnderlyingObjects(const MachineInstr &MI,
|
||||
// Replace Branch with the compact branch instruction.
|
||||
Iter Filler::replaceWithCompactBranch(MachineBasicBlock &MBB,
|
||||
Iter Branch, DebugLoc DL) {
|
||||
const MipsInstrInfo *TII= static_cast<const MipsInstrInfo *>(
|
||||
TM.getSubtargetImpl()->getInstrInfo());
|
||||
const MipsInstrInfo *TII = static_cast<const MipsInstrInfo *>(
|
||||
MBB.getParent()->getSubtarget().getInstrInfo());
|
||||
|
||||
unsigned NewOpcode =
|
||||
(((unsigned) Branch->getOpcode()) == Mips::BEQ) ? Mips::BEQZC_MM
|
||||
@ -543,9 +538,10 @@ static int getEquivalentCallShort(int Opcode) {
|
||||
/// We assume there is only one delay slot per delayed instruction.
|
||||
bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
|
||||
bool Changed = false;
|
||||
bool InMicroMipsMode = TM.getSubtarget<MipsSubtarget>().inMicroMipsMode();
|
||||
const MipsInstrInfo *TII =
|
||||
static_cast<const MipsInstrInfo *>(TM.getSubtargetImpl()->getInstrInfo());
|
||||
const MipsSubtarget &STI =
|
||||
static_cast<const MipsSubtarget &>(MBB.getParent()->getSubtarget());
|
||||
bool InMicroMipsMode = STI.inMicroMipsMode();
|
||||
const MipsInstrInfo *TII = STI.getInstrInfo();
|
||||
|
||||
for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
|
||||
if (!hasUnoccupiedSlot(&*I))
|
||||
@ -627,7 +623,8 @@ bool Filler::searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
|
||||
if (delayHasHazard(*I, RegDU, IM))
|
||||
continue;
|
||||
|
||||
if (TM.getSubtarget<MipsSubtarget>().isTargetNaCl()) {
|
||||
if (static_cast<const MipsSubtarget &>(MBB.getParent()->getSubtarget())
|
||||
.isTargetNaCl()) {
|
||||
// In NaCl, instructions that must be masked are forbidden in delay slots.
|
||||
// We only check for loads, stores and SP changes. Calls, returns and
|
||||
// branches are not checked because non-NaCl targets never put them in
|
||||
@ -660,7 +657,7 @@ bool Filler::searchBackward(MachineBasicBlock &MBB, Iter Slot) const {
|
||||
if (DisableBackwardSearch)
|
||||
return false;
|
||||
|
||||
RegDefsUses RegDU(TM);
|
||||
RegDefsUses RegDU(*MBB.getParent()->getSubtarget().getRegisterInfo());
|
||||
MemDefsUses MemDU(MBB.getParent()->getFrameInfo());
|
||||
ReverseIter Filler;
|
||||
|
||||
@ -681,7 +678,7 @@ bool Filler::searchForward(MachineBasicBlock &MBB, Iter Slot) const {
|
||||
if (DisableForwardSearch || !Slot->isCall())
|
||||
return false;
|
||||
|
||||
RegDefsUses RegDU(TM);
|
||||
RegDefsUses RegDU(*MBB.getParent()->getSubtarget().getRegisterInfo());
|
||||
NoMemInstr NM;
|
||||
Iter Filler;
|
||||
|
||||
@ -705,7 +702,7 @@ bool Filler::searchSuccBBs(MachineBasicBlock &MBB, Iter Slot) const {
|
||||
if (!SuccBB)
|
||||
return false;
|
||||
|
||||
RegDefsUses RegDU(TM);
|
||||
RegDefsUses RegDU(*MBB.getParent()->getSubtarget().getRegisterInfo());
|
||||
bool HasMultipleSuccs = false;
|
||||
BB2BrMap BrMap;
|
||||
std::unique_ptr<InspectMemInstr> IM;
|
||||
@ -757,8 +754,8 @@ MachineBasicBlock *Filler::selectSuccBB(MachineBasicBlock &B) const {
|
||||
|
||||
std::pair<MipsInstrInfo::BranchType, MachineInstr *>
|
||||
Filler::getBranch(MachineBasicBlock &MBB, const MachineBasicBlock &Dst) const {
|
||||
const MipsInstrInfo *TII =
|
||||
static_cast<const MipsInstrInfo *>(TM.getSubtargetImpl()->getInstrInfo());
|
||||
const MipsInstrInfo *TII = static_cast<const MipsInstrInfo *>(
|
||||
MBB.getParent()->getSubtarget().getInstrInfo());
|
||||
MachineBasicBlock *TrueBB = nullptr, *FalseBB = nullptr;
|
||||
SmallVector<MachineInstr*, 2> BranchInstrs;
|
||||
SmallVector<MachineOperand, 2> Cond;
|
||||
|
@ -60,9 +60,9 @@ class MipsFastISel final : public FastISel {
|
||||
/// Subtarget - Keep a pointer to the MipsSubtarget around so that we can
|
||||
/// make the right decision when generating code for different targets.
|
||||
const TargetMachine &TM;
|
||||
const MipsSubtarget *Subtarget;
|
||||
const TargetInstrInfo &TII;
|
||||
const TargetLowering &TLI;
|
||||
const MipsSubtarget *Subtarget;
|
||||
MipsFunctionInfo *MFI;
|
||||
|
||||
// Convenience variables to avoid some queries.
|
||||
@ -157,9 +157,9 @@ public:
|
||||
explicit MipsFastISel(FunctionLoweringInfo &funcInfo,
|
||||
const TargetLibraryInfo *libInfo)
|
||||
: FastISel(funcInfo, libInfo), TM(funcInfo.MF->getTarget()),
|
||||
TII(*TM.getSubtargetImpl()->getInstrInfo()),
|
||||
TLI(*TM.getSubtargetImpl()->getTargetLowering()),
|
||||
Subtarget(&TM.getSubtarget<MipsSubtarget>()) {
|
||||
Subtarget(
|
||||
&static_cast<const MipsSubtarget &>(funcInfo.MF->getSubtarget())),
|
||||
TII(*Subtarget->getInstrInfo()), TLI(*Subtarget->getTargetLowering()) {
|
||||
MFI = funcInfo.MF->getInfo<MipsFunctionInfo>();
|
||||
Context = &funcInfo.Fn->getContext();
|
||||
TargetSupported = ((TM.getRelocationModel() == Reloc::PIC_) &&
|
||||
|
@ -100,7 +100,7 @@ bool MipsFrameLowering::hasFP(const MachineFunction &MF) const {
|
||||
|
||||
uint64_t MipsFrameLowering::estimateStackSize(const MachineFunction &MF) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
|
||||
const TargetRegisterInfo &TRI = *STI.getRegisterInfo();
|
||||
|
||||
int64_t Offset = 0;
|
||||
|
||||
|
@ -47,7 +47,7 @@ using namespace llvm;
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
bool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||
Subtarget = &TM.getSubtarget<MipsSubtarget>();
|
||||
Subtarget = &static_cast<const MipsSubtarget &>(MF.getSubtarget());
|
||||
bool Ret = SelectionDAGISel::runOnMachineFunction(MF);
|
||||
|
||||
processFunctionAfterISel(MF);
|
||||
@ -230,12 +230,3 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode,
|
||||
OutOps.push_back(Op);
|
||||
return false;
|
||||
}
|
||||
|
||||
/// createMipsISelDag - This pass converts a legalized DAG into a
|
||||
/// MIPS-specific DAG, ready for instruction scheduling.
|
||||
FunctionPass *llvm::createMipsISelDag(MipsTargetMachine &TM) {
|
||||
if (TM.getSubtargetImpl()->inMips16Mode())
|
||||
return llvm::createMips16ISelDag(TM);
|
||||
|
||||
return llvm::createMipsSEISelDag(TM);
|
||||
}
|
||||
|
@ -125,11 +125,6 @@ private:
|
||||
char ConstraintCode,
|
||||
std::vector<SDValue> &OutOps) override;
|
||||
};
|
||||
|
||||
/// createMipsISelDag - This pass converts a legalized DAG into a
|
||||
/// MIPS-specific DAG, ready for instruction scheduling.
|
||||
FunctionPass *createMipsISelDag(MipsTargetMachine &TM);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -203,7 +203,7 @@ const char *MipsTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
|
||||
MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
|
||||
const MipsSubtarget &STI)
|
||||
: TargetLowering(TM), Subtarget(STI) {
|
||||
: TargetLowering(TM), Subtarget(STI), ABI(TM.getABI()) {
|
||||
// Mips does not have i1 type, so use i32 for
|
||||
// setcc operations results (slt, sgt, ...).
|
||||
setBooleanContents(ZeroOrOneBooleanContent);
|
||||
@ -393,14 +393,12 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
|
||||
|
||||
// The arguments on the stack are defined in terms of 4-byte slots on O32
|
||||
// and 8-byte slots on N32/N64.
|
||||
setMinStackArgumentAlignment(
|
||||
(Subtarget.isABI_N32() || Subtarget.isABI_N64()) ? 8 : 4);
|
||||
setMinStackArgumentAlignment((ABI.IsN32() || ABI.IsN64()) ? 8 : 4);
|
||||
|
||||
setStackPointerRegisterToSaveRestore(Subtarget.isABI_N64() ? Mips::SP_64
|
||||
: Mips::SP);
|
||||
setStackPointerRegisterToSaveRestore(ABI.IsN64() ? Mips::SP_64 : Mips::SP);
|
||||
|
||||
setExceptionPointerRegister(Subtarget.isABI_N64() ? Mips::A0_64 : Mips::A0);
|
||||
setExceptionSelectorRegister(Subtarget.isABI_N64() ? Mips::A1_64 : Mips::A1);
|
||||
setExceptionPointerRegister(ABI.IsN64() ? Mips::A0_64 : Mips::A0);
|
||||
setExceptionSelectorRegister(ABI.IsN64() ? Mips::A1_64 : Mips::A1);
|
||||
|
||||
MaxStoresPerMemcpy = 16;
|
||||
|
||||
@ -939,16 +937,14 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
case Mips::DIVU:
|
||||
case Mips::MOD:
|
||||
case Mips::MODU:
|
||||
return insertDivByZeroTrap(
|
||||
MI, *BB, *getTargetMachine().getSubtargetImpl()->getInstrInfo(), false);
|
||||
return insertDivByZeroTrap(MI, *BB, *Subtarget.getInstrInfo(), false);
|
||||
case Mips::PseudoDSDIV:
|
||||
case Mips::PseudoDUDIV:
|
||||
case Mips::DDIV:
|
||||
case Mips::DDIVU:
|
||||
case Mips::DMOD:
|
||||
case Mips::DMODU:
|
||||
return insertDivByZeroTrap(
|
||||
MI, *BB, *getTargetMachine().getSubtargetImpl()->getInstrInfo(), true);
|
||||
return insertDivByZeroTrap(MI, *BB, *Subtarget.getInstrInfo(), true);
|
||||
case Mips::SEL_D:
|
||||
return emitSEL_D(MI, BB);
|
||||
|
||||
@ -984,8 +980,7 @@ MipsTargetLowering::emitAtomicBinary(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
MachineFunction *MF = BB->getParent();
|
||||
MachineRegisterInfo &RegInfo = MF->getRegInfo();
|
||||
const TargetRegisterClass *RC = getRegClassFor(MVT::getIntegerVT(Size * 8));
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned LL, SC, AND, NOR, ZERO, BEQ;
|
||||
|
||||
@ -1068,8 +1063,7 @@ MipsTargetLowering::emitAtomicBinary(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
MachineBasicBlock *MipsTargetLowering::emitSignExtendToI32InReg(
|
||||
MachineInstr *MI, MachineBasicBlock *BB, unsigned Size, unsigned DstReg,
|
||||
unsigned SrcReg) const {
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
|
||||
if (Subtarget.hasMips32r2() && Size == 1) {
|
||||
@ -1105,8 +1099,7 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicBinaryPartword(
|
||||
MachineFunction *MF = BB->getParent();
|
||||
MachineRegisterInfo &RegInfo = MF->getRegInfo();
|
||||
const TargetRegisterClass *RC = getRegClassFor(MVT::i32);
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
|
||||
unsigned Dest = MI->getOperand(0).getReg();
|
||||
@ -1258,8 +1251,7 @@ MachineBasicBlock * MipsTargetLowering::emitAtomicCmpSwap(MachineInstr *MI,
|
||||
MachineFunction *MF = BB->getParent();
|
||||
MachineRegisterInfo &RegInfo = MF->getRegInfo();
|
||||
const TargetRegisterClass *RC = getRegClassFor(MVT::getIntegerVT(Size * 8));
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned LL, SC, ZERO, BNE, BEQ;
|
||||
|
||||
@ -1341,8 +1333,7 @@ MipsTargetLowering::emitAtomicCmpSwapPartword(MachineInstr *MI,
|
||||
MachineFunction *MF = BB->getParent();
|
||||
MachineRegisterInfo &RegInfo = MF->getRegInfo();
|
||||
const TargetRegisterClass *RC = getRegClassFor(MVT::i32);
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
|
||||
unsigned Dest = MI->getOperand(0).getReg();
|
||||
@ -1479,10 +1470,8 @@ MipsTargetLowering::emitAtomicCmpSwapPartword(MachineInstr *MI,
|
||||
MachineBasicBlock *MipsTargetLowering::emitSEL_D(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
MachineFunction *MF = BB->getParent();
|
||||
const TargetRegisterInfo *TRI =
|
||||
getTargetMachine().getSubtargetImpl()->getRegisterInfo();
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = MF->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
MachineBasicBlock::iterator II(MI);
|
||||
@ -1526,8 +1515,7 @@ SDValue MipsTargetLowering::lowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
|
||||
false, 0);
|
||||
Chain = Addr.getValue(1);
|
||||
|
||||
if ((getTargetMachine().getRelocationModel() == Reloc::PIC_) ||
|
||||
Subtarget.isABI_N64()) {
|
||||
if ((getTargetMachine().getRelocationModel() == Reloc::PIC_) || ABI.IsN64()) {
|
||||
// For PIC, the sequence is:
|
||||
// BRIND(load(Jumptable + index) + RelocBase)
|
||||
// RelocBase can be JumpTable, GOT or some sort of global base.
|
||||
@ -1609,10 +1597,9 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
|
||||
GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op);
|
||||
const GlobalValue *GV = N->getGlobal();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget.isABI_N64()) {
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !ABI.IsN64()) {
|
||||
const MipsTargetObjectFile &TLOF =
|
||||
(const MipsTargetObjectFile&)getObjFileLowering();
|
||||
(const MipsTargetObjectFile &)getObjFileLowering();
|
||||
|
||||
if (TLOF.IsGlobalInSmallSection(GV, getTargetMachine()))
|
||||
// %gp_rel relocation
|
||||
@ -1623,8 +1610,7 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
|
||||
}
|
||||
|
||||
if (GV->hasInternalLinkage() || (GV->hasLocalLinkage() && !isa<Function>(GV)))
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG,
|
||||
Subtarget.isABI_N32() || Subtarget.isABI_N64());
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
|
||||
|
||||
if (LargeGOT)
|
||||
return getAddrGlobalLargeGOT(N, SDLoc(N), Ty, DAG, MipsII::MO_GOT_HI16,
|
||||
@ -1632,8 +1618,7 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
|
||||
MachinePointerInfo::getGOT());
|
||||
|
||||
return getAddrGlobal(N, SDLoc(N), Ty, DAG,
|
||||
(Subtarget.isABI_N32() || Subtarget.isABI_N64())
|
||||
? MipsII::MO_GOT_DISP
|
||||
(ABI.IsN32() || ABI.IsN64()) ? MipsII::MO_GOT_DISP
|
||||
: MipsII::MO_GOT16,
|
||||
DAG.getEntryNode(), MachinePointerInfo::getGOT());
|
||||
}
|
||||
@ -1643,12 +1628,10 @@ SDValue MipsTargetLowering::lowerBlockAddress(SDValue Op,
|
||||
BlockAddressSDNode *N = cast<BlockAddressSDNode>(Op);
|
||||
EVT Ty = Op.getValueType();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget.isABI_N64())
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !ABI.IsN64())
|
||||
return getAddrNonPIC(N, SDLoc(N), Ty, DAG);
|
||||
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG,
|
||||
Subtarget.isABI_N32() || Subtarget.isABI_N64());
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::
|
||||
@ -1736,12 +1719,10 @@ lowerJumpTable(SDValue Op, SelectionDAG &DAG) const
|
||||
JumpTableSDNode *N = cast<JumpTableSDNode>(Op);
|
||||
EVT Ty = Op.getValueType();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget.isABI_N64())
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !ABI.IsN64())
|
||||
return getAddrNonPIC(N, SDLoc(N), Ty, DAG);
|
||||
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG,
|
||||
Subtarget.isABI_N32() || Subtarget.isABI_N64());
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::
|
||||
@ -1750,10 +1731,9 @@ lowerConstantPool(SDValue Op, SelectionDAG &DAG) const
|
||||
ConstantPoolSDNode *N = cast<ConstantPoolSDNode>(Op);
|
||||
EVT Ty = Op.getValueType();
|
||||
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ &&
|
||||
!Subtarget.isABI_N64()) {
|
||||
if (getTargetMachine().getRelocationModel() != Reloc::PIC_ && !ABI.IsN64()) {
|
||||
const MipsTargetObjectFile &TLOF =
|
||||
(const MipsTargetObjectFile&)getObjFileLowering();
|
||||
(const MipsTargetObjectFile &)getObjFileLowering();
|
||||
|
||||
if (TLOF.IsConstantInSmallSection(N->getConstVal(), getTargetMachine()))
|
||||
// %gp_rel relocation
|
||||
@ -1762,8 +1742,7 @@ lowerConstantPool(SDValue Op, SelectionDAG &DAG) const
|
||||
return getAddrNonPIC(N, SDLoc(N), Ty, DAG);
|
||||
}
|
||||
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG,
|
||||
Subtarget.isABI_N32() || Subtarget.isABI_N64());
|
||||
return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
@ -1789,8 +1768,7 @@ SDValue MipsTargetLowering::lowerVAARG(SDValue Op, SelectionDAG &DAG) const {
|
||||
unsigned Align = Node->getConstantOperandVal(3);
|
||||
const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
|
||||
SDLoc DL(Node);
|
||||
unsigned ArgSlotSizeInBytes =
|
||||
(Subtarget.isABI_N32() || Subtarget.isABI_N64()) ? 8 : 4;
|
||||
unsigned ArgSlotSizeInBytes = (ABI.IsN32() || ABI.IsN64()) ? 8 : 4;
|
||||
|
||||
SDValue VAListLoad = DAG.getLoad(getPointerTy(), DL, Chain, VAListPtr,
|
||||
MachinePointerInfo(SV), false, false, false,
|
||||
@ -1953,9 +1931,8 @@ lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
|
||||
MFI->setFrameAddressIsTaken(true);
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc DL(Op);
|
||||
SDValue FrameAddr =
|
||||
DAG.getCopyFromReg(DAG.getEntryNode(), DL,
|
||||
Subtarget.isABI_N64() ? Mips::FP_64 : Mips::FP, VT);
|
||||
SDValue FrameAddr = DAG.getCopyFromReg(
|
||||
DAG.getEntryNode(), DL, ABI.IsN64() ? Mips::FP_64 : Mips::FP, VT);
|
||||
return FrameAddr;
|
||||
}
|
||||
|
||||
@ -1971,7 +1948,7 @@ SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MVT VT = Op.getSimpleValueType();
|
||||
unsigned RA = Subtarget.isABI_N64() ? Mips::RA_64 : Mips::RA;
|
||||
unsigned RA = ABI.IsN64() ? Mips::RA_64 : Mips::RA;
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
// Return RA, which contains the return address. Mark it an implicit live-in.
|
||||
@ -1993,12 +1970,12 @@ SDValue MipsTargetLowering::lowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
|
||||
SDValue Offset = Op.getOperand(1);
|
||||
SDValue Handler = Op.getOperand(2);
|
||||
SDLoc DL(Op);
|
||||
EVT Ty = Subtarget.isABI_N64() ? MVT::i64 : MVT::i32;
|
||||
EVT Ty = ABI.IsN64() ? 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 = Subtarget.isABI_N64() ? Mips::V1_64 : Mips::V1;
|
||||
unsigned AddrReg = Subtarget.isABI_N64() ? Mips::V0_64 : Mips::V0;
|
||||
unsigned OffsetReg = ABI.IsN64() ? Mips::V1_64 : Mips::V1;
|
||||
unsigned AddrReg = ABI.IsN64() ? 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,
|
||||
@ -2295,9 +2272,8 @@ SDValue MipsTargetLowering::lowerFP_TO_SINT(SDValue Op,
|
||||
static bool CC_MipsO32(unsigned ValNo, MVT ValVT, MVT LocVT,
|
||||
CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags,
|
||||
CCState &State, const MCPhysReg *F64Regs) {
|
||||
const MipsSubtarget &Subtarget =
|
||||
State.getMachineFunction().getTarget()
|
||||
.getSubtarget<const MipsSubtarget>();
|
||||
const MipsSubtarget &Subtarget = static_cast<const MipsSubtarget &>(
|
||||
State.getMachineFunction().getSubtarget());
|
||||
|
||||
static const unsigned IntRegsSize = 4, FloatRegsSize = 2;
|
||||
|
||||
@ -2451,8 +2427,8 @@ getOpndList(SmallVectorImpl<SDValue> &Ops,
|
||||
// used for the function (that is, Mips linker doesn't generate lazy binding
|
||||
// stub for a function whose address is taken in the program).
|
||||
if (IsPICCall && !InternalLinkage && IsCallReloc) {
|
||||
unsigned GPReg = Subtarget.isABI_N64() ? Mips::GP_64 : Mips::GP;
|
||||
EVT Ty = Subtarget.isABI_N64() ? MVT::i64 : MVT::i32;
|
||||
unsigned GPReg = ABI.IsN64() ? Mips::GP_64 : Mips::GP;
|
||||
EVT Ty = ABI.IsN64() ? MVT::i64 : MVT::i32;
|
||||
RegsToPass.push_back(std::make_pair(GPReg, getGlobalReg(CLI.DAG, Ty)));
|
||||
}
|
||||
|
||||
@ -2475,8 +2451,7 @@ getOpndList(SmallVectorImpl<SDValue> &Ops,
|
||||
RegsToPass[i].second.getValueType()));
|
||||
|
||||
// Add a register mask operand representing the call-preserved registers.
|
||||
const TargetRegisterInfo *TRI =
|
||||
getTargetMachine().getSubtargetImpl()->getRegisterInfo();
|
||||
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
|
||||
const uint32_t *Mask = TRI->getCallPreservedMask(CLI.CallConv);
|
||||
assert(Mask && "Missing call preserved mask for calling convention");
|
||||
if (Subtarget.inMips16HardFloat()) {
|
||||
@ -2512,7 +2487,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const TargetFrameLowering *TFL = MF.getSubtarget().getFrameLowering();
|
||||
const TargetFrameLowering *TFL = Subtarget.getFrameLowering();
|
||||
MipsFunctionInfo *FuncInfo = MF.getInfo<MipsFunctionInfo>();
|
||||
bool IsPIC = getTargetMachine().getRelocationModel() == Reloc::PIC_;
|
||||
|
||||
@ -2524,8 +2499,6 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
|
||||
// Allocate the reserved argument area. It seems strange to do this from the
|
||||
// caller side but removing it breaks the frame size calculation.
|
||||
const MipsABIInfo &ABI =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget()).getABI();
|
||||
CCInfo.AllocateStack(ABI.GetCalleeAllocdArgSizeInBytes(CallConv), 1);
|
||||
|
||||
CCInfo.AnalyzeCallOperands(Outs, CC_Mips, CLI.getArgs(), Callee.getNode());
|
||||
@ -2556,8 +2529,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
Chain = DAG.getCALLSEQ_START(Chain, NextStackOffsetVal, DL);
|
||||
|
||||
SDValue StackPtr = DAG.getCopyFromReg(
|
||||
Chain, DL, Subtarget.isABI_N64() ? Mips::SP_64 : Mips::SP,
|
||||
getPointerTy());
|
||||
Chain, DL, ABI.IsN64() ? Mips::SP_64 : Mips::SP, getPointerTy());
|
||||
|
||||
// With EABI is it possible to have 16 args on registers.
|
||||
std::deque< std::pair<unsigned, SDValue> > RegsToPass;
|
||||
@ -2671,8 +2643,7 @@ 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 =
|
||||
(Subtarget.isABI_N64() || IsPIC); // true if calls are translated to
|
||||
bool IsPICCall = (ABI.IsN64() || IsPIC); // true if calls are translated to
|
||||
// jalr $25
|
||||
bool GlobalOrExternal = false, InternalLinkage = false, IsCallReloc = false;
|
||||
SDValue CalleeLo;
|
||||
@ -2684,8 +2655,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
InternalLinkage = Val->hasInternalLinkage();
|
||||
|
||||
if (InternalLinkage)
|
||||
Callee = getAddrLocal(G, DL, Ty, DAG,
|
||||
Subtarget.isABI_N32() || Subtarget.isABI_N64());
|
||||
Callee = getAddrLocal(G, DL, Ty, DAG, ABI.IsN32() || ABI.IsN64());
|
||||
else if (LargeGOT) {
|
||||
Callee = getAddrGlobalLargeGOT(G, DL, Ty, DAG, MipsII::MO_CALL_HI16,
|
||||
MipsII::MO_CALL_LO16, Chain,
|
||||
@ -2704,7 +2674,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
const char *Sym = S->getSymbol();
|
||||
|
||||
if (!Subtarget.isABI_N64() && !IsPIC) // !N64 && static
|
||||
if (!ABI.IsN64() && !IsPIC) // !N64 && static
|
||||
Callee =
|
||||
DAG.getTargetExternalSymbol(Sym, getPointerTy(), MipsII::MO_NO_FLAG);
|
||||
else if (LargeGOT) {
|
||||
@ -2889,8 +2859,6 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
MipsCCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs,
|
||||
*DAG.getContext());
|
||||
const MipsABIInfo &ABI =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget()).getABI();
|
||||
CCInfo.AllocateStack(ABI.GetCalleeAllocdArgSizeInBytes(CallConv), 1);
|
||||
Function::const_arg_iterator FuncArg =
|
||||
DAG.getMachineFunction().getFunction()->arg_begin();
|
||||
@ -2943,7 +2911,7 @@ 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 (Subtarget.isABI_O32() && RegVT == MVT::i32 &&
|
||||
else if (ABI.IsO32() && RegVT == MVT::i32 &&
|
||||
ValVT == MVT::f64) {
|
||||
unsigned Reg2 = addLiveIn(DAG.getMachineFunction(),
|
||||
getNextIntArgReg(ArgReg), RC);
|
||||
@ -2958,7 +2926,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
} else { // VA.isRegLoc()
|
||||
MVT LocVT = VA.getLocVT();
|
||||
|
||||
if (Subtarget.isABI_O32()) {
|
||||
if (ABI.IsO32()) {
|
||||
// We ought to be able to use LocVT directly but O32 sets it to i32
|
||||
// when allocating floating point values to integer registers.
|
||||
// This shouldn't influence how we load the value into registers unless
|
||||
@ -2995,7 +2963,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
unsigned Reg = MipsFI->getSRetReturnReg();
|
||||
if (!Reg) {
|
||||
Reg = MF.getRegInfo().createVirtualRegister(
|
||||
getRegClassFor(Subtarget.isABI_N64() ? MVT::i64 : MVT::i32));
|
||||
getRegClassFor(ABI.IsN64() ? MVT::i64 : MVT::i32));
|
||||
MipsFI->setSRetReturnReg(Reg);
|
||||
}
|
||||
SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[i]);
|
||||
@ -3112,7 +3080,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 = Subtarget.isABI_N64() ? Mips::V0_64 : Mips::V0;
|
||||
unsigned V0 = ABI.IsN64() ? Mips::V0_64 : Mips::V0;
|
||||
|
||||
Chain = DAG.getCopyToReg(Chain, DL, V0, Val, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
@ -3247,7 +3215,7 @@ parsePhysicalReg(StringRef C, std::string &Prefix,
|
||||
std::pair<unsigned, const TargetRegisterClass *> MipsTargetLowering::
|
||||
parseRegForInlineAsmConstraint(StringRef C, MVT VT) const {
|
||||
const TargetRegisterInfo *TRI =
|
||||
getTargetMachine().getSubtargetImpl()->getRegisterInfo();
|
||||
Subtarget.getRegisterInfo();
|
||||
const TargetRegisterClass *RC;
|
||||
std::string Prefix;
|
||||
unsigned long long Reg;
|
||||
@ -3523,7 +3491,7 @@ bool MipsTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
|
||||
}
|
||||
|
||||
unsigned MipsTargetLowering::getJumpTableEncoding() const {
|
||||
if (Subtarget.isABI_N64())
|
||||
if (ABI.IsN64())
|
||||
return MachineJumpTableInfo::EK_GPRel64BlockAddress;
|
||||
|
||||
return TargetLowering::getJumpTableEncoding();
|
||||
@ -3541,8 +3509,6 @@ void MipsTargetLowering::copyByValRegs(
|
||||
unsigned RegAreaSize = NumRegs * GPRSizeInBytes;
|
||||
unsigned FrameObjSize = std::max(Flags.getByValSize(), RegAreaSize);
|
||||
int FrameObjOffset;
|
||||
const MipsABIInfo &ABI =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget()).getABI();
|
||||
ArrayRef<MCPhysReg> ByValArgRegs = ABI.GetByValArgRegs();
|
||||
|
||||
if (RegAreaSize)
|
||||
@ -3594,10 +3560,7 @@ void MipsTargetLowering::passByValArg(
|
||||
unsigned NumRegs = LastReg - FirstReg;
|
||||
|
||||
if (NumRegs) {
|
||||
const ArrayRef<MCPhysReg> ArgRegs =
|
||||
static_cast<const MipsTargetMachine &>(DAG.getTarget())
|
||||
.getABI()
|
||||
.GetByValArgRegs();
|
||||
const ArrayRef<MCPhysReg> ArgRegs = ABI.GetByValArgRegs();
|
||||
bool LeftoverBytes = (NumRegs * RegSizeInBytes > ByValSizeInBytes);
|
||||
unsigned I = 0;
|
||||
|
||||
@ -3680,10 +3643,7 @@ void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
|
||||
SDValue Chain, SDLoc DL,
|
||||
SelectionDAG &DAG,
|
||||
CCState &State) const {
|
||||
const ArrayRef<MCPhysReg> ArgRegs =
|
||||
static_cast<const MipsTargetMachine &>(DAG.getTarget())
|
||||
.getABI()
|
||||
.GetVarArgRegs();
|
||||
const ArrayRef<MCPhysReg> ArgRegs = ABI.GetVarArgRegs();
|
||||
unsigned Idx = State.getFirstUnallocated(ArgRegs.data(), ArgRegs.size());
|
||||
unsigned RegSizeInBytes = Subtarget.getGPRSizeInBytes();
|
||||
MVT RegTy = MVT::getIntegerVT(RegSizeInBytes * 8);
|
||||
@ -3699,8 +3659,6 @@ void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
|
||||
VaArgOffset =
|
||||
RoundUpToAlignment(State.getNextStackOffset(), RegSizeInBytes);
|
||||
else {
|
||||
const MipsABIInfo &ABI =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget()).getABI();
|
||||
VaArgOffset =
|
||||
(int)ABI.GetCalleeAllocdArgSizeInBytes(State.getCallingConv()) -
|
||||
(int)(RegSizeInBytes * (ArgRegs.size() - Idx));
|
||||
@ -3731,8 +3689,7 @@ void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
|
||||
|
||||
void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size,
|
||||
unsigned Align) const {
|
||||
MachineFunction &MF = State->getMachineFunction();
|
||||
const TargetFrameLowering *TFL = MF.getSubtarget().getFrameLowering();
|
||||
const TargetFrameLowering *TFL = Subtarget.getFrameLowering();
|
||||
|
||||
assert(Size && "Byval argument's size shouldn't be 0.");
|
||||
|
||||
@ -3743,13 +3700,10 @@ void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size,
|
||||
|
||||
if (State->getCallingConv() != CallingConv::Fast) {
|
||||
unsigned RegSizeInBytes = Subtarget.getGPRSizeInBytes();
|
||||
const ArrayRef<MCPhysReg> IntArgRegs =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget())
|
||||
.getABI()
|
||||
.GetByValArgRegs();
|
||||
const ArrayRef<MCPhysReg> IntArgRegs = ABI.GetByValArgRegs();
|
||||
// FIXME: The O32 case actually describes no shadow registers.
|
||||
const MCPhysReg *ShadowRegs =
|
||||
Subtarget.isABI_O32() ? IntArgRegs.data() : Mips64DPRegs;
|
||||
ABI.IsO32() ? IntArgRegs.data() : Mips64DPRegs;
|
||||
|
||||
// We used to check the size as well but we can't do that anymore since
|
||||
// CCState::HandleByVal() rounds up the size after calling this function.
|
||||
@ -3786,7 +3740,7 @@ MipsTargetLowering::emitPseudoSELECT(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
"conditional-move instructions.");
|
||||
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
Subtarget.getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
|
||||
// To "insert" a SELECT instruction, we actually have to insert the
|
||||
|
@ -15,6 +15,7 @@
|
||||
#ifndef LLVM_LIB_TARGET_MIPS_MIPSISELLOWERING_H
|
||||
#define LLVM_LIB_TARGET_MIPS_MIPSISELLOWERING_H
|
||||
|
||||
#include "MCTargetDesc/MipsABIInfo.h"
|
||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||
#include "Mips.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
@ -361,6 +362,8 @@ namespace llvm {
|
||||
|
||||
// Subtarget Info
|
||||
const MipsSubtarget &Subtarget;
|
||||
// Cache the ABI from the TargetMachine, we use it everywhere.
|
||||
const MipsABIInfo &ABI;
|
||||
|
||||
private:
|
||||
// Create a TargetGlobalAddress node.
|
||||
|
@ -65,14 +65,7 @@ namespace {
|
||||
MipsLongBranch(TargetMachine &tm)
|
||||
: MachineFunctionPass(ID), TM(tm),
|
||||
IsPIC(TM.getRelocationModel() == Reloc::PIC_),
|
||||
ABI(static_cast<const MipsTargetMachine &>(TM).getABI()),
|
||||
LongBranchSeqSize(
|
||||
!IsPIC ? 2
|
||||
: (ABI.IsN64()
|
||||
? 10
|
||||
: (!TM.getSubtarget<MipsSubtarget>().isTargetNaCl()
|
||||
? 9
|
||||
: 10))) {}
|
||||
ABI(static_cast<const MipsTargetMachine &>(TM).getABI()) {}
|
||||
|
||||
const char *getPassName() const override {
|
||||
return "Mips Long Branch";
|
||||
@ -175,7 +168,7 @@ void MipsLongBranch::initMBBInfo() {
|
||||
MBBInfos.resize(MF->size());
|
||||
|
||||
const MipsInstrInfo *TII =
|
||||
static_cast<const MipsInstrInfo *>(TM.getSubtargetImpl()->getInstrInfo());
|
||||
static_cast<const MipsInstrInfo *>(MF->getSubtarget().getInstrInfo());
|
||||
for (unsigned I = 0, E = MBBInfos.size(); I < E; ++I) {
|
||||
MachineBasicBlock *MBB = MF->getBlockNumbered(I);
|
||||
|
||||
@ -221,8 +214,8 @@ int64_t MipsLongBranch::computeOffset(const MachineInstr *Br) {
|
||||
// MachineBasicBlock operand MBBOpnd.
|
||||
void MipsLongBranch::replaceBranch(MachineBasicBlock &MBB, Iter Br,
|
||||
DebugLoc DL, MachineBasicBlock *MBBOpnd) {
|
||||
const MipsInstrInfo *TII =
|
||||
static_cast<const MipsInstrInfo *>(TM.getSubtargetImpl()->getInstrInfo());
|
||||
const MipsInstrInfo *TII = static_cast<const MipsInstrInfo *>(
|
||||
MBB.getParent()->getSubtarget().getInstrInfo());
|
||||
unsigned NewOpc = TII->getOppositeBranchOpc(Br->getOpcode());
|
||||
const MCInstrDesc &NewDesc = TII->get(NewOpc);
|
||||
|
||||
@ -263,9 +256,10 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) {
|
||||
const BasicBlock *BB = MBB->getBasicBlock();
|
||||
MachineFunction::iterator FallThroughMBB = ++MachineFunction::iterator(MBB);
|
||||
MachineBasicBlock *LongBrMBB = MF->CreateMachineBasicBlock(BB);
|
||||
|
||||
const MipsSubtarget &Subtarget =
|
||||
static_cast<const MipsSubtarget &>(MF->getSubtarget());
|
||||
const MipsInstrInfo *TII =
|
||||
static_cast<const MipsInstrInfo *>(TM.getSubtargetImpl()->getInstrInfo());
|
||||
static_cast<const MipsInstrInfo *>(Subtarget.getInstrInfo());
|
||||
|
||||
MF->insert(FallThroughMBB, LongBrMBB);
|
||||
MBB->removeSuccessor(TgtMBB);
|
||||
@ -280,8 +274,6 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) {
|
||||
// We must select between the MIPS32r6/MIPS64r6 BAL (which is a normal
|
||||
// instruction) and the pre-MIPS32r6/MIPS64r6 definition (which is an
|
||||
// pseudo-instruction wrapping BGEZAL).
|
||||
|
||||
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
|
||||
unsigned BalOp = Subtarget.hasMips32r6() ? Mips::BAL : Mips::BAL_BR;
|
||||
|
||||
if (!ABI.IsN64()) {
|
||||
@ -338,7 +330,7 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) {
|
||||
BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::LW), Mips::RA)
|
||||
.addReg(Mips::SP).addImm(0);
|
||||
|
||||
if (!TM.getSubtarget<MipsSubtarget>().isTargetNaCl()) {
|
||||
if (!Subtarget.isTargetNaCl()) {
|
||||
MIBundleBuilder(*BalTgtMBB, Pos)
|
||||
.append(BuildMI(*MF, DL, TII->get(Mips::JR)).addReg(Mips::AT))
|
||||
.append(BuildMI(*MF, DL, TII->get(Mips::ADDiu), Mips::SP)
|
||||
@ -457,14 +449,17 @@ static void emitGPDisp(MachineFunction &F, const MipsInstrInfo *TII) {
|
||||
}
|
||||
|
||||
bool MipsLongBranch::runOnMachineFunction(MachineFunction &F) {
|
||||
const MipsSubtarget &STI =
|
||||
static_cast<const MipsSubtarget &>(F.getSubtarget());
|
||||
const MipsInstrInfo *TII =
|
||||
static_cast<const MipsInstrInfo *>(TM.getSubtargetImpl()->getInstrInfo());
|
||||
static_cast<const MipsInstrInfo *>(STI.getInstrInfo());
|
||||
LongBranchSeqSize =
|
||||
!IsPIC ? 2 : (ABI.IsN64() ? 10 : (!STI.isTargetNaCl() ? 9 : 10));
|
||||
|
||||
const MipsSubtarget &STI = TM.getSubtarget<MipsSubtarget>();
|
||||
if (STI.inMips16Mode() || !STI.enableLongBranchPass())
|
||||
return false;
|
||||
if ((TM.getRelocationModel() == Reloc::PIC_) &&
|
||||
TM.getSubtarget<MipsSubtarget>().isABI_O32() &&
|
||||
static_cast<const MipsTargetMachine &>(TM).getABI().IsO32() &&
|
||||
F.getInfo<MipsFunctionInfo>()->globalBaseRegSet())
|
||||
emitGPDisp(F, TII);
|
||||
|
||||
@ -486,10 +481,10 @@ bool MipsLongBranch::runOnMachineFunction(MachineFunction &F) {
|
||||
if (!I->Br || I->HasLongBranch)
|
||||
continue;
|
||||
|
||||
int ShVal = TM.getSubtarget<MipsSubtarget>().inMicroMipsMode() ? 2 : 4;
|
||||
int ShVal = STI.inMicroMipsMode() ? 2 : 4;
|
||||
int64_t Offset = computeOffset(I->Br) / ShVal;
|
||||
|
||||
if (TM.getSubtarget<MipsSubtarget>().isTargetNaCl()) {
|
||||
if (STI.isTargetNaCl()) {
|
||||
// The offset calculation does not include sandboxing instructions
|
||||
// that will be added later in the MC layer. Since at this point we
|
||||
// don't know the exact amount of code that "sandboxing" will add, we
|
||||
|
@ -7,10 +7,11 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MipsMachineFunction.h"
|
||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||
#include "MipsMachineFunction.h"
|
||||
#include "MipsInstrInfo.h"
|
||||
#include "MipsSubtarget.h"
|
||||
#include "MipsTargetMachine.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
@ -78,11 +79,13 @@ unsigned MipsFunctionInfo::getGlobalBaseReg() {
|
||||
if (GlobalBaseReg)
|
||||
return GlobalBaseReg;
|
||||
|
||||
const MipsSubtarget &ST = MF.getTarget().getSubtarget<MipsSubtarget>();
|
||||
|
||||
const TargetRegisterClass *RC =
|
||||
ST.inMips16Mode() ? &Mips::CPU16RegsRegClass
|
||||
: ST.isABI_N64() ? &Mips::GPR64RegClass
|
||||
static_cast<const MipsSubtarget &>(MF.getSubtarget()).inMips16Mode()
|
||||
? &Mips::CPU16RegsRegClass
|
||||
: static_cast<const MipsTargetMachine &>(MF.getTarget())
|
||||
.getABI()
|
||||
.IsN64()
|
||||
? &Mips::GPR64RegClass
|
||||
: &Mips::GPR32RegClass;
|
||||
return GlobalBaseReg = MF.getRegInfo().createVirtualRegister(RC);
|
||||
}
|
||||
@ -101,9 +104,10 @@ unsigned MipsFunctionInfo::getMips16SPAliasReg() {
|
||||
|
||||
void MipsFunctionInfo::createEhDataRegsFI() {
|
||||
for (int I = 0; I < 4; ++I) {
|
||||
const MipsSubtarget &ST = MF.getTarget().getSubtarget<MipsSubtarget>();
|
||||
const TargetRegisterClass *RC = ST.isABI_N64() ?
|
||||
&Mips::GPR64RegClass : &Mips::GPR32RegClass;
|
||||
const TargetRegisterClass *RC =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget()).getABI().IsN64()
|
||||
? &Mips::GPR64RegClass
|
||||
: &Mips::GPR32RegClass;
|
||||
|
||||
EhDataRegFI[I] = MF.getFrameInfo()->CreateStackObject(RC->getSize(),
|
||||
RC->getAlignment(), false);
|
||||
|
@ -174,7 +174,7 @@ void MBBInfo::postVisit() {
|
||||
|
||||
// OptimizePICCall methods.
|
||||
bool OptimizePICCall::runOnMachineFunction(MachineFunction &F) {
|
||||
if (F.getTarget().getSubtarget<MipsSubtarget>().inMips16Mode())
|
||||
if (static_cast<const MipsSubtarget &>(F.getSubtarget()).inMips16Mode())
|
||||
return false;
|
||||
|
||||
// Do a pre-order traversal of the dominator tree.
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "MipsInstrInfo.h"
|
||||
#include "MipsMachineFunction.h"
|
||||
#include "MipsSubtarget.h"
|
||||
#include "MipsTargetMachine.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
@ -62,7 +63,7 @@ MipsRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
case Mips::GPR32RegClassID:
|
||||
case Mips::GPR64RegClassID:
|
||||
case Mips::DSPRRegClassID: {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
|
||||
return 28 - TFI->hasFP(MF);
|
||||
}
|
||||
case Mips::FGR32RegClassID:
|
||||
@ -167,7 +168,7 @@ getReservedRegs(const MachineFunction &MF) const {
|
||||
Reserved.set(*Reg);
|
||||
}
|
||||
// Reserve FP if this function should have a dedicated frame pointer register.
|
||||
if (MF.getSubtarget().getFrameLowering()->hasFP(MF)) {
|
||||
if (Subtarget.getFrameLowering()->hasFP(MF)) {
|
||||
if (Subtarget.inMips16Mode())
|
||||
Reserved.set(Mips::S0);
|
||||
else {
|
||||
@ -256,8 +257,9 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
||||
|
||||
unsigned MipsRegisterInfo::
|
||||
getFrameRegister(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
bool IsN64 = Subtarget.isABI_N64();
|
||||
const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
|
||||
bool IsN64 =
|
||||
static_cast<const MipsTargetMachine &>(MF.getTarget()).getABI().IsN64();
|
||||
|
||||
if (Subtarget.inMips16Mode())
|
||||
return TFI->hasFP(MF) ? Mips::S0 : Mips::SP;
|
||||
|
@ -71,11 +71,17 @@ private:
|
||||
|
||||
MachineFunction &MF;
|
||||
MachineRegisterInfo &MRI;
|
||||
const MipsSubtarget &Subtarget;
|
||||
const MipsSEInstrInfo &TII;
|
||||
const MipsRegisterInfo &RegInfo;
|
||||
};
|
||||
}
|
||||
|
||||
ExpandPseudo::ExpandPseudo(MachineFunction &MF_)
|
||||
: MF(MF_), MRI(MF.getRegInfo()) {}
|
||||
: MF(MF_), MRI(MF.getRegInfo()),
|
||||
Subtarget(static_cast<const MipsSubtarget &>(MF.getSubtarget())),
|
||||
TII(*static_cast<const MipsSEInstrInfo *>(Subtarget.getInstrInfo())),
|
||||
RegInfo(*Subtarget.getRegisterInfo()) {}
|
||||
|
||||
bool ExpandPseudo::expand() {
|
||||
bool Expanded = false;
|
||||
@ -146,11 +152,6 @@ void ExpandPseudo::expandLoadCCond(MachineBasicBlock &MBB, Iter I) {
|
||||
|
||||
assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
|
||||
const TargetRegisterClass *RC = RegInfo.intRegClass(4);
|
||||
unsigned VR = MRI.createVirtualRegister(RC);
|
||||
unsigned Dst = I->getOperand(0).getReg(), FI = I->getOperand(1).getIndex();
|
||||
@ -166,11 +167,6 @@ void ExpandPseudo::expandStoreCCond(MachineBasicBlock &MBB, Iter I) {
|
||||
|
||||
assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
|
||||
const TargetRegisterClass *RC = RegInfo.intRegClass(4);
|
||||
unsigned VR = MRI.createVirtualRegister(RC);
|
||||
unsigned Src = I->getOperand(0).getReg(), FI = I->getOperand(1).getIndex();
|
||||
@ -189,11 +185,6 @@ void ExpandPseudo::expandLoadACC(MachineBasicBlock &MBB, Iter I,
|
||||
|
||||
assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
|
||||
const TargetRegisterClass *RC = RegInfo.intRegClass(RegSize);
|
||||
unsigned VR0 = MRI.createVirtualRegister(RC);
|
||||
unsigned VR1 = MRI.createVirtualRegister(RC);
|
||||
@ -219,11 +210,6 @@ void ExpandPseudo::expandStoreACC(MachineBasicBlock &MBB, Iter I,
|
||||
|
||||
assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
|
||||
const TargetRegisterClass *RC = RegInfo.intRegClass(RegSize);
|
||||
unsigned VR0 = MRI.createVirtualRegister(RC);
|
||||
unsigned VR1 = MRI.createVirtualRegister(RC);
|
||||
@ -254,11 +240,6 @@ bool ExpandPseudo::expandCopyACC(MachineBasicBlock &MBB, Iter I,
|
||||
// mfhi $vr1, src
|
||||
// copy dst_hi, $vr1
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
|
||||
unsigned Dst = I->getOperand(0).getReg(), Src = I->getOperand(1).getReg();
|
||||
unsigned VRegSize = RegInfo.getMinimalPhysRegClass(Dst)->getSize() / 2;
|
||||
const TargetRegisterClass *RC = RegInfo.intRegClass(VRegSize);
|
||||
@ -298,16 +279,8 @@ bool ExpandPseudo::expandBuildPairF64(MachineBasicBlock &MBB,
|
||||
// register). Unfortunately, we have to make this decision before register
|
||||
// allocation so for now we use a spill/reload sequence for all
|
||||
// double-precision values in regardless of being an odd/even register.
|
||||
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
|
||||
if ((Subtarget.isABI_FPXX() && !Subtarget.hasMTHC1()) ||
|
||||
(FP64 && !Subtarget.useOddSPReg())) {
|
||||
const MipsSEInstrInfo &TII = *static_cast<const MipsSEInstrInfo *>(
|
||||
TM.getSubtargetImpl()->getInstrInfo());
|
||||
const MipsRegisterInfo &TRI = *static_cast<const MipsRegisterInfo *>(
|
||||
TM.getSubtargetImpl()->getRegisterInfo());
|
||||
|
||||
unsigned DstReg = I->getOperand(0).getReg();
|
||||
unsigned LoReg = I->getOperand(1).getReg();
|
||||
unsigned HiReg = I->getOperand(2).getReg();
|
||||
@ -327,11 +300,11 @@ bool ExpandPseudo::expandBuildPairF64(MachineBasicBlock &MBB,
|
||||
int FI = MF.getInfo<MipsFunctionInfo>()->getMoveF64ViaSpillFI(RC2);
|
||||
if (!Subtarget.isLittle())
|
||||
std::swap(LoReg, HiReg);
|
||||
TII.storeRegToStack(MBB, I, LoReg, I->getOperand(1).isKill(), FI, RC, &TRI,
|
||||
0);
|
||||
TII.storeRegToStack(MBB, I, HiReg, I->getOperand(2).isKill(), FI, RC, &TRI,
|
||||
4);
|
||||
TII.loadRegFromStack(MBB, I, DstReg, FI, RC2, &TRI, 0);
|
||||
TII.storeRegToStack(MBB, I, LoReg, I->getOperand(1).isKill(), FI, RC,
|
||||
&RegInfo, 0);
|
||||
TII.storeRegToStack(MBB, I, HiReg, I->getOperand(2).isKill(), FI, RC,
|
||||
&RegInfo, 4);
|
||||
TII.loadRegFromStack(MBB, I, DstReg, FI, RC2, &RegInfo, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -359,15 +332,8 @@ bool ExpandPseudo::expandExtractElementF64(MachineBasicBlock &MBB,
|
||||
// allocation so for now we use a spill/reload sequence for all
|
||||
// double-precision values in regardless of being an odd/even register.
|
||||
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
|
||||
if ((Subtarget.isABI_FPXX() && !Subtarget.hasMTHC1()) ||
|
||||
(FP64 && !Subtarget.useOddSPReg())) {
|
||||
const MipsSEInstrInfo &TII = *static_cast<const MipsSEInstrInfo *>(
|
||||
TM.getSubtargetImpl()->getInstrInfo());
|
||||
const MipsRegisterInfo &TRI = *static_cast<const MipsRegisterInfo *>(
|
||||
TM.getSubtargetImpl()->getRegisterInfo());
|
||||
|
||||
unsigned DstReg = I->getOperand(0).getReg();
|
||||
unsigned SrcReg = I->getOperand(1).getReg();
|
||||
unsigned N = I->getOperand(2).getImm();
|
||||
@ -386,9 +352,9 @@ bool ExpandPseudo::expandExtractElementF64(MachineBasicBlock &MBB,
|
||||
// We re-use the same spill slot each time so that the stack frame doesn't
|
||||
// grow too much in functions with a large number of moves.
|
||||
int FI = MF.getInfo<MipsFunctionInfo>()->getMoveF64ViaSpillFI(RC);
|
||||
TII.storeRegToStack(MBB, I, SrcReg, I->getOperand(1).isKill(), FI, RC, &TRI,
|
||||
0);
|
||||
TII.loadRegFromStack(MBB, I, DstReg, FI, RC2, &TRI, Offset);
|
||||
TII.storeRegToStack(MBB, I, SrcReg, I->getOperand(1).isKill(), FI, RC,
|
||||
&RegInfo, 0);
|
||||
TII.loadRegFromStack(MBB, I, DstReg, FI, RC2, &RegInfo, Offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -415,9 +381,9 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
*static_cast<const MipsSEInstrInfo *>(STI.getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo =
|
||||
*static_cast<const MipsRegisterInfo *>(STI.getRegisterInfo());
|
||||
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
|
||||
@ -550,9 +516,9 @@ void MipsSEFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo = *static_cast<const MipsRegisterInfo *>(
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
*static_cast<const MipsSEInstrInfo *>(STI.getInstrInfo());
|
||||
const MipsRegisterInfo &RegInfo =
|
||||
*static_cast<const MipsRegisterInfo *>(STI.getRegisterInfo());
|
||||
|
||||
DebugLoc dl = MBBI->getDebugLoc();
|
||||
unsigned SP = STI.isABI_N64() ? Mips::SP_64 : Mips::SP;
|
||||
@ -605,7 +571,7 @@ spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
MachineFunction *MF = MBB.getParent();
|
||||
MachineBasicBlock *EntryBlock = MF->begin();
|
||||
const TargetInstrInfo &TII = *MF->getSubtarget().getInstrInfo();
|
||||
const TargetInstrInfo &TII = *STI.getInstrInfo();
|
||||
|
||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
||||
// Add the callee-saved register as live-in. Do not add if the register is
|
||||
@ -646,7 +612,7 @@ void MipsSEFrameLowering::
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I) const {
|
||||
const MipsSEInstrInfo &TII =
|
||||
*static_cast<const MipsSEInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
*static_cast<const MipsSEInstrInfo *>(STI.getInstrInfo());
|
||||
|
||||
if (!hasReservedCallFrame(MF)) {
|
||||
int64_t Amount = I->getOperand(0).getImm();
|
||||
|
@ -37,7 +37,7 @@ using namespace llvm;
|
||||
#define DEBUG_TYPE "mips-isel"
|
||||
|
||||
bool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||
Subtarget = &TM.getSubtarget<MipsSubtarget>();
|
||||
Subtarget = &static_cast<const MipsSubtarget &>(MF.getSubtarget());
|
||||
if (Subtarget->inMips16Mode())
|
||||
return false;
|
||||
return MipsDAGToDAGISel::runOnMachineFunction(MF);
|
||||
@ -130,7 +130,7 @@ void MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
|
||||
MachineBasicBlock &MBB = MF.front();
|
||||
MachineBasicBlock::iterator I = MBB.begin();
|
||||
MachineRegisterInfo &RegInfo = MF.getRegInfo();
|
||||
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
|
||||
const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
|
||||
DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
|
||||
unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
|
||||
const TargetRegisterClass *RC;
|
||||
|
@ -2747,8 +2747,7 @@ emitBPOSGE32(MachineInstr *MI, MachineBasicBlock *BB) const{
|
||||
// $vr0 = phi($vr2, $fbb, $vr1, $tbb)
|
||||
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
const TargetRegisterClass *RC = &Mips::GPR32RegClass;
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
const BasicBlock *LLVM_BB = BB->getBasicBlock();
|
||||
@ -2813,8 +2812,7 @@ emitMSACBranchPseudo(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
// $rd = phi($rd1, $fbb, $rd2, $tbb)
|
||||
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
const TargetRegisterClass *RC = &Mips::GPR32RegClass;
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
const BasicBlock *LLVM_BB = BB->getBasicBlock();
|
||||
@ -2875,8 +2873,7 @@ emitMSACBranchPseudo(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
// for lane 1 because it would require FR=0 mode which isn't supported by MSA.
|
||||
MachineBasicBlock * MipsSETargetLowering::
|
||||
emitCOPY_FW(MachineInstr *MI, MachineBasicBlock *BB) const{
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Fd = MI->getOperand(0).getReg();
|
||||
@ -2910,8 +2907,7 @@ MachineBasicBlock * MipsSETargetLowering::
|
||||
emitCOPY_FD(MachineInstr *MI, MachineBasicBlock *BB) const{
|
||||
assert(Subtarget.isFP64bit());
|
||||
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
unsigned Fd = MI->getOperand(0).getReg();
|
||||
unsigned Ws = MI->getOperand(1).getReg();
|
||||
@ -2940,8 +2936,7 @@ emitCOPY_FD(MachineInstr *MI, MachineBasicBlock *BB) const{
|
||||
MachineBasicBlock *
|
||||
MipsSETargetLowering::emitINSERT_FW(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Wd = MI->getOperand(0).getReg();
|
||||
@ -2975,8 +2970,7 @@ MipsSETargetLowering::emitINSERT_FD(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
assert(Subtarget.isFP64bit());
|
||||
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Wd = MI->getOperand(0).getReg();
|
||||
@ -3024,8 +3018,7 @@ MipsSETargetLowering::emitINSERT_DF_VIDX(MachineInstr *MI,
|
||||
MachineBasicBlock *BB,
|
||||
unsigned EltSizeInBytes,
|
||||
bool IsFP) const {
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Wd = MI->getOperand(0).getReg();
|
||||
@ -3135,8 +3128,7 @@ MipsSETargetLowering::emitINSERT_DF_VIDX(MachineInstr *MI,
|
||||
MachineBasicBlock *
|
||||
MipsSETargetLowering::emitFILL_FW(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Wd = MI->getOperand(0).getReg();
|
||||
@ -3167,8 +3159,7 @@ MipsSETargetLowering::emitFILL_FD(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
assert(Subtarget.isFP64bit());
|
||||
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Wd = MI->getOperand(0).getReg();
|
||||
@ -3196,8 +3187,7 @@ MipsSETargetLowering::emitFILL_FD(MachineInstr *MI,
|
||||
MachineBasicBlock *
|
||||
MipsSETargetLowering::emitFEXP2_W_1(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
const TargetRegisterClass *RC = &Mips::MSA128WRegClass;
|
||||
unsigned Ws1 = RegInfo.createVirtualRegister(RC);
|
||||
@ -3226,8 +3216,7 @@ MipsSETargetLowering::emitFEXP2_W_1(MachineInstr *MI,
|
||||
MachineBasicBlock *
|
||||
MipsSETargetLowering::emitFEXP2_D_1(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
const TargetInstrInfo *TII =
|
||||
getTargetMachine().getSubtargetImpl()->getInstrInfo();
|
||||
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
|
||||
MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo();
|
||||
const TargetRegisterClass *RC = &Mips::MSA128DRegClass;
|
||||
unsigned Ws1 = RegInfo.createVirtualRegister(RC);
|
||||
|
Loading…
Reference in New Issue
Block a user