mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Eliminate the stack slot used to save the global base register.
The long branch pass (fixed in r160601) no longer uses the global base register to compute addresses of branch destinations, so it is not necessary to reserve a slot on the stack. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160703 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -113,11 +113,7 @@ void MipsFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
// First, compute final stack size.
|
||||
unsigned StackAlign = getStackAlignment();
|
||||
uint64_t StackSize = RoundUpToAlignment(MFI->getStackSize(), StackAlign);
|
||||
|
||||
if (MipsFI->globalBaseRegSet())
|
||||
StackSize += MFI->getObjectOffset(MipsFI->getGlobalRegFI()) + StackAlign;
|
||||
else
|
||||
StackSize += RoundUpToAlignment(MipsFI->getMaxCallFrameSize(), StackAlign);
|
||||
StackSize += RoundUpToAlignment(MipsFI->getMaxCallFrameSize(), StackAlign);
|
||||
|
||||
// Update stack size
|
||||
MFI->setStackSize(StackSize);
|
||||
|
@@ -117,28 +117,23 @@ private:
|
||||
void MipsDAGToDAGISel::InitGlobalBaseReg(MachineFunction &MF) {
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
|
||||
if (((MF.getTarget().getRelocationModel() == Reloc::Static) ||
|
||||
Subtarget.inMips16Mode()) && !MipsFI->globalBaseRegSet())
|
||||
if (!MipsFI->globalBaseRegSet())
|
||||
return;
|
||||
|
||||
MachineBasicBlock &MBB = MF.front();
|
||||
MachineBasicBlock::iterator I = MBB.begin();
|
||||
MachineRegisterInfo &RegInfo = MF.getRegInfo();
|
||||
const MipsRegisterInfo *TargetRegInfo = TM.getRegisterInfo();
|
||||
const MipsInstrInfo *MII = TM.getInstrInfo();
|
||||
const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
|
||||
DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
|
||||
unsigned V0, V1, V2, GlobalBaseReg = MipsFI->getGlobalBaseReg();
|
||||
int FI = 0;
|
||||
const TargetRegisterClass *RC;
|
||||
|
||||
FI= MipsFI->initGlobalRegFI();
|
||||
|
||||
const TargetRegisterClass *RC = Subtarget.isABI_N64() ?
|
||||
(const TargetRegisterClass*)&Mips::CPU64RegsRegClass :
|
||||
(const TargetRegisterClass*)&Mips::CPURegsRegClass;
|
||||
|
||||
if (Subtarget.inMips16Mode())
|
||||
RC=(const TargetRegisterClass*)&Mips::CPU16RegsRegClass;
|
||||
if (Subtarget.isABI_N64())
|
||||
RC = (const TargetRegisterClass*)&Mips::CPU64RegsRegClass;
|
||||
else if (Subtarget.inMips16Mode())
|
||||
RC = (const TargetRegisterClass*)&Mips::CPU16RegsRegClass;
|
||||
else
|
||||
RC = (const TargetRegisterClass*)&Mips::CPURegsRegClass;
|
||||
|
||||
V0 = RegInfo.createVirtualRegister(RC);
|
||||
V1 = RegInfo.createVirtualRegister(RC);
|
||||
@@ -158,23 +153,17 @@ void MipsDAGToDAGISel::InitGlobalBaseReg(MachineFunction &MF) {
|
||||
.addReg(Mips::T9_64);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1)
|
||||
.addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
|
||||
MII->storeRegToStackSlot(MBB, I, GlobalBaseReg, false, FI, RC,
|
||||
TargetRegInfo);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Subtarget.inMips16Mode()) {
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmX16), V0)
|
||||
.addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16),
|
||||
V1)
|
||||
.addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::SllX16),
|
||||
V2 ).addReg(V0).addImm(16);
|
||||
.addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1)
|
||||
.addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::SllX16), V2).addReg(V0).addImm(16);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::AdduRxRyRz16), GlobalBaseReg)
|
||||
.addReg(V1).addReg(V2);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -203,19 +192,11 @@ void MipsDAGToDAGISel::InitGlobalBaseReg(MachineFunction &MF) {
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1)
|
||||
.addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
|
||||
MII->storeRegToStackSlot(MBB, I, GlobalBaseReg, false, FI, RC,
|
||||
TargetRegInfo);
|
||||
return;
|
||||
}
|
||||
|
||||
assert(Subtarget.isABI_O32());
|
||||
|
||||
|
||||
//if (Subtarget.inMips16Mode())
|
||||
// return; // no need to load GP. It can be calculated anywhere
|
||||
|
||||
|
||||
|
||||
// For O32 ABI, the following instruction sequence is emitted to initialize
|
||||
// the global base register:
|
||||
//
|
||||
@@ -237,7 +218,6 @@ void MipsDAGToDAGISel::InitGlobalBaseReg(MachineFunction &MF) {
|
||||
MBB.addLiveIn(Mips::V0);
|
||||
BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg)
|
||||
.addReg(Mips::V0).addReg(Mips::T9);
|
||||
MII->storeRegToStackSlot(MBB, I, GlobalBaseReg, false, FI, RC, TargetRegInfo);
|
||||
}
|
||||
|
||||
bool MipsDAGToDAGISel::ReplaceUsesWithZeroReg(MachineRegisterInfo *MRI,
|
||||
|
@@ -48,7 +48,6 @@ class MipsFunctionInfo : public MachineFunctionInfo {
|
||||
// OutArgFIRange: Range of indices of all frame objects created during call to
|
||||
// LowerCall except for the frame object for restoring $gp.
|
||||
std::pair<int, int> InArgFIRange, OutArgFIRange;
|
||||
int GlobalRegFI;
|
||||
mutable int DynAllocFI; // Frame index of dynamically allocated stack area.
|
||||
unsigned MaxCallFrameSize;
|
||||
|
||||
@@ -58,7 +57,7 @@ public:
|
||||
MipsFunctionInfo(MachineFunction& MF)
|
||||
: MF(MF), SRetReturnReg(0), GlobalBaseReg(0),
|
||||
VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)),
|
||||
OutArgFIRange(std::make_pair(-1, 0)), GlobalRegFI(0), DynAllocFI(0),
|
||||
OutArgFIRange(std::make_pair(-1, 0)), DynAllocFI(0),
|
||||
MaxCallFrameSize(0), EmitNOAT(false)
|
||||
{}
|
||||
|
||||
@@ -77,24 +76,6 @@ public:
|
||||
OutArgFIRange.second = LastFI;
|
||||
}
|
||||
|
||||
bool isGlobalRegFI(int FI) const {
|
||||
return GlobalRegFI && (FI == GlobalRegFI);
|
||||
}
|
||||
|
||||
int getGlobalRegFI() const {
|
||||
return GlobalRegFI;
|
||||
}
|
||||
|
||||
int initGlobalRegFI() {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
unsigned RegSize = TM.getSubtarget<MipsSubtarget>().isABI_N64() ? 8 : 4;
|
||||
int64_t StackAlignment = TM.getFrameLowering()->getStackAlignment();
|
||||
uint64_t Offset = RoundUpToAlignment(MaxCallFrameSize, StackAlignment);
|
||||
|
||||
GlobalRegFI = MF.getFrameInfo()->CreateFixedObject(RegSize, Offset, true);
|
||||
return GlobalRegFI;
|
||||
}
|
||||
|
||||
// The first call to this function creates a frame object for dynamically
|
||||
// allocated stack area.
|
||||
int getDynAllocFI() const {
|
||||
|
@@ -214,8 +214,7 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
||||
// incoming argument, callee-saved register location or local variable.
|
||||
int64_t Offset;
|
||||
|
||||
if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isDynAllocFI(FrameIndex) ||
|
||||
MipsFI->isGlobalRegFI(FrameIndex))
|
||||
if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isDynAllocFI(FrameIndex))
|
||||
Offset = spOffset;
|
||||
else
|
||||
Offset = spOffset + (int64_t)stackSize;
|
||||
|
Reference in New Issue
Block a user