aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-01-13 00:50:33 +0000
committerChris Lattner <sabre@nondot.org>2003-01-13 00:50:33 +0000
commitd264bec88a2c6fb75fe71a030b303569efc8da1a (patch)
tree74b1ce4940885242ad3f1b414f5df8de3018faf4
parent0c514f4e2711ab57bf75f26806f7b8584dfbee6f (diff)
* Move frame and constant pool indexes to first argument of memory reference
so we can put an offset in there as well... * Fix long/ulong stuff git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5231 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86RegisterInfo.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp
index d45b21bf31..821a4735cf 100644
--- a/lib/Target/X86/X86RegisterInfo.cpp
+++ b/lib/Target/X86/X86RegisterInfo.cpp
@@ -123,27 +123,29 @@ void X86RegisterInfo::eliminateCallFramePseudoInstr(MachineFunction &MF,
void X86RegisterInfo::eliminateFrameIndex(MachineFunction &MF,
MachineBasicBlock::iterator &II) const {
- unsigned i = 3;
+ unsigned i = 0;
MachineInstr &MI = **II;
while (!MI.getOperand(i).isFrameIndex()) {
++i;
assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
}
+ int FrameIndex = MI.getOperand(i).getFrameIndex();
+
// This must be part of a four operand memory reference. Replace the
- // FrameIndex with the offset and the base register with EBP.
- MI.SetMachineOperandReg(i-3, hasFP(MF) ? X86::EBP : X86::ESP);
+ // FrameIndex with base register with EBP. Add add an offset to the offset.
+ MI.SetMachineOperandReg(i, hasFP(MF) ? X86::EBP : X86::ESP);
- // Now replace the frame index itself with the offset from EBP.
- int FrameIndex = MI.getOperand(i).getFrameIndex();
- int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
+ // Now add the frame object offset to the offset from EBP.
+ int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) +
+ MI.getOperand(i+3).getImmedValue();
if (!hasFP(MF) && hasSPAdjust(MF)) {
const MachineFrameInfo *MFI = MF.getFrameInfo();
Offset += MFI->getStackSize() + MFI->getMaxCallFrameSize();
}
- MI.SetMachineOperandConst(i, MachineOperand::MO_SignExtendedImmed, Offset);
+ MI.SetMachineOperandConst(i+3, MachineOperand::MO_SignExtendedImmed, Offset);
}
void X86RegisterInfo::processFunctionBeforeFrameFinalized(MachineFunction &MF)
@@ -332,15 +334,14 @@ X86RegisterInfo::X86RegisterInfo()
const TargetRegisterClass*
X86RegisterInfo::getRegClassForType(const Type* Ty) const {
switch (Ty->getPrimitiveID()) {
- default: assert(0 && "Invalid type to getClass!");
+ case Type::LongTyID:
+ case Type::ULongTyID: assert(0 && "Long values can't fit in registers!");
+ default: assert(0 && "Invalid type to getClass!");
case Type::BoolTyID:
case Type::SByteTyID:
case Type::UByteTyID: return &X86ByteRegisterClassInstance;
case Type::ShortTyID:
case Type::UShortTyID: return &X86ShortRegisterClassInstance;
- case Type::LongTyID: // FIXME: Longs are not handled yet!
- case Type::ULongTyID: // FIXME: Treat these like ints, this is bogus!
-
case Type::IntTyID:
case Type::UIntTyID:
case Type::PointerTyID: return &X86IntRegisterClassInstance;