[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
Chris Lattner
lattner at cs.uiuc.edu
Wed Jan 11 15:04:07 PST 2006
Changes in directory llvm/lib/Target/PowerPC:
PPCRegisterInfo.cpp updated: 1.39 -> 1.40
---
Log message:
If a function has a non-zero sized frame, use an add to adjust the stack
pointer in the epilog, not a load.
---
Diffs of the changes: (+20 -9)
PPCRegisterInfo.cpp | 29 ++++++++++++++++++++---------
1 files changed, 20 insertions(+), 9 deletions(-)
Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.39 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.40
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.39 Mon Jan 9 12:28:21 2006
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Wed Jan 11 17:03:54 2006
@@ -370,23 +370,34 @@
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);
}
}
More information about the llvm-commits
mailing list