x86 -- disassemble the REP/REPNE prefix when needed
authorDave Zarzycki <zarzycki@apple.com>
Mon, 25 Mar 2013 18:59:38 +0000 (18:59 +0000)
committerDave Zarzycki <zarzycki@apple.com>
Mon, 25 Mar 2013 18:59:38 +0000 (18:59 +0000)
This fixes Apple bug: 13493622

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177887 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
test/MC/Disassembler/X86/simple-tests.txt

index 85d8a991dd6ea08334abd75900b4a4d5d2cc0423..7324c413d11fc9efa7f128e5c343d46ba83c4cfc 100644 (file)
@@ -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 */
index 5ea40eb913486830e7967ef6685fca37af37c66f..9827a1809f1b7c09439a6925c9a14f4296ff2b52 100644 (file)
 # 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