OSDN Git Service

* target.h (asm_out.byte_op, asm_out.aligned_op, asm_out.unaligned_op,
[pf3gnuchains/gcc-fork.git] / gcc / config / avr / avr.c
index ed54cbb..7e20748 100644 (file)
@@ -61,6 +61,7 @@ void          debug_hard_reg_set   PARAMS ((HARD_REG_SET set));
 static tree   avr_handle_progmem_attribute PARAMS ((tree *, tree, tree, int, bool *));
 static tree   avr_handle_fndecl_attribute PARAMS ((tree *, tree, tree, int, bool *));
 const struct attribute_spec avr_attribute_table[];
+static bool   avr_assemble_integer PARAMS ((rtx, unsigned int, int));
 static void   avr_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
 static void   avr_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
 
@@ -120,8 +121,8 @@ enum avr_arch {
 };
 
 struct mcu_type_s {
-  const char *name;
-  enum avr_arch arch;
+  const char *const name;
+  const enum avr_arch arch;
 };
 
 /* List of all known AVR MCU types - if updated, it has to be kept
@@ -174,6 +175,11 @@ static const struct mcu_type_s avr_mcu_types[] = {
 int avr_case_values_threshold = 30000;
 \f
 /* Initialize the GCC target structure.  */
+#undef TARGET_ASM_ALIGNED_HI_OP
+#define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
+#undef TARGET_ASM_INTEGER
+#define TARGET_ASM_INTEGER avr_assemble_integer
+
 #undef TARGET_ASM_FUNCTION_PROLOGUE
 #define TARGET_ASM_FUNCTION_PROLOGUE avr_output_function_prologue
 #undef TARGET_ASM_FUNCTION_EPILOGUE
@@ -194,7 +200,7 @@ avr_override_options ()
 
   if (!t->name)
     {
-      fprintf (stderr, "Unknown MCU `%s' specified\nKnown MCU names:\n",
+      fprintf (stderr, "unknown MCU `%s' specified\nKnown MCU names:\n",
               avr_mcu_name);
       for (t = avr_mcu_types; t->name; t++)
        fprintf (stderr,"   %s\n", t->name);
@@ -242,7 +248,7 @@ avr_init_once ()
 
 /*  return register class from register number */
 
-static int reg_class_tab[]={
+static const int reg_class_tab[]={
   GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,
   GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,
   GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,
@@ -1039,7 +1045,7 @@ print_operand (file, x, code)
       else if (code == 'o')
        {
          if (GET_CODE (addr) != PLUS)
-           fatal_insn ("Bad address, not (reg+disp):", addr);
+           fatal_insn ("bad address, not (reg+disp):", addr);
 
          print_operand (file, XEXP (addr, 1), 0);
        }
@@ -1047,7 +1053,7 @@ print_operand (file, x, code)
        {
          print_operand_address (file, XEXP (addr,0));
          if (REGNO (XEXP (addr, 0)) == REG_X)
-           fatal_insn ("Internal compiler bug.\nBad address:"
+           fatal_insn ("internal compiler error.  Bad address:"
                        ,addr);
          fputc ('+', file);
          print_operand (file, XEXP (addr,1), code);
@@ -1060,7 +1066,7 @@ print_operand (file, x, code)
       long val;
       REAL_VALUE_TYPE rv;
       if (GET_MODE (x) != SFmode)
-       fatal_insn ("Internal compiler bug. Unknown mode:", x);
+       fatal_insn ("internal compiler error.  Unknown mode:", x);
       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
       REAL_VALUE_TO_TARGET_SINGLE (rv, val);
       asm_fprintf (file, "0x%lx", val);
@@ -1358,7 +1364,7 @@ avr_simplify_comparision_p (mode, operator, x)
 {
   unsigned int max = (mode == QImode ? 0xff :
                       mode == HImode ? 0xffff :
-                      mode == SImode ? 0xffffffffU : 0);
+                      mode == SImode ? 0xffffffff : 0);
   if (max && operator && GET_CODE (x) == CONST_INT)
     {
       if (unsigned_condition (operator) != operator)
@@ -1768,7 +1774,7 @@ output_movhi (insn, operands, l)
       operands[1] = src;
       return "";
     }
-  fatal_insn ("Invalid insn:", insn);
+  fatal_insn ("invalid insn:", insn);
   return "";
 }
 
@@ -1805,7 +1811,7 @@ out_movqi_r_mr (insn, op, l)
        {
          int disp = INTVAL (XEXP (x,1));
          if (REGNO (XEXP (x,0)) != REG_Y)
-           fatal_insn ("Incorrect insn:",insn);
+           fatal_insn ("incorrect insn:",insn);
 
          if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
            return *l = 3, (AS2 (adiw,r28,%o1-63) CR_TAB
@@ -1891,7 +1897,7 @@ out_movhi_r_mr (insn, op, l)
       if (disp > MAX_LD_OFFSET (GET_MODE (src)))
        {
          if (REGNO (XEXP (base, 0)) != REG_Y)
-           fatal_insn ("Incorrect insn:",insn);
+           fatal_insn ("incorrect insn:",insn);
          
          if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
            return *l = 4, (AS2 (adiw,r28,%o1-62) CR_TAB
@@ -1940,7 +1946,7 @@ out_movhi_r_mr (insn, op, l)
   else if (GET_CODE (base) == PRE_DEC) /* (--R) */
     {
       if (reg_overlap_mentioned_p (dest, XEXP (base, 0)))
-       fatal_insn ("Incorrect insn:", insn);
+       fatal_insn ("incorrect insn:", insn);
 
       *l = 2;
       return (AS2 (ld,%B0,%1) CR_TAB
@@ -1949,7 +1955,7 @@ out_movhi_r_mr (insn, op, l)
   else if (GET_CODE (base) == POST_INC) /* (R++) */
     {
       if (reg_overlap_mentioned_p (dest, XEXP (base, 0)))
-       fatal_insn ("Incorrect insn:", insn);
+       fatal_insn ("incorrect insn:", insn);
 
       *l = 2;
       return (AS2 (ld,%A0,%1)  CR_TAB
@@ -1968,7 +1974,7 @@ out_movhi_r_mr (insn, op, l)
              AS2 (lds,%B0,%B1));
     }
   
-  fatal_insn ("Unknown move insn:",insn);
+  fatal_insn ("unknown move insn:",insn);
   return "";
 }
 
@@ -2047,7 +2053,7 @@ out_movsi_r_mr (insn, op, l)
       if (disp > MAX_LD_OFFSET (GET_MODE (src)))
        {
          if (REGNO (XEXP (base, 0)) != REG_Y)
-           fatal_insn ("Incorrect insn:",insn);
+           fatal_insn ("incorrect insn:",insn);
 
          if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (src)))
            return *l = 6, (AS2 (adiw,r28,%o1-60) CR_TAB
@@ -2132,7 +2138,7 @@ out_movsi_r_mr (insn, op, l)
                    AS2 (lds,%C0,%C1) CR_TAB
                    AS2 (lds,%D0,%D1));
     
-  fatal_insn ("Unknown move insn:",insn);
+  fatal_insn ("unknown move insn:",insn);
   return "";
 }
 
@@ -2219,7 +2225,7 @@ out_movsi_mr_r (insn, op, l)
       if (disp > MAX_LD_OFFSET (GET_MODE (dest)))
        {
          if (reg_base != REG_Y)
-           fatal_insn ("Incorrect insn:",insn);
+           fatal_insn ("incorrect insn:",insn);
 
          if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
            return *l = 6, (AS2 (adiw,r28,%o0-60) CR_TAB
@@ -2290,7 +2296,7 @@ out_movsi_mr_r (insn, op, l)
                  AS2 (st,%0,%B1) CR_TAB
                  AS2 (st,%0,%C1) CR_TAB
                  AS2 (st,%0,%D1));
-  fatal_insn ("Unknown move insn:",insn);
+  fatal_insn ("unknown move insn:",insn);
   return "";
 }
 
@@ -2480,7 +2486,7 @@ output_movsisf(insn, operands, l)
       operands[1] = src;
       return "";
     }
-  fatal_insn ("Invalid insn:", insn);
+  fatal_insn ("invalid insn:", insn);
   return "";
 }
 
@@ -2517,7 +2523,7 @@ out_movqi_mr_r (insn, op, l)
        {
          int disp = INTVAL (XEXP (x,1));
          if (REGNO (XEXP (x,0)) != REG_Y)
-           fatal_insn ("Incorrect insn:",insn);
+           fatal_insn ("incorrect insn:",insn);
 
          if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
            return *l = 3, (AS2 (adiw,r28,%o0-63) CR_TAB
@@ -2628,7 +2634,7 @@ out_movhi_mr_r (insn, op, l)
       if (disp > MAX_LD_OFFSET (GET_MODE (dest)))
        {
          if (reg_base != REG_Y)
-           fatal_insn ("Incorrect insn:",insn);
+           fatal_insn ("incorrect insn:",insn);
 
          if (disp <= 63 + MAX_LD_OFFSET (GET_MODE (dest)))
            return *l = 4, (AS2 (adiw,r28,%o0-62) CR_TAB
@@ -2672,7 +2678,7 @@ out_movhi_mr_r (insn, op, l)
   else if (GET_CODE (base) == POST_INC) /* (R++) */
     return *l=2, (AS2 (st,%0,%A1)  CR_TAB
                  AS2 (st,%0,%B1));
-  fatal_insn ("Unknown move insn:",insn);
+  fatal_insn ("unknown move insn:",insn);
   return "";
 }
 
@@ -2908,7 +2914,7 @@ out_shift_with_cnt (template, insn, operands, len, t_len)
        }
     }
   else
-    fatal_insn ("Bad shift insn:", insn);
+    fatal_insn ("bad shift insn:", insn);
 
   if (second_label)
     {
@@ -3024,7 +3030,7 @@ ashlqi3_out (insn, operands, len)
        }
     }
   else if (CONSTANT_P (operands[2]))
-    fatal_insn ("Internal compiler bug.\nIncorrect shift:", insn);
+    fatal_insn ("internal compiler error.  Incorrect shift:", insn);
 
   out_shift_with_cnt (AS1 (lsl,%0),
                      insn, operands, len, 1);
@@ -3454,7 +3460,7 @@ ashrqi3_out (insn, operands, len)
        }
     }
   else if (CONSTANT_P (operands[2]))
-    fatal_insn ("Internal compiler bug.\nIncorrect shift:", insn);
+    fatal_insn ("internal compiler error.  Incorrect shift:", insn);
 
   out_shift_with_cnt (AS1 (asr,%0),
                      insn, operands, len, 1);
@@ -3834,7 +3840,7 @@ lshrqi3_out (insn, operands, len)
        }
     }
   else if (CONSTANT_P (operands[2]))
-    fatal_insn ("Internal compiler bug.\nIncorrect shift:", insn);
+    fatal_insn ("internal compiler error.  Incorrect shift:", insn);
   
   out_shift_with_cnt (AS1 (lsr,%0),
                      insn, operands, len, 1);
@@ -4242,8 +4248,8 @@ adjust_insn_length (insn, len)
              if (GET_MODE (op[1]) == SImode)
                len = (((mask & 0xff) != 0xff)
                       + ((mask & 0xff00) != 0xff00)
-                      + ((mask & 0xff0000UL) != 0xff0000UL)
-                      + ((mask & 0xff000000UL) != 0xff000000UL));
+                      + ((mask & 0xff0000L) != 0xff0000L)
+                      + ((mask & 0xff000000L) != 0xff000000L));
              else if (GET_MODE (op[1]) == HImode)
                len = (((mask & 0xff) != 0xff)
                       + ((mask & 0xff00) != 0xff00));
@@ -4257,8 +4263,8 @@ adjust_insn_length (insn, len)
              if (GET_MODE (op[1]) == SImode)
                len = (((mask & 0xff) != 0)
                       + ((mask & 0xff00) != 0)
-                      + ((mask & 0xff0000UL) != 0)
-                      + ((mask & 0xff000000UL) != 0));
+                      + ((mask & 0xff0000L) != 0)
+                      + ((mask & 0xff000000L) != 0));
              else if (GET_MODE (op[1]) == HImode)
                len = (((mask & 0xff) != 0)
                       + ((mask & 0xff00) != 0));
@@ -4458,49 +4464,25 @@ _reg_unused_after (insn, reg)
   return 1;
 }
 
