[PATCH] D49001: [X86][Disassembler] Fix LOCK prefix disassembler support

Phabricator via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 5 16:37:52 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL336400: [X86][Disassembler] Fix LOCK prefix disassembler support (authored by maks, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D49001?vs=154324&id=154334#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D49001

Files:
  llvm/trunk/lib/Target/X86/Disassembler/X86Disassembler.cpp
  llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
  llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
  llvm/trunk/test/MC/Disassembler/X86/prefixes.txt


Index: llvm/trunk/test/MC/Disassembler/X86/prefixes.txt
===================================================================
--- llvm/trunk/test/MC/Disassembler/X86/prefixes.txt
+++ llvm/trunk/test/MC/Disassembler/X86/prefixes.txt
@@ -101,6 +101,10 @@
 # CHECK: movq %mm0, %mm1
 0x46 0x0f 0x7f 0xc1
 
+# Test that lock prefix is not dropped if it's not the first prefix
+# CHECK: lock cmpxchgw %di, (%rcx)
+0x66 0xf0 0x0f 0xb1 0x39
+
 # Test that a prefix on it's own works. It's debatable as to if this is 
 # something that is considered valid, but however as LLVM's own disassembler
 # has decided to disassemble prefixes as being separate opcodes, it therefore 
Index: llvm/trunk/lib/Target/X86/Disassembler/X86Disassembler.cpp
===================================================================
--- llvm/trunk/lib/Target/X86/Disassembler/X86Disassembler.cpp
+++ llvm/trunk/lib/Target/X86/Disassembler/X86Disassembler.cpp
@@ -247,6 +247,8 @@
                  // It should not be 'pause' f3 90
                  InternalInstr.opcode != 0x90)
           Flags |= X86::IP_HAS_REPEAT;
+        if (InternalInstr.hasLockPrefix)
+          Flags |= X86::IP_HAS_LOCK;
       }
       Instr.setFlags(Flags);
     }
Index: llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
===================================================================
--- llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
+++ llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
@@ -563,6 +563,8 @@
   bool hasAdSize;
   // Operand-size override
   bool hasOpSize;
+  // Lock prefix
+  bool hasLockPrefix;
   // The repeat prefix if any
   uint8_t repeatPrefix;
 
Index: llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
===================================================================
--- llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
+++ llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
@@ -298,6 +298,9 @@
 static void setPrefixPresent(struct InternalInstruction *insn, uint8_t prefix) {
   uint8_t nextByte;
   switch (prefix) {
+  case 0xf0:
+    insn->hasLockPrefix = true;
+    break;
   case 0xf2:
   case 0xf3:
     if (lookAtByte(insn, &nextByte))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49001.154334.patch
Type: text/x-patch
Size: 2221 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180705/752952cc/attachment.bin>


More information about the llvm-commits mailing list