[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Jun 27 11:56:01 PDT 2006



Changes in directory llvm/lib/Target/PowerPC:

PPCRegisterInfo.cpp updated: 1.70 -> 1.71
---
Log message:

Fix rewriting frame offsets with ixaddr instructions, which implicitly shift
the offset two bits to the left.


---
Diffs of the changes:  (+21 -8)

 PPCRegisterInfo.cpp |   29 +++++++++++++++++++++--------
 1 files changed, 21 insertions(+), 8 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.70 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.71
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.70	Tue Jun 20 18:18:58 2006
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp	Tue Jun 27 13:55:49 2006
@@ -390,9 +390,27 @@
   // Take into account whether it's an add or mem instruction
   unsigned OffIdx = (i == 2) ? 1 : 2;
 
+  // Figure out if the offset in the instruction is shifted right two bits. This
+  // is true for instructions like "STD", which the machine implicitly adds two
+  // low zeros to.
+  bool isIXAddr = false;
+  switch (MI.getOpcode()) {
+  case PPC::LWA:
+  case PPC::LD:
+  case PPC::STD:
+  case PPC::STD_32:
+    isIXAddr = true;
+    break;
+  }
+  
+  
   // Now add the frame object offset to the offset from r1.
-  int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) +
-               MI.getOperand(OffIdx).getImmedValue();
+  int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
+  
+  if (!isIXAddr)
+    Offset += MI.getOperand(OffIdx).getImmedValue();
+  else
+    Offset += MI.getOperand(OffIdx).getImmedValue() << 2;
 
   // If we're not using a Frame Pointer that has been set to the value of the
   // SP before having the stack size subtracted from it, then add the stack size
@@ -415,14 +433,9 @@
     MI.getOperand(1).ChangeToRegister(MI.getOperand(i).getReg());
     MI.getOperand(2).ChangeToRegister(PPC::R0);
   } else {
-    switch (MI.getOpcode()) {
-    case PPC::LWA:
-    case PPC::LD:
-    case PPC::STD:
-    case PPC::STD_32:
+    if (isIXAddr) {
       assert((Offset & 3) == 0 && "Invalid frame offset!");
       Offset >>= 2;    // The actual encoded value has the low two bits zero.
-      break;
     }
     MI.getOperand(OffIdx).ChangeToImmediate(Offset);
   }






More information about the llvm-commits mailing list