This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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?

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.
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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]