-/* Output rtx VALUE as .byte to file FILE */
-
-void
-asm_output_char (file, value)
-     FILE *file;
-     rtx value;
-{
-  fprintf (file, "\t.byte ");
-  output_addr_const (file, value);
-  fprintf (file, "\n");
-}
-
-
-/* Output VALUE as .byte to file FILE */
-
-void
-asm_output_byte (file, value)
-     FILE *file;
-     int value;
-{
-  fprintf (file, "\t.byte 0x%x\n", value & 0xff);
-}
-
-
-/* Output rtx VALUE as .word to file FILE */
+/* Target hook for assembling integer objects.  The AVR version needs
+   special handling for references to certain labels.  */
 
-void
-asm_output_short (file, value)
-     FILE *file;
-     rtx value;
+static bool
+avr_assemble_integer (x, size, aligned_p)
+     rtx x;
+     unsigned int size;
+     int aligned_p;
 {
-  if (SYMBOL_REF_FLAG (value) || GET_CODE (value) == LABEL_REF)
-    {
-      fprintf (file, "\t.word pm(");
-      output_addr_const (file, (value));
-      fprintf (file, ")\n");
-    }
-  else
+  if (size == POINTER_SIZE / BITS_PER_UNIT && aligned_p
+      && ((GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FLAG (x))
+         || GET_CODE (x) == LABEL_REF))
     {
-      fprintf (file, "\t.word ");
-      output_addr_const (file, (value));
-      fprintf (file, "\n");
+      fputs ("\t.word\tpm(", asm_out_file);
+      output_addr_const (asm_out_file, x);
+      fputs (")\n", asm_out_file);
+      return true;
     }
+  return default_assemble_integer (x, size, aligned_p);
 }
 
 
@@ -4699,8 +4681,8 @@ avr_handle_progmem_attribute (node, name, args, flags, no_add_attrs)
        {
          if (DECL_INITIAL (*node) == NULL_TREE && !DECL_EXTERNAL (*node))
            {
-             warning ("Only initialized variables can be placed into "
-                      "program memory area.");
+             warning ("only initialized variables can be placed into "
+                      "program memory area");
              *no_add_attrs = true;
            }
        }
@@ -4831,7 +4813,7 @@ void
 order_regs_for_local_alloc ()
 {
   unsigned int i;
-  int order_0[] = {
+  static const int order_0[] = {
     24,25,
     18,19,
     20,21,
@@ -4843,7 +4825,7 @@ order_regs_for_local_alloc ()
     0,1,
     32,33,34,35
   };
-  int order_1[] = {
+  static const int order_1[] = {
     18,19,
     20,21,
     22,23,
@@ -4855,7 +4837,7 @@ order_regs_for_local_alloc ()
     0,1,
     32,33,34,35
   };
-  int order_2[] = {
+  static const int order_2[] = {
     25,24,
     23,22,
     21,20,
@@ -4869,9 +4851,9 @@ order_regs_for_local_alloc ()
     32,33,34,35
   };
   
-  int *order = (TARGET_ORDER_1 ? order_1 :
-               TARGET_ORDER_2 ? order_2 :
-               order_0);
+  const int *order = (TARGET_ORDER_1 ? order_1 :
+                     TARGET_ORDER_2 ? order_2 :
+                     order_0);
   for (i=0; i < ARRAY_SIZE (order_0); ++i)
       reg_alloc_order[i] = order[i];
 }
@@ -5162,9 +5144,9 @@ mask_one_bit_p (mask)
   unsigned HOST_WIDE_INT n=mask;
   for (i = 0; i < 32; ++i)
     {
-      if (n & 0x80000000UL)
+      if (n & 0x80000000L)
        {
-         if (n & 0x7fffffffUL)
+         if (n & 0x7fffffffL)
            return 0;
          else
            return 32-i;
@@ -5347,7 +5329,7 @@ output_reload_insisf (insn, operands, len)
        *len = 4 + ((INTVAL (src) & 0xff) != 0)
                + ((INTVAL (src) & 0xff00) != 0)
                + ((INTVAL (src) & 0xff0000) != 0)
-               + ((INTVAL (src) & 0xff000000U) != 0);
+               + ((INTVAL (src) & 0xff000000) != 0);
       else
        *len = 8;
 
@@ -5375,7 +5357,7 @@ output_reload_insisf (insn, operands, len)
       output_asm_insn (AS2 (ldi, %2, hlo8(%1)), operands);
       output_asm_insn (AS2 (mov, %C0, %2), operands);
     }
-  if (cnst && ((INTVAL (src) & 0xff000000U) == 0))
+  if (cnst && ((INTVAL (src) & 0xff000000) == 0))
     output_asm_insn (AS2 (mov, %D0, __zero_reg__), operands);
   else
     {