2007-03-25 Paul Brook <paul@codesourcery.com>
authorPaul Brook <paul@codesourcery.com>
Fri, 25 May 2007 23:13:24 +0000 (23:13 +0000)
committerPaul Brook <paul@codesourcery.com>
Fri, 25 May 2007 23:13:24 +0000 (23:13 +0000)
gas/
* config/tc-arm.c (T2_SUBS_PC_LR): Define.
(do_t_add_sub): Correctly encode subs pc, lr, #const.
(do_t_mov_cmp): Correctly encode movs pc, lr.

gas/testsulte/
* gas/arm/thumb32.s: Add tests for subs pc, lr.
* gas/arm/thumb32.d: Change error-output: to stderr:.
Update expected output.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/thumb32.d
gas/testsuite/gas/arm/thumb32.s

index 9bfdc85afaa702eb1eb42a9cd8ee5d0f26de1c62..8b471d5dc2111f163055de4b9d5a104da6ecb106 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-25  Paul Brook  <paul@codesourcery.com>
+
+       * config/tc-arm.c (T2_SUBS_PC_LR): Define.
+       (do_t_add_sub): Correctly encode subs pc, lr, #const.
+       (do_t_mov_cmp): Correctly encode movs pc, lr.
+
 2007-05-24  Steve Ellcey  <sje@cup.hp.com>
 
        * Makefile.in: Regnerate.
index 2a9c7abb80547070798927a3cf78f575d675029e..2cb28d4eee4b36e2ffc619662ef7dcfdbc25589f 100644 (file)
@@ -555,6 +555,8 @@ struct asm_opcode
 #define OPCODE_MASK    0xfe1fffff
 #define V4_STR_BIT     0x00000020
 
+#define T2_SUBS_PC_LR  0xf3de8f00
+
 #define DATA_OP_SHIFT  21
 
 #define T2_OPCODE_MASK 0xfe1fffff
@@ -8439,7 +8441,21 @@ do_t_add_sub (void)
          if (inst.size_req == 4
              || (inst.size_req != 2 && !opcode))
            {
-             if (Rs == REG_PC)
+             if (Rd == REG_PC)
+               {
+                 constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
+                            _("only SUBS PC, LR, #const allowed"));
+                 constraint (inst.reloc.exp.X_op != O_constant,
+                             _("expression too complex"));
+                 constraint (inst.reloc.exp.X_add_number < 0
+                             || inst.reloc.exp.X_add_number > 0xff,
+                            _("immediate value out of range"));
+                 inst.instruction = T2_SUBS_PC_LR
+                                    | inst.reloc.exp.X_add_number;
+                 inst.reloc.type = BFD_RELOC_UNUSED;
+                 return;
+               }
+             else if (Rs == REG_PC)
                {
                  /* Always use addw/subw.  */
                  inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
@@ -9486,6 +9502,16 @@ do_t_mov_cmp (void)
          || inst.operands[1].shifted)
        narrow = FALSE;
 
+      /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
+      if (opcode == T_MNEM_movs && inst.operands[1].isreg
+         && !inst.operands[1].shifted
+         && inst.operands[0].reg == REG_PC
+         && inst.operands[1].reg == REG_LR)
+       {
+         inst.instruction = T2_SUBS_PC_LR;
+         return;
+       }
+
       if (!inst.operands[1].isreg)
        {
          /* Immediate operand.  */
index 8e60e10a2ead1bb0d09c82319922f3f73ed07443..e5404a0f24a54746d30a7d0400e4b3b277e49e13 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-25  Paul Brook  <paul@codesourcery.com>
+
+       * gas/arm/thumb32.s: Add tests for subs pc, lr.
+       * gas/arm/thumb32.d: Change error-output: to stderr:.
+       Update expected output.
+
 2007-05-22  Paul Brook  <paul@codesourcery.com>
 
        * gas/arm/backslash-at.d: Update expected output.
index 1b602043dfd7617d52362738872c6678ad1d6926..ea68ec64a472eeb45b32ebe7d44cc85c1da4000f 100644 (file)
@@ -3,7 +3,7 @@
 # objdump: -dr --prefix-addresses --show-raw-insn
 # The arm-aout and arm-pe ports do not support Thumb branch relocations.
 # not-target: *-*-*aout* *-*-pe
-# error-output: thumb32.l
+# stderr: thumb32.l
 
 .*: +file format .*arm.*
 
@@ -959,3 +959,7 @@ Disassembly of section .text:
 0[0-9a-f]+ <[^>]+> e80d c010   srsdb   sp, #16
 0[0-9a-f]+ <[^>]+> e9ad c015   srsia   sp!, #21
 0[0-9a-f]+ <[^>]+> e9ad c00a   srsia   sp!, #10
+0[0-9a-f]+ <[^>]+> f3de 8f00   subs    pc, lr, #0
+0[0-9a-f]+ <[^>]+> f3de 8f00   subs    pc, lr, #0
+0[0-9a-f]+ <[^>]+> f3de 8f04   subs    pc, lr, #4
+0[0-9a-f]+ <[^>]+> f3de 8fff   subs    pc, lr, #255
index 2cc03b548d87dec2b7f3faee86c223e8d6e26136..7079ea68d5786cf21b4e64a8d1b5dc03d5de4cf7 100644 (file)
@@ -775,3 +775,8 @@ srs:
        srsdb sp, #16
        srsia sp!, #21
        srsia sp!, #10
+
+       movs pc, lr
+       subs pc, lr, #0
+       subs pc, lr, #4
+       subs pc, lr, #255