2006-04-07 Paul Brook <paul@codesourcery.com>
authorPaul Brook <paul@codesourcery.com>
Fri, 7 Apr 2006 15:03:45 +0000 (15:03 +0000)
committerPaul Brook <paul@codesourcery.com>
Fri, 7 Apr 2006 15:03:45 +0000 (15:03 +0000)
gas/
* config/tc-arm.c (THUMB2_LOAD_BIT): Define.
(move_or_literal_pool): Handle Thumb-2 instructions.
(do_t_ldst): Call move_or_literal_pool for =N addressing modes.
gas/testsuite/
* gas/arm/thumb2_pool.d: New test.
* gas/arm/thumb2_pool.s: New test.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/thumb2_pool.d [new file with mode: 0644]
gas/testsuite/gas/arm/thumb2_pool.s [new file with mode: 0644]

index aab0c09e6ca6c6da0adeb141681d68bfc84b0216..84cee21a71caf5768caafea0fc351b79359454dd 100644 (file)
@@ -1,3 +1,9 @@
+2006-04-07  Paul Brook  <paul@codesourcery.com>
+
+       * config/tc-arm.c (THUMB2_LOAD_BIT): Define.
+       (move_or_literal_pool): Handle Thumb-2 instructions.
+       (do_t_ldst): Call move_or_literal_pool for =N addressing modes.
+
 2006-04-07  Alan Modra  <amodra@bigpond.net.au>
 
        PR 2512.
index 7b4887da4e07c18b5d6ff4b9a8fdc9c40c795f49..bf91b89e64735eb602ad6c9d8f1f119fc310e1af 100644 (file)
@@ -560,6 +560,7 @@ struct asm_opcode
 #define THUMB_SIZE     2       /* Size of thumb instruction.  */
 #define THUMB_PP_PC_LR 0x0100
 #define THUMB_LOAD_BIT 0x0800
+#define THUMB2_LOAD_BIT 0x00100000
 
 #define BAD_ARGS       _("bad arguments to instruction")
 #define BAD_PC         _("r15 not allowed here")
@@ -4443,7 +4444,14 @@ encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
 static int
 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
 {
-  if ((inst.instruction & (thumb_p ? THUMB_LOAD_BIT : LOAD_BIT)) == 0)
+  unsigned long tbit;
+
+  if (thumb_p)
+    tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
+  else
+    tbit = LOAD_BIT;
+
+  if ((inst.instruction & tbit) == 0)
     {
       inst.error = _("invalid pseudo operation");
       return 1;
@@ -4457,7 +4465,7 @@ move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
     {
       if (thumb_p)
        {
-         if ((inst.reloc.exp.X_add_number & ~0xFF) == 0)
+         if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
            {
              /* This can be done with a mov(1) instruction.  */
              inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
@@ -5965,7 +5973,7 @@ encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
   bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
 
   constraint (!inst.operands[i].isreg,
-             _("Thumb does not support the ldr =N pseudo-operation"));
+             _("Instruction does not support =N addresses"));
 
   inst.instruction |= inst.operands[i].reg << 16;
   if (inst.operands[i].immisreg)
@@ -6979,6 +6987,13 @@ do_t_ldst (void)
   opcode = inst.instruction;
   if (unified_syntax)
     {
+      if (!inst.operands[1].isreg)
+       {
+         if (opcode <= 0xffff)
+           inst.instruction = THUMB_OP32 (opcode);
+         if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
+           return;
+       }
       if (inst.operands[1].isreg
          && !inst.operands[1].writeback
          && !inst.operands[1].shifted && !inst.operands[1].postind
index 28bbea8e0e6e2484031486f4e9953632c49396be..6a569df8562d61882703aad1b0b0ad4344b5b976 100644 (file)
@@ -1,3 +1,8 @@
+2006-04-07  Paul Brook  <paul@codesourcery.com>
+
+       * gas/arm/thumb2_pool.d: New test.
+       * gas/arm/thumb2_pool.s: New test.
+
 2006-04-05  Richard Sandiford  <richard@codesourcery.com>
 
        * gas/sparc/vxworks-pic.s, gas/sparc/vxworks-pic.d: New test.
diff --git a/gas/testsuite/gas/arm/thumb2_pool.d b/gas/testsuite/gas/arm/thumb2_pool.d
new file mode 100644 (file)
index 0000000..7bf0c60
--- /dev/null
@@ -0,0 +1,15 @@
+# as: -march=armv6t2
+# objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+0+000 <[^>]+> 4e04             ldr     r6, \[pc, #16\] \(00+14 <[^>]+>\)
+0+002 <[^>]+> 4904             ldr     r1, \[pc, #16\] \(00+14 <[^>]+>\)
+0+004 <[^>]+> f8df 600c        ldr\.w  r6, \[pc, #12\] ; 00+14 <[^>]+>
+0+008 <[^>]+> f8df 9008        ldr\.w  r9, \[pc, #8\]  ; 00+14 <[^>]+>
+0+00c <[^>]+> bf00             nop
+0+00e <[^>]+> f8df 5004        ldr\.w  r5, \[pc, #4\]  ; 00+14 <[^>]+>
+0+012 <[^>]+> 4900             ldr     r1, \[pc, #0\]  \(00+14 <[^>]+>\)
+0+014 <[^>]+> (5678|1234) .*
+0+016 <[^>]+> (1234|5678) .*
diff --git a/gas/testsuite/gas/arm/thumb2_pool.s b/gas/testsuite/gas/arm/thumb2_pool.s
new file mode 100644 (file)
index 0000000..844e77e
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+       .thumb
+       .syntax unified
+       .thumb_func
+thumb2_ldr:
+       ldr     r6, =0x12345678
+       ldr.n   r1, =0x12345678
+       ldr.w   r6, =0x12345678
+       ldr     r9, =0x12345678
+       nop
+       ldr.w   r5, =0x12345678
+       ldr     r1, =0x12345678
+       .pool