diff options
author | Dave Zarzycki <zarzycki@apple.com> | 2013-03-25 18:59:38 +0000 |
---|---|---|
committer | Dave Zarzycki <zarzycki@apple.com> | 2013-03-25 18:59:38 +0000 |
commit | 97a80092d3e4413d43e4632a3ec92fcabfd9b378 (patch) | |
tree | ec36e228af55506778465dcc1c8ed5e9490d8ec0 /lib/Target/X86 | |
parent | 301a9c0db76fc045c39cb088a13b2550b83f75d9 (diff) |
x86 -- disassemble the REP/REPNE prefix when needed
This fixes Apple bug: 13493622
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177887 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86')
-rw-r--r-- | lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c index 85d8a991dd..7324c413d1 100644 --- a/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c +++ b/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c @@ -318,14 +318,27 @@ static int readPrefixes(struct InternalInstruction* insn) { return -1; /* - * If the first byte is a LOCK prefix break and let it be disassembled - * as a lock "instruction", by creating an <MCInst #xxxx LOCK_PREFIX>. - * FIXME there is currently no way to get the disassembler to print the - * lock prefix if it is not the first byte. + * If the byte is a LOCK/REP/REPNE prefix and not a part of the opcode, then + * break and let it be disassembled as a normal "instruction". */ - if (insn->readerCursor - 1 == insn->startLocation && byte == 0xf0) - break; - + if (insn->readerCursor - 1 == insn->startLocation + && (byte == 0xf0 || byte == 0xf2 || byte == 0xf3)) { + if (byte == 0xf0) + break; + uint8_t nextByte; + if (lookAtByte(insn, &nextByte)) + return -1; + if (insn->mode == MODE_64BIT && (nextByte & 0xf0) == 0x40) { + if (consumeByte(insn, &nextByte)) + return -1; + if (lookAtByte(insn, &nextByte)) + return -1; + unconsumeByte(insn); + } + if (nextByte != 0x0f && nextByte != 0x90) + break; + } + switch (byte) { case 0xf0: /* LOCK */ case 0xf2: /* REPNE/REPNZ */ |