diff options
author | David Woodhouse <dwmw2@infradead.org> | 2014-01-20 12:02:48 +0000 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2014-01-20 12:02:48 +0000 |
commit | 9c74fdb8b9bc414916a1396b73a0addb27c12f66 (patch) | |
tree | 6ac5af7894e03579f884ad7c61d494081c196289 /llvm/lib/Target | |
parent | 3442f3429e06aab276ee93cb05bba888a7b7efdf (diff) | |
download | bcm5719-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')
-rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 19 |
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]) && |