[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