Applied Marek Michalkiewicz <marekm@linux.org.pl>'s patch to ehance the AVR port.
[deliverable/binutils-gdb.git] / gas / config / tc-avr.c
index d93b16b6e0e34be535566e3b962540831eeef3d0..97f614d626d2eaff1c066d8c1912a4799592a115 100644 (file)
@@ -59,9 +59,10 @@ struct mcu_type_s
 static struct mcu_type_s mcu_types[] =
 {
   {"avr1",      AVR_ISA_TINY1,    bfd_mach_avr1},
-  {"avr2",      AVR_ISA_85xx,     bfd_mach_avr2},
+  {"avr2",      AVR_ISA_2xxx,     bfd_mach_avr2},
   {"avr3",      AVR_ISA_M103,     bfd_mach_avr3},
-  {"avr4",      AVR_ISA_ALL,      bfd_mach_avr4},
+  {"avr4",      AVR_ISA_M83,      bfd_mach_avr4},
+  {"avr5",      AVR_ISA_ALL,      bfd_mach_avr5},
   {"at90s1200", AVR_ISA_1200,     bfd_mach_avr1},
   {"attiny10",  AVR_ISA_TINY1,    bfd_mach_avr1},
   {"attiny11",  AVR_ISA_TINY1,    bfd_mach_avr1},
@@ -76,15 +77,17 @@ static struct mcu_type_s mcu_types[] =
   {"at90s4433", AVR_ISA_2xxx,     bfd_mach_avr2},
   {"at90s4414", AVR_ISA_2xxx,     bfd_mach_avr2},
   {"at90s4434", AVR_ISA_2xxx,     bfd_mach_avr2},
-  {"at90s8515", AVR_ISA_85xx,     bfd_mach_avr2},
-  {"at90s8535", AVR_ISA_85xx,     bfd_mach_avr2},
-  {"at90c8534", AVR_ISA_85xx,     bfd_mach_avr2},
+  {"at90s8515", AVR_ISA_2xxx,     bfd_mach_avr2},
+  {"at90s8535", AVR_ISA_2xxx,     bfd_mach_avr2},
+  {"at90c8534", AVR_ISA_2xxx,     bfd_mach_avr2},
   {"atmega603", AVR_ISA_M603,     bfd_mach_avr3},
   {"atmega103", AVR_ISA_M103,     bfd_mach_avr3},
-  {"atmega161", AVR_ISA_M161,     bfd_mach_avr4},
-  {"at94k10",   AVR_ISA_94K,      bfd_mach_avr4},
-  {"at94k20",   AVR_ISA_94K,      bfd_mach_avr4},
-  {"at94k40",   AVR_ISA_94K,      bfd_mach_avr4},
+  {"atmega83",  AVR_ISA_M83,      bfd_mach_avr4},
+  {"atmega85",  AVR_ISA_M83,      bfd_mach_avr4},
+  {"atmega161", AVR_ISA_M161,     bfd_mach_avr5},
+  {"atmega163", AVR_ISA_M161,     bfd_mach_avr5},
+  {"atmega32",  AVR_ISA_M161,     bfd_mach_avr5},
+  {"at94k",     AVR_ISA_94K,      bfd_mach_avr5},
   {NULL, 0, 0}
 };
 
@@ -204,10 +207,11 @@ md_show_usage (stream)
      _ ("AVR options:\n"
        "  -mmcu=[avr-name] select microcontroller variant\n"
        "                   [avr-name] can be:\n"
-       "                   avr1 - AT90S1200\n"
-       "                   avr2 - AT90S2xxx, AT90S4xxx, AT90S85xx, ATtiny22\n"
-       "                   avr3 - ATmega103 or ATmega603\n"
-       "                   avr4 - ATmega161\n"
+       "                   avr1 - AT90S1200, ATtiny1x, ATtiny28\n"
+       "                   avr2 - AT90S2xxx, AT90S4xxx, AT90S8xxx, ATtiny22\n"
+       "                   avr3 - ATmega103, ATmega603\n"
+       "                   avr4 - ATmega83, ATmega85\n"
+       "                   avr5 - ATmega161, ATmega163, ATmega32, AT94K\n"
        "                   or immediate microcontroller name.\n"));
 }
 
@@ -244,10 +248,16 @@ md_parse_option (c, arg)
 
       if (!mcu_types[i].name)
        as_fatal (_ ("unknown MCU: %s\n"), arg);
-      if (avr_mcu == &default_mcu)
+
+      /* It is OK to redefine mcu type within the same avr[1-5] bfd machine
+        type - this for allows passing -mmcu=... via gcc ASM_SPEC as well
+        as .arch ... in the asm output at the same time.  */
+
+      if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach)
        avr_mcu = &mcu_types[i];
       else
-       as_fatal (_ ("redefinition of mcu type `%s'"), mcu_types[i].name);
+       as_fatal (_ ("redefinition of mcu type `%s' to `%s'"),
+                 avr_mcu->name, mcu_types[i].name);
       return 1;
     }
   return 0;
@@ -818,14 +828,8 @@ md_apply_fix3 (fixp, valuep, seg)
 
          if (value < -2048 || value > 2047)
            {
-             if (avr_mcu->isa & AVR_ISA_WRAP)
-               {
-                 if (value > 2047)
-                   value -= 4096;
-                 else
-                   value += 4096;
-               }
-             else
+             /* No wrap for devices with >8K of program memory.  */
+             if (avr_mcu->isa & AVR_ISA_MEGA)
                as_bad_where (fixp->fx_file, fixp->fx_line,
                              _("operand out of range: %ld"), value);
            }
This page took 0.02423 seconds and 4 git commands to generate.