add support for instruction prefixes on the same line as the instruction,
authorChris Lattner <sabre@nondot.org>
Wed, 8 Sep 2010 05:17:37 +0000 (05:17 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 8 Sep 2010 05:17:37 +0000 (05:17 +0000)
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
test/MC/AsmParser/X86/x86_64-new-encoder.s

index 068ed56e951082f166ba825671a6c6343d64ef6a..1b5dccf8e9c4313b0700b163f7fd43b8e3567e41 100644 (file)
@@ -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") ||
index 7992972c988c1a00f48116134724ed7f1a70e818..5fc29f11f9cd184512452e88adbe4ef7a4693cfa 100644 (file)
@@ -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]