diff options
| author | Craig Topper <craig.topper@gmail.com> | 2014-01-06 04:55:54 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@gmail.com> | 2014-01-06 04:55:54 +0000 |
| commit | 3c80d62a6ceacac6341619d5ffe7afbab84be5bf (patch) | |
| tree | 775c53b542d64dd6073a46d41c95f321c394e958 /llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | |
| parent | 32a14e0a7b7fcc85dbeffef3f7a0c9a1336c887a (diff) | |
| download | bcm5719-llvm-3c80d62a6ceacac6341619d5ffe7afbab84be5bf.tar.gz bcm5719-llvm-3c80d62a6ceacac6341619d5ffe7afbab84be5bf.zip | |
[x86] Add basic support for .code16
This is not really expected to work right yet. Mostly because we will
still emit the OpSize (0x66) prefix in all the wrong places, along with
a number of other corner cases. Those will all be fixed in the subsequent
commits.
Patch from David Woodhouse.
llvm-svn: 198584
Diffstat (limited to 'llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp index 293541a8438..51b90b1c497 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -49,7 +49,12 @@ public: bool is32BitMode() const { // FIXME: Can tablegen auto-generate this? - return (STI.getFeatureBits() & X86::Mode64Bit) == 0; + return (STI.getFeatureBits() & X86::Mode32Bit) != 0; + } + + bool is16BitMode() const { + // FIXME: Can tablegen auto-generate this? + return (STI.getFeatureBits() & X86::Mode16Bit) != 0; } unsigned GetX86RegNum(const MCOperand &MO) const { @@ -1177,13 +1182,16 @@ void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, assert(!Is64BitMemOperand(MI, MemOperand)); need_address_override = Is16BitMemOperand(MI, MemOperand); } else { - need_address_override = false; + assert(is16BitMode()); + assert(!Is64BitMemOperand(MI, MemOperand)); + need_address_override = !Is16BitMemOperand(MI, MemOperand); } if (need_address_override) EmitByte(0x67, CurByte, OS); // Emit the operand size opcode prefix as needed. + // FIXME for is16BitMode(). if (TSFlags & X86II::OpSize) EmitByte(0x66, CurByte, OS); |

