* Move frame and constant pool indexes to first argument of memory reference
authorChris Lattner <sabre@nondot.org>
Mon, 13 Jan 2003 00:50:33 +0000 (00:50 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 13 Jan 2003 00:50:33 +0000 (00:50 +0000)
  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

lib/Target/X86/X86RegisterInfo.cpp

index d45b21bf31cbfa647c5f64308a5fe401d47b7bb7..821a4735cf36993349c314e3f62613f7cc7e6e51 100644 (file)
@@ -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;