Teach the x86 mc assembler that %dr6 = %db6, this implements
authorChris Lattner <sabre@nondot.org>
Thu, 24 Jun 2010 07:29:18 +0000 (07:29 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 24 Jun 2010 07:29:18 +0000 (07:29 +0000)
rdar://8013734

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106725 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmParser/X86AsmLexer.cpp
lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/AsmParser/X86/x86_64-operands.s

index 66be4892b1281dcc5a8cd7b1ab24369eac8f89d4..26797ab353b62b9de61adabc38bd4b05376587ef 100644 (file)
@@ -88,6 +88,8 @@ AsmToken X86AsmLexer::LexTokenATT() {
     if (unsigned regID = MatchRegisterName(nextToken.getString())) {
       lexDefinite();
         
+      // FIXME: This is completely wrong when there is a space or other
+      // punctuation between the % and the register name.
       StringRef regStr(lexedToken.getString().data(),
                        lexedToken.getString().size() + 
                        nextToken.getString().size());
@@ -96,6 +98,36 @@ AsmToken X86AsmLexer::LexTokenATT() {
                       static_cast<int64_t>(regID));
     }
     
+    // Match register name failed.  If this is "db[0-7]", match it as an alias
+    // for dr[0-7].
+    if (nextToken.getString().size() == 3 &&
+        nextToken.getString().startswith("db")) {
+      int RegNo = -1;
+      switch (nextToken.getString()[2]) {
+      case '0': RegNo = X86::DR0; break;
+      case '1': RegNo = X86::DR1; break;
+      case '2': RegNo = X86::DR2; break;
+      case '3': RegNo = X86::DR3; break;
+      case '4': RegNo = X86::DR4; break;
+      case '5': RegNo = X86::DR5; break;
+      case '6': RegNo = X86::DR6; break;
+      case '7': RegNo = X86::DR7; break;
+      }
+      
+      if (RegNo != -1) {
+        lexDefinite();
+
+        // FIXME: This is completely wrong when there is a space or other
+        // punctuation between the % and the register name.
+        StringRef regStr(lexedToken.getString().data(),
+                         lexedToken.getString().size() + 
+                         nextToken.getString().size());
+        return AsmToken(AsmToken::Register, regStr, 
+                        static_cast<int64_t>(RegNo));
+      }
+    }
+      
+   
     return lexedToken;
   }    
   }
index bcb70da2f150b88e2c9089e43b4de925e10f777d..1b14ebf7b25613f413a3530e0b379e1bba26176e 100644 (file)
@@ -412,6 +412,28 @@ bool X86ATTAsmParser::ParseRegister(unsigned &RegNo,
     return false;
   }
   
+  // If this is "db[0-7]", match it as an alias
+  // for dr[0-7].
+  if (RegNo == 0 && Tok.getString().size() == 3 &&
+      Tok.getString().startswith("db")) {
+    switch (Tok.getString()[2]) {
+    case '0': RegNo = X86::DR0; break;
+    case '1': RegNo = X86::DR1; break;
+    case '2': RegNo = X86::DR2; break;
+    case '3': RegNo = X86::DR3; break;
+    case '4': RegNo = X86::DR4; break;
+    case '5': RegNo = X86::DR5; break;
+    case '6': RegNo = X86::DR6; break;
+    case '7': RegNo = X86::DR7; break;
+    }
+    
+    if (RegNo != 0) {
+      EndLoc = Tok.getLoc();
+      Parser.Lex(); // Eat it.
+      return false;
+    }
+  }
+  
   if (RegNo == 0)
     return Error(Tok.getLoc(), "invalid register name");
 
index 9e15779138cfad41b5e563a7c061fe5eae142742..88f1a64cc42fbbcae375906a4f6096d8b1cfa0cb 100644 (file)
@@ -1,5 +1,3 @@
-// FIXME: Actually test that we get the expected results.
-        
 // RUN: llvm-mc -triple x86_64-unknown-unknown %s | FileCheck %s
 
 # CHECK: callq a
@@ -7,3 +5,11 @@
 
 # CHECK: leaq  -40(%rbp), %r15
        leaq    -40(%rbp), %r15
+
+
+
+// rdar://8013734 - Alias dr6=db6
+mov %dr6, %rax
+mov %db6, %rax
+# CHECK: movq  %dr6, %rax
+# CHECK: movq  %dr6, %rax