[GAS][ARM]Generate unpredictable warning for pc used in data processing instructions with register-shifted register operand

Richard Earnshaw (lists) Richard.Earnshaw@arm.com
Mon Oct 10 12:48:00 GMT 2016


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
> 



More information about the Binutils mailing list