diff options
author | Craig Topper <craig.topper@gmail.com> | 2011-10-16 03:51:13 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2011-10-16 03:51:13 +0000 |
commit | 17730847d59c919d97f097d46a3fcba1888e5300 (patch) | |
tree | e953de771db6fdc42842e707c1124c6d462265b9 /lib/Target/X86/MCTargetDesc/X86BaseInfo.h | |
parent | 4025061b8a31e612af17bd9548b35e1918135291 (diff) | |
download | llvm-17730847d59c919d97f097d46a3fcba1888e5300.tar.gz llvm-17730847d59c919d97f097d46a3fcba1888e5300.tar.bz2 llvm-17730847d59c919d97f097d46a3fcba1888e5300.tar.xz |
Add X86 BEXTR instruction. This instruction uses VEX.vvvv to encode Operand 3 instead of Operand 2 so needs special casing in the disassembler and code emitter. Ultimately, should pass this information from tablegen
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142105 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/MCTargetDesc/X86BaseInfo.h')
-rw-r--r-- | lib/Target/X86/MCTargetDesc/X86BaseInfo.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/Target/X86/MCTargetDesc/X86BaseInfo.h b/lib/Target/X86/MCTargetDesc/X86BaseInfo.h index 555ca17f42..ce24904f50 100644 --- a/lib/Target/X86/MCTargetDesc/X86BaseInfo.h +++ b/lib/Target/X86/MCTargetDesc/X86BaseInfo.h @@ -462,7 +462,7 @@ namespace X86II { /// is duplicated in the MCInst (e.g. "EAX = addl EAX, [mem]") it is only /// counted as one operand. /// - static inline int getMemoryOperandNo(uint64_t TSFlags) { + static inline int getMemoryOperandNo(uint64_t TSFlags, unsigned Opcode) { switch (TSFlags & X86II::FormMask) { case X86II::MRMInitReg: assert(0 && "FIXME: Remove this form"); default: assert(0 && "Unknown FormMask value in getMemoryOperandNo!"); @@ -477,9 +477,12 @@ namespace X86II { case X86II::MRMDestMem: return 0; case X86II::MRMSrcMem: { + // FIXME: BEXTR uses VEX.vvvv for Operand 3 + bool IsBEXTR = (Opcode == X86::BEXTR32rr || Opcode == X86::BEXTR32rm || + Opcode == X86::BEXTR64rr || Opcode == X86::BEXTR64rm); bool HasVEX_4V = (TSFlags >> X86II::VEXShift) & X86II::VEX_4V; unsigned FirstMemOp = 1; - if (HasVEX_4V) + if (HasVEX_4V && !IsBEXTR) ++FirstMemOp;// Skip the register source (which is encoded in VEX_VVVV). // FIXME: Maybe lea should have its own form? This is a horrible hack. |