OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / config / arm / arm.c
index dd75551..6c9a695 100644 (file)
@@ -52,6 +52,7 @@
 #include "target-def.h"
 #include "debug.h"
 #include "langhooks.h"
+#include "df.h"
 
 /* Forward definitions of types.  */
 typedef struct minipool_node    Mnode;
@@ -148,8 +149,8 @@ static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
                                  tree, bool);
 
 #ifdef OBJECT_FORMAT_ELF
-static void arm_elf_asm_constructor (rtx, int);
-static void arm_elf_asm_destructor (rtx, int);
+static void arm_elf_asm_constructor (rtx, int) ATTRIBUTE_UNUSED;
+static void arm_elf_asm_destructor (rtx, int) ATTRIBUTE_UNUSED;
 #endif
 #ifndef ARM_PE
 static void arm_encode_section_info (tree, rtx, int);
@@ -195,6 +196,7 @@ static bool arm_handle_option (size_t, const char *, int);
 static unsigned HOST_WIDE_INT arm_shift_truncation_mask (enum machine_mode);
 static bool arm_cannot_copy_insn_p (rtx);
 static bool arm_tls_symbol_p (rtx x);
+static void arm_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
 
 \f
 /* Initialize the GCC target structure.  */
@@ -377,6 +379,11 @@ static bool arm_tls_symbol_p (rtx x);
 #undef TARGET_CANNOT_FORCE_CONST_MEM
 #define TARGET_CANNOT_FORCE_CONST_MEM arm_tls_referenced_p
 
+#ifdef HAVE_AS_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL arm_output_dwarf_dtprel
+#endif
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Obstack for minipool constant handling.  */
@@ -450,6 +457,7 @@ static int thumb_call_reg_needed;
 #define FL_NOTM              (1 << 17)       /* Instructions not present in the 'M'
                                         profile.  */
 #define FL_DIV       (1 << 18)       /* Hardware divide.  */
+#define FL_VFPV3      (1 << 19)       /* Vector Floating Point V3.  */
 
 #define FL_IWMMXT     (1 << 29)              /* XScale v2 or "Intel Wireless MMX technology".  */
 
@@ -693,7 +701,8 @@ static const struct fpu_desc all_fpus[] =
   {"fpe2",     FPUTYPE_FPA_EMU2},
   {"fpe3",     FPUTYPE_FPA_EMU2},
   {"maverick", FPUTYPE_MAVERICK},
-  {"vfp",      FPUTYPE_VFP}
+  {"vfp",      FPUTYPE_VFP},
+  {"vfp3",     FPUTYPE_VFP3},
 };
 
 
@@ -708,7 +717,8 @@ static const enum fputype fp_model_for_fpu[] =
   ARM_FP_MODEL_FPA,            /* FPUTYPE_FPA_EMU2  */
   ARM_FP_MODEL_FPA,            /* FPUTYPE_FPA_EMU3  */
   ARM_FP_MODEL_MAVERICK,       /* FPUTYPE_MAVERICK  */
-  ARM_FP_MODEL_VFP             /* FPUTYPE_VFP  */
+  ARM_FP_MODEL_VFP,            /* FPUTYPE_VFP  */
+  ARM_FP_MODEL_VFP             /* FPUTYPE_VFP3  */
 };
 
 
@@ -1338,10 +1348,23 @@ arm_override_options (void)
                 ARM_DOUBLEWORD_ALIGN ? "8, 32 or 64": "8 or 32");
     }
 
+  if (!TARGET_ARM && TARGET_VXWORKS_RTP && flag_pic)
+    {
+      error ("RTP PIC is incompatible with Thumb");
+      flag_pic = 0;
+    }
+
   /* If stack checking is disabled, we can use r10 as the PIC register,
      which keeps r9 available.  The EABI specifies r9 as the PIC register.  */
   if (flag_pic && TARGET_SINGLE_PIC_BASE)
-    arm_pic_register = (TARGET_APCS_STACK || TARGET_AAPCS_BASED) ? 9 : 10;
+    {
+      if (TARGET_VXWORKS_RTP)
+       warning (0, "RTP PIC is incompatible with -msingle-pic-base");
+      arm_pic_register = (TARGET_APCS_STACK || TARGET_AAPCS_BASED) ? 9 : 10;
+    }
+
+  if (flag_pic && TARGET_VXWORKS_RTP)
+    arm_pic_register = 9;
 
   if (arm_pic_register_string != NULL)
     {
@@ -1354,7 +1377,9 @@ arm_override_options (void)
       else if (pic_register < 0 || call_used_regs[pic_register]
               || pic_register == HARD_FRAME_POINTER_REGNUM
               || pic_register == STACK_POINTER_REGNUM
-              || pic_register >= PC_REGNUM)
+              || pic_register >= PC_REGNUM
+              || (TARGET_VXWORKS_RTP
+                  && (unsigned int) pic_register != arm_pic_register))
        error ("unable to use '%s' for PIC register", arm_pic_register_string);
       else
        arm_pic_register = pic_register;
@@ -1620,7 +1645,7 @@ use_return_insn (int iscond, rtx sibling)
 
       if (flag_pic 
          && arm_pic_register != INVALID_REGNUM
-         && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
+         && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
        return 0;
     }
 
@@ -1633,18 +1658,18 @@ use_return_insn (int iscond, rtx sibling)
      since this also requires an insn.  */
   if (TARGET_HARD_FLOAT && TARGET_FPA)
     for (regno = FIRST_FPA_REGNUM; regno <= LAST_FPA_REGNUM; regno++)
-      if (regs_ever_live[regno] && !call_used_regs[regno])
+      if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
        return 0;
 
   /* Likewise VFP regs.  */
   if (TARGET_HARD_FLOAT && TARGET_VFP)
     for (regno = FIRST_VFP_REGNUM; regno <= LAST_VFP_REGNUM; regno++)
