aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86CodeEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r--lib/Target/X86/X86CodeEmitter.cpp70
1 files changed, 37 insertions, 33 deletions
diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp
index 1d12ce2d2c..8e0ba2a497 100644
--- a/lib/Target/X86/X86CodeEmitter.cpp
+++ b/lib/Target/X86/X86CodeEmitter.cpp
@@ -453,14 +453,24 @@ void Emitter::emitMemModRMByte(const MachineInstr &MI,
}
}
+static unsigned sizeOfImm(const TargetInstrDescriptor &Desc) {
+ switch (Desc.TSFlags & X86II::ImmMask) {
+ case X86II::Imm8: return 1;
+ case X86II::Imm16: return 2;
+ case X86II::Imm32: return 4;
+ default: assert(0 && "Immediate size not set!");
+ return 0;
+ }
+}
+
static unsigned sizeOfPtr(const TargetInstrDescriptor &Desc) {
- switch (Desc.TSFlags & X86II::ArgMask) {
- case X86II::Arg8: return 1;
- case X86II::Arg16: return 2;
- case X86II::Arg32: return 4;
- case X86II::ArgF32: return 4;
- case X86II::ArgF64: return 8;
- case X86II::ArgF80: return 10;
+ switch (Desc.TSFlags & X86II::MemMask) {
+ case X86II::Mem8: return 1;
+ case X86II::Mem16: return 2;
+ case X86II::Mem32: return 4;
+ case X86II::Mem64: return 8;
+ case X86II::Mem80: return 10;
+ case X86II::Mem128: return 16;
default: assert(0 && "Memory size not set!");
return 0;
}
@@ -527,25 +537,21 @@ void Emitter::emitInstruction(MachineInstr &MI) {
MCE.emitByte(BaseOpcode + getX86RegNum(MI.getOperand(0).getReg()));
if (MI.getNumOperands() == 2) {
MachineOperand &MO1 = MI.getOperand(1);
- if (MO1.isImmediate() || MO1.getVRegValueOrNull() ||
- MO1.isGlobalAddress() || MO1.isExternalSymbol()) {
- unsigned Size = sizeOfPtr(Desc);
- if (Value *V = MO1.getVRegValueOrNull()) {
- assert(Size == 4 && "Don't know how to emit non-pointer values!");
- emitGlobalAddressForPtr(cast<GlobalValue>(V));
- } else if (MO1.isGlobalAddress()) {
- assert(Size == 4 && "Don't know how to emit non-pointer values!");
- assert(!MO1.isPCRelative() && "Function pointer ref is PC relative?");
- emitGlobalAddressForPtr(MO1.getGlobal());
- } else if (MO1.isExternalSymbol()) {
- assert(Size == 4 && "Don't know how to emit non-pointer values!");
-
- unsigned Address = MCE.getGlobalValueAddress(MO1.getSymbolName());
- assert(Address && "Unknown external symbol!");
- emitMaybePCRelativeValue(Address, MO1.isPCRelative());
- } else {
- emitConstant(MO1.getImmedValue(), Size);
- }
+ if (Value *V = MO1.getVRegValueOrNull()) {
+ assert(sizeOfImm(Desc) == 4 && "Don't know how to emit non-pointer values!");
+ emitGlobalAddressForPtr(cast<GlobalValue>(V));
+ } else if (MO1.isGlobalAddress()) {
+ assert(sizeOfImm(Desc) == 4 && "Don't know how to emit non-pointer values!");
+ assert(!MO1.isPCRelative() && "Function pointer ref is PC relative?");
+ emitGlobalAddressForPtr(MO1.getGlobal());
+ } else if (MO1.isExternalSymbol()) {
+ assert(sizeOfImm(Desc) == 4 && "Don't know how to emit non-pointer values!");
+
+ unsigned Address = MCE.getGlobalValueAddress(MO1.getSymbolName());
+ assert(Address && "Unknown external symbol!");
+ emitMaybePCRelativeValue(Address, MO1.isPCRelative());
+ } else {
+ emitConstant(MO1.getImmedValue(), sizeOfImm(Desc));
}
}
break;
@@ -555,7 +561,7 @@ void Emitter::emitInstruction(MachineInstr &MI) {
emitRegModRMByte(MI.getOperand(0).getReg(),
getX86RegNum(MI.getOperand(1).getReg()));
if (MI.getNumOperands() == 3)
- emitConstant(MI.getOperand(2).getImmedValue(), sizeOfPtr(Desc));
+ emitConstant(MI.getOperand(2).getImmedValue(), sizeOfImm(Desc));
break;
}
case X86II::MRMDestMem:
@@ -569,14 +575,14 @@ void Emitter::emitInstruction(MachineInstr &MI) {
emitRegModRMByte(MI.getOperand(1).getReg(),
getX86RegNum(MI.getOperand(0).getReg()));
if (MI.getNumOperands() == 3)
- emitConstant(MI.getOperand(2).getImmedValue(), sizeOfPtr(Desc));
+ emitConstant(MI.getOperand(2).getImmedValue(), sizeOfImm(Desc));
break;
case X86II::MRMSrcMem:
MCE.emitByte(BaseOpcode);
emitMemModRMByte(MI, 1, getX86RegNum(MI.getOperand(0).getReg()));
if (MI.getNumOperands() == 2+4)
- emitConstant(MI.getOperand(5).getImmedValue(), sizeOfPtr(Desc));
+ emitConstant(MI.getOperand(5).getImmedValue(), sizeOfImm(Desc));
break;
case X86II::MRM0r: case X86II::MRM1r:
@@ -588,8 +594,7 @@ void Emitter::emitInstruction(MachineInstr &MI) {
(Desc.TSFlags & X86II::FormMask)-X86II::MRM0r);
if (MI.getOperand(MI.getNumOperands()-1).isImmediate()) {
- unsigned Size = sizeOfPtr(Desc);
- emitConstant(MI.getOperand(MI.getNumOperands()-1).getImmedValue(), Size);
+ emitConstant(MI.getOperand(MI.getNumOperands()-1).getImmedValue(), sizeOfImm(Desc));
}
break;
@@ -601,9 +606,8 @@ void Emitter::emitInstruction(MachineInstr &MI) {
emitMemModRMByte(MI, 0, (Desc.TSFlags & X86II::FormMask)-X86II::MRM0m);
if (MI.getNumOperands() == 5) {
- unsigned Size = sizeOfPtr(Desc);
if (MI.getOperand(4).isImmediate())
- emitConstant(MI.getOperand(4).getImmedValue(), Size);
+ emitConstant(MI.getOperand(4).getImmedValue(), sizeOfImm(Desc));
else if (MI.getOperand(4).isGlobalAddress())
emitGlobalAddressForPtr(MI.getOperand(4).getGlobal());
else