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},
{"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}
};
_ ("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"));
}
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;
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);
}