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 | 07fabeecadf4990f6681a95c9b5b72270b463e30 (patch) | |
| tree | 30993c009793f609d7bf5c8ee222fb6b0fb8cfec /llvm | |
| parent | b0d81f8626b58487dcf5ebaaca6aeb8fe1fd5a93 (diff) | |
| download | bcm5719-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')
| -rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 27 | ||||
| -rw-r--r-- | llvm/test/MC/Disassembler/X86/simple-tests.txt | 15 |
2 files changed, 35 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 */ diff --git a/llvm/test/MC/Disassembler/X86/simple-tests.txt b/llvm/test/MC/Disassembler/X86/simple-tests.txt index 5ea40eb9134..9827a1809f1 100644 --- a/llvm/test/MC/Disassembler/X86/simple-tests.txt +++ b/llvm/test/MC/Disassembler/X86/simple-tests.txt @@ -753,3 +753,18 @@ # CHECK: lock # CHECK-NEXT: xaddq %rcx, %rbx 0xf0 0x48 0x0f 0xc1 0xcb + +# rdar://13493622 lldb doesn't print the x86 rep/repne prefix when disassembling +# CHECK: repne +# CHECK-NEXT: movsd +0xf2 0xa5 +# CHECK: repne +# CHECK-NEXT: movsq +0xf2 0x48 0xa5 +# CHECK: repne +# CHECK-NEXT: movb $0, (%rax) +0xf2 0xc6 0x0 0x0 +# CHECK: rep +# CHECK-NEXT: lock +# CHECK-NEXT: incl (%rax) +0xf3 0xf0 0xff 0x00 |

