diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp
index f8be684..40d757b 100644
--- a/lib/Target/X86/InstSelectSimple.cpp
+++ b/lib/Target/X86/InstSelectSimple.cpp
@@ -114,9 +114,10 @@
       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 @@
         // 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;
diff --git a/lib/Target/X86/MachineCodeEmitter.cpp b/lib/Target/X86/MachineCodeEmitter.cpp
index b5b1a0d..e4d1724 100644
--- a/lib/Target/X86/MachineCodeEmitter.cpp
+++ b/lib/Target/X86/MachineCodeEmitter.cpp
@@ -157,17 +157,19 @@
     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 @@
     }
 
     // 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
diff --git a/lib/Target/X86/Printer.cpp b/lib/Target/X86/Printer.cpp
index 4ce2624..d2dbf64 100644
--- a/lib/Target/X86/Printer.cpp
+++ b/lib/Target/X86/Printer.cpp
@@ -148,8 +148,8 @@
 
   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;
   }
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index 4ce2624..d2dbf64 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -148,8 +148,8 @@
 
   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;
   }
diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp
index b5b1a0d..e4d1724 100644
--- a/lib/Target/X86/X86CodeEmitter.cpp
+++ b/lib/Target/X86/X86CodeEmitter.cpp
@@ -157,17 +157,19 @@
     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 @@
     }
 
     // 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
diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp
index f8be684..40d757b 100644
--- a/lib/Target/X86/X86ISelSimple.cpp
+++ b/lib/Target/X86/X86ISelSimple.cpp
@@ -114,9 +114,10 @@
       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 @@
         // 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;
