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)) 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