summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
diff options
context:
space:
mode:
authorDave Zarzycki <zarzycki@apple.com>2013-03-25 18:59:38 +0000
committerDave Zarzycki <zarzycki@apple.com>2013-03-25 18:59:38 +0000
commit07fabeecadf4990f6681a95c9b5b72270b463e30 (patch)
tree30993c009793f609d7bf5c8ee222fb6b0fb8cfec /llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
parentb0d81f8626b58487dcf5ebaaca6aeb8fe1fd5a93 (diff)
downloadbcm5719-llvm-07fabeecadf4990f6681a95c9b5b72270b463e30.tar.gz
bcm5719-llvm-07fabeecadf4990f6681a95c9b5b72270b463e30.zip
x86 -- disassemble the REP/REPNE prefix when needed
This fixes Apple bug: 13493622 llvm-svn: 177887
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
index 85d8a991dd6..7324c413d11 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
+++ b/llvm/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 */
OpenPOWER on IntegriCloud