InstSelectSimple.cpp: Give promote32 a comment. Add initial
authorBrian Gaeke <gaeke@uiuc.edu>
Fri, 13 Dec 2002 07:56:18 +0000 (07:56 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Fri, 13 Dec 2002 07:56:18 +0000 (07:56 +0000)
 implementation of getReg() for arguments.

MachineCodeEmitter.cpp: Fix using EBP with index, scale and no
 displacement (whew!) due to Chris.

Printer.cpp: Fix printing out index and scale in memory references.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4998 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/InstSelectSimple.cpp
lib/Target/X86/MachineCodeEmitter.cpp
lib/Target/X86/Printer.cpp
lib/Target/X86/X86AsmPrinter.cpp
lib/Target/X86/X86CodeEmitter.cpp
lib/Target/X86/X86ISelSimple.cpp

index f8be68450024d72ad4b1b379637c636d6b76e0cf..40d757b645af08b77d53a2cf64f455e05f39e66c 100644 (file)
@@ -114,9 +114,10 @@ namespace {
       abort();
     }
 
-    void promote32(unsigned targetReg, Value *V);
-
-    // emitGEPOperation - Common code shared between visitGetElemenPtrInst and
+    /// promote32 - Make a value 32-bits wide, and put it somewhere.
+    void promote32 (const unsigned targetReg, Value *v);
+    
+    // emitGEPOperation - Common code shared between visitGetElementPtrInst and
     // constant expression GEP support.
     //
     void emitGEPOperation(Value *Src, User::op_iterator IdxBegin,
@@ -156,7 +157,25 @@ namespace {
         // Move the address of the global into the register
         BuildMI(BB, X86::MOVir32, 1, Reg).addReg(GV);
       } else if (Argument *A = dyn_cast<Argument>(V)) {
-        std::cerr << "ERROR: Arguments not implemented in SimpleInstSel\n";
+       // Find the position of the argument in the argument list.
+       const Function *f = F->getFunction ();
+       int counter = 0, argPosition = -1;
+       for (Function::const_aiterator ai = f->abegin (), ae = f->aend ();
+            ai != ae; ++ai) {
+         ++counter;
+         if (&(*ai) == A) {
+           argPosition = counter;
+         }
+       }
+       assert (argPosition != -1
+               && "Argument not found in current function's argument list");
+       // Load it out of the stack frame at EBP + 4*argPosition.
+       // (First, load Reg with argPosition, then load Reg with DWORD
+       // PTR [EBP + 4*Reg].)
+       BuildMI (BB, X86::MOVir32, 1, Reg).addZImm (argPosition);
+       BuildMI (BB, X86::MOVmr32, 4,
+                Reg).addReg (X86::EBP).addZImm (4).addReg (Reg).addSImm (0);
+        // std::cerr << "ERROR: Arguments not implemented in SimpleInstSel\n";
       }
 
       return Reg;
index b5b1a0d754fe430d2d27be49a5ce2ff821f22e84..e4d17246821cddba7b353b4734e22446462a9e28 100644 (file)
@@ -157,17 +157,19 @@ void Emitter::emitMemModRMByte(const MachineInstr &MI,
     assert(IndexReg.getReg() != X86::ESP && "Cannot use ESP as index reg!");
 
     bool ForceDisp32 = false;
+    bool ForceDisp8  = false;
     if (BaseReg.getReg() == 0) {
       // If there is no base register, we emit the special case SIB byte with
       // MOD=0, BASE=5, to JUST get the index, scale, and displacement.
       MCE.emitByte(ModRMByte(0, RegOpcodeField, 4));
       ForceDisp32 = true;
-    } else if (Disp.getImmedValue() == 0) {
+    } else if (Disp.getImmedValue() == 0 && BaseReg.getReg() != X86::EBP) {
       // Emit no displacement ModR/M byte
       MCE.emitByte(ModRMByte(0, RegOpcodeField, 4));
     } else if (isDisp8(Disp.getImmedValue())) {
       // Emit the disp8 encoding...
       MCE.emitByte(ModRMByte(1, RegOpcodeField, 4));
+      ForceDisp8 = true;           // Make sure to force 8 bit disp if Base=EBP
     } else {
       // Emit the normal disp32 encoding...
       MCE.emitByte(ModRMByte(2, RegOpcodeField, 4));
@@ -189,7 +191,7 @@ void Emitter::emitMemModRMByte(const MachineInstr &MI,
     }
 
     // Do we need to output a displacement?
-    if (Disp.getImmedValue() != 0 || ForceDisp32) {
+    if (Disp.getImmedValue() != 0 || ForceDisp32 || ForceDisp8) {
       if (!ForceDisp32 && isDisp8(Disp.getImmedValue()))
         emitConstant(Disp.getImmedValue(), 1);
       else
index 4ce2624e4bff0b24d7e0e3d9d31c8e4094156585..d2dbf64d14262da850d9161eba53b3d5e860393e 100644 (file)
@@ -148,8 +148,8 @@ static void printMemReference(std::ostream &O, const MachineInstr *MI,
 
   if (IndexReg.getReg()) {
     if (NeedPlus) O << " + ";
-    if (IndexReg.getImmedValue() != 1)
-      O << IndexReg.getImmedValue() << "*";
+    if (Scale.getImmedValue() != 1)
+      O << Scale.getImmedValue() << "*";
     printOp(O, IndexReg, RI);
     NeedPlus = true;
   }
index 4ce2624e4bff0b24d7e0e3d9d31c8e4094156585..d2dbf64d14262da850d9161eba53b3d5e860393e 100644 (file)
@@ -148,8 +148,8 @@ static void printMemReference(std::ostream &O, const MachineInstr *MI,
 
   if (IndexReg.getReg()) {
     if (NeedPlus) O << " + ";
-    if (IndexReg.getImmedValue() != 1)
-      O << IndexReg.getImmedValue() << "*";
+    if (Scale.getImmedValue() != 1)
+      O << Scale.getImmedValue() << "*";
     printOp(O, IndexReg, RI);
     NeedPlus = true;
   }
index b5b1a0d754fe430d2d27be49a5ce2ff821f22e84..e4d17246821cddba7b353b4734e22446462a9e28 100644 (file)
@@ -157,17 +157,19 @@ void Emitter::emitMemModRMByte(const MachineInstr &MI,
     assert(IndexReg.getReg() != X86::ESP && "Cannot use ESP as index reg!");
 
     bool ForceDisp32 = false;
+    bool ForceDisp8  = false;
     if (BaseReg.getReg() == 0) {
       // If there is no base register, we emit the special case SIB byte with
       // MOD=0, BASE=5, to JUST get the index, scale, and displacement.
       MCE.emitByte(ModRMByte(0, RegOpcodeField, 4));
       ForceDisp32 = true;
-    } else if (Disp.getImmedValue() == 0) {
+    } else if (Disp.getImmedValue() == 0 && BaseReg.getReg() != X86::EBP) {
       // Emit no displacement ModR/M byte
       MCE.emitByte(ModRMByte(0, RegOpcodeField, 4));
     } else if (isDisp8(Disp.getImmedValue())) {
       // Emit the disp8 encoding...
       MCE.emitByte(ModRMByte(1, RegOpcodeField, 4));
+      ForceDisp8 = true;           // Make sure to force 8 bit disp if Base=EBP
     } else {
       // Emit the normal disp32 encoding...
       MCE.emitByte(ModRMByte(2, RegOpcodeField, 4));
@@ -189,7 +191,7 @@ void Emitter::emitMemModRMByte(const MachineInstr &MI,
     }
 
     // Do we need to output a displacement?
-    if (Disp.getImmedValue() != 0 || ForceDisp32) {
+    if (Disp.getImmedValue() != 0 || ForceDisp32 || ForceDisp8) {
       if (!ForceDisp32 && isDisp8(Disp.getImmedValue()))
         emitConstant(Disp.getImmedValue(), 1);
       else
index f8be68450024d72ad4b1b379637c636d6b76e0cf..40d757b645af08b77d53a2cf64f455e05f39e66c 100644 (file)
@@ -114,9 +114,10 @@ namespace {
       abort();
     }
 
-    void promote32(unsigned targetReg, Value *V);
-
-    // emitGEPOperation - Common code shared between visitGetElemenPtrInst and
+    /// promote32 - Make a value 32-bits wide, and put it somewhere.
+    void promote32 (const unsigned targetReg, Value *v);
+    
+    // emitGEPOperation - Common code shared between visitGetElementPtrInst and
     // constant expression GEP support.
     //
     void emitGEPOperation(Value *Src, User::op_iterator IdxBegin,
@@ -156,7 +157,25 @@ namespace {
         // Move the address of the global into the register
         BuildMI(BB, X86::MOVir32, 1, Reg).addReg(GV);
       } else if (Argument *A = dyn_cast<Argument>(V)) {
-        std::cerr << "ERROR: Arguments not implemented in SimpleInstSel\n";
+       // Find the position of the argument in the argument list.
+       const Function *f = F->getFunction ();
+       int counter = 0, argPosition = -1;
+       for (Function::const_aiterator ai = f->abegin (), ae = f->aend ();
+            ai != ae; ++ai) {
+         ++counter;
+         if (&(*ai) == A) {
+           argPosition = counter;
+         }
+       }
+       assert (argPosition != -1
+               && "Argument not found in current function's argument list");
+       // Load it out of the stack frame at EBP + 4*argPosition.
+       // (First, load Reg with argPosition, then load Reg with DWORD
+       // PTR [EBP + 4*Reg].)
+       BuildMI (BB, X86::MOVir32, 1, Reg).addZImm (argPosition);
+       BuildMI (BB, X86::MOVmr32, 4,
+                Reg).addReg (X86::EBP).addZImm (4).addReg (Reg).addSImm (0);
+        // std::cerr << "ERROR: Arguments not implemented in SimpleInstSel\n";
       }
 
       return Reg;