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]

[RFA] [ARM] Fix reporting of undefined and deprecated mov rd, rm instructions


Hi,

In Thumb state gas rejects mov sp, sp.  In fact this instruction is
allowed (but deprecated).

The attached patch fixes this case, and other related cases where the
disassembler was incorrectly accepting or rejecting variants of mov rd,
rm in Thumb state.  Please can someone review and if appropriate approve
it?

Thanks,

Matt

Proposed ChangeLogs:

gas/ChangeLog:
2010-06-28  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>

	* config/tc-arm.c (do_t_mov_cmp): Fix reporting of 
	unpredictable and deprecated mov register instructions.

gas/testsuite/ChangeLog:
2010-06-28  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>

	* gas/arm/thumb2_bad_reg.s: Update mov register tests.
	* gas/arm/thumb2_bad_reg.l: Likewise.

-- 
Matthew Gretton-Dann
Principal Engineer - PDSW Tools
ARM Ltd
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 2e4880a..5aced1d 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -10244,9 +10244,24 @@ do_t_mov_cmp (void)
 		  reject_bad_reg (Rn);
 		  reject_bad_reg (Rm);
 		}
-	      else if ((Rn == REG_SP || Rn == REG_PC)
-		       && (Rm == REG_SP || Rm == REG_PC))
-		reject_bad_reg (Rm);
+	      else if (narrow)
+		{
+		  /* This is mov.n.  */
+		  if ((Rn == REG_SP || Rn == REG_PC)
+		      && (Rm == REG_SP || Rm == REG_PC))
+		    {
+		      as_warn (_("Use of r%u as a source register is "
+				 "deprecated when r%u is the destination "
+				 "register."), Rm, Rn);
+		    }
+		}
+	      else
+		{
+		  /* This is mov.w.  */
+		  constraint (Rn == REG_PC, BAD_PC);
+		  constraint (Rm == REG_PC, BAD_PC);
+		  constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
+		}
 	    }
 	  else
 	    reject_bad_reg (Rn);
diff --git a/gas/testsuite/gas/arm/thumb2_bad_reg.l b/gas/testsuite/gas/arm/thumb2_bad_reg.l
index 1da7bac..2679e59 100644
--- a/gas/testsuite/gas/arm/thumb2_bad_reg.l
+++ b/gas/testsuite/gas/arm/thumb2_bad_reg.l
@@ -137,14 +137,24 @@
 [^:]*:[0-9]+: Error: r15 not allowed here -- `mls r0,r0,r0,r15'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `mov.w r13,#1'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,#1'
+[^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r0,r15'
+[^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,r0'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `movs.w r0,r13'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `movs.w r0,r15'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `movs.w r13,r0'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `movs.w r15,r0'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `mov.w r13,r13'
-[^:]*:[0-9]+: Error: r13 not allowed here -- `mov.w r15,r13'
+[^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,r13'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r13,r15'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,r15'
+[^:]*:[0-9]+: Warning: Use of r13 as a source register is deprecated when r13 is the destination register.
+[^:]*:[0-9]+: Warning: Use of r13 as a source register is deprecated when r15 is the destination register.
+[^:]*:[0-9]+: Warning: Use of r15 as a source register is deprecated when r13 is the destination register.
+[^:]*:[0-9]+: Warning: Use of r15 as a source register is deprecated when r15 is the destination register.
+[^:]*:[0-9]+: Error: r13 not allowed here -- `movs r13,r13'
+[^:]*:[0-9]+: Error: r15 not allowed here -- `movs r15,r13'
+[^:]*:[0-9]+: Error: r13 not allowed here -- `movs r13,r15'
+[^:]*:[0-9]+: Error: r15 not allowed here -- `movs r15,r15'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `movt r13,#1'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `movt r15,#1'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `mrc p0,#1,r13,cr0,cr0'
diff --git a/gas/testsuite/gas/arm/thumb2_bad_reg.s b/gas/testsuite/gas/arm/thumb2_bad_reg.s
index 20a26e0..f1b1c0b 100644
--- a/gas/testsuite/gas/arm/thumb2_bad_reg.s
+++ b/gas/testsuite/gas/arm/thumb2_bad_reg.s
@@ -191,8 +191,8 @@ test:
 	mov r13, r0			@ OK
 	mov r15, r0			@ OK
 	mov.w r0, r13			@ OK
-	mov.w r0, r15			@ OK
-	mov.w r15, r0			@ OK
+	mov.w r0, r15
+	mov.w r15, r0
 	mov.w r13, r0			@ OK
 	movs.w r0, r13
 	movs.w r0, r15
@@ -202,6 +202,14 @@ test:
 	mov.w r15, r13
 	mov.w r13, r15
 	mov.w r15, r15
+	mov r13, r13			@ Deprecated
+	mov r15, r13			@ Deprecated
+	mov r13, r15			@ Deprecated
+	mov r15, r15			@ Deprecated
+	movs r13, r13
+	movs r15, r13
+	movs r13, r15
+	movs r15, r15
 	@ MOVT
 	movt r13, #1
 	movt r15, #1

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