diff options
-rw-r--r-- | lib/Target/X86/AsmParser/X86AsmParser.cpp | 23 | ||||
-rw-r--r-- | test/MC/AsmParser/X86/x86_64-new-encoder.s | 12 |
2 files changed, 29 insertions, 6 deletions
diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 068ed56e95..1b5dccf8e9 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -758,10 +758,19 @@ ParseInstruction(StringRef Name, SMLoc NameLoc, if (ExtraImmOp) Operands.push_back(X86Operand::CreateImm(ExtraImmOp, NameLoc, NameLoc)); - - // This does the actual operand parsing. - if (getLexer().isNot(AsmToken::EndOfStatement)) { + + // Determine whether this is an instruction prefix. + bool isPrefix = + PatchedName == "lock" || PatchedName == "rep" || + PatchedName == "repne"; + + + // This does the actual operand parsing. Don't parse any more if we have a + // prefix juxtaposed with an operation like "lock incl 4(%rax)", because we + // just want to parse the "lock" as the first instruction and the "incl" as + // the next one. + if (getLexer().isNot(AsmToken::EndOfStatement) && !isPrefix) { // Parse '*' modifier. if (getLexer().is(AsmToken::Star)) { @@ -785,11 +794,13 @@ ParseInstruction(StringRef Name, SMLoc NameLoc, else return true; } + + if (getLexer().isNot(AsmToken::EndOfStatement)) + return TokError("unexpected token in argument list"); } - if (getLexer().isNot(AsmToken::EndOfStatement)) - return TokError("unexpected token in argument list"); - Parser.Lex(); // Consume the EndOfStatement + if (getLexer().is(AsmToken::EndOfStatement)) + Parser.Lex(); // Consume the EndOfStatement // FIXME: Hack to handle recognizing s{hr,ar,hl}? $1. if ((Name.startswith("shr") || Name.startswith("sar") || diff --git a/test/MC/AsmParser/X86/x86_64-new-encoder.s b/test/MC/AsmParser/X86/x86_64-new-encoder.s index 7992972c98..5fc29f11f9 100644 --- a/test/MC/AsmParser/X86/x86_64-new-encoder.s +++ b/test/MC/AsmParser/X86/x86_64-new-encoder.s @@ -173,3 +173,15 @@ xchgl 368(%rax),%ecx // CHECK: xchgl %ecx, 368(%rax) xchgl %ecx, 368(%rax) // CHECK: xchgl %ecx, 368(%rax) + +// PR7254 +lock incl 1(%rsp) +// CHECK: lock +// CHECK: incl 1(%rsp) + +// rdar://8033482 +rep movsl +// CHECK: rep +// CHECK: encoding: [0xf3] +// CHECK: movsl +// CHECK: encoding: [0xa5] |