* config/tc-arm.c (warn_deprecated_sp): New macro.
authorMark Mitchell <mark@codesourcery.com>
Tue, 24 Feb 2009 04:30:30 +0000 (04:30 +0000)
committerMark Mitchell <mark@codesourcery.com>
Tue, 24 Feb 2009 04:30:30 +0000 (04:30 +0000)
(do_t_mov_cmp): Permit R13 as the second
argument to "cmp.n".

* gas/arm/thumb2_bad_reg.s: Update to allow R13 as second argument
for CMP.
* gas/arm/thumb2_bad_reg.l: Adjust accordingly.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/thumb2_bad_reg.l
gas/testsuite/gas/arm/thumb2_bad_reg.s

index 67161df6bb71bdca67be4bf133da56ca452c8368..c1207bd9a90c120d08ce1fdba26459aaa8972b9a 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-23  Mark Mitchell  <mark@codesourcery.com>
+
+       * config/tc-arm.c (warn_deprecated_sp): New macro.
+       (do_t_mov_cmp): Permit R13 as the second
+       argument to "cmp.n".
+
 2009-02-23  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/tc-i386.c (type_names): Add OPERAND_TYPE_REGYMM.
index 782d10be9d0637a485e2d8166c3552061c3bd1e6..a1e5d12ccb0255702655a75aa110341175bead1f 100644 (file)
@@ -6140,6 +6140,14 @@ parse_operands (char *str, const unsigned char *pattern)
      }                                                 \
   while (0)
 
+/* If REG is R13 (the stack pointer), warn that its use is
+   deprecated.  */
+#define warn_deprecated_sp(reg)                        \
+  do                                           \
+    if (warn_on_deprecated && reg == REG_SP)   \
+       as_warn (_("use of r13 is deprecated"));        \
+  while (0)
+
 /* Functions for operand encoding.  ARM, then Thumb.  */
 
 #define rotate_left(v, n) (v << n | v >> (32 - n))
@@ -9690,7 +9698,18 @@ do_t_mov_cmp (void)
       if (opcode == T_MNEM_cmp)
        {
          constraint (Rn == REG_PC, BAD_PC);
-         reject_bad_reg (Rm);
+         if (narrow)
+           {
+             /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
+                but valid.  */
+             warn_deprecated_sp (Rm);
+             /* R15 was documented as a valid choice for Rm in ARMv6,
+                but as UNPREDICTABLE in ARMv7.  ARM's proprietary
+                tools reject R15, so we do too.  */
+             constraint (Rm == REG_PC, BAD_PC);
+           }
+         else
+           reject_bad_reg (Rm);
        }
       else if (opcode == T_MNEM_mov
               || opcode == T_MNEM_movs)
index 99ea036ae281f84d96f9edccb319a1a616bb7c97..b1b23c261dcf7e73f5572a2aa1b51b644725eb55 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-23  Mark Mitchell  <mark@codesourcery.com>
+
+       * gas/arm/thumb2_bad_reg.s: Update to allow R13 as second argument
+       for CMP.
+       * gas/arm/thumb2_bad_reg.l: Adjust accordingly.
+
 2009-02-19  Peter Bergner  <bergner@vnet.ibm.com>
 
        * gas/ppc/e500mc.d ("lfdepx", "stfdepx"): Fix tests to expect a
index 46b4924faff8babb64af4a16efcd35f5277a6eee..f22df10e017b5840dbbce39680cbc49a2116730c 100644 (file)
 [^:]*:[0-9]+: Error: r15 not allowed here -- `cmn.w r0,r15'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `cmp.w r15,#1'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `cmp r15,r0'
+[^:]*:[0-9]+: Warning: use of r13 is deprecated
+[^:]*:[0-9]+: Error: r15 not allowed here -- `cmp r0,r15'
+[^:]*:[0-9]+: Warning: use of r13 is deprecated
+[^:]*:[0-9]+: Error: r15 not allowed here -- `cmp.n r0,r15'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `cmp.w r15,r0'
 [^:]*:[0-9]+: Error: r13 not allowed here -- `cmp.w r0,r13'
 [^:]*:[0-9]+: Error: r15 not allowed here -- `cmp.w r0,r15'
index 77134c3c1fe692d48e6f373b90e042c85080f269..90c82e6896329e853dd56df1fb3b8593a41c55c1 100644 (file)
@@ -114,6 +114,10 @@ test:
        @ CMP (register)
        cmp r13, r0                     @ OK
        cmp r15, r0
+       cmp r0, r13                     @ Deprecated
+       cmp r0, r15                     
+       cmp.n r0, r13                   @ Deprecated
+       cmp.n r0, r15                   
        cmp.w r13, r0                   @ OK
        cmp.w r15, r0
        cmp.w r0, r13