summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/Disassembler
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2014-01-20 12:02:48 +0000
committerDavid Woodhouse <dwmw2@infradead.org>2014-01-20 12:02:48 +0000
commit9c74fdb8b9bc414916a1396b73a0addb27c12f66 (patch)
tree6ac5af7894e03579f884ad7c61d494081c196289 /llvm/lib/Target/X86/Disassembler
parent3442f3429e06aab276ee93cb05bba888a7b7efdf (diff)
downloadbcm5719-llvm-9c74fdb8b9bc414916a1396b73a0addb27c12f66.tar.gz
bcm5719-llvm-9c74fdb8b9bc414916a1396b73a0addb27c12f66.zip
[x86] Fix 16-bit disassembly of JCXZ/JECXZ
llvm-svn: 199653
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
index 66badd95c32..48c16977133 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
@@ -987,6 +987,25 @@ static int getID(struct InternalInstruction* insn, const void *miiArg) {
if (getIDWithAttrMask(&instructionID, insn, attrMask))
return -1;
+ /*
+ * JCXZ/JECXZ need special handling for 16-bit mode because the meaning
+ * of the AdSize prefix is inverted w.r.t. 32-bit mode.
+ */
+ if (insn->mode == MODE_16BIT && insn->opcode == 0xE3) {
+ const struct InstructionSpecifier *spec;
+ spec = specifierForUID(instructionID);
+
+ /*
+ * Check for Ii8PCRel instructions. We could alternatively do a
+ * string-compare on the names, but this is probably cheaper.
+ */
+ if (x86OperandSets[spec->operands][0].type == TYPE_REL8) {
+ attrMask ^= ATTR_ADSIZE;
+ if (getIDWithAttrMask(&instructionID, insn, attrMask))
+ return -1;
+ }
+ }
+
/* The following clauses compensate for limitations of the tables. */
if ((insn->mode == MODE_16BIT || insn->prefixPresent[0x66]) &&
OpenPOWER on IntegriCloud