If a function has a non-zero sized frame, use an add to adjust the stack

pointer in the epilog, not a load.

llvm-svn: 25229
This commit is contained in:
Chris Lattner 2006-01-11 23:03:54 +00:00
parent c040152f94
commit 3280da3cda
1 changed files with 20 additions and 9 deletions

View File

@ -370,23 +370,34 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
void PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
MachineBasicBlock::iterator MBBI = prior(MBB.end());
MachineInstr *MI;
assert(MBBI->getOpcode() == PPC::BLR &&
"Can only insert epilog into returning blocks");
// Get the number of bytes allocated from the FrameInfo...
unsigned NumBytes = MFI->getStackSize();
unsigned GPRSize = 4;
// Get the number of bytes allocated from the FrameInfo.
unsigned NumBytes = MF.getFrameInfo()->getStackSize();
unsigned GPRSize = 4;
if (NumBytes != 0) {
// If this function has a frame pointer, load the saved stack pointer from
// its stack slot.
if (hasFP(MF)) {
MI = BuildMI(PPC::LWZ, 2, PPC::R31).addSImm(GPRSize).addReg(PPC::R31);
MBB.insert(MBBI, MI);
BuildMI(MBB, MBBI, PPC::LWZ, 2, PPC::R31)
.addSImm(GPRSize).addReg(PPC::R31);
}
// The loaded (or persistent) stack pointer value is offseted by the 'stwu'
// on entry to the function. Add this offset back now.
if (NumBytes <= 32768) {
BuildMI(MBB, MBBI, PPC::ADDI, 2, PPC::R1)
.addReg(PPC::R1).addSImm(NumBytes);
} else {
BuildMI(MBB, MBBI, PPC::LIS, 1, PPC::R0).addSImm(NumBytes >> 16);
BuildMI(MBB, MBBI, PPC::ORI, 2, PPC::R0)
.addReg(PPC::R0).addImm(NumBytes & 0xFFFF);
BuildMI(MBB, MBBI, PPC::ADD4, 2, PPC::R1)
.addReg(PPC::R0).addReg(PPC::R1);
}
MI = BuildMI(PPC::LWZ, 2, PPC::R1).addSImm(0).addReg(PPC::R1);
MBB.insert(MBBI, MI);
}
}