-      if (regs_ever_live[regno] && !call_used_regs[regno])
+      if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
        return 0;
 
   if (TARGET_REALLY_IWMMXT)
     for (regno = FIRST_IWMMXT_REGNUM; regno <= LAST_IWMMXT_REGNUM; regno++)
-      if (regs_ever_live[regno] && ! call_used_regs [regno])
+      if (df_regs_ever_live_p (regno) && ! call_used_regs[regno])
        return 0;
 
   return 1;
@@ -3214,6 +3239,11 @@ arm_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
   if (decl == NULL || TARGET_THUMB)
     return false;
 
+  /* The PIC register is live on entry to VxWorks PLT entries, so we
+     must make the call before restoring the PIC register.  */
+  if (TARGET_VXWORKS_RTP && flag_pic && !targetm.binds_local_p (decl))
+    return false;
+
   /* Cannot tail-call to long calls, since these are out of range of
      a branch instruction.  */
   if (arm_is_long_call_p (decl))
@@ -3255,6 +3285,54 @@ legitimate_pic_operand_p (rtx x)
   return 1;
 }
 
+/* Record that the current function needs a PIC register.  Initialize
+   cfun->machine->pic_reg if we have not already done so.  */
+
+static void
+require_pic_register (void)
+{
+  /* A lot of the logic here is made obscure by the fact that this
+     routine gets called as part of the rtx cost estimation process.
+     We don't want those calls to affect any assumptions about the real
+     function; and further, we can't call entry_of_function() until we
+     start the real expansion process.  */
+  if (!current_function_uses_pic_offset_table)
+    {
+      gcc_assert (!no_new_pseudos);
+      if (arm_pic_register != INVALID_REGNUM)
+       {
+         cfun->machine->pic_reg = gen_rtx_REG (Pmode, arm_pic_register);
+
+         /* Play games to avoid marking the function as needing pic
+            if we are being called as part of the cost-estimation
+            process.  */
+         if (current_ir_type () != IR_GIMPLE)
+           current_function_uses_pic_offset_table = 1;
+       }
+      else
+       {
+         rtx seq;
+
+         cfun->machine->pic_reg = gen_reg_rtx (Pmode);
+
+         /* Play games to avoid marking the function as needing pic
+            if we are being called as part of the cost-estimation
+            process.  */
+         if (current_ir_type () != IR_GIMPLE)
+           {
+             current_function_uses_pic_offset_table = 1;
+             start_sequence ();
+
+             arm_load_pic_register (0UL);
+
+             seq = get_insns ();
+             end_sequence ();
+             emit_insn_after (seq, entry_of_function ());
+           }
+       }
+    }
+}
+
 rtx
 legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
 {
@@ -3267,48 +3345,8 @@ legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
       rtx insn;
       int subregs = 0;
 
-      /* If this function doesn't have a pic register, create one now.
-        A lot of the logic here is made obscure by the fact that this
-        routine gets called as part of the rtx cost estimation
-        process.  We don't want those calls to affect any assumptions
-        about the real function; and further, we can't call
-        entry_of_function() until we start the real expansion
-        process.  */
-      if (!current_function_uses_pic_offset_table)
-       {
-         gcc_assert (!no_new_pseudos);
-         if (arm_pic_register != INVALID_REGNUM)
-           {
-             cfun->machine->pic_reg = gen_rtx_REG (Pmode, arm_pic_register);
-
-             /* Play games to avoid marking the function as needing pic
-                if we are being called as part of the cost-estimation
-                process.  */
-             if (current_ir_type () != IR_GIMPLE)
-               current_function_uses_pic_offset_table = 1;
-           }
-         else
-           {
-             rtx seq;
-
-             cfun->machine->pic_reg = gen_reg_rtx (Pmode);
-
-             /* Play games to avoid marking the function as needing pic
-                if we are being called as part of the cost-estimation
-                process.  */
-             if (current_ir_type () != IR_GIMPLE)
-               {
-                 current_function_uses_pic_offset_table = 1;
-                 start_sequence ();
-
-                 arm_load_pic_register (0UL);
-
-                 seq = get_insns ();
-                 end_sequence ();
-                 emit_insn_after (seq, entry_of_function ());
-               }
-           }
-       }
+      /* If this function doesn't have a pic register, create one now.  */
+      require_pic_register ();
 
       if (reg == 0)
        {
@@ -3335,10 +3373,17 @@ legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
       else /* TARGET_THUMB1 */
        emit_insn (gen_pic_load_addr_thumb1 (address, orig));
 
+      /* VxWorks does not impose a fixed gap between segments; the run-time
+        gap can be different from the object-file gap.  We therefore can't
+        use GOTOFF unless we are absolutely sure that the symbol is in the
+        same segment as the GOT.  Unfortunately, the flexibility of linker
+        scripts means that we can't be sure of that in general, so assume
+        that GOTOFF is never valid on VxWorks.  */
       if ((GET_CODE (orig) == LABEL_REF
           || (GET_CODE (orig) == SYMBOL_REF &&
               SYMBOL_REF_LOCAL_P (orig)))
-         && NEED_GOT_RELOC)
+         && NEED_GOT_RELOC
+         && !TARGET_VXWORKS_RTP)
        pic_ref = gen_rtx_PLUS (Pmode, cfun->machine->pic_reg, address);
       else
        {
@@ -3419,7 +3464,7 @@ thumb_find_work_register (unsigned long pushed_regs_mask)
      register allocation order means that sometimes r3 might be used
      but earlier argument registers might not, so check them all.  */
   for (reg = LAST_ARG_REGNUM; reg >= 0; reg --)
-    if (!regs_ever_live[reg])
+    if (!df_regs_ever_live_p (reg))
       return reg;
 
   /* Before going on to check the call-saved registers we can try a couple
@@ -3478,7 +3523,7 @@ void
 arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
 {
 #ifndef AOF_ASSEMBLER
-  rtx l1, labelno, pic_tmp, pic_tmp2, pic_rtx;
+  rtx l1, labelno, pic_tmp, pic_tmp2, pic_rtx, pic_reg;
   rtx global_offset_table;
 
   if (current_function_uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
@@ -3486,72 +3531,88 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
 
   gcc_assert (flag_pic);
 
-  /* We use an UNSPEC rather than a LABEL_REF because this label never appears
-     in the code stream.  */
-
-  labelno = GEN_INT (pic_labelno++);
-  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
-  l1 = gen_rtx_CONST (VOIDmode, l1);
-
-  global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
-  /* On the ARM the PC register contains 'dot + 8' at the time of the
-     addition, on the Thumb it is 'dot + 4'.  */
-  pic_tmp = plus_constant (l1, TARGET_ARM ? 8 : 4);
-  if (GOT_PCREL)
-    pic_tmp2 = gen_rtx_CONST (VOIDmode,
-                           gen_rtx_PLUS (Pmode, global_offset_table, pc_rtx));
-  else
-    pic_tmp2 = gen_rtx_CONST (VOIDmode, global_offset_table);
+  pic_reg = cfun->machine->pic_reg;
+  if (TARGET_VXWORKS_RTP)
+    {
+      pic_rtx = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE);
+      pic_rtx = gen_rtx_CONST (Pmode, pic_rtx);
+      emit_insn (gen_pic_load_addr_arm (pic_reg, pic_rtx));
 
-  pic_rtx = gen_rtx_CONST (Pmode, gen_rtx_MINUS (Pmode, pic_tmp2, pic_tmp));
+      emit_insn (gen_rtx_SET (Pmode, pic_reg, gen_rtx_MEM (Pmode, pic_reg)));
 
-  if (TARGET_ARM)
-    {
-      emit_insn (gen_pic_load_addr_arm (cfun->machine->pic_reg, pic_rtx));
-      emit_insn (gen_pic_add_dot_plus_eight (cfun->machine->pic_reg,
-                                            cfun->machine->pic_reg, labelno));
+      pic_tmp = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
+      emit_insn (gen_pic_offset_arm (pic_reg, pic_reg, pic_tmp));
     }
-  else if (TARGET_THUMB2)
+  else
     {
-      /* Thumb-2 only allows very limited access to the PC.  Calculate the
-        address in a temporary register.  */
-      if (arm_pic_register != INVALID_REGNUM)
+      /* We use an UNSPEC rather than a LABEL_REF because this label
+        never appears in the code stream.  */
+
+      labelno = GEN_INT (pic_labelno++);
+      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
+      l1 = gen_rtx_CONST (VOIDmode, l1);
+
+      global_offset_table
+       = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
+      /* On the ARM the PC register contains 'dot + 8' at the time of the
+        addition, on the Thumb it is 'dot + 4'.  */
+      pic_tmp = plus_constant (l1, TARGET_ARM ? 8 : 4);
+      if (GOT_PCREL)
        {
-         pic_tmp = gen_rtx_REG (SImode,
-                                thumb_find_work_register (saved_regs));
+         pic_tmp2 = gen_rtx_PLUS (Pmode, global_offset_table, pc_rtx);
+         pic_tmp2 = gen_rtx_CONST (VOIDmode, pic_tmp2);
        }
       else
+       pic_tmp2 = gen_rtx_CONST (VOIDmode, global_offset_table);
+
+      pic_rtx = gen_rtx_MINUS (Pmode, pic_tmp2, pic_tmp);
+      pic_rtx = gen_rtx_CONST (Pmode, pic_rtx);
+
+      if (TARGET_ARM)
        {
-         gcc_assert (!no_new_pseudos);
-         pic_tmp = gen_reg_rtx (Pmode);
+         emit_insn (gen_pic_load_addr_arm (pic_reg, pic_rtx));
+         emit_insn (gen_pic_add_dot_plus_eight (pic_reg, pic_reg, labelno));
        }
+      else if (TARGET_THUMB2)
+       {
+         /* Thumb-2 only allows very limited access to the PC.  Calculate the
+            address in a temporary register.  */
+         if (arm_pic_register != INVALID_REGNUM)
+           {
+             pic_tmp = gen_rtx_REG (SImode,
+                                    thumb_find_work_register (saved_regs));
+           }
+         else
+           {
+             gcc_assert (!no_new_pseudos);
+             pic_tmp = gen_reg_rtx (Pmode);
+           }
 
-      emit_insn (gen_pic_load_addr_thumb2 (cfun->machine->pic_reg, pic_rtx));
-      emit_insn (gen_pic_load_dot_plus_four (pic_tmp, labelno));
-      emit_insn (gen_addsi3(cfun->machine->pic_reg, cfun->machine->pic_reg,
-                           pic_tmp));
-    }
-  else /* TARGET_THUMB1 */
-    {
-      if (arm_pic_register != INVALID_REGNUM
-         && REGNO (cfun->machine->pic_reg) > LAST_LO_REGNUM)
+         emit_insn (gen_pic_load_addr_thumb2 (pic_reg, pic_rtx));
+         emit_insn (gen_pic_load_dot_plus_four (pic_tmp, labelno));
+         emit_insn (gen_addsi3 (pic_reg, pic_reg, pic_tmp));
+       }
+      else /* TARGET_THUMB1 */
        {
-         /* We will have pushed the pic register, so we should always be
-            able to find a work register.  */
-         pic_tmp = gen_rtx_REG (SImode,
-                                thumb_find_work_register (saved_regs));
-         emit_insn (gen_pic_load_addr_thumb1 (pic_tmp, pic_rtx));
-         emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp));
+         if (arm_pic_register != INVALID_REGNUM
+             && REGNO (pic_reg) > LAST_LO_REGNUM)
+           {
+             /* We will have pushed the pic register, so we should always be
+                able to find a work register.  */
+             pic_tmp = gen_rtx_REG (SImode,
+                                    thumb_find_work_register (saved_regs));
+             emit_insn (gen_pic_load_addr_thumb1 (pic_tmp, pic_rtx));
+             emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp));
+           }
+         else
+           emit_insn (gen_pic_load_addr_thumb1 (pic_reg, pic_rtx));
+         emit_insn (gen_pic_add_dot_plus_four (pic_reg, pic_reg, labelno));
        }
