diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 5005343..9e814a1 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -7416,6 +7416,21 @@ encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos) static void encode_arm_shift (int i) { + /* register-shifted register. */ + if (inst.operands[i].immisreg) + { + int index; + for (index = 0; index <= i; ++index) + { + gas_assert (inst.operands[index].present); + if (inst.operands[index].isreg && inst.operands[index].reg == REG_PC) + as_warn (UNPRED_REG ("r15")); + } + + if (inst.operands[i].imm == REG_PC) + as_warn (UNPRED_REG ("r15")); + } + if (inst.operands[i].shift_kind == SHIFT_RRX) inst.instruction |= SHIFT_ROR << 5; else diff --git a/gas/testsuite/gas/arm/shift-bad-pc.d b/gas/testsuite/gas/arm/shift-bad-pc.d new file mode 100644 index 0000000..17edcd3 --- /dev/null +++ b/gas/testsuite/gas/arm/shift-bad-pc.d @@ -0,0 +1,3 @@ +# name: pc used in instructions with register-shifted register +# as: +# error-output: shift-bad-pc.l diff --git a/gas/testsuite/gas/arm/shift-bad-pc.l b/gas/testsuite/gas/arm/shift-bad-pc.l new file mode 100644 index 0000000..55a3295 --- /dev/null +++ b/gas/testsuite/gas/arm/shift-bad-pc.l @@ -0,0 +1,56 @@ +.*shift-bad-pc.s: Assembler messages: +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour diff --git a/gas/testsuite/gas/arm/shift-bad-pc.s b/gas/testsuite/gas/arm/shift-bad-pc.s new file mode 100644 index 0000000..43fca39 --- /dev/null +++ b/gas/testsuite/gas/arm/shift-bad-pc.s @@ -0,0 +1,21 @@ + .syntax unified + + .macro insn4 rd rn rm rs + .irp insn, and, eor, sub, rsb, add, adc, sbc, rsc, orr, bic + \insn pc, \rn, \rm, lsr \rs + \insn \rd, pc, \rm, lsr \rs + \insn \rd, \rn, pc, lsr \rs + \insn \rd, \rn, \rm, lsr pc + .endr + .endm + + .macro insn3 rn rm rs + .irp insn, tst, teq, cmp, cmn, mvn + \insn pc, \rm, lsr \rs + \insn \rn, pc, lsr \rs + \insn \rn, \rm, lsr pc + .endr + .endm + + insn4 r0 r1 r2 r3 + insn3 r0 r1 r2