summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86CodeEmitter.cpp
diff options
context:
space:
mode:
authorNicolas Geoffray <nicolas.geoffray@lip6.fr>2011-08-28 13:07:57 +0000
committerNicolas Geoffray <nicolas.geoffray@lip6.fr>2011-08-28 13:07:57 +0000
commitc98da24bed617b9264db8df5f378cccd2a95e792 (patch)
treed04f8987d5129d445d5b40cd96961c580764bfdf /lib/Target/X86/X86CodeEmitter.cpp
parentbe6ceb6ebcfb48e09ffab297c1537c87383f0ce9 (diff)
downloadllvm-c98da24bed617b9264db8df5f378cccd2a95e792.tar.gz
llvm-c98da24bed617b9264db8df5f378cccd2a95e792.tar.bz2
llvm-c98da24bed617b9264db8df5f378cccd2a95e792.tar.xz
Encoding of instructions referencing segments has changed. Do what X86MCCodeEmitter does.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138723 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r--lib/Target/X86/X86CodeEmitter.cpp32
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp
index aeff03a89e..dc1524cb30 100644
--- a/lib/Target/X86/X86CodeEmitter.cpp
+++ b/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.