-      else
-       emit_insn (gen_pic_load_addr_thumb1 (cfun->machine->pic_reg, pic_rtx));
-      emit_insn (gen_pic_add_dot_plus_four (cfun->machine->pic_reg,
-                                           cfun->machine->pic_reg, labelno));
     }
 
   /* Need to emit this whether or not we obey regdecls,
      since setjmp/longjmp can cause life info to screw up.  */
-  emit_insn (gen_rtx_USE (VOIDmode, cfun->machine->pic_reg));
+  emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
 #endif /* AOF_ASSEMBLER */
 }
 
@@ -4892,7 +4953,7 @@ arm_rtx_costs_1 (rtx x, enum rtx_code code, enum rtx_code outer)
       return 6;
 
     case CONST_DOUBLE:
-      if (arm_const_double_rtx (x))
+      if (arm_const_double_rtx (x) || vfp3_const_double_rtx (x))
        return outer == SET ? 2 : -1;
       else if ((outer == COMPARE || outer == PLUS)
               && neg_const_double_rtx_ok_for_fpa (x))
@@ -5591,6 +5652,108 @@ neg_const_double_rtx_ok_for_fpa (rtx x)
 
   return 0;
 }
+
+
+/* VFPv3 has a fairly wide range of representable immediates, formed from
+   "quarter-precision" floating-point values. These can be evaluated using this
+   formula (with ^ for exponentiation):
+
+     -1^s * n * 2^-r
+
+   Where 's' is a sign bit (0/1), 'n' and 'r' are integers such that
+   16 <= n <= 31 and 0 <= r <= 7.
+
+   These values are mapped onto an 8-bit integer ABCDEFGH s.t.
+
+     - A (most-significant) is the sign bit.
+     - BCD are the exponent (encoded as r XOR 3).
+     - EFGH are the mantissa (encoded as n - 16).
+*/
+
+/* Return an integer index for a VFPv3 immediate operand X suitable for the
+   fconst[sd] instruction, or -1 if X isn't suitable.  */
+static int
+vfp3_const_double_index (rtx x)
+{
+  REAL_VALUE_TYPE r, m;
+  int sign, exponent;
+  unsigned HOST_WIDE_INT mantissa, mant_hi;
+  unsigned HOST_WIDE_INT mask;
+  int point_pos = 2 * HOST_BITS_PER_WIDE_INT - 1;
+
+  if (!TARGET_VFP3 || GET_CODE (x) != CONST_DOUBLE)
+    return -1;
+
+  REAL_VALUE_FROM_CONST_DOUBLE (r, x);
+
+  /* We can't represent these things, so detect them first.  */
+  if (REAL_VALUE_ISINF (r) || REAL_VALUE_ISNAN (r) || REAL_VALUE_MINUS_ZERO (r))
+    return -1;
+
+  /* Extract sign, exponent and mantissa.  */
+  sign = REAL_VALUE_NEGATIVE (r) ? 1 : 0;
+  r = REAL_VALUE_ABS (r);
+  exponent = REAL_EXP (&r);
+  /* For the mantissa, we expand into two HOST_WIDE_INTS, apart from the
+     highest (sign) bit, with a fixed binary point at bit point_pos.
+     WARNING: If there's ever a VFP version which uses more than 2 * H_W_I - 1
+     bits for the mantissa, this may fail (low bits would be lost).  */
+  real_ldexp (&m, &r, point_pos - exponent);
+  REAL_VALUE_TO_INT (&mantissa, &mant_hi, m);
+
+  /* If there are bits set in the low part of the mantissa, we can't
+     represent this value.  */
+  if (mantissa != 0)
+    return -1;
+
+  /* Now make it so that mantissa contains the most-significant bits, and move
+     the point_pos to indicate that the least-significant bits have been
+     discarded.  */
+  point_pos -= HOST_BITS_PER_WIDE_INT;
+  mantissa = mant_hi;
+
+  /* We can permit four significant bits of mantissa only, plus a high bit
+     which is always 1.  */
+  mask = ((unsigned HOST_WIDE_INT)1 << (point_pos - 5)) - 1;
+  if ((mantissa & mask) != 0)
+    return -1;
+
+  /* Now we know the mantissa is in range, chop off the unneeded bits.  */
+  mantissa >>= point_pos - 5;
+
+  /* The mantissa may be zero. Disallow that case. (It's possible to load the
+     floating-point immediate zero with Neon using an integer-zero load, but
+     that case is handled elsewhere.)  */
+  if (mantissa == 0)
+    return -1;
+
+  gcc_assert (mantissa >= 16 && mantissa <= 31);
+
+  /* The value of 5 here would be 4 if GCC used IEEE754-like encoding (where
+     normalised significands are in the range [1, 2). (Our mantissa is shifted
+     left 4 places at this point relative to normalised IEEE754 values).  GCC
+     internally uses [0.5, 1) (see real.c), so the exponent returned from
+     REAL_EXP must be altered.  */
+  exponent = 5 - exponent;
+
+  if (exponent < 0 || exponent > 7)
+    return -1;
+
+  /* Sign, mantissa and exponent are now in the correct form to plug into the
+     formulae described in the comment above.  */
+  return (sign << 7) | ((exponent ^ 3) << 4) | (mantissa - 16);
+}
+
+/* Return TRUE if rtx X is a valid immediate VFPv3 constant.  */
+int
+vfp3_const_double_rtx (rtx x)
+{
+  if (!TARGET_VFP3)
+    return 0;
+
+  return vfp3_const_double_index (x) != -1;
+}
+
 \f
 /* Predicates for `match_operand' and `match_operator'.  */
 
