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,
// 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;
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));
}
// 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
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;
}
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;
}
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));
}
// 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
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,
// 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;