diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-20 03:42:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-20 03:42:58 +0000 |
commit | c01d1232fe5a25d807c7ab975437ef6c514d2cd6 (patch) | |
tree | b55790814d8235baddf5d61280ae855cf97d9325 /lib/Target/X86/X86CodeEmitter.cpp | |
parent | 9fc2adc48781da63b2554d40960d0e63de238add (diff) |
* Rename X86::IMULr16 -> X86::IMULrr16
* Implement R1 = R2 * C where R1 and R2 are 32 or 16 bits. This avoids an
extra copy into a register, reducing register pressure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9278 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r-- | lib/Target/X86/X86CodeEmitter.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp index aaac24848c..f3fd142ed8 100644 --- a/lib/Target/X86/X86CodeEmitter.cpp +++ b/lib/Target/X86/X86CodeEmitter.cpp @@ -12,7 +12,7 @@ #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" -#include "llvm/Value.h" +#include "llvm/Function.h" #include "Support/Debug.h" #include "Support/Statistic.h" #include "Config/alloca.h" @@ -243,15 +243,12 @@ void Emitter::emitGlobalAddressForCall(GlobalValue *GV) { // Get the address from the backend... unsigned Address = MCE.getGlobalValueAddress(GV); - // If the machine code emitter doesn't know what the address IS yet, we have - // to take special measures. - // if (Address == 0) { // FIXME: this is JIT specific! if (TheJITResolver == 0) TheJITResolver = new JITResolver(MCE); Address = TheJITResolver->addFunctionReference(MCE.getCurrentPCValue(), - (Function*)GV); + cast<Function>(GV)); } emitMaybePCRelativeValue(Address, true); } @@ -536,8 +533,19 @@ void Emitter::emitInstruction(MachineInstr &MI) { case X86II::MRMSrcReg: MCE.emitByte(BaseOpcode); - emitRegModRMByte(MI.getOperand(MI.getNumOperands()-1).getReg(), - getX86RegNum(MI.getOperand(0).getReg())); + + if (MI.getNumOperands() == 2) { + emitRegModRMByte(MI.getOperand(MI.getNumOperands()-1).getReg(), + getX86RegNum(MI.getOperand(0).getReg())); + } else if (MI.getOperand(2).isImmediate()) { + emitRegModRMByte(MI.getOperand(1).getReg(), + getX86RegNum(MI.getOperand(0).getReg())); + + emitConstant(MI.getOperand(2).getImmedValue(), sizeOfPtr(Desc)); + } else { + emitRegModRMByte(MI.getOperand(2).getReg(), + getX86RegNum(MI.getOperand(0).getReg())); + } break; case X86II::MRMSrcMem: |