Sort the register list based on the *actual* register numbers rather than the
authorBill Wendling <isanbard@gmail.com>
Wed, 12 Jan 2011 21:20:59 +0000 (21:20 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 12 Jan 2011 21:20:59 +0000 (21:20 +0000)
enum values we give to them. <rdar://problem/8823730>

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

lib/Target/ARM/AsmParser/ARMAsmParser.cpp
test/MC/ARM/reg-list.s [new file with mode: 0644]

index b51e3511724fcc40880a46b2675a2303b1fbe94c..b672bc4ce41c4af801611283efcaaa385030732a 100644 (file)
@@ -583,15 +583,15 @@ ParseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator
     RI = Registers.begin(), RE = Registers.end();
 
-  DenseMap<unsigned, bool> RegMap;
-  RegMap[RI->first] = true;
-
-  unsigned HighRegNum = RI->first;
+  unsigned HighRegNum = getARMRegisterNumbering(RI->first);
   bool EmittedWarning = false;
 
+  DenseMap<unsigned, bool> RegMap;
+  RegMap[HighRegNum] = true;
+
   for (++RI; RI != RE; ++RI) {
     const std::pair<unsigned, SMLoc> &RegInfo = *RI;
-    unsigned Reg = RegInfo.first;
+    unsigned Reg = getARMRegisterNumbering(RegInfo.first);
 
     if (RegMap[Reg]) {
       Error(RegInfo.second, "register duplicated in register list");
diff --git a/test/MC/ARM/reg-list.s b/test/MC/ARM/reg-list.s
new file mode 100644 (file)
index 0000000..4dd392e
--- /dev/null
@@ -0,0 +1,8 @@
+@ RUN: llvm-mc -triple thumb-apple-darwin10 -show-encoding < %s 2> %t | FileCheck %s
+@ RUN: FileCheck --check-prefix=CHECK-WARNINGS < %t %s
+        
+        push    {r7, lr}
+@ CHECK-WARNINGS: register not in ascending order in register list
+
+        push   {lr, r7}
+@ CHECK: push {lr, r7}