summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmLexer.cpp32
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp22
-rw-r--r--llvm/test/MC/AsmParser/X86/x86_64-operands.s10
3 files changed, 62 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmLexer.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmLexer.cpp
index 66be4892b12..26797ab353b 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmLexer.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmLexer.cpp
@@ -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;
}
}
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index bcb70da2f15..1b14ebf7b25 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -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");
diff --git a/llvm/test/MC/AsmParser/X86/x86_64-operands.s b/llvm/test/MC/AsmParser/X86/x86_64-operands.s
index 9e15779138c..88f1a64cc42 100644
--- a/llvm/test/MC/AsmParser/X86/x86_64-operands.s
+++ b/llvm/test/MC/AsmParser/X86/x86_64-operands.s
@@ -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
OpenPOWER on IntegriCloud