From 2544f426927aa6dbac8d52bd9d5e12629099da82 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 8 Sep 2010 05:17:37 +0000 Subject: [PATCH] add support for instruction prefixes on the same line as the instruction, implementing rdar://8033482 and PR7254. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113348 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/AsmParser/X86AsmParser.cpp | 23 ++++++++++++++++------ 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 068ed56e951..1b5dccf8e9c 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 7992972c988..5fc29f11f9c 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]