mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 08:17:40 +00:00
Add pseudo instructions to the XCore for (load|store|load address) of a
frame index. eliminateFrameIndex will replace these instructions with (LDWSP|STWSP|LDAWSP) or (LDW|STW|LDAWF) if a frame pointer is in use. This fixes PR 3324. Previously we used LDWSP, STWSP, LDAWSP before frame pointer elimination. However since they were marked as implicitly using SP they could not be rematerialised. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62238 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -77,7 +77,7 @@ bool XCoreInstrInfo::isMoveInstr(const MachineInstr &MI,
|
||||
unsigned
|
||||
XCoreInstrInfo::isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const{
|
||||
int Opcode = MI->getOpcode();
|
||||
if (Opcode == XCore::LDWSP_ru6 || Opcode == XCore::LDWSP_lru6)
|
||||
if (Opcode == XCore::LDWFI)
|
||||
{
|
||||
if ((MI->getOperand(1).isFI()) && // is a stack slot
|
||||
(MI->getOperand(2).isImm()) && // the imm is zero
|
||||
@@ -99,19 +99,11 @@ unsigned
|
||||
XCoreInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
|
||||
int &FrameIndex) const {
|
||||
int Opcode = MI->getOpcode();
|
||||
if (Opcode == XCore::STWSP_ru6 || Opcode == XCore::STWSP_lru6)
|
||||
if (Opcode == XCore::STWFI)
|
||||
{
|
||||
if ((MI->getOperand(1).isFI()) && // is a stack slot
|
||||
(MI->getOperand(2).isImm()) && // the imm is zero
|
||||
(isZeroImm(MI->getOperand(2))))
|
||||
{
|
||||
FrameIndex = MI->getOperand(1).getIndex();
|
||||
return MI->getOperand(0).getReg();
|
||||
}
|
||||
}
|
||||
else if (Opcode == XCore::STWSP_ru6_2 || Opcode == XCore::STWSP_lru6_2)
|
||||
{
|
||||
if (MI->getOperand(1).isFI())
|
||||
(isZeroImm(MI->getOperand(2))))
|
||||
{
|
||||
FrameIndex = MI->getOperand(1).getIndex();
|
||||
return MI->getOperand(0).getReg();
|
||||
@@ -387,8 +379,8 @@ void XCoreInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
unsigned SrcReg, bool isKill, int FrameIndex,
|
||||
const TargetRegisterClass *RC) const
|
||||
{
|
||||
BuildMI(MBB, I, get(XCore::STWSP_lru6)).addReg(SrcReg, false, false, isKill)
|
||||
.addFrameIndex(FrameIndex).addImm(0);
|
||||
BuildMI(MBB, I, get(XCore::STWFI)).addReg(SrcReg, false, false, isKill)
|
||||
.addFrameIndex(FrameIndex).addImm(0);
|
||||
}
|
||||
|
||||
void XCoreInstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg,
|
||||
@@ -404,8 +396,8 @@ void XCoreInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
||||
unsigned DestReg, int FrameIndex,
|
||||
const TargetRegisterClass *RC) const
|
||||
{
|
||||
BuildMI(MBB, I, get(XCore::LDWSP_lru6), DestReg).addFrameIndex(FrameIndex)
|
||||
.addImm(0);
|
||||
BuildMI(MBB, I, get(XCore::LDWFI), DestReg).addFrameIndex(FrameIndex)
|
||||
.addImm(0);
|
||||
}
|
||||
|
||||
void XCoreInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
|
||||
|
||||
Reference in New Issue
Block a user