This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [GAS][ARM]Generate unpredictable warning for pc used in data processing instructions with register-shifted register operand
- From: "Richard Earnshaw (lists)" <Richard dot Earnshaw at arm dot com>
- To: Renlin Li <renlin dot li at foss dot arm dot com>, "binutils at sourceware dot org" <binutils at sourceware dot org>
- Cc: Nicholas Clifton <nickc at redhat dot com>, Ramana Radhakrishnan <Ramana dot Radhakrishnan at arm dot com>
- Date: Mon, 10 Oct 2016 13:48:33 +0100
- Subject: Re: [GAS][ARM]Generate unpredictable warning for pc used in data processing instructions with register-shifted register operand
- Authentication-results: sourceware.org; auth=none
- References: <57FB6409.3010105@foss.arm.com>
On 10/10/16 10:48, Renlin Li wrote:
> Hi all,
>
> According to ARMARM, the behavior of instructions with register-shifted
> register
> is unpredictable when PC is used in any field.
>
> For example, the behavior of following instructions are all unpredictable:
> cmn pc, r1, lsr r2
> cmn r0, pc, lsr r2
> cmn r0, r1, lsr pc
>
> This patch produces warnings for this case.
> arm-none-eabi binutils regression checked Okay.
>
> Okay for trunk?
>
OK.
R.
> Regards,
> Renlin
>
>
> gas/ChangeLog:
>
> 2016-10-10 Renlin Li <renlin.li@arm.com>
>
> * config/tc-arm.c (encode_arm_shift): Generate unpredictable warning
> for register-shifted register instructions.
>
> gas/testsuite/ChangeLog:
>
> 2016-10-10 Renlin Li <renlin.li@arm.com>
>
> * gas/arm/shift-bad-pc.d: New.
> * gas/arm/shift-bad-pc.l: New.
> * gas/arm/shift-bad-pc.s: New.
>
> tmp.diff
>
>
> 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
>