[llvm] r225972 - Correct POP handling for v7m

Jyoti Allur jyoti.allur at samsung.com
Wed Jan 14 02:48:16 PST 2015


Author: jyoti.allur
Date: Wed Jan 14 04:48:16 2015
New Revision: 225972

URL: http://llvm.org/viewvc/llvm-project?rev=225972&view=rev
Log:
Correct POP handling for v7m

Modified:
    llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
    llvm/trunk/test/MC/ARM/thumb-load-store-multiple.s

Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=225972&r1=225971&r2=225972&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Wed Jan 14 04:48:16 2015
@@ -190,7 +190,7 @@ class ARMAsmParser : public MCTargetAsmP
   }
 
   bool validatetLDMRegList(MCInst Inst, const OperandVector &Operands,
-                           unsigned ListNo, bool IsPop = false);
+                           unsigned ListNo, bool IsARPop = false);
   bool validatetSTMRegList(MCInst Inst, const OperandVector &Operands,
                            unsigned ListNo);
 
@@ -6027,7 +6027,7 @@ static bool instIsBreakpoint(const MCIns
 
 bool ARMAsmParser::validatetLDMRegList(MCInst Inst,
                                        const OperandVector &Operands,
-                                       unsigned ListNo, bool IsPop) {
+                                       unsigned ListNo, bool IsARPop) {
   const ARMOperand &Op = static_cast<const ARMOperand &>(*Operands[ListNo]);
   bool HasWritebackToken = Op.isToken() && Op.getToken() == "!";
 
@@ -6035,7 +6035,7 @@ bool ARMAsmParser::validatetLDMRegList(M
   bool ListContainsLR = listContainsReg(Inst, ListNo, ARM::LR);
   bool ListContainsPC = listContainsReg(Inst, ListNo, ARM::PC);
 
-  if (!IsPop && ListContainsSP)
+  if (!IsARPop && ListContainsSP)
     return Error(Operands[ListNo + HasWritebackToken]->getStartLoc(),
                  "SP may not be in the register list");
   else if (ListContainsPC && ListContainsLR)
@@ -6338,7 +6338,7 @@ bool ARMAsmParser::validateInstruction(M
         !isThumbTwo())
       return Error(Operands[2]->getStartLoc(),
                    "registers must be in range r0-r7 or pc");
-    if (validatetLDMRegList(Inst, Operands, 2, /*IsPop=*/true))
+    if (validatetLDMRegList(Inst, Operands, 2, !isMClass()))
       return true;
     break;
   }

Modified: llvm/trunk/test/MC/ARM/thumb-load-store-multiple.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb-load-store-multiple.s?rev=225972&r1=225971&r2=225972&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/thumb-load-store-multiple.s (original)
+++ llvm/trunk/test/MC/ARM/thumb-load-store-multiple.s Wed Jan 14 04:48:16 2015
@@ -1,12 +1,16 @@
 @ RUN: not llvm-mc -triple thumbv7-eabi -filetype asm -o - %s 2>&1 \
 @ RUN:     | FileCheck %s
+@ RUN: not llvm-mc -triple thumbv7a-eabi -filetype asm -o - %s 2>&1 \
+@ RUN: | FileCheck --check-prefix=CHECK --check-prefix=CHECK-V7A %s
+@ RUN: not llvm-mc -triple thumbv7m-eabi -filetype asm -o - %s 2>&1 \
+@ RUN: | FileCheck --check-prefix=CHECK --check-prefix=CHECK-V7M %s
 
 	.syntax unified
 	.thumb
 
 	.global ldm
 	.type ldm,%function
-ldb:
+ldm:
 	ldm r0!, {r1, sp}
 @ CHECK: error: SP may not be in the register list
 @ CHECK: ldm r0!, {r1, sp}
@@ -27,7 +31,7 @@ ldb:
 ldmdb:
 	ldmdb r0!, {r1, sp}
 @ CHECK: error: SP may not be in the register list
-	ldm r0!, {lr, pc}
+	ldmdb r0!, {lr, pc}
 @ error: PC and LR may not be in the register list simultaneously
 	itt eq
 	ldmeq r0!, {r1, pc}
@@ -63,12 +67,14 @@ push:
 @ CHECK: error: SP may not be in the register list
 	push {pc}
 @ CHECK: error: PC may not be in the register list
-	push {sp,pc}
+	push {sp, pc}
 @ CHECK: error: SP and PC may not be in the register list
 
 	.global pop
 	.type pop,%function
 pop:
+        pop {sp}
+@ CHECK-V7M: error: SP may not be in the register list
 	pop {lr, pc}
 @ CHECK: error: PC and LR may not be in the register list simultaneously
 @ CHECK: pop {lr, pc}
@@ -84,9 +90,9 @@ pop:
 	.type valid,%function
 valid:
 	pop {sp}
-@ CHECK: ldr sp, [sp], #4
+@ CHECK-V7A: ldr sp, [sp], #4
 	pop {sp, pc}
-@ CHECK: pop.w {sp, pc}
+@ CHECK-V7A: pop.w {sp, pc}
 	push.w {r0}
 @ CHECK: str r0, [sp, #-4]
 	pop.w {r0}





More information about the llvm-commits mailing list