mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 00:11:00 +00:00
Refactor away tSpill and tRestore pseudos in ARM backend.
The tSpill and tRestore instructions are just copies of the tSTRspi and tLDRspi instructions, respectively. Just use those directly instead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134092 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1e965641dc
commit
74472b4bf9
@ -792,7 +792,7 @@ ARMBaseInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
|
||||
break;
|
||||
case ARM::STRi12:
|
||||
case ARM::t2STRi12:
|
||||
case ARM::tSpill:
|
||||
case ARM::tSTRspi:
|
||||
case ARM::VSTRD:
|
||||
case ARM::VSTRS:
|
||||
if (MI->getOperand(1).isFI() &&
|
||||
@ -927,7 +927,7 @@ ARMBaseInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
||||
break;
|
||||
case ARM::LDRi12:
|
||||
case ARM::t2LDRi12:
|
||||
case ARM::tRestore:
|
||||
case ARM::tLDRspi:
|
||||
case ARM::VLDRD:
|
||||
case ARM::VLDRS:
|
||||
if (MI->getOperand(1).isFI() &&
|
||||
|
@ -686,19 +686,6 @@ def tLDRspi : T1pIs<(outs tGPR:$Rt), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
|
||||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
// Special instruction for restore. It cannot clobber condition register
|
||||
// when it's expanded by eliminateCallFramePseudoInstr().
|
||||
let canFoldAsLoad = 1, mayLoad = 1, neverHasSideEffects = 1 in
|
||||
// FIXME: Pseudo for tLDRspi
|
||||
def tRestore : T1pIs<(outs tGPR:$dst), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
|
||||
"ldr", "\t$dst, $addr", []>,
|
||||
T1LdStSP<{1,?,?}> {
|
||||
bits<3> Rt;
|
||||
bits<8> addr;
|
||||
let Inst{10-8} = Rt;
|
||||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
// Load tconstpool
|
||||
// FIXME: Use ldr.n to work around a Darwin assembler bug.
|
||||
let canFoldAsLoad = 1, isReMaterializable = 1 in
|
||||
@ -755,19 +742,6 @@ def tSTRspi : T1pIs<(outs), (ins tGPR:$Rt, t_addrmode_sp:$addr), IIC_iStore_i,
|
||||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
let mayStore = 1, neverHasSideEffects = 1 in
|
||||
// Special instruction for spill. It cannot clobber condition register when it's
|
||||
// expanded by eliminateCallFramePseudoInstr().
|
||||
// FIXME: Pseudo for tSTRspi
|
||||
def tSpill : T1pIs<(outs), (ins tGPR:$src, t_addrmode_sp:$addr), IIC_iStore_i,
|
||||
"str", "\t$src, $addr", []>,
|
||||
T1LdStSP<{0,?,?}> {
|
||||
bits<3> Rt;
|
||||
bits<8> addr;
|
||||
let Inst{10-8} = Rt;
|
||||
let Inst{7-0} = addr;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Load / store multiple Instructions.
|
||||
//
|
||||
|
@ -177,7 +177,7 @@ static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) {
|
||||
}
|
||||
|
||||
static bool isCSRestore(MachineInstr *MI, const unsigned *CSRegs) {
|
||||
if (MI->getOpcode() == ARM::tRestore &&
|
||||
if (MI->getOpcode() == ARM::tLDRspi &&
|
||||
MI->getOperand(1).isFI() &&
|
||||
isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs))
|
||||
return true;
|
||||
|
@ -75,7 +75,7 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
MachineMemOperand::MOStore,
|
||||
MFI.getObjectSize(FI),
|
||||
MFI.getObjectAlignment(FI));
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tSpill))
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tSTRspi))
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addFrameIndex(FI).addImm(0).addMemOperand(MMO));
|
||||
}
|
||||
@ -104,7 +104,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
MachineMemOperand::MOLoad,
|
||||
MFI.getObjectSize(FI),
|
||||
MFI.getObjectAlignment(FI));
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tRestore), DestReg)
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tLDRspi), DestReg)
|
||||
.addFrameIndex(FI).addImm(0).addMemOperand(MMO));
|
||||
}
|
||||
}
|
||||
|
@ -377,11 +377,9 @@ static void removeOperands(MachineInstr &MI, unsigned i) {
|
||||
static unsigned convertToNonSPOpcode(unsigned Opcode) {
|
||||
switch (Opcode) {
|
||||
case ARM::tLDRspi:
|
||||
case ARM::tRestore: // FIXME: Should this opcode be here?
|
||||
return ARM::tLDRi;
|
||||
|
||||
case ARM::tSTRspi:
|
||||
case ARM::tSpill: // FIXME: Should this opcode be here?
|
||||
return ARM::tSTRi;
|
||||
}
|
||||
|
||||
@ -524,7 +522,7 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
|
||||
|
||||
// If this is a thumb spill / restore, we will be using a constpool load to
|
||||
// materialize the offset.
|
||||
if (Opcode == ARM::tRestore || Opcode == ARM::tSpill) {
|
||||
if (Opcode == ARM::tLDRspi || Opcode == ARM::tSTRspi) {
|
||||
ImmOp.ChangeToImmediate(0);
|
||||
} else {
|
||||
// Otherwise, it didn't fit. Pull in what we can to simplify the immed.
|
||||
@ -664,7 +662,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
// Use the destination register to materialize sp + offset.
|
||||
unsigned TmpReg = MI.getOperand(0).getReg();
|
||||
bool UseRR = false;
|
||||
if (Opcode == ARM::tRestore) {
|
||||
if (Opcode == ARM::tLDRspi) {
|
||||
if (FrameReg == ARM::SP)
|
||||
emitThumbRegPlusImmInReg(MBB, II, dl, TmpReg, FrameReg,
|
||||
Offset, false, TII, *this);
|
||||
@ -687,7 +685,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
|
||||
bool UseRR = false;
|
||||
|
||||
if (Opcode == ARM::tSpill) {
|
||||
if (Opcode == ARM::tSTRspi) {
|
||||
if (FrameReg == ARM::SP)
|
||||
emitThumbRegPlusImmInReg(MBB, II, dl, VReg, FrameReg,
|
||||
Offset, false, TII, *this);
|
||||
|
@ -1667,14 +1667,12 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
|
||||
// tPOP_RET/t2LDMIA_RET conflict with tPOP/t2LDM (ditto)
|
||||
// tMOVCCi conflicts with tMOVi8
|
||||
// tMOVCCr conflicts with tMOVgpr2gpr
|
||||
// tSpill conflicts with tSTRspi
|
||||
// tLDRcp conflicts with tLDRspi
|
||||
// tRestore conflicts with tLDRspi
|
||||
// t2MOVCCi16 conflicts with tMOVi16
|
||||
if (Name == "tBfar" ||
|
||||
Name == "tPOP_RET" || Name == "t2LDMIA_RET" ||
|
||||
Name == "tMOVCCi" || Name == "tMOVCCr" ||
|
||||
Name == "tSpill" || Name == "tLDRcp" || Name == "tRestore" ||
|
||||
Name == "tLDRcp" ||
|
||||
Name == "t2MOVCCi16")
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user