summaryrefslogtreecommitdiff
path: root/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2011-10-16 03:51:13 +0000
committerCraig Topper <craig.topper@gmail.com>2011-10-16 03:51:13 +0000
commit17730847d59c919d97f097d46a3fcba1888e5300 (patch)
treee953de771db6fdc42842e707c1124c6d462265b9 /lib/Target/X86/MCTargetDesc/X86BaseInfo.h
parent4025061b8a31e612af17bd9548b35e1918135291 (diff)
downloadllvm-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.h7
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.