diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp @@ -105,9 +105,8 @@ assert(MI.getNumOperands() >= 4 && "expected >= 4 arguments"); for (unsigned OI = 4, OE = MI.getNumOperands(); OI < OE; ++OI) { assert(MI.getOperand(OI).isReg() && "expected register"); - if (MI.getOperand(OI).getReg() == ARM::SP || - MI.getOperand(OI).getReg() == ARM::PC) { - Info = "use of SP or PC in the list is deprecated"; + if (MI.getOperand(OI).getReg() == ARM::PC) { + Info = "use of PC in the list is deprecated"; return true; } } @@ -132,9 +131,6 @@ case ARM::PC: ListContainsPC = true; break; - case ARM::SP: - Info = "use of SP in the list is deprecated"; - return true; } } diff --git a/llvm/test/MC/ARM/arm-load-store-multiple-deprecated.s b/llvm/test/MC/ARM/arm-load-store-multiple-deprecated.s --- a/llvm/test/MC/ARM/arm-load-store-multiple-deprecated.s +++ b/llvm/test/MC/ARM/arm-load-store-multiple-deprecated.s @@ -4,6 +4,9 @@ @ RUN: | FileCheck -check-prefix CHECK-ERROR %s @ RUN: not llvm-mc -triple armv7-linux-eabi -filetype asm -o - %s 2>&1 \ +@ RUN: | FileCheck %s -check-prefix CHECK -check-prefix CHECK-V7 + +@ RUN: not llvm-mc -triple armv8-linux-eabi -filetype asm -o - %s 2>&1 \ @ RUN: | FileCheck %s -check-prefix CHECK -check-prefix CHECK-V7 .syntax unified @@ -13,114 +16,81 @@ .type stm,%function stm: stm sp!, {r0, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK-ERROR: error: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated +@ CHECK-ERROR: error: use of PC in the list is deprecated @ CHECK: stm sp!, {r0, pc} -@ CHECK: ^ - stm r0!, {r0, sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK-ERROR: error: use of SP or PC in the list is deprecated -@ CHECK: stm r0!, {r0, sp} @ CHECK: ^ stm r1!, {r0, sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stm r1!, {r0, sp, pc} @ CHECK: ^ stm r2!, {sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stm r2!, {sp, pc} @ CHECK: ^ stm sp!, {pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stm sp!, {pc} -@ CHECK: ^ - stm r0!, {sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stm r0!, {sp} @ CHECK: ^ .global stmda .type stmda,%function stmda: stmda sp!, {r0, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmda sp!, {r0, pc} -@ CHECK: ^ - stmda r0!, {r0, sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stmda r0!, {r0, sp} @ CHECK: ^ stmda r1!, {r0, sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmda r1!, {r0, sp, pc} @ CHECK: ^ stmda r2!, {sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmda r2!, {sp, pc} @ CHECK: ^ stmda sp!, {pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmda sp!, {pc} -@ CHECK: ^ - stmda r0!, {sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stmda r0!, {sp} @ CHECK: ^ .global stmdb .type stmdb,%function stmdb: stmdb sp!, {r0, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmdb sp!, {r0, pc} -@ CHECK: ^ - stmdb r0!, {r0, sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stmdb r0!, {r0, sp} @ CHECK: ^ stmdb r1!, {r0, sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmdb r1!, {r0, sp, pc} @ CHECK: ^ stmdb r2!, {sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmdb r2!, {sp, pc} @ CHECK: ^ stmdb sp!, {pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmdb sp!, {pc} -@ CHECK: ^ - stmdb r0!, {sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stmdb r0!, {sp} @ CHECK: ^ .global stmib .type stmib,%function stmib: stmib sp!, {r0, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmib sp!, {r0, pc} -@ CHECK: ^ - stmib r0!, {r0, sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stmib r0!, {r0, sp} @ CHECK: ^ stmib r1!, {r0, sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmib r1!, {r0, sp, pc} @ CHECK: ^ stmib r2!, {sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmib r2!, {sp, pc} @ CHECK: ^ stmib sp!, {pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: stmib sp!, {pc} -@ CHECK: ^ - stmib r0!, {sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: stmib r0!, {sp} @ CHECK: ^ @@ -128,37 +98,25 @@ .type push,%function push: push {r0, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: push {r0, pc} -@ CHECK: ^ - push {r0, sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: push {r0, sp} @ CHECK: ^ push {r0, sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: push {r0, sp, pc} @ CHECK: ^ push {sp, pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: push {sp, pc} @ CHECK: ^ push {pc} -@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: warning: use of PC in the list is deprecated @ CHECK: push {pc} -@ CHECK: ^ - push {sp} -@ CHECK: warning: use of SP or PC in the list is deprecated -@ CHECK: push {sp} @ CHECK: ^ .global ldm .type ldm,%function ldm: - ldm r0!, {r1, sp} -@ CHECK: warning: use of SP in the list is deprecated - ldm r0!, {sp} -@ CHECK: warning: use of SP in the list is deprecated ldm r0!, {r1, lr, pc} @ CHECK: warning: use of LR and PC simultaneously in the list is deprecated ldm r0!, {lr, pc} @@ -167,10 +125,6 @@ .global ldmda .type ldmda,%function ldmda: - ldmda r0!, {r1, sp} -@ CHECK: warning: use of SP in the list is deprecated - ldmda r0!, {sp} -@ CHECK: warning: use of SP in the list is deprecated ldmda r0!, {r1, lr, pc} @ CHECK: warning: use of LR and PC simultaneously in the list is deprecated ldmda r0!, {lr, pc} @@ -179,10 +133,6 @@ .global ldmdb .type ldmdb,%function ldmdb: - ldmdb r0!, {r1, sp} -@ CHECK: warning: use of SP in the list is deprecated - ldmdb r0!, {sp} -@ CHECK: warning: use of SP in the list is deprecated ldmdb r0!, {r1, lr, pc} @ CHECK: warning: use of LR and PC simultaneously in the list is deprecated ldmdb r0!, {lr, pc} @@ -191,10 +141,6 @@ .global ldmib .type ldmib,%function ldmib: - ldmib r0!, {r1, sp} -@ CHECK: warning: use of SP in the list is deprecated - ldmib r0!, {sp} -@ CHECK: warning: use of SP in the list is deprecated ldmib r0!, {r1, lr, pc} @ CHECK: warning: use of LR and PC simultaneously in the list is deprecated ldmib r0!, {lr, pc} @@ -204,23 +150,69 @@ .type pop,%function pop: pop {r0, sp} -@ CHECK: warning: use of SP in the list is deprecated @ CHECK-V7: error: writeback register not allowed in register list pop {sp} -@ CHECK: warning: use of SP in the list is deprecated @ CHECK-V7: error: writeback register not allowed in register list pop {r0, lr, pc} @ CHECK: warning: use of LR and PC simultaneously in the list is deprecated pop {lr, pc} @ CHECK: warning: use of LR and PC simultaneously in the list is deprecated - .global valid + .global valid_stm .type valid,%function -valid: +valid_stm: + stm r0!, {r0, sp} +@ CHECK: stm r0!, {r0, sp} + stm r0!, {sp} +@ CHECK: stm r0!, {sp} + stmda r0!, {r0, sp} +@ CHECK: stmda r0!, {r0, sp} + stmda r0!, {sp} +@ CHECK: stmda r0!, {sp} + stmdb r0!, {r0, sp} +@ CHECK: stmdb r0!, {r0, sp} + stmdb r0!, {sp} +@ CHECK: stmdb r0!, {sp} + stmib r0!, {r0, sp} +@ CHECK: stmib r0!, {r0, sp} + stmib r0!, {sp} +@ CHECK: stmib r0!, {sp} stmdaeq r0, {r0} @ CHECK: stmdaeq r0, {r0} + + .global valid_push + .type valid,%function +valid_push: + push {r0, sp} +@ CHECK: push {r0, sp} + push {sp} +@ CHECK: push {sp} + + .global valid_ldm + .type valid,%function +valid_ldm: + ldm r0!, {r1, sp} +@ CHECK: ldm r0!, {r1, sp} + ldm r0!, {sp} +@ CHECK: ldm r0!, {sp} + ldmda r0!, {r1, sp} +@ CHECK: ldmda r0!, {r1, sp} + ldmda r0!, {sp} +@ CHECK: ldmda r0!, {sp} + ldmdb r0!, {r1, sp} +@ CHECK: ldmdb r0!, {r1, sp} + ldmdb r0!, {sp} +@ CHECK: ldmdb r0!, {sp} + ldmib r0!, {r1, sp} +@ CHECK: ldmib r0!, {r1, sp} + ldmib r0!, {sp} +@ CHECK: ldmib r0!, {sp} ldmdaeq r0, {r0} @ CHECK: ldmdaeq r0, {r0} + + .global valid_pop + .type valid,%function +valid_pop: pop {r0, pc} @ CHECK: pop {r0, pc}