[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