@@ -6000,10 +6163,9 @@ arm_cannot_copy_insn_p (rtx insn)
 {
   rtx pat = PATTERN (insn);
 
-  if (GET_CODE (pat) == PARALLEL
-      && GET_CODE (XVECEXP (pat, 0, 0)) == SET)
+  if (GET_CODE (pat) == SET)
     {
-      rtx rhs = SET_SRC (XVECEXP (pat, 0, 0));
+      rtx rhs = SET_SRC (pat);
 
       if (GET_CODE (rhs) == UNSPEC
          && XINT (rhs, 1) == UNSPEC_PIC_BASE)
@@ -8751,6 +8913,15 @@ vfp_output_fldmd (FILE * stream, unsigned int base, int reg, int count)
       count++;
     }
 
+  /* FLDMD may not load more than 16 doubleword registers at a time. Split the
+     load into multiple parts if we have to handle more than 16 registers.  */
+  if (count > 16)
+    {
+      vfp_output_fldmd (stream, base, reg, 16);
+      vfp_output_fldmd (stream, base, reg + 16, count - 16);
+      return;
+    }
+
   fputc ('\t', stream);
   asm_fprintf (stream, "fldmfdd\t%r!, {", base);
 
@@ -8813,6 +8984,19 @@ vfp_emit_fstmd (int base_reg, int count)
       count++;
     }
 
+  /* FSTMD may not store more than 16 doubleword registers at once.  Split
+     larger stores into multiple parts (up to a maximum of two, in
+     practice).  */
+  if (count > 16)
+    {
+      int saved;
+      /* NOTE: base_reg is an internal register number, so each D register
+         counts as 2.  */
+      saved = vfp_emit_fstmd (base_reg + 32, count - 16);
+      saved += vfp_emit_fstmd (base_reg, 16);
+      return saved;
+    }
+
   par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
   dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1));
 
@@ -8862,6 +9046,30 @@ vfp_emit_fstmd (int base_reg, int count)
   return count * 8;
 }
 
+/* Emit a call instruction with pattern PAT.  ADDR is the address of
+   the call target.  */
+
+void
+arm_emit_call_insn (rtx pat, rtx addr)
+{
+  rtx insn;
+
+  insn = emit_call_insn (pat);
+
+  /* The PIC register is live on entry to VxWorks PIC PLT entries.
+     If the call might use such an entry, add a use of the PIC register
+     to the instruction's CALL_INSN_FUNCTION_USAGE.  */
+  if (TARGET_VXWORKS_RTP
+      && flag_pic
+      && GET_CODE (addr) == SYMBOL_REF
+      && (SYMBOL_REF_DECL (addr)
+         ? !targetm.binds_local_p (SYMBOL_REF_DECL (addr))
+         : !SYMBOL_REF_LOCAL_P (addr)))
+    {
+      require_pic_register ();
+      use_reg (&CALL_INSN_FUNCTION_USAGE (insn), cfun->machine->pic_reg);
+    }
+}
 
 /* Output a 'call' insn.  */
 const char *
@@ -9689,8 +9897,8 @@ arm_compute_save_reg0_reg12_mask (void)
        max_reg = 12;
 
       for (reg = 0; reg <= max_reg; reg++)
-       if (regs_ever_live[reg]
-           || (! current_function_is_leaf && call_used_regs [reg]))
+       if (df_regs_ever_live_p (reg)
+           || (! current_function_is_leaf && call_used_regs[reg]))
          save_reg_mask |= (1 << reg);
 
       /* Also save the pic base register if necessary.  */
@@ -9708,15 +9916,18 @@ arm_compute_save_reg0_reg12_mask (void)
       /* In the normal case we only need to save those registers
         which are call saved and which are used by this function.  */
       for (reg = 0; reg <= last_reg; reg++)
-       if (regs_ever_live[reg] && ! call_used_regs [reg])
+       if (df_regs_ever_live_p (reg) && ! call_used_regs[reg])
          save_reg_mask |= (1 << reg);
 
       /* Handle the frame pointer as a special case.  */
-      if (TARGET_THUMB2 && frame_pointer_needed)
+      if (! TARGET_APCS_FRAME
+         && ! frame_pointer_needed
+         && df_regs_ever_live_p (HARD_FRAME_POINTER_REGNUM)
+         && ! call_used_regs[HARD_FRAME_POINTER_REGNUM])
        save_reg_mask |= 1 << HARD_FRAME_POINTER_REGNUM;
       else if (! TARGET_APCS_FRAME
               && ! frame_pointer_needed
-              && regs_ever_live[HARD_FRAME_POINTER_REGNUM]
+              && df_regs_ever_live_p (HARD_FRAME_POINTER_REGNUM)
               && ! call_used_regs[HARD_FRAME_POINTER_REGNUM])
        save_reg_mask |= 1 << HARD_FRAME_POINTER_REGNUM;
 
@@ -9725,7 +9936,7 @@ arm_compute_save_reg0_reg12_mask (void)
       if (flag_pic
          && !TARGET_SINGLE_PIC_BASE
          && arm_pic_register != INVALID_REGNUM
-         && (regs_ever_live[PIC_OFFSET_TABLE_REGNUM]
+         && (df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM)
              || current_function_uses_pic_offset_table))
        save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
 
@@ -9791,11 +10002,11 @@ arm_compute_save_reg_mask (void)
      now and then popping it back into the PC.  This incurs extra memory
      accesses though, so we only do it when optimizing for size, and only
      if we know that we will not need a fancy return sequence.  */
-  if (regs_ever_live [LR_REGNUM]
-         || (save_reg_mask
-             && optimize_size
-             && ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL
-             && !current_function_calls_eh_return))
+  if (df_regs_ever_live_p (LR_REGNUM)
+      || (save_reg_mask
+         && optimize_size
+         && ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL
+         && !current_function_calls_eh_return))
     save_reg_mask |= 1 << LR_REGNUM;
 
   if (cfun->machine->lr_save_eliminated)
@@ -9851,7 +10062,7 @@ thumb1_compute_save_reg_mask (void)
 
   mask = 0;
   for (reg = 0; reg < 12; reg ++)
-    if (regs_ever_live[reg] && !call_used_regs[reg])
+    if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
       mask |= 1 << reg;
 
   if (flag_pic
@@ -9905,8 +10116,8 @@ arm_get_vfp_saved_size (void)
           regno < LAST_VFP_REGNUM;
           regno += 2)
        {
-         if ((!regs_ever_live[regno] || call_used_regs[regno])
-             && (!regs_ever_live[regno + 1] || call_used_regs[regno + 1]))
+         if ((!df_regs_ever_live_p (regno) || call_used_regs[regno])
+             && (!df_regs_ever_live_p (regno + 1) || call_used_regs[regno + 1]))
            {
              if (count > 0)
                {
@@ -10308,7 +10519,7 @@ arm_output_epilogue (rtx sibling)
       if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
        {
          for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
-           if (regs_ever_live[reg] && !call_used_regs[reg])
+           if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
              {
                floats_offset += 12;
                asm_fprintf (f, "\tldfe\t%r, [%r, #-%d]\n",
@@ -10321,7 +10532,7 @@ arm_output_epilogue (rtx sibling)
 
          for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
            {
-             if (regs_ever_live[reg] && !call_used_regs[reg])
+             if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
                {
                  floats_offset += 12;
 
@@ -10367,8 +10578,8 @@ arm_output_epilogue (rtx sibling)
          start_reg = FIRST_VFP_REGNUM;
          for (reg = FIRST_VFP_REGNUM; reg < LAST_VFP_REGNUM; reg += 2)
            {
-             if ((!regs_ever_live[reg] || call_used_regs[reg])
-                 && (!regs_ever_live[reg + 1] || call_used_regs[reg + 1]))
+             if ((!df_regs_ever_live_p (reg) || call_used_regs[reg])
+                 && (!df_regs_ever_live_p (reg + 1) || call_used_regs[reg + 1]))
                {
                  if (start_reg != reg)
                    vfp_output_fldmd (f, IP_REGNUM,
@@ -10395,7 +10606,7 @@ arm_output_epilogue (rtx sibling)
          lrm_count += (lrm_count % 2 ? 2 : 1);
 
          for (reg = LAST_IWMMXT_REGNUM; reg >= FIRST_IWMMXT_REGNUM; reg--)
-           if (regs_ever_live[reg] && !call_used_regs[reg])
+           if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
              {
                asm_fprintf (f, "\twldrd\t%r, [%r, #-%d]\n",
                             reg, FP_REGNUM, lrm_count * 4);
@@ -10476,7 +10687,7 @@ arm_output_epilogue (rtx sibling)
       if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
        {
          for (reg = FIRST_FPA_REGNUM; reg <= LAST_FPA_REGNUM; reg++)
-           if (regs_ever_live[reg] && !call_used_regs[reg])
+           if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
              asm_fprintf (f, "\tldfe\t%r, [%r], #12\n",
                           reg, SP_REGNUM);
        }
@@ -10486,7 +10697,7 @@ arm_output_epilogue (rtx sibling)
 
          for (reg = FIRST_FPA_REGNUM; reg <= LAST_FPA_REGNUM; reg++)
            {
-             if (regs_ever_live[reg] && !call_used_regs[reg])
+             if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
                {
                  if (reg - start_reg == 3)
                    {
@@ -10517,8 +10728,8 @@ arm_output_epilogue (rtx sibling)
          start_reg = FIRST_VFP_REGNUM;
          for (reg = FIRST_VFP_REGNUM; reg < LAST_VFP_REGNUM; reg += 2)
            {
-             if ((!regs_ever_live[reg] || call_used_regs[reg])
-                 && (!regs_ever_live[reg + 1] || call_used_regs[reg + 1]))
+             if ((!df_regs_ever_live_p (reg) || call_used_regs[reg])
+                 && (!df_regs_ever_live_p (reg + 1) || call_used_regs[reg + 1]))
                {
                  if (start_reg != reg)
                    vfp_output_fldmd (f, SP_REGNUM,
@@ -10534,7 +10745,7 @@ arm_output_epilogue (rtx sibling)
        }
       if (TARGET_IWMMXT)
        for (reg = FIRST_IWMMXT_REGNUM; reg <= LAST_IWMMXT_REGNUM; reg++)
-         if (regs_ever_live[reg] && !call_used_regs[reg])
+         if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
            asm_fprintf (f, "\twldrd\t%r, [%r], #8\n", reg, SP_REGNUM);
 
       /* If we can, restore the LR into the PC.  */
@@ -10876,7 +11087,7 @@ thumb_force_lr_save (void)
   return !cfun->machine->lr_save_eliminated
         && (!leaf_function_p ()
             || thumb_far_jump_used_p ()
-            || regs_ever_live [LR_REGNUM]);
+            || df_regs_ever_live_p (LR_REGNUM));
 }
 
 
@@ -10984,7 +11195,7 @@ arm_get_frame_offsets (void)
          for (regno = FIRST_IWMMXT_REGNUM;
               regno <= LAST_IWMMXT_REGNUM;
               regno++)
-           if (regs_ever_live [regno] && ! call_used_regs [regno])
+           if (df_regs_ever_live_p (regno) && ! call_used_regs[regno])
              saved += 8;
        }
 
@@ -10993,7 +11204,7 @@ arm_get_frame_offsets (void)
        {
          /* Space for saved FPA registers.  */
          for (regno = FIRST_FPA_REGNUM; regno <= LAST_FPA_REGNUM; regno++)
-         if (regs_ever_live[regno] && ! call_used_regs[regno])
+           if (df_regs_ever_live_p (regno) && ! call_used_regs[regno])
            saved += 12;
 
          /* Space for saved VFP registers.  */
@@ -11016,6 +11227,7 @@ arm_get_frame_offsets (void)
   if (leaf && frame_size == 0)
     {
       offsets->outgoing_args = offsets->soft_frame;
+      offsets->locals_base = offsets->soft_frame;
       return offsets;
     }
 
@@ -11132,7 +11344,7 @@ arm_save_coproc_regs(void)
   rtx insn;
 
   for (reg = LAST_IWMMXT_REGNUM; reg >= FIRST_IWMMXT_REGNUM; reg--)
-    if (regs_ever_live[reg] && ! call_used_regs [reg])
+    if (df_regs_ever_live_p (reg) && ! call_used_regs[reg])
       {
        insn = gen_rtx_PRE_DEC (V2SImode, stack_pointer_rtx);
        insn = gen_rtx_MEM (V2SImode, insn);
@@ -11146,7 +11358,7 @@ arm_save_coproc_regs(void)
   if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
     {
       for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
-       if (regs_ever_live[reg] && !call_used_regs[reg])
+       if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
          {
            insn = gen_rtx_PRE_DEC (XFmode, stack_pointer_rtx);
            insn = gen_rtx_MEM (XFmode, insn);
@@ -11161,7 +11373,7 @@ arm_save_coproc_regs(void)
 
       for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
        {
-         if (regs_ever_live[reg] && !call_used_regs[reg])
+         if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
            {
              if (start_reg - reg == 3)
                {
@@ -11196,8 +11408,8 @@ arm_save_coproc_regs(void)
 
       for (reg = FIRST_VFP_REGNUM; reg < LAST_VFP_REGNUM; reg += 2)
        {
-         if ((!regs_ever_live[reg] || call_used_regs[reg])
-             && (!regs_ever_live[reg + 1] || call_used_regs[reg + 1]))
+         if ((!df_regs_ever_live_p (reg) || call_used_regs[reg])
+             && (!df_regs_ever_live_p (reg + 1) || call_used_regs[reg + 1]))
            {
              if (start_reg != reg)
                saved_size += vfp_emit_fstmd (start_reg,
@@ -11342,7 +11554,7 @@ arm_expand_prologue (void)
             doesn't need to be unwound, as it doesn't contain a value
             inherited from the caller.  */
 
-         if (regs_ever_live[3] == 0)
+         if (df_regs_ever_live_p (3) == false)
            insn = emit_set_insn (gen_rtx_REG (SImode, 3), ip_rtx);
          else if (args_to_push == 0)
            {
@@ -11436,7 +11648,7 @@ arm_expand_prologue (void)
          if (IS_NESTED (func_type))
            {
              /* Recover the static chain register.  */
-             if (regs_ever_live [3] == 0
+             if (!df_regs_ever_live_p (3)
                  || saved_pretend_args)
                insn = gen_rtx_REG (SImode, 3);
              else /* if (current_function_pretend_args_size == 0) */
@@ -11505,10 +11717,7 @@ arm_expand_prologue (void)
   /* If the link register is being kept alive, with the return address in it,
      then make sure that it does not get reused by the ce2 pass.  */
   if ((live_regs_mask & (1 << LR_REGNUM)) == 0)
-    {
-      emit_insn (gen_prologue_use (gen_rtx_REG (SImode, LR_REGNUM)));
-      cfun->machine->lr_save_eliminated = 1;
-    }
+    cfun->machine->lr_save_eliminated = 1;
 }
 \f
 /* Print condition code to STREAM.  Helper function for arm_print_operand.  */
@@ -11778,7 +11987,7 @@ arm_print_operand (FILE *stream, rtx x, int code)
         want to do that.  */
       if (x == const_true_rtx)
        {
-         output_operand_lossage ("instruction never exectued");
+         output_operand_lossage ("instruction never executed");
          return;
        }
       if (!COMPARISON_P (x))
@@ -11900,6 +12109,16 @@ arm_print_operand (FILE *stream, rtx x, int code)
       }
       return;
 
+    /* Print a VFPv3 floating-point constant, represented as an integer
+       index.  */
+    case 'G':
+      {
+        int index = vfp3_const_double_index (x);
+       gcc_assert (index != -1);
+       fprintf (stream, "%d", index);
+      }
+      return;
+
     default:
       if (x == 0)
        {
@@ -11947,14 +12166,13 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
       if (NEED_GOT_RELOC && flag_pic && making_const_table &&
          (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF))
        {
-         if (GET_CODE (x) == SYMBOL_REF
-             && (CONSTANT_POOL_ADDRESS_P (x)
-                 || SYMBOL_REF_LOCAL_P (x)))
-           fputs ("(GOTOFF)", asm_out_file);
-         else if (GET_CODE (x) == LABEL_REF)
-           fputs ("(GOTOFF)", asm_out_file);
-         else
+         /* See legitimize_pic_address for an explanation of the
+            TARGET_VXWORKS_RTP check.  */
+         if (TARGET_VXWORKS_RTP
+             || (GET_CODE (x) == SYMBOL_REF && !SYMBOL_REF_LOCAL_P (x)))
            fputs ("(GOT)", asm_out_file);
+         else
+           fputs ("(GOTOFF)", asm_out_file);
        }
       fputc ('\n', asm_out_file);
       return true;
@@ -12680,11 +12898,10 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
       && IS_VFP_REGNUM (regno))
     {
       if (mode == SFmode || mode == SImode)
-       return TRUE;
+       return VFP_REGNO_OK_FOR_SINGLE (regno);
 
-      /* DFmode values are only valid in even register pairs.  */
       if (mode == DFmode)
-       return ((regno - FIRST_VFP_REGNUM) & 1) == 0;
+       return VFP_REGNO_OK_FOR_DOUBLE (regno);
       return FALSE;
     }
 
@@ -12747,7 +12964,14 @@ arm_regno_class (int regno)
     return CIRRUS_REGS;
 
   if (IS_VFP_REGNUM (regno))
-    return VFP_REGS;
+    {
+      if (regno <= D7_VFP_REGNUM)
+       return VFP_D0_D7_REGS;
+      else if (regno <= LAST_LO_VFP_REGNUM)
+        return VFP_LO_REGS;
+      else
+        return VFP_HI_REGS;
+    }
 
   if (IS_IWMMXT_REGNUM (regno))
     return IWMMXT_REGS;
@@ -13842,7 +14066,7 @@ thumb_exit (FILE *f, int reg_containing_return_addr)
     {
       /* If we can deduce the registers used from the function's
         return value.  This is more reliable that examining
-        regs_ever_live[] because that will be set if the register is
+        df_regs_ever_live_p () because that will be set if the register is
         ever used in the function, not just if the register is used
         to hold a return value.  */
 
@@ -14123,7 +14347,7 @@ thumb_far_jump_used_p (void)
 
         If we need doubleword stack alignment this could affect the other
         elimination offsets so we can't risk getting it wrong.  */
-      if (regs_ever_live [ARG_POINTER_REGNUM])
+      if (df_regs_ever_live_p (ARG_POINTER_REGNUM))
        cfun->machine->arg_pointer_live = 1;
       else if (!cfun->machine->arg_pointer_live)
        return 0;
@@ -14187,7 +14411,7 @@ thumb_unexpanded_epilogue (void)
   high_regs_pushed = bit_count (live_regs_mask & 0x0f00);
 
   /* If we can deduce the registers used from the function's return value.
-     This is more reliable that examining regs_ever_live[] because that
+     This is more reliable that examining df_regs_ever_live_p () because that
      will be set if the register is ever used in the function, not just if
      the register is used to hold a return value.  */
   size = arm_size_return_regs ();
@@ -14558,11 +14782,6 @@ thumb1_expand_prologue (void)
   cfun->machine->lr_save_eliminated = !thumb_force_lr_save ();
   if (live_regs_mask & 0xff)
     cfun->machine->lr_save_eliminated = 0;
-
-  /* If the link register is being kept alive, with the return address in it,
-     then make sure that it does not get reused by the ce2 pass.  */
-  if (cfun->machine->lr_save_eliminated)
-    emit_insn (gen_prologue_use (gen_rtx_REG (SImode, LR_REGNUM)));
 }
 
 
@@ -14586,6 +14805,7 @@ thumb1_expand_epilogue (void)
       amount = offsets->locals_base - offsets->saved_regs;
     }
 
+  gcc_assert (amount >= 0);
   if (amount)
     {
       if (amount < 512)
@@ -14611,10 +14831,10 @@ thumb1_expand_epilogue (void)
   /* Emit a clobber for each insn that will be restored in the epilogue,
      so that flow2 will get register lifetimes correct.  */
   for (regno = 0; regno < 13; regno++)
-    if (regs_ever_live[regno] && !call_used_regs[regno])
+    if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
       emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, regno)));
 
-  if (! regs_ever_live[LR_REGNUM])
+  if (! df_regs_ever_live_p (LR_REGNUM))
     emit_insn (gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, LR_REGNUM)));
 }
 
@@ -15193,6 +15413,7 @@ arm_file_start (void)
        }
       else
        {
+         int set_float_abi_attributes = 0;
          switch (arm_fpu_arch)
            {
            case FPUTYPE_FPA:
@@ -15208,15 +15429,23 @@ arm_file_start (void)
              fpu_name = "maverick";
              break;
            case FPUTYPE_VFP:
-             if (TARGET_HARD_FLOAT)
-               asm_fprintf (asm_out_file, "\t.eabi_attribute 27, 3\n");
-             if (TARGET_HARD_FLOAT_ABI)
-               asm_fprintf (asm_out_file, "\t.eabi_attribute 28, 1\n");
              fpu_name = "vfp";
+             set_float_abi_attributes = 1;
+             break;
+           case FPUTYPE_VFP3:
+             fpu_name = "vfp3";
+             set_float_abi_attributes = 1;
              break;
            default:
              abort();
            }
+         if (set_float_abi_attributes)
+           {
+             if (TARGET_HARD_FLOAT)
+               asm_fprintf (asm_out_file, "\t.eabi_attribute 27, 3\n");
+             if (TARGET_HARD_FLOAT_ABI)
+               asm_fprintf (asm_out_file, "\t.eabi_attribute 28, 1\n");
+           }
        }
       asm_fprintf (asm_out_file, "\t.fpu %s\n", fpu_name);
 
@@ -16095,6 +16324,7 @@ arm_dbx_register_number (unsigned int regno)
   if (IS_FPA_REGNUM (regno))
     return (TARGET_AAPCS_BASED ? 96 : 16) + regno - FIRST_FPA_REGNUM;
 
+  /* FIXME: VFPv3 register numbering.  */
   if (IS_VFP_REGNUM (regno))
     return 64 + regno - FIRST_VFP_REGNUM;
 
@@ -16458,6 +16688,17 @@ arm_emit_tls_decoration (FILE *fp, rtx x)
   return TRUE;
 }
 
+/* ARM implementation of TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
+
+static void
+arm_output_dwarf_dtprel (FILE *file, int size, rtx x)
+{
+  gcc_assert (size == 4);
+  fputs ("\t.word\t", file);
+  output_addr_const (file, x);
+  fputs ("(tlsldo)", file);
+}
+
 bool
 arm_output_addr_const_extra (FILE *fp, rtx x)
 {