summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2011-12-30 06:23:39 +0000
committerCraig Topper <craig.topper@gmail.com>2011-12-30 06:23:39 +0000
commit2ba766ae84c31ee6066f9c5e8029751d3e92cb05 (patch)
treeb0cf1822236261cd470c1c09c7b276ea86ea17db /llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
parent03a0beda885cee8bb474f18d0b834b06c562f4b7 (diff)
downloadbcm5719-llvm-2ba766ae84c31ee6066f9c5e8029751d3e92cb05.tar.gz
bcm5719-llvm-2ba766ae84c31ee6066f9c5e8029751d3e92cb05.zip
Add disassembler support for VPERMIL2PD and VPERMIL2PS.
llvm-svn: 147368
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
index 1a248073392..c915df0049f 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
@@ -1472,6 +1472,7 @@ static int readVVVV(struct InternalInstruction* insn) {
static int readOperands(struct InternalInstruction* insn) {
int index;
int hasVVVV, needVVVV;
+ int sawRegImm = 0;
dbgprintf(insn, "readOperands()");
@@ -1500,11 +1501,20 @@ static int readOperands(struct InternalInstruction* insn) {
dbgprintf(insn, "We currently don't hande code-offset encodings");
return -1;
case ENCODING_IB:
+ if (sawRegImm) {
+ // saw a register immediate so don't read again and instead split the previous immediate
+ // FIXME: This is a hack
+ insn->immediates[insn->numImmediatesConsumed++] = insn->immediates[insn->numImmediatesConsumed - 1] & 0xf;
+ break;
+ }
if (readImmediate(insn, 1))
return -1;
if (insn->spec->operands[index].type == TYPE_IMM3 &&
insn->immediates[insn->numImmediatesConsumed - 1] > 7)
return -1;
+ if (insn->spec->operands[index].type == TYPE_XMM128 ||
+ insn->spec->operands[index].type == TYPE_XMM256)
+ sawRegImm = 1;
break;
case ENCODING_IW:
if (readImmediate(insn, 2))
OpenPOWER on IntegriCloud