diff options
author | Nicolas Geoffray <nicolas.geoffray@lip6.fr> | 2011-08-28 13:07:57 +0000 |
---|---|---|
committer | Nicolas Geoffray <nicolas.geoffray@lip6.fr> | 2011-08-28 13:07:57 +0000 |
commit | f786bae6ac35d1ae879ff72e4b974b444c27cde6 (patch) | |
tree | b294577ceebe209df98c0435b4cf0a68796709f3 /llvm/lib | |
parent | 52600ee8c3ed94fb69d6147a640a330e3d7b00ed (diff) | |
download | bcm5719-llvm-f786bae6ac35d1ae879ff72e4b974b444c27cde6.tar.gz bcm5719-llvm-f786bae6ac35d1ae879ff72e4b974b444c27cde6.zip |
Encoding of instructions referencing segments has changed. Do what X86MCCodeEmitter does.
llvm-svn: 138723
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86CodeEmitter.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp index aeff03a89ec..dc1524cb30b 100644 --- a/llvm/lib/Target/X86/X86CodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp @@ -618,14 +618,32 @@ void Emitter<CodeEmitter>::emitInstruction(MachineInstr &MI, // Emit segment override opcode prefix as needed. switch (Desc->TSFlags & X86II::SegOvrMask) { - case X86II::FS: - MCE.emitByte(0x64); - break; - case X86II::GS: - MCE.emitByte(0x65); + case 0: { + // Determine where the memory operand starts, if present. + int MemOperand = X86II::getMemoryOperandNo(Desc->TSFlags); + // No segment override, check for explicit one on memory operand. + if (MemOperand != -1) { // If the instruction has a memory operand. + switch (MI.getOperand(MemOperand+X86::AddrSegmentReg).getReg()) { + default: assert(0 && "Unknown segment register!"); + case 0: break; + case X86::CS: MCE.emitByte(0x2E); break; + case X86::SS: MCE.emitByte(0x36); break; + case X86::DS: MCE.emitByte(0x3E); break; + case X86::ES: MCE.emitByte(0x26); break; + case X86::FS: MCE.emitByte(0x64); break; + case X86::GS: MCE.emitByte(0x65); break; + } + } + } break; - default: llvm_unreachable("Invalid segment!"); - case 0: break; // No segment override! + + case X86II::FS: + MCE.emitByte(0x64); + break; + case X86II::GS: + MCE.emitByte(0x65); + break; + default: llvm_unreachable("Invalid segment!"); } // Emit the repeat opcode prefix as needed. |