mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-15 09:33:39 +00:00
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
This commit is contained in:
parent
301a9c0db7
commit
97a80092d3
@ -318,13 +318,26 @@ static int readPrefixes(struct InternalInstruction* insn) {
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the first byte is a LOCK prefix break and let it be disassembled
|
* If the byte is a LOCK/REP/REPNE prefix and not a part of the opcode, then
|
||||||
* as a lock "instruction", by creating an <MCInst #xxxx LOCK_PREFIX>.
|
* break and let it be disassembled as a normal "instruction".
|
||||||
* FIXME there is currently no way to get the disassembler to print the
|
|
||||||
* lock prefix if it is not the first byte.
|
|
||||||
*/
|
*/
|
||||||
if (insn->readerCursor - 1 == insn->startLocation && byte == 0xf0)
|
if (insn->readerCursor - 1 == insn->startLocation
|
||||||
|
&& (byte == 0xf0 || byte == 0xf2 || byte == 0xf3)) {
|
||||||
|
if (byte == 0xf0)
|
||||||
break;
|
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) {
|
switch (byte) {
|
||||||
case 0xf0: /* LOCK */
|
case 0xf0: /* LOCK */
|
||||||
|
@ -753,3 +753,18 @@
|
|||||||
# CHECK: lock
|
# CHECK: lock
|
||||||
# CHECK-NEXT: xaddq %rcx, %rbx
|
# CHECK-NEXT: xaddq %rcx, %rbx
|
||||||
0xf0 0x48 0x0f 0xc1 0xcb
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user