diff options
author | Brian Gaeke <gaeke@uiuc.edu> | 2002-12-13 07:56:18 +0000 |
---|---|---|
committer | Brian Gaeke <gaeke@uiuc.edu> | 2002-12-13 07:56:18 +0000 |
commit | 95780cccef3f6630a912aba9e2241819d7a00ba4 (patch) | |
tree | 39474209056a7b89d2fde53c2c3ff587939e0441 | |
parent | 3153b35a520f40954c2bded460e0b055f15727b9 (diff) |
InstSelectSimple.cpp: Give promote32 a comment. Add initial
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
-rw-r--r-- | lib/Target/X86/InstSelectSimple.cpp | 27 | ||||
-rw-r--r-- | lib/Target/X86/MachineCodeEmitter.cpp | 6 | ||||
-rw-r--r-- | lib/Target/X86/Printer.cpp | 4 | ||||
-rw-r--r-- | lib/Target/X86/X86AsmPrinter.cpp | 4 | ||||
-rw-r--r-- | lib/Target/X86/X86CodeEmitter.cpp | 6 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelSimple.cpp | 27 |
6 files changed, 58 insertions, 16 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index f8be684500..40d757b645 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -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; diff --git a/lib/Target/X86/MachineCodeEmitter.cpp b/lib/Target/X86/MachineCodeEmitter.cpp index b5b1a0d754..e4d1724682 100644 --- a/lib/Target/X86/MachineCodeEmitter.cpp +++ b/lib/Target/X86/MachineCodeEmitter.cpp @@ -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 diff --git a/lib/Target/X86/Printer.cpp b/lib/Target/X86/Printer.cpp index 4ce2624e4b..d2dbf64d14 100644 --- a/lib/Target/X86/Printer.cpp +++ b/lib/Target/X86/Printer.cpp @@ -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; } diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index 4ce2624e4b..d2dbf64d14 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -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; } diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp index b5b1a0d754..e4d1724682 100644 --- a/lib/Target/X86/X86CodeEmitter.cpp +++ b/lib/Target/X86/X86CodeEmitter.cpp @@ -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 diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index f8be684500..40d757b645 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -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; |