Re: Device specific ISA support in AVR

"S, Pitchumani" <[email protected]>
Newsgroups gmane.comp.hardware.avr.gcc
Message-ID <CAC140656783604CABA6AE60C2A6D5A46AE103C3@penmbx01>
> -----Original Message-----
> From: Georg-Johann Lay [mailto:[email protected]]
> Sent: Thursday, March 13, 2014 7:43 PM
> To: S, Pitchumani
> Cc: [email protected]
> Subject: Re: [avr-gcc-list] Device specific ISA support in AVR
> 
> Am 03/12/2014 06:59 PM, schrieb S, Pitchumani:
> 
> >>> Please review the patches and comment.
> >>
> >> Hi Pitchumani,
> >>
> >> some remarks on the work:
> >>
> >> 1) It might be useful to builtin-define macros so that user code can
> test
> >> for
> >> availability of these instructions, similar to __AVR_ERRATA_SKIP__ or
> >> __AVR_HAVE_MUL__. That way users can depend on the macro when
> implementing
> >> their inline assembler that might use RMW instructions. This macro
> should
> >> then
> >> be documented with the other macros.
> >>
> >> 2) Binutils' documentation should spell out "RMW" as read-modify-store.
> >> It's
> >> always easier to remember an option if the resolution of some cryptic
> >> letter
> >> combination is known.
> >>
> >> 3) There are also MCU-specific ISA-like features in avr-mcus.def:
> >>
> >> *) ERRATA_SKIP (ISA with broken CPSE, SBRC/S, SBIC/S wrapping 32-bit
> insn)
> >>
> >> *) SHORT_SP (MCU has no SPH special function register)
> >>
> >> Maybe these 3 ISA properties can be merged into one field with
> respective
> >> flags.  That way avr-mcus.def would be easier to read and the number of
> >> fields
> >> would reduce.
> >>
> >> 4) I'd prefer ISA in front of the feature, not as suffix, i.e.
> >>
> >> AVR_ISA_RMW, AVR_ISA_SKIP_BUG, AVR_ISR_SP8, etc. instead of
> AVR_RMW_ISA.
> >>
> >> 5) There is already a Binutils PR, cf. PR15043 (with differently named
> >> options,
> >> though).
> >>
> >> http://sourceware.org/PR15043
> >>
> >> 6) The GCC release notes must mention that at least Binutils version
> xyz
> >> is needed.
> >>
> >> Typically, there is some time margin until GCC might assume that
> specific
> >> features are available in binutils.  This is beacuse your work is not a
> >> pure
> >> extension but affects existing devices.
> >>
> >> 7) Don't you skip the test conditions that you want to test in the new
> GCC
> >> testsuite program? I.e. you skip -mmcu=atxmega32a4u.
> >
> > Hi Johann,
> >
> > I have updated avr-gcc patch as per your comments. Please review.
> 
> Again some notes :-)
> 
> The GNU coding rules limit lines to 80 characters; some lines in your
> changes
> are longer. (There are some files like avr-mcus.def where long lines are
> in
> order and accepted).
> 
> Maybe the easiest way is to rename lengthy component name
> "dev_specific_feature" to "isa" which is clear enough, IMO.
> 
> 
> The test case is still not in order because of
> 
> +/* { dg-options "-mmcu=atxmega128b1" } */
> 
> which collides with -mmcu= when the tests are run for a different target.
> 
> But there's no need for -mmcu= at all, we have __AVR_ISA_RMW__ so you can
> factor out the asms by means of #ifdef __AVR_ISA_RMW__ :-)
> 
> Johann
> 
> > gcc/ChangeLog
> > 2014-03-12  Pitchumani Sivanupandi  <[email protected]>
> >
> >      * config/avr/avr-arch.h (avr_mcu_t): Add dev_specific_feature field
> >      to have device specific ISA/ feature information. Remove short_sp
> >      and errata_skip fields.
> >      Add avr_device_specific_features enum to have device specific info.
> >      * config/avr/avr-c.c: use dev_specific_feature to check
> errata_skip.
> 
> Function names are missing.
> 
> >        Add __AVR_ISA_RMW__ builtin macro if RMW ISA available.
> >      * config/avr/avr-devices.c (avr_mcu_types): Update AVR_MCU macro
> for
> >      updated device specific info.
> >      * config/avr/avr-mcus.def: Merge device specific details to
> >      dev_specific_feature field.
> >      * config/avr/avr.c (avr_2word_insn_p): use dev_specific_feature
> field
> >      to check errata_skip.
> >      * config/avr/avr.h: same for short sp info.
> 
> What objects / macros are affected?
> 
> >      * config/avr/driver-avr.c (avr_device_to_as): Pass -mrmw option to
> >      assembler if RMW isa supported by current device.
> >      * config/avr/genmultilib.awk: Update as device info structure
> changed.
> >      * doc/invoke.texi: Add info for __AVR_ISA_RMW__ builtin macro
> >
> > gcc/testsuite/ChangeLog
> > 2014-03-12 Pitchumani Sivanupandi  <[email protected]>
> >
> >      * gcc.target/avr/ dev-specific-rmw.c: New test.
> 
> Superfluous blank in the file name.

Hi Johann,

Thanks for the review :)
I have updated the patch and ChangeLog.

Regards,
Pitchumani

gcc/ChangeLog

2014-03-12  Pitchumani Sivanupandi  <[email protected]>

    * config/avr/avr-arch.h (avr_mcu_t): Add dev_attribute field to have device
	specific ISA/ feature information. Remove short_sp and errata_skip fields.
    Add avr_device_specific_features enum to have device specific info.
    * config/avr/avr-c.c (avr_cpu_cpp_builtins): use dev_attribute to check 
	errata_skip. Add __AVR_ISA_RMW__ builtin macro if RMW ISA available.
    * config/avr/avr-devices.c (avr_mcu_types): Update AVR_MCU macro for
    updated device specific info.
    * config/avr/avr-mcus.def: Merge device specific details to 
    dev_attribute field.
    * config/avr/avr.c (avr_2word_insn_p): use dev_attribute field to check
	errata_skip.
    * config/avr/avr.h (AVR_HAVE_8BIT_SP): same for short sp info.
    * config/avr/driver-avr.c (avr_device_to_as): Pass -mrmw option to
    assembler if RMW isa supported by current device.
    * config/avr/genmultilib.awk: Update as device info structure changed.
    * doc/invoke.texi: Add info for __AVR_ISA_RMW__ builtin macro

gcc/testsuite/ChangeLog

2014-03-12 Pitchumani Sivanupandi  <[email protected]>

    * gcc.target/avr/dev-specific-rmw.c: New test.

_______________________________________________
AVR-GCC-list mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list
dev-specific-feature-avr-gcc.patch (application/octet-stream, 61.2 KB)
diff --git a/gcc/config/avr/avr-arch.h b/gcc/config/avr/avr-arch.h
index 6357e99..b3c7cc0 100644
--- a/gcc/config/avr/avr-arch.h
+++ b/gcc/config/avr/avr-arch.h
@@ -100,32 +100,12 @@ typedef struct
   /* Index in avr_arch_types[].  */
   enum avr_arch arch;
 
+  /* device specific feature */
+  int dev_attribute;
+
   /* Must lie outside user's namespace.  NULL == no macro.  */
   const char *const macro;
 
-  /* Stack pointer have 8 bits width.  */
-  int short_sp;
-
-  /* Some AVR devices have a core erratum when skipping a 2-word instruction.
-     Skip instructions are:  SBRC, SBRS, SBIC, SBIS, CPSE.
-     Problems will occur with return address is IRQ executes during the
-     skip sequence.
-
-     A support ticket from Atmel returned the following information:
-
-         Subject: (ATTicket:644469) On AVR skip-bug core Erratum
-         From: [email protected]                    Date: 2011-07-27
-         (Please keep the subject when replying to this mail)
-
-         This errata exists only in AT90S8515 and ATmega103 devices.
-
-         For information please refer the following respective errata links
-            http://www.atmel.com/dyn/resources/prod_documents/doc2494.pdf
-            http://www.atmel.com/dyn/resources/prod_documents/doc1436.pdf  */
-
-  /* Core Erratum:  Must not skip 2-word instruction.  */
-  int errata_skip;
-
   /* Start of data section.  */
   int data_section_start;
 
@@ -136,6 +116,42 @@ typedef struct
   const char *const library_name;
 } avr_mcu_t;
 
+/* AVR device specific features.
+
+AVR_ISA_RMW
+  Only few avr devices have Read-Modify-Write (RMW) instructions
+  (XCH, LAC, LAS and LAT)
+
+AVR_SHORT_SP
+  Stack Pointer has only 8 bit width.
+  The device / multilib has an 8-bit stack pointer (no SPH).
+
+AVR_ERRATA_SKIP
+  Some AVR devices have a core erratum when skipping a 2-word instruction.
+  Skip instructions are:  SBRC, SBRS, SBIC, SBIS, CPSE.
+  Problems will occur with return address is IRQ executes during the
+  skip sequence.
+
+  A support ticket from Atmel returned the following information:
+
+     Subject: (ATTicket:644469) On AVR skip-bug core Erratum
+     From: [email protected]                    Date: 2011-07-27
+     (Please keep the subject when replying to this mail)
+
+     This errata exists only in AT90S8515 and ATmega103 devices.
+
+     For information please refer the following respective errata links
+       http://www.atmel.com/dyn/resources/prod_documents/doc2494.pdf
+       http://www.atmel.com/dyn/resources/prod_documents/doc1436.pdf  */
+
+enum avr_device_specific_features
+{
+  AVR_ISA_NONE,
+  AVR_ISA_RMW     = 0x1, /* device has RMW instructions. */
+  AVR_SHORT_SP    = 0x2, /* Stack Pointer has 8 bits width. */
+  AVR_ERRATA_SKIP = 0x4  /* device has a core erratum. */
+};
+
 /* Map architecture to its texinfo string.  */
 
 typedef struct
diff --git a/gcc/config/avr/avr-c.c b/gcc/config/avr/avr-c.c
index 101d280..c6a2f1f 100644
--- a/gcc/config/avr/avr-c.c
+++ b/gcc/config/avr/avr-c.c
@@ -347,7 +347,7 @@ avr_cpu_cpp_builtins (struct cpp_reader *pfile)
   if (TARGET_NO_INTERRUPTS)
     cpp_define (pfile, "__NO_INTERRUPTS__");
 
-  if (avr_current_device->errata_skip)
+  if (avr_current_device->dev_attribute & AVR_ERRATA_SKIP)
     {
       cpp_define (pfile, "__AVR_ERRATA_SKIP__");
 
@@ -355,6 +355,9 @@ avr_cpu_cpp_builtins (struct cpp_reader *pfile)
         cpp_define (pfile, "__AVR_ERRATA_SKIP_JMP_CALL__");
     }
 
+  if (avr_current_device->dev_attribute & AVR_ISA_RMW)
+    cpp_define (pfile, "__AVR_ISA_RMW__");
+
   cpp_define_formatted (pfile, "__AVR_SFR_OFFSET__=0x%x",
                         avr_current_arch->sfr_offset);
 
diff --git a/gcc/config/avr/avr-devices.c b/gcc/config/avr/avr-devices.c
index 177f196..2485cad 100644
--- a/gcc/config/avr/avr-devices.c
+++ b/gcc/config/avr/avr-devices.c
@@ -104,11 +104,11 @@ avr_texinfo[] =
 const avr_mcu_t
 avr_mcu_types[] =
 {
-#define AVR_MCU(NAME, ARCH, MACRO, SP8, ERR_SKIP, DATA_SEC, N_FLASH, LIBNAME)\
-  { NAME, ARCH, MACRO, SP8, ERR_SKIP, DATA_SEC, N_FLASH, LIBNAME },
+#define AVR_MCU(NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, N_FLASH, LIBNAME)\
+  { NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, N_FLASH, LIBNAME },
 #include "avr-mcus.def"
 #undef AVR_MCU
     /* End of list.  */
-  { NULL, ARCH_UNKNOWN, NULL, 0, 0, 0, 0, NULL }
+  { NULL, ARCH_UNKNOWN, AVR_ISA_NONE, NULL, 0, 0, NULL }
 };
 
diff --git a/gcc/config/avr/avr-mcus.def b/gcc/config/avr/avr-mcus.def
index d068f5e..3cf2fcd 100644
--- a/gcc/config/avr/avr-mcus.def
+++ b/gcc/config/avr/avr-mcus.def
@@ -33,291 +33,288 @@
 
    Before including this file, define a macro:
 
-   AVR_MCU (NAME, ARCH, MACRO, SHORT_SP, ERRATA_SKIP, DATA_SEC, N_FLASH,
-            LIBRARY_NAME)
+   AVR_MCU (NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, N_FLASH, LIBRARY_NAME)
 
    where the arguments are the fields of avr_mcu_t:
    
-       NAME         Accept -mmcu=<NAME>
+       NAME          Accept -mmcu=<NAME>
 
-       ARCH         Specifies the multilib variant together with SHORT_SP
+       ARCH          Specifies the multilib variant together with SHORT_SP
 
-       MACRO        If NULL, this is a core and not a device.  If non-NULL,
-                    supply respective built-in macro.
+       DEV_ATTRIBUTE Specifies the device specific features
+                     - additional ISA, short SP, errata skip etc.,
 
-       SHORT_SP     The device / multilib has an 8-bit stack pointer (no SPH).
+       MACRO         If NULL, this is a core and not a device.  If non-NULL,
+                     supply respective built-in macro.
 
-       ERRATA_SKIP  Apply work-around for the "skip 32-bit instruction"
-                    silicon bug:  Don't skip 32-bit instrctions.
+       DATA_SEC      First address of SRAM, used in  -Tdata=  by the driver.
 
-       DATA_SEC     First address of SRAM, used in  -Tdata=  by the driver.
+       N_FLASH       Number of 64 KiB flash segments, rounded up.
 
-       N_FLASH      Number of 64 KiB flash segments, rounded up.
-
-       LIBRARY_NAME Used by the driver to linke startup code from avr-libc
-                    as of  crt<LIBRARY_NAME>.o
+       LIBRARY_NAME  Used by the driver to linke startup code from avr-libc
+                     as of  crt<LIBRARY_NAME>.o
 
    "avr2" must be first for the "0" default to work as intended.  */
 
 /* Classic, <= 8K.  */
-AVR_MCU ("avr2",                 ARCH_AVR2, NULL,                        0, 1, 0x0060, 6, "s8515")
-AVR_MCU ("at90s2313",            ARCH_AVR2, "__AVR_AT90S2313__",         1, 0, 0x0060, 1, "s2313")
-AVR_MCU ("at90s2323",            ARCH_AVR2, "__AVR_AT90S2323__",         1, 0, 0x0060, 1, "s2323")
-AVR_MCU ("at90s2333",            ARCH_AVR2, "__AVR_AT90S2333__",         1, 0, 0x0060, 1, "s2333")
-AVR_MCU ("at90s2343",            ARCH_AVR2, "__AVR_AT90S2343__",         1, 0, 0x0060, 1, "s2343")
-AVR_MCU ("attiny22",             ARCH_AVR2, "__AVR_ATtiny22__",          1, 0, 0x0060, 1, "tn22")
-AVR_MCU ("attiny26",             ARCH_AVR2, "__AVR_ATtiny26__",          1, 0, 0x0060, 1, "tn26")
-AVR_MCU ("at90s4414",            ARCH_AVR2, "__AVR_AT90S4414__",         0, 0, 0x0060, 1, "s4414")
-AVR_MCU ("at90s4433",            ARCH_AVR2, "__AVR_AT90S4433__",         1, 0, 0x0060, 1, "s4433")
-AVR_MCU ("at90s4434",            ARCH_AVR2, "__AVR_AT90S4434__",         0, 0, 0x0060, 1, "s4434")
-AVR_MCU ("at90s8515",            ARCH_AVR2, "__AVR_AT90S8515__",         0, 1, 0x0060, 1, "s8515")
-AVR_MCU ("at90c8534",            ARCH_AVR2, "__AVR_AT90C8534__",         0, 0, 0x0060, 1, "c8534")
-AVR_MCU ("at90s8535",            ARCH_AVR2, "__AVR_AT90S8535__",         0, 0, 0x0060, 1, "s8535")
+AVR_MCU ("avr2",                 ARCH_AVR2, AVR_ERRATA_SKIP, NULL,                     0x0060, 6, "s8515")
+AVR_MCU ("at90s2313",            ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2313__",         0x0060, 1, "s2313")
+AVR_MCU ("at90s2323",            ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2323__",         0x0060, 1, "s2323")
+AVR_MCU ("at90s2333",            ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2333__",         0x0060, 1, "s2333")
+AVR_MCU ("at90s2343",            ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2343__",         0x0060, 1, "s2343")
+AVR_MCU ("attiny22",             ARCH_AVR2, AVR_SHORT_SP, "__AVR_ATtiny22__",          0x0060, 1, "tn22")
+AVR_MCU ("attiny26",             ARCH_AVR2, AVR_SHORT_SP, "__AVR_ATtiny26__",          0x0060, 1, "tn26")
+AVR_MCU ("at90s4414",            ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S4414__",         0x0060, 1, "s4414")
+AVR_MCU ("at90s4433",            ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S4433__",         0x0060, 1, "s4433")
+AVR_MCU ("at90s4434",            ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S4434__",         0x0060, 1, "s4434")
+AVR_MCU ("at90s8515",            ARCH_AVR2, AVR_ERRATA_SKIP, "__AVR_AT90S8515__",      0x0060, 1, "s8515")
+AVR_MCU ("at90c8534",            ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90C8534__",         0x0060, 1, "c8534")
+AVR_MCU ("at90s8535",            ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S8535__",         0x0060, 1, "s8535")
 /* Classic + MOVW, <= 8K.  */
-AVR_MCU ("avr25",                ARCH_AVR25, NULL,                       0, 0, 0x0060, 1, "tn85")
-AVR_MCU ("ata6289",              ARCH_AVR25, "__AVR_ATA6289__",          0, 0, 0x0100, 1, "a6289")
-AVR_MCU ("ata5272",              ARCH_AVR25, "__AVR_ATA5272__",          0, 0, 0x0100, 1, "a5272")
-AVR_MCU ("attiny13",             ARCH_AVR25, "__AVR_ATtiny13__",         1, 0, 0x0060, 1, "tn13")
-AVR_MCU ("attiny13a",            ARCH_AVR25, "__AVR_ATtiny13A__",        1, 0, 0x0060, 1, "tn13a")
-AVR_MCU ("attiny2313",           ARCH_AVR25, "__AVR_ATtiny2313__",       1, 0, 0x0060, 1, "tn2313")
-AVR_MCU ("attiny2313a",          ARCH_AVR25, "__AVR_ATtiny2313A__",      1, 0, 0x0060, 1, "tn2313a")
-AVR_MCU ("attiny24",             ARCH_AVR25, "__AVR_ATtiny24__",         1, 0, 0x0060, 1, "tn24")
-AVR_MCU ("attiny24a",            ARCH_AVR25, "__AVR_ATtiny24A__",        1, 0, 0x0060, 1, "tn24a")
-AVR_MCU ("attiny4313",           ARCH_AVR25, "__AVR_ATtiny4313__",       0, 0, 0x0060, 1, "tn4313")
-AVR_MCU ("attiny44",             ARCH_AVR25, "__AVR_ATtiny44__",         0, 0, 0x0060, 1, "tn44")
-AVR_MCU ("attiny44a",            ARCH_AVR25, "__AVR_ATtiny44A__",        0, 0, 0x0060, 1, "tn44a")
-AVR_MCU ("attiny84",             ARCH_AVR25, "__AVR_ATtiny84__",         0, 0, 0x0060, 1, "tn84")
-AVR_MCU ("attiny84a",            ARCH_AVR25, "__AVR_ATtiny84A__",        0, 0, 0x0060, 1, "tn84")
-AVR_MCU ("attiny25",             ARCH_AVR25, "__AVR_ATtiny25__",         1, 0, 0x0060, 1, "tn25")
-AVR_MCU ("attiny45",             ARCH_AVR25, "__AVR_ATtiny45__",         0, 0, 0x0060, 1, "tn45")
-AVR_MCU ("attiny85",             ARCH_AVR25, "__AVR_ATtiny85__",         0, 0, 0x0060, 1, "tn85")
-AVR_MCU ("attiny261",            ARCH_AVR25, "__AVR_ATtiny261__",        1, 0, 0x0060, 1, "tn261")
-AVR_MCU ("attiny261a",           ARCH_AVR25, "__AVR_ATtiny261A__",       1, 0, 0x0060, 1, "tn261a")
-AVR_MCU ("attiny461",            ARCH_AVR25, "__AVR_ATtiny461__",        0, 0, 0x0060, 1, "tn461")
-AVR_MCU ("attiny461a",           ARCH_AVR25, "__AVR_ATtiny461A__",       0, 0, 0x0060, 1, "tn461a")
-AVR_MCU ("attiny861",            ARCH_AVR25, "__AVR_ATtiny861__",        0, 0, 0x0060, 1, "tn861")
-AVR_MCU ("attiny861a",           ARCH_AVR25, "__AVR_ATtiny861A__",       0, 0, 0x0060, 1, "tn861a")
-AVR_MCU ("attiny43u",            ARCH_AVR25, "__AVR_ATtiny43U__",        0, 0, 0x0060, 1, "tn43u")
-AVR_MCU ("attiny87",             ARCH_AVR25, "__AVR_ATtiny87__",         0, 0, 0x0100, 1, "tn87")
-AVR_MCU ("attiny48",             ARCH_AVR25, "__AVR_ATtiny48__",         0, 0, 0x0100, 1, "tn48")
-AVR_MCU ("attiny88",             ARCH_AVR25, "__AVR_ATtiny88__",         0, 0, 0x0100, 1, "tn88")
-AVR_MCU ("at86rf401",            ARCH_AVR25, "__AVR_AT86RF401__",        0, 0, 0x0060, 1, "86401")
+AVR_MCU ("avr25",                ARCH_AVR25, AVR_ISA_NONE, NULL,                       0x0060, 1, "tn85")
+AVR_MCU ("ata6289",              ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATA6289__",          0x0100, 1, "a6289")
+AVR_MCU ("ata5272",              ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATA5272__",          0x0100, 1, "a5272")
+AVR_MCU ("attiny13",             ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny13__",         0x0060, 1, "tn13")
+AVR_MCU ("attiny13a",            ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny13A__",        0x0060, 1, "tn13a")
+AVR_MCU ("attiny2313",           ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny2313__",       0x0060, 1, "tn2313")
+AVR_MCU ("attiny2313a",          ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny2313A__",      0x0060, 1, "tn2313a")
+AVR_MCU ("attiny24",             ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny24__",         0x0060, 1, "tn24")
+AVR_MCU ("attiny24a",            ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny24A__",        0x0060, 1, "tn24a")
+AVR_MCU ("attiny4313",           ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny4313__",       0x0060, 1, "tn4313")
+AVR_MCU ("attiny44",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny44__",         0x0060, 1, "tn44")
+AVR_MCU ("attiny44a",            ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny44A__",        0x0060, 1, "tn44a")
+AVR_MCU ("attiny84",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny84__",         0x0060, 1, "tn84")
+AVR_MCU ("attiny84a",            ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny84A__",        0x0060, 1, "tn84")
+AVR_MCU ("attiny25",             ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny25__",         0x0060, 1, "tn25")
+AVR_MCU ("attiny45",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny45__",         0x0060, 1, "tn45")
+AVR_MCU ("attiny85",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny85__",         0x0060, 1, "tn85")
+AVR_MCU ("attiny261",            ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny261__",        0x0060, 1, "tn261")
+AVR_MCU ("attiny261a",           ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny261A__",       0x0060, 1, "tn261a")
+AVR_MCU ("attiny461",            ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny461__",        0x0060, 1, "tn461")
+AVR_MCU ("attiny461a",           ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny461A__",       0x0060, 1, "tn461a")
+AVR_MCU ("attiny861",            ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny861__",        0x0060, 1, "tn861")
+AVR_MCU ("attiny861a",           ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny861A__",       0x0060, 1, "tn861a")
+AVR_MCU ("attiny43u",            ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny43U__",        0x0060, 1, "tn43u")
+AVR_MCU ("attiny87",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny87__",         0x0100, 1, "tn87")
+AVR_MCU ("attiny48",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny48__",         0x0100, 1, "tn48")
+AVR_MCU ("attiny88",             ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny88__",         0x0100, 1, "tn88")
+AVR_MCU ("at86rf401",            ARCH_AVR25, AVR_ISA_NONE, "__AVR_AT86RF401__",        0x0060, 1, "86401")
 /* Classic, > 8K, <= 64K.  */
-AVR_MCU ("avr3",                 ARCH_AVR3, NULL,                        0, 0, 0x0060, 1, "43355")
-AVR_MCU ("at43usb355",           ARCH_AVR3, "__AVR_AT43USB355__",        0, 0, 0x0060, 1, "43355")
-AVR_MCU ("at76c711",             ARCH_AVR3, "__AVR_AT76C711__",          0, 0, 0x0060, 1, "76711")
+AVR_MCU ("avr3",                 ARCH_AVR3, AVR_ISA_NONE, NULL,                        0x0060, 1, "43355")
+AVR_MCU ("at43usb355",           ARCH_AVR3, AVR_ISA_NONE, "__AVR_AT43USB355__",        0x0060, 1, "43355")
+AVR_MCU ("at76c711",             ARCH_AVR3, AVR_ISA_NONE, "__AVR_AT76C711__",          0x0060, 1, "76711")
 /* Classic, == 128K.  */
-AVR_MCU ("avr31",                ARCH_AVR31, NULL,                       0, 1, 0x0060, 2, "m103")
-AVR_MCU ("atmega103",            ARCH_AVR31, "__AVR_ATmega103__",        0, 1, 0x0060, 2, "m103")
-AVR_MCU ("at43usb320",           ARCH_AVR31, "__AVR_AT43USB320__",       0, 0, 0x0060, 2, "43320")
+AVR_MCU ("avr31",                ARCH_AVR31, AVR_ERRATA_SKIP, NULL,                    0x0060, 2, "m103")
+AVR_MCU ("atmega103",            ARCH_AVR31, AVR_ERRATA_SKIP, "__AVR_ATmega103__",     0x0060, 2, "m103")
+AVR_MCU ("at43usb320",           ARCH_AVR31, AVR_ISA_NONE, "__AVR_AT43USB320__",       0x0060, 2, "43320")
 /* Classic + MOVW + JMP/CALL.  */
-AVR_MCU ("avr35",                ARCH_AVR35, NULL,                       0, 0, 0x0100, 1, "usb162")
-AVR_MCU ("ata5505",              ARCH_AVR35, "__AVR_ATA5505__",          0, 0, 0x0100, 1, "a5505")
-AVR_MCU ("at90usb82",            ARCH_AVR35, "__AVR_AT90USB82__",        0, 0, 0x0100, 1, "usb82")
-AVR_MCU ("at90usb162",           ARCH_AVR35, "__AVR_AT90USB162__",       0, 0, 0x0100, 1, "usb162")
-AVR_MCU ("atmega8u2",            ARCH_AVR35, "__AVR_ATmega8U2__",        0, 0, 0x0100, 1, "m8u2")
-AVR_MCU ("atmega16u2",           ARCH_AVR35, "__AVR_ATmega16U2__",       0, 0, 0x0100, 1, "m16u2")
-AVR_MCU ("atmega32u2",           ARCH_AVR35, "__AVR_ATmega32U2__",       0, 0, 0x0100, 1, "m32u2")
-AVR_MCU ("attiny167",            ARCH_AVR35, "__AVR_ATtiny167__",        0, 0, 0x0100, 1, "tn167")
-AVR_MCU ("attiny1634",           ARCH_AVR35, "__AVR_ATtiny1634__",       0, 0, 0x0100, 1, "tn1634")
+AVR_MCU ("avr35",                ARCH_AVR35, AVR_ISA_NONE, NULL,                       0x0100, 1, "usb162")
+AVR_MCU ("ata5505",              ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA5505__",          0x0100, 1, "a5505")
+AVR_MCU ("at90usb82",            ARCH_AVR35, AVR_ISA_NONE, "__AVR_AT90USB82__",        0x0100, 1, "usb82")
+AVR_MCU ("at90usb162",           ARCH_AVR35, AVR_ISA_NONE, "__AVR_AT90USB162__",       0x0100, 1, "usb162")
+AVR_MCU ("atmega8u2",            ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega8U2__",        0x0100, 1, "m8u2")
+AVR_MCU ("atmega16u2",           ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega16U2__",       0x0100, 1, "m16u2")
+AVR_MCU ("atmega32u2",           ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega32U2__",       0x0100, 1, "m32u2")
+AVR_MCU ("attiny167",            ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATtiny167__",        0x0100, 1, "tn167")
+AVR_MCU ("attiny1634",           ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATtiny1634__",       0x0100, 1, "tn1634")
 /* Enhanced, <= 8K.  */
-AVR_MCU ("avr4",                 ARCH_AVR4, NULL,                        0, 0, 0x0060, 1, "m8")
-AVR_MCU ("ata6285",              ARCH_AVR4, "__AVR_ATA6285__",           0, 0, 0x0100, 1, "a6285")
-AVR_MCU ("ata6286",              ARCH_AVR4, "__AVR_ATA6286__",           0, 0, 0x0100, 1, "a6286")
-AVR_MCU ("atmega8",              ARCH_AVR4, "__AVR_ATmega8__",           0, 0, 0x0060, 1, "m8")
-AVR_MCU ("atmega8a",             ARCH_AVR4, "__AVR_ATmega8A__",          0, 0, 0x0060, 1, "m8a")
-AVR_MCU ("atmega48",             ARCH_AVR4, "__AVR_ATmega48__",          0, 0, 0x0100, 1, "m48")
-AVR_MCU ("atmega48a",            ARCH_AVR4, "__AVR_ATmega48A__",         0, 0, 0x0100, 1, "m48a")
-AVR_MCU ("atmega48p",            ARCH_AVR4, "__AVR_ATmega48P__",         0, 0, 0x0100, 1, "m48p")
-AVR_MCU ("atmega48pa",           ARCH_AVR4, "__AVR_ATmega48PA__",        0, 0, 0x0100, 1, "m48pa")
-AVR_MCU ("atmega88",             ARCH_AVR4, "__AVR_ATmega88__",          0, 0, 0x0100, 1, "m88")
-AVR_MCU ("atmega88a",            ARCH_AVR4, "__AVR_ATmega88A__",         0, 0, 0x0100, 1, "m88a")
-AVR_MCU ("atmega88p",            ARCH_AVR4, "__AVR_ATmega88P__",         0, 0, 0x0100, 1, "m88p")
-AVR_MCU ("atmega88pa",           ARCH_AVR4, "__AVR_ATmega88PA__",        0, 0, 0x0100, 1, "m88pa")
-AVR_MCU ("atmega8515",           ARCH_AVR4, "__AVR_ATmega8515__",        0, 0, 0x0060, 1, "m8515")
-AVR_MCU ("atmega8535",           ARCH_AVR4, "__AVR_ATmega8535__",        0, 0, 0x0060, 1, "m8535")
-AVR_MCU ("atmega8hva",           ARCH_AVR4, "__AVR_ATmega8HVA__",        0, 0, 0x0100, 1, "m8hva")
-AVR_MCU ("at90pwm1",             ARCH_AVR4, "__AVR_AT90PWM1__",          0, 0, 0x0100, 1, "90pwm1")
-AVR_MCU ("at90pwm2",             ARCH_AVR4, "__AVR_AT90PWM2__",          0, 0, 0x0100, 1, "90pwm2")
-AVR_MCU ("at90pwm2b",            ARCH_AVR4, "__AVR_AT90PWM2B__",         0, 0, 0x0100, 1, "90pwm2b")
-AVR_MCU ("at90pwm3",             ARCH_AVR4, "__AVR_AT90PWM3__",          0, 0, 0x0100, 1, "90pwm3")
-AVR_MCU ("at90pwm3b",            ARCH_AVR4, "__AVR_AT90PWM3B__",         0, 0, 0x0100, 1, "90pwm3b")
-AVR_MCU ("at90pwm81",            ARCH_AVR4, "__AVR_AT90PWM81__",         0, 0, 0x0100, 1, "90pwm81")
+AVR_MCU ("avr4",                 ARCH_AVR4, AVR_ISA_NONE,  NULL,                       0x0060, 1, "m8")
+AVR_MCU ("ata6285",              ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATA6285__",          0x0100, 1, "a6285")
+AVR_MCU ("ata6286",              ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATA6286__",          0x0100, 1, "a6286")
+AVR_MCU ("atmega8",              ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega8__",          0x0060, 1, "m8")
+AVR_MCU ("atmega8a",             ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega8A__",         0x0060, 1, "m8a")
+AVR_MCU ("atmega48",             ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega48__",         0x0100, 1, "m48")
+AVR_MCU ("atmega48a",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega48A__",        0x0100, 1, "m48a")
+AVR_MCU ("atmega48p",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega48P__",        0x0100, 1, "m48p")
+AVR_MCU ("atmega48pa",           ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega48PA__",       0x0100, 1, "m48pa")
+AVR_MCU ("atmega88",             ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega88__",         0x0100, 1, "m88")
+AVR_MCU ("atmega88a",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega88A__",        0x0100, 1, "m88a")
+AVR_MCU ("atmega88p",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega88P__",        0x0100, 1, "m88p")
+AVR_MCU ("atmega88pa",           ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega88PA__",       0x0100, 1, "m88pa")
+AVR_MCU ("atmega8515",           ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega8515__",       0x0060, 1, "m8515")
+AVR_MCU ("atmega8535",           ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega8535__",       0x0060, 1, "m8535")
+AVR_MCU ("atmega8hva",           ARCH_AVR4, AVR_ISA_NONE,  "__AVR_ATmega8HVA__",       0x0100, 1, "m8hva")
+AVR_MCU ("at90pwm1",             ARCH_AVR4, AVR_ISA_NONE,  "__AVR_AT90PWM1__",         0x0100, 1, "90pwm1")
+AVR_MCU ("at90pwm2",             ARCH_AVR4, AVR_ISA_NONE,  "__AVR_AT90PWM2__",         0x0100, 1, "90pwm2")
+AVR_MCU ("at90pwm2b",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_AT90PWM2B__",        0x0100, 1, "90pwm2b")
+AVR_MCU ("at90pwm3",             ARCH_AVR4, AVR_ISA_NONE,  "__AVR_AT90PWM3__",         0x0100, 1, "90pwm3")
+AVR_MCU ("at90pwm3b",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_AT90PWM3B__",        0x0100, 1, "90pwm3b")
+AVR_MCU ("at90pwm81",            ARCH_AVR4, AVR_ISA_NONE,  "__AVR_AT90PWM81__",        0x0100, 1, "90pwm81")
 /* Enhanced, > 8K, <= 64K.  */
-AVR_MCU ("avr5",                 ARCH_AVR5, NULL,                        0, 0, 0x0060, 1, "m16")
-AVR_MCU ("ata5790",              ARCH_AVR5, "__AVR_ATA5790__",           0, 0, 0x0100, 1, "a5790")
-AVR_MCU ("ata5790n",             ARCH_AVR5, "__AVR_ATA5790N__",          0, 0, 0x0100, 1, "a5790n")
-AVR_MCU ("ata5795",              ARCH_AVR5, "__AVR_ATA5795__",           0, 0, 0x0100, 1, "a5795")
-AVR_MCU ("atmega16",             ARCH_AVR5, "__AVR_ATmega16__",          0, 0, 0x0060, 1, "m16")
-AVR_MCU ("atmega16a",            ARCH_AVR5, "__AVR_ATmega16A__",         0, 0, 0x0060, 1, "m16a")
-AVR_MCU ("atmega161",            ARCH_AVR5, "__AVR_ATmega161__",         0, 0, 0x0060, 1, "m161")
-AVR_MCU ("atmega162",            ARCH_AVR5, "__AVR_ATmega162__",         0, 0, 0x0100, 1, "m162")
-AVR_MCU ("atmega163",            ARCH_AVR5, "__AVR_ATmega163__",         0, 0, 0x0060, 1, "m163")
-AVR_MCU ("atmega164a",           ARCH_AVR5, "__AVR_ATmega164A__",        0, 0, 0x0100, 1, "m164a")
-AVR_MCU ("atmega164p",           ARCH_AVR5, "__AVR_ATmega164P__",        0, 0, 0x0100, 1, "m164p")
-AVR_MCU ("atmega164pa",          ARCH_AVR5, "__AVR_ATmega164PA__",       0, 0, 0x0100, 1, "m164pa")
-AVR_MCU ("atmega165",            ARCH_AVR5, "__AVR_ATmega165__",         0, 0, 0x0100, 1, "m165")
-AVR_MCU ("atmega165a",           ARCH_AVR5, "__AVR_ATmega165A__",        0, 0, 0x0100, 1, "m165a")
-AVR_MCU ("atmega165p",           ARCH_AVR5, "__AVR_ATmega165P__",        0, 0, 0x0100, 1, "m165p")
-AVR_MCU ("atmega165pa",          ARCH_AVR5, "__AVR_ATmega165PA__",       0, 0, 0x0100, 1, "m165pa")
-AVR_MCU ("atmega168",            ARCH_AVR5, "__AVR_ATmega168__",         0, 0, 0x0100, 1, "m168")
-AVR_MCU ("atmega168a",           ARCH_AVR5, "__AVR_ATmega168A__",        0, 0, 0x0100, 1, "m168a")
-AVR_MCU ("atmega168p",           ARCH_AVR5, "__AVR_ATmega168P__",        0, 0, 0x0100, 1, "m168p")
-AVR_MCU ("atmega168pa",          ARCH_AVR5, "__AVR_ATmega168PA__",       0, 0, 0x0100, 1, "m168pa")
-AVR_MCU ("atmega169",            ARCH_AVR5, "__AVR_ATmega169__",         0, 0, 0x0100, 1, "m169")
-AVR_MCU ("atmega169a",           ARCH_AVR5, "__AVR_ATmega169A__",        0, 0, 0x0100, 1, "m169a")
-AVR_MCU ("atmega169p",           ARCH_AVR5, "__AVR_ATmega169P__",        0, 0, 0x0100, 1, "m169p")
-AVR_MCU ("atmega169pa",          ARCH_AVR5, "__AVR_ATmega169PA__",       0, 0, 0x0100, 1, "m169pa")
-AVR_MCU ("atmega16hvb",          ARCH_AVR5, "__AVR_ATmega16HVB__",       0, 0, 0x0100, 1, "m16hvb")
-AVR_MCU ("atmega16hvbrevb",      ARCH_AVR5, "__AVR_ATmega16HVBREVB__",   0, 0, 0x0100, 1, "m16hvbrevb")
-AVR_MCU ("atmega16m1",           ARCH_AVR5, "__AVR_ATmega16M1__",        0, 0, 0x0100, 1, "m16m1")
-AVR_MCU ("atmega16u4",           ARCH_AVR5, "__AVR_ATmega16U4__",        0, 0, 0x0100, 1, "m16u4")
-AVR_MCU ("atmega26hvg",          ARCH_AVR5, "__AVR_ATmega26HVG__",       0, 0, 0x0100, 1, "m26hvg")
-AVR_MCU ("atmega32a",            ARCH_AVR5, "__AVR_ATmega32A__",         0, 0, 0x0060, 1, "m32a")
-AVR_MCU ("atmega32",             ARCH_AVR5, "__AVR_ATmega32__",          0, 0, 0x0060, 1, "m32")
-AVR_MCU ("atmega323",            ARCH_AVR5, "__AVR_ATmega323__",         0, 0, 0x0060, 1, "m323")
-AVR_MCU ("atmega324a",           ARCH_AVR5, "__AVR_ATmega324A__",        0, 0, 0x0100, 1, "m324a")
-AVR_MCU ("atmega324p",           ARCH_AVR5, "__AVR_ATmega324P__",        0, 0, 0x0100, 1, "m324p")
-AVR_MCU ("atmega324pa",          ARCH_AVR5, "__AVR_ATmega324PA__",       0, 0, 0x0100, 1, "m324pa")
-AVR_MCU ("atmega325",            ARCH_AVR5, "__AVR_ATmega325__",         0, 0, 0x0100, 1, "m325")
-AVR_MCU ("atmega325a",           ARCH_AVR5, "__AVR_ATmega325A__",        0, 0, 0x0100, 1, "m325a")
-AVR_MCU ("atmega325p",           ARCH_AVR5, "__AVR_ATmega325P__",        0, 0, 0x0100, 1, "m325p")
-AVR_MCU ("atmega3250",           ARCH_AVR5, "__AVR_ATmega3250__",        0, 0, 0x0100, 1, "m3250")
-AVR_MCU ("atmega3250a",          ARCH_AVR5, "__AVR_ATmega3250A__",       0, 0, 0x0100, 1, "m3250a")
-AVR_MCU ("atmega3250p",          ARCH_AVR5, "__AVR_ATmega3250P__",       0, 0, 0x0100, 1, "m3250p")
-AVR_MCU ("atmega3250pa",         ARCH_AVR5, "__AVR_ATmega3250PA__",      0, 0, 0x0100, 1, "m3250pa")
-AVR_MCU ("atmega328",            ARCH_AVR5, "__AVR_ATmega328__",         0, 0, 0x0100, 1, "m328")
-AVR_MCU ("atmega328p",           ARCH_AVR5, "__AVR_ATmega328P__",        0, 0, 0x0100, 1, "m328p")
-AVR_MCU ("atmega329",            ARCH_AVR5, "__AVR_ATmega329__",         0, 0, 0x0100, 1, "m329")
-AVR_MCU ("atmega329a",           ARCH_AVR5, "__AVR_ATmega329A__",        0, 0, 0x0100, 1, "m329a")
-AVR_MCU ("atmega329p",           ARCH_AVR5, "__AVR_ATmega329P__",        0, 0, 0x0100, 1, "m329p")
-AVR_MCU ("atmega329pa",          ARCH_AVR5, "__AVR_ATmega329PA__",       0, 0, 0x0100, 1, "m329pa")
-AVR_MCU ("atmega3290",           ARCH_AVR5, "__AVR_ATmega3290__",        0, 0, 0x0100, 1, "m3290")
-AVR_MCU ("atmega3290a",          ARCH_AVR5, "__AVR_ATmega3290A__",       0, 0, 0x0100, 1, "m3290a")
-AVR_MCU ("atmega3290p",          ARCH_AVR5, "__AVR_ATmega3290P__",       0, 0, 0x0100, 1, "m3290p")
-AVR_MCU ("atmega3290pa",         ARCH_AVR5, "__AVR_ATmega3290PA__",      0, 0, 0x0100, 1, "m3290pa")
-AVR_MCU ("atmega32c1",           ARCH_AVR5, "__AVR_ATmega32C1__",        0, 0, 0x0100, 1, "m32c1")
-AVR_MCU ("atmega32m1",           ARCH_AVR5, "__AVR_ATmega32M1__",        0, 0, 0x0100, 1, "m32m1")
-AVR_MCU ("atmega32u4",           ARCH_AVR5, "__AVR_ATmega32U4__",        0, 0, 0x0100, 1, "m32u4")
-AVR_MCU ("atmega32u6",           ARCH_AVR5, "__AVR_ATmega32U6__",        0, 0, 0x0100, 1, "m32u6")
-AVR_MCU ("atmega406",            ARCH_AVR5, "__AVR_ATmega406__",         0, 0, 0x0100, 1, "m406")
-AVR_MCU ("atmega64",             ARCH_AVR5, "__AVR_ATmega64__",          0, 0, 0x0100, 1, "m64")
-AVR_MCU ("atmega64a",            ARCH_AVR5, "__AVR_ATmega64A__",         0, 0, 0x0100, 1, "m64a")
-AVR_MCU ("atmega640",            ARCH_AVR5, "__AVR_ATmega640__",         0, 0, 0x0200, 1, "m640")
-AVR_MCU ("atmega644",            ARCH_AVR5, "__AVR_ATmega644__",         0, 0, 0x0100, 1, "m644")
-AVR_MCU ("atmega644a",           ARCH_AVR5, "__AVR_ATmega644A__",        0, 0, 0x0100, 1, "m644a")
-AVR_MCU ("atmega644p",           ARCH_AVR5, "__AVR_ATmega644P__",        0, 0, 0x0100, 1, "m644p")
-AVR_MCU ("atmega644pa",          ARCH_AVR5, "__AVR_ATmega644PA__",       0, 0, 0x0100, 1, "m644pa")
-AVR_MCU ("atmega645",            ARCH_AVR5, "__AVR_ATmega645__",         0, 0, 0x0100, 1, "m645")
-AVR_MCU ("atmega645a",           ARCH_AVR5, "__AVR_ATmega645A__",        0, 0, 0x0100, 1, "m645a")
-AVR_MCU ("atmega645p",           ARCH_AVR5, "__AVR_ATmega645P__",        0, 0, 0x0100, 1, "m645p")
-AVR_MCU ("atmega6450",           ARCH_AVR5, "__AVR_ATmega6450__",        0, 0, 0x0100, 1, "m6450")
-AVR_MCU ("atmega6450a",          ARCH_AVR5, "__AVR_ATmega6450A__",       0, 0, 0x0100, 1, "m6450a")
-AVR_MCU ("atmega6450p",          ARCH_AVR5, "__AVR_ATmega6450P__",       0, 0, 0x0100, 1, "m6450p")
-AVR_MCU ("atmega649",            ARCH_AVR5, "__AVR_ATmega649__",         0, 0, 0x0100, 1, "m649")
-AVR_MCU ("atmega649a",           ARCH_AVR5, "__AVR_ATmega649A__",        0, 0, 0x0100, 1, "m649a")
-AVR_MCU ("atmega649p",           ARCH_AVR5, "__AVR_ATmega649P__",        0, 0, 0x0100, 1, "m649p")
-AVR_MCU ("atmega6490",           ARCH_AVR5, "__AVR_ATmega6490__",        0, 0, 0x0100, 1, "m6490")
-AVR_MCU ("atmega16hva",          ARCH_AVR5, "__AVR_ATmega16HVA__",       0, 0, 0x0100, 1, "m16hva")
-AVR_MCU ("atmega16hva2",         ARCH_AVR5, "__AVR_ATmega16HVA2__",      0, 0, 0x0100, 1, "m16hva2")
-AVR_MCU ("atmega32hvb",          ARCH_AVR5, "__AVR_ATmega32HVB__",       0, 0, 0x0100, 1, "m32hvb")
-AVR_MCU ("atmega6490a",          ARCH_AVR5, "__AVR_ATmega6490A__",       0, 0, 0x0100, 1, "m6490a")
-AVR_MCU ("atmega6490p",          ARCH_AVR5, "__AVR_ATmega6490P__",       0, 0, 0x0100, 1, "m6490p")
-AVR_MCU ("atmega64c1",           ARCH_AVR5, "__AVR_ATmega64C1__",        0, 0, 0x0100, 1, "m64c1")
-AVR_MCU ("atmega64m1",           ARCH_AVR5, "__AVR_ATmega64M1__",        0, 0, 0x0100, 1, "m64m1")
-AVR_MCU ("atmega64hve",          ARCH_AVR5, "__AVR_ATmega64HVE__",       0, 0, 0x0100, 1, "m64hve")
-AVR_MCU ("atmega64rfa2",         ARCH_AVR5, "__AVR_ATmega64RFA2__",      0, 0, 0x0200, 1, "m64rfa2")
-AVR_MCU ("atmega64rfr2",         ARCH_AVR5, "__AVR_ATmega64RFR2__",      0, 0, 0x0200, 1, "m64rfr2")
-AVR_MCU ("atmega32hvbrevb",      ARCH_AVR5, "__AVR_ATmega32HVBREVB__",   0, 0, 0x0100, 1, "m32hvbrevb")
-AVR_MCU ("atmega48hvf",          ARCH_AVR5, "__AVR_ATmega48HVF__",       0, 0, 0x0100, 1, "m48hvf")
-AVR_MCU ("at90can32",            ARCH_AVR5, "__AVR_AT90CAN32__",         0, 0, 0x0100, 1, "can32")
-AVR_MCU ("at90can64",            ARCH_AVR5, "__AVR_AT90CAN64__",         0, 0, 0x0100, 1, "can64")
-AVR_MCU ("at90pwm161",           ARCH_AVR5, "__AVR_AT90PWM161__",        0, 0, 0x0100, 1, "90pwm161")
-AVR_MCU ("at90pwm216",           ARCH_AVR5, "__AVR_AT90PWM216__",        0, 0, 0x0100, 1, "90pwm216")
-AVR_MCU ("at90pwm316",           ARCH_AVR5, "__AVR_AT90PWM316__",        0, 0, 0x0100, 1, "90pwm316")
-AVR_MCU ("at90scr100",           ARCH_AVR5, "__AVR_AT90SCR100__",        0, 0, 0x0100, 1, "90scr100")
-AVR_MCU ("at90usb646",           ARCH_AVR5, "__AVR_AT90USB646__",        0, 0, 0x0100, 1, "usb646")
-AVR_MCU ("at90usb647",           ARCH_AVR5, "__AVR_AT90USB647__",        0, 0, 0x0100, 1, "usb647")
-AVR_MCU ("at94k",                ARCH_AVR5, "__AVR_AT94K__",             0, 0, 0x0060, 1, "at94k")
-AVR_MCU ("m3000",                ARCH_AVR5, "__AVR_M3000__",             0, 0, 0x1000, 1, "m3000")
+AVR_MCU ("avr5",                 ARCH_AVR5, AVR_ISA_NONE, NULL,                        0x0060, 1, "m16")
+AVR_MCU ("ata5790",              ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5790__",           0x0100, 1, "a5790")
+AVR_MCU ("ata5790n",             ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5790N__",          0x0100, 1, "a5790n")
+AVR_MCU ("ata5795",              ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5795__",           0x0100, 1, "a5795")
+AVR_MCU ("atmega16",             ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16__",          0x0060, 1, "m16")
+AVR_MCU ("atmega16a",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16A__",         0x0060, 1, "m16a")
+AVR_MCU ("atmega161",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega161__",         0x0060, 1, "m161")
+AVR_MCU ("atmega162",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega162__",         0x0100, 1, "m162")
+AVR_MCU ("atmega163",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega163__",         0x0060, 1, "m163")
+AVR_MCU ("atmega164a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164A__",        0x0100, 1, "m164a")
+AVR_MCU ("atmega164p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164P__",        0x0100, 1, "m164p")
+AVR_MCU ("atmega164pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164PA__",       0x0100, 1, "m164pa")
+AVR_MCU ("atmega165",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165__",         0x0100, 1, "m165")
+AVR_MCU ("atmega165a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165A__",        0x0100, 1, "m165a")
+AVR_MCU ("atmega165p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165P__",        0x0100, 1, "m165p")
+AVR_MCU ("atmega165pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165PA__",       0x0100, 1, "m165pa")
+AVR_MCU ("atmega168",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168__",         0x0100, 1, "m168")
+AVR_MCU ("atmega168a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168A__",        0x0100, 1, "m168a")
+AVR_MCU ("atmega168p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168P__",        0x0100, 1, "m168p")
+AVR_MCU ("atmega168pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168PA__",       0x0100, 1, "m168pa")
+AVR_MCU ("atmega169",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169__",         0x0100, 1, "m169")
+AVR_MCU ("atmega169a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169A__",        0x0100, 1, "m169a")
+AVR_MCU ("atmega169p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169P__",        0x0100, 1, "m169p")
+AVR_MCU ("atmega169pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169PA__",       0x0100, 1, "m169pa")
+AVR_MCU ("atmega16hvb",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVB__",       0x0100, 1, "m16hvb")
+AVR_MCU ("atmega16hvbrevb",      ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVBREVB__",   0x0100, 1, "m16hvbrevb")
+AVR_MCU ("atmega16m1",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16M1__",        0x0100, 1, "m16m1")
+AVR_MCU ("atmega16u4",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16U4__",        0x0100, 1, "m16u4")
+AVR_MCU ("atmega26hvg",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega26HVG__",       0x0100, 1, "m26hvg")
+AVR_MCU ("atmega32a",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32A__",         0x0060, 1, "m32a")
+AVR_MCU ("atmega32",             ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32__",          0x0060, 1, "m32")
+AVR_MCU ("atmega323",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega323__",         0x0060, 1, "m323")
+AVR_MCU ("atmega324a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324A__",        0x0100, 1, "m324a")
+AVR_MCU ("atmega324p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324P__",        0x0100, 1, "m324p")
+AVR_MCU ("atmega324pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324PA__",       0x0100, 1, "m324pa")
+AVR_MCU ("atmega325",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325__",         0x0100, 1, "m325")
+AVR_MCU ("atmega325a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325A__",        0x0100, 1, "m325a")
+AVR_MCU ("atmega325p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325P__",        0x0100, 1, "m325p")
+AVR_MCU ("atmega3250",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250__",        0x0100, 1, "m3250")
+AVR_MCU ("atmega3250a",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250A__",       0x0100, 1, "m3250a")
+AVR_MCU ("atmega3250p",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250P__",       0x0100, 1, "m3250p")
+AVR_MCU ("atmega3250pa",         ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250PA__",      0x0100, 1, "m3250pa")
+AVR_MCU ("atmega328",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328__",         0x0100, 1, "m328")
+AVR_MCU ("atmega328p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328P__",        0x0100, 1, "m328p")
+AVR_MCU ("atmega329",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329__",         0x0100, 1, "m329")
+AVR_MCU ("atmega329a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329A__",        0x0100, 1, "m329a")
+AVR_MCU ("atmega329p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329P__",        0x0100, 1, "m329p")
+AVR_MCU ("atmega329pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329PA__",       0x0100, 1, "m329pa")
+AVR_MCU ("atmega3290",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290__",        0x0100, 1, "m3290")
+AVR_MCU ("atmega3290a",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290A__",       0x0100, 1, "m3290a")
+AVR_MCU ("atmega3290p",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290P__",       0x0100, 1, "m3290p")
+AVR_MCU ("atmega3290pa",         ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290PA__",      0x0100, 1, "m3290pa")
+AVR_MCU ("atmega32c1",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32C1__",        0x0100, 1, "m32c1")
+AVR_MCU ("atmega32m1",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32M1__",        0x0100, 1, "m32m1")
+AVR_MCU ("atmega32u4",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32U4__",        0x0100, 1, "m32u4")
+AVR_MCU ("atmega32u6",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32U6__",        0x0100, 1, "m32u6")
+AVR_MCU ("atmega406",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega406__",         0x0100, 1, "m406")
+AVR_MCU ("atmega64",             ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64__",          0x0100, 1, "m64")
+AVR_MCU ("atmega64a",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64A__",         0x0100, 1, "m64a")
+AVR_MCU ("atmega640",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega640__",         0x0200, 1, "m640")
+AVR_MCU ("atmega644",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644__",         0x0100, 1, "m644")
+AVR_MCU ("atmega644a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644A__",        0x0100, 1, "m644a")
+AVR_MCU ("atmega644p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644P__",        0x0100, 1, "m644p")
+AVR_MCU ("atmega644pa",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644PA__",       0x0100, 1, "m644pa")
+AVR_MCU ("atmega645",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645__",         0x0100, 1, "m645")
+AVR_MCU ("atmega645a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645A__",        0x0100, 1, "m645a")
+AVR_MCU ("atmega645p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645P__",        0x0100, 1, "m645p")
+AVR_MCU ("atmega6450",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450__",        0x0100, 1, "m6450")
+AVR_MCU ("atmega6450a",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450A__",       0x0100, 1, "m6450a")
+AVR_MCU ("atmega6450p",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450P__",       0x0100, 1, "m6450p")
+AVR_MCU ("atmega649",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649__",         0x0100, 1, "m649")
+AVR_MCU ("atmega649a",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649A__",        0x0100, 1, "m649a")
+AVR_MCU ("atmega649p",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649P__",        0x0100, 1, "m649p")
+AVR_MCU ("atmega6490",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490__",        0x0100, 1, "m6490")
+AVR_MCU ("atmega16hva",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVA__",       0x0100, 1, "m16hva")
+AVR_MCU ("atmega16hva2",         ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVA2__",      0x0100, 1, "m16hva2")
+AVR_MCU ("atmega32hvb",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32HVB__",       0x0100, 1, "m32hvb")
+AVR_MCU ("atmega6490a",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490A__",       0x0100, 1, "m6490a")
+AVR_MCU ("atmega6490p",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490P__",       0x0100, 1, "m6490p")
+AVR_MCU ("atmega64c1",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64C1__",        0x0100, 1, "m64c1")
+AVR_MCU ("atmega64m1",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64M1__",        0x0100, 1, "m64m1")
+AVR_MCU ("atmega64hve",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64HVE__",       0x0100, 1, "m64hve")
+AVR_MCU ("atmega64rfa2",         ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64RFA2__",      0x0200, 1, "m64rfa2")
+AVR_MCU ("atmega64rfr2",         ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64RFR2__",      0x0200, 1, "m64rfr2")
+AVR_MCU ("atmega32hvbrevb",      ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32HVBREVB__",   0x0100, 1, "m32hvbrevb")
+AVR_MCU ("atmega48hvf",          ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega48HVF__",       0x0100, 1, "m48hvf")
+AVR_MCU ("at90can32",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90CAN32__",         0x0100, 1, "can32")
+AVR_MCU ("at90can64",            ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90CAN64__",         0x0100, 1, "can64")
+AVR_MCU ("at90pwm161",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM161__",        0x0100, 1, "90pwm161")
+AVR_MCU ("at90pwm216",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM216__",        0x0100, 1, "90pwm216")
+AVR_MCU ("at90pwm316",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM316__",        0x0100, 1, "90pwm316")
+AVR_MCU ("at90scr100",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90SCR100__",        0x0100, 1, "90scr100")
+AVR_MCU ("at90usb646",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90USB646__",        0x0100, 1, "usb646")
+AVR_MCU ("at90usb647",           ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90USB647__",        0x0100, 1, "usb647")
+AVR_MCU ("at94k",                ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT94K__",             0x0060, 1, "at94k")
+AVR_MCU ("m3000",                ARCH_AVR5, AVR_ISA_NONE, "__AVR_M3000__",             0x1000, 1, "m3000")
 /* Enhanced, == 128K.  */
-AVR_MCU ("avr51",                ARCH_AVR51, NULL,                       0, 0, 0x0100, 2, "m128")
-AVR_MCU ("atmega128",            ARCH_AVR51, "__AVR_ATmega128__",        0, 0, 0x0100, 2, "m128")
-AVR_MCU ("atmega128a",           ARCH_AVR51, "__AVR_ATmega128A__",       0, 0, 0x0100, 2, "m128a")
-AVR_MCU ("atmega1280",           ARCH_AVR51, "__AVR_ATmega1280__",       0, 0, 0x0200, 2, "m1280")
-AVR_MCU ("atmega1281",           ARCH_AVR51, "__AVR_ATmega1281__",       0, 0, 0x0200, 2, "m1281")
-AVR_MCU ("atmega1284",           ARCH_AVR51, "__AVR_ATmega1284__",       0, 0, 0x0100, 2, "m1284")
-AVR_MCU ("atmega1284p",          ARCH_AVR51, "__AVR_ATmega1284P__",      0, 0, 0x0100, 2, "m1284p")
-AVR_MCU ("atmega128rfa1",        ARCH_AVR51, "__AVR_ATmega128RFA1__",    0, 0, 0x0200, 2, "m128rfa1")
-AVR_MCU ("at90can128",           ARCH_AVR51, "__AVR_AT90CAN128__",       0, 0, 0x0100, 2, "can128")
-AVR_MCU ("at90usb1286",          ARCH_AVR51, "__AVR_AT90USB1286__",      0, 0, 0x0100, 2, "usb1286")
-AVR_MCU ("at90usb1287",          ARCH_AVR51, "__AVR_AT90USB1287__",      0, 0, 0x0100, 2, "usb1287")
+AVR_MCU ("avr51",                ARCH_AVR51, AVR_ISA_NONE, NULL,                       0x0100, 2, "m128")
+AVR_MCU ("atmega128",            ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128__",        0x0100, 2, "m128")
+AVR_MCU ("atmega128a",           ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128A__",       0x0100, 2, "m128a")
+AVR_MCU ("atmega1280",           ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1280__",       0x0200, 2, "m1280")
+AVR_MCU ("atmega1281",           ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1281__",       0x0200, 2, "m1281")
+AVR_MCU ("atmega1284",           ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284__",       0x0100, 2, "m1284")
+AVR_MCU ("atmega1284p",          ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284P__",      0x0100, 2, "m1284p")
+AVR_MCU ("atmega128rfa1",        ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128RFA1__",    0x0200, 2, "m128rfa1")
+AVR_MCU ("at90can128",           ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90CAN128__",       0x0100, 2, "can128")
+AVR_MCU ("at90usb1286",          ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90USB1286__",      0x0100, 2, "usb1286")
+AVR_MCU ("at90usb1287",          ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90USB1287__",      0x0100, 2, "usb1287")
 /* 3-Byte PC.  */
-AVR_MCU ("avr6",                 ARCH_AVR6, NULL,                        0, 0, 0x0200, 4, "m2561")
-AVR_MCU ("atmega2560",           ARCH_AVR6, "__AVR_ATmega2560__",        0, 0, 0x0200, 4, "m2560")
-AVR_MCU ("atmega2561",           ARCH_AVR6, "__AVR_ATmega2561__",        0, 0, 0x0200, 4, "m2561")
+AVR_MCU ("avr6",                 ARCH_AVR6, AVR_ISA_NONE, NULL,                        0x0200, 4, "m2561")
+AVR_MCU ("atmega2560",           ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2560__",        0x0200, 4, "m2560")
+AVR_MCU ("atmega2561",           ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2561__",        0x0200, 4, "m2561")
 /* Xmega, 16K <= Flash < 64K, RAM <= 64K */
-AVR_MCU ("avrxmega2",        ARCH_AVRXMEGA2, NULL,                       0, 0, 0x2000, 1, "x32a4")
-AVR_MCU ("atxmega16a4",      ARCH_AVRXMEGA2, "__AVR_ATxmega16A4__",      0, 0, 0x2000, 1, "x16a4")
-AVR_MCU ("atxmega16d4",      ARCH_AVRXMEGA2, "__AVR_ATxmega16D4__",      0, 0, 0x2000, 1, "x16d4")
-AVR_MCU ("atxmega32a4",      ARCH_AVRXMEGA2, "__AVR_ATxmega32A4__",      0, 0, 0x2000, 1, "x32a4")
-AVR_MCU ("atxmega32d4",      ARCH_AVRXMEGA2, "__AVR_ATxmega32D4__",      0, 0, 0x2000, 1, "x32d4")
-AVR_MCU ("atxmega32x1",      ARCH_AVRXMEGA2, "__AVR_ATxmega32X1__",      0, 0, 0x2000, 1, "x32x1")
-AVR_MCU ("atmxt112sl",       ARCH_AVRXMEGA2, "__AVR_ATMXT112SL__",       0, 0, 0x2000, 1, "mxt112sl")
-AVR_MCU ("atmxt224",         ARCH_AVRXMEGA2, "__AVR_ATMXT224__",         0, 0, 0x2000, 1, "mxt224")
-AVR_MCU ("atmxt224e",        ARCH_AVRXMEGA2, "__AVR_ATMXT224E__",        0, 0, 0x2000, 1, "mxt224e")
-AVR_MCU ("atmxt336s",        ARCH_AVRXMEGA2, "__AVR_ATMXT336S__",        0, 0, 0x2000, 1, "mxt336s")
-AVR_MCU ("atxmega16a4u",     ARCH_AVRXMEGA2, "__AVR_ATxmega16A4U__",     0, 0, 0x2000, 1, "x16a4u")
-AVR_MCU ("atxmega16c4",      ARCH_AVRXMEGA2, "__AVR_ATxmega16C4__",      0, 0, 0x2000, 1, "x16c4")
-AVR_MCU ("atxmega32a4u",     ARCH_AVRXMEGA2, "__AVR_ATxmega32A4U__",     0, 0, 0x2000, 1, "x32a4u")
-AVR_MCU ("atxmega32c4",      ARCH_AVRXMEGA2, "__AVR_ATxmega32C4__",      0, 0, 0x2000, 1, "x32c4")
-AVR_MCU ("atxmega32e5",      ARCH_AVRXMEGA2, "__AVR_ATxmega32E5__",      0, 0, 0x2000, 1, "x32e5")
+AVR_MCU ("avrxmega2",        ARCH_AVRXMEGA2, AVR_ISA_NONE, NULL,                       0x2000, 1, "x32a4")
+AVR_MCU ("atxmega16a4",      ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16A4__",      0x2000, 1, "x16a4")
+AVR_MCU ("atxmega16d4",      ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16D4__",      0x2000, 1, "x16d4")
+AVR_MCU ("atxmega32a4",      ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32A4__",      0x2000, 1, "x32a4")
+AVR_MCU ("atxmega32d4",      ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32D4__",      0x2000, 1, "x32d4")
+AVR_MCU ("atxmega32x1",      ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32X1__",      0x2000, 1, "x32x1")
+AVR_MCU ("atmxt112sl",       ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATMXT112SL__",       0x2000, 1, "mxt112sl")
+AVR_MCU ("atmxt224",         ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATMXT224__",         0x2000, 1, "mxt224")
+AVR_MCU ("atmxt224e",        ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATMXT224E__",        0x2000, 1, "mxt224e")
+AVR_MCU ("atmxt336s",        ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATMXT336S__",        0x2000, 1, "mxt336s")
+AVR_MCU ("atxmega16a4u",     ARCH_AVRXMEGA2, AVR_ISA_RMW,  "__AVR_ATxmega16A4U__",     0x2000, 1, "x16a4u")
+AVR_MCU ("atxmega16c4",      ARCH_AVRXMEGA2, AVR_ISA_RMW,  "__AVR_ATxmega16C4__",      0x2000, 1, "x16c4")
+AVR_MCU ("atxmega32a4u",     ARCH_AVRXMEGA2, AVR_ISA_RMW,  "__AVR_ATxmega32A4U__",     0x2000, 1, "x32a4u")
+AVR_MCU ("atxmega32c4",      ARCH_AVRXMEGA2, AVR_ISA_RMW,  "__AVR_ATxmega32C4__",      0x2000, 1, "x32c4")
+AVR_MCU ("atxmega32e5",      ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32E5__",      0x2000, 1, "x32e5")
 /* Xmega, 64K < Flash <= 128K, RAM <= 64K */
-AVR_MCU ("avrxmega4",        ARCH_AVRXMEGA4, NULL,                       0, 0, 0x2000, 2, "x64a4")
-AVR_MCU ("atxmega64a3",      ARCH_AVRXMEGA4, "__AVR_ATxmega64A3__",      0, 0, 0x2000, 2, "x64a3")
-AVR_MCU ("atxmega64d3",      ARCH_AVRXMEGA4, "__AVR_ATxmega64D3__",      0, 0, 0x2000, 2, "x64d3")
-AVR_MCU ("atxmega64a3u",     ARCH_AVRXMEGA4, "__AVR_ATxmega64A3U__",     0, 0, 0x2000, 2, "x64a3u")
-AVR_MCU ("atxmega64a4u",     ARCH_AVRXMEGA4, "__AVR_ATxmega64A4U__",     0, 0, 0x2000, 2, "x64a4u")
-AVR_MCU ("atxmega64b1",      ARCH_AVRXMEGA4, "__AVR_ATxmega64B1__",      0, 0, 0x2000, 2, "x64b1")
-AVR_MCU ("atxmega64b3",      ARCH_AVRXMEGA4, "__AVR_ATxmega64B3__",      0, 0, 0x2000, 2, "x64b3")
-AVR_MCU ("atxmega64c3",      ARCH_AVRXMEGA4, "__AVR_ATxmega64C3__",      0, 0, 0x2000, 2, "x64c3")
-AVR_MCU ("atxmega64d4",      ARCH_AVRXMEGA4, "__AVR_ATxmega64D4__",      0, 0, 0x2000, 2, "x64d4")
+AVR_MCU ("avrxmega4",        ARCH_AVRXMEGA4, AVR_ISA_NONE, NULL,                       0x2000, 2, "x64a4")
+AVR_MCU ("atxmega64a3",      ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64A3__",      0x2000, 2, "x64a3")
+AVR_MCU ("atxmega64d3",      ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D3__",      0x2000, 2, "x64d3")
+AVR_MCU ("atxmega64a3u",     ARCH_AVRXMEGA4, AVR_ISA_RMW,  "__AVR_ATxmega64A3U__",     0x2000, 2, "x64a3u")
+AVR_MCU ("atxmega64a4u",     ARCH_AVRXMEGA4, AVR_ISA_RMW,  "__AVR_ATxmega64A4U__",     0x2000, 2, "x64a4u")
+AVR_MCU ("atxmega64b1",      ARCH_AVRXMEGA4, AVR_ISA_RMW,  "__AVR_ATxmega64B1__",      0x2000, 2, "x64b1")
+AVR_MCU ("atxmega64b3",      ARCH_AVRXMEGA4, AVR_ISA_RMW,  "__AVR_ATxmega64B3__",      0x2000, 2, "x64b3")
+AVR_MCU ("atxmega64c3",      ARCH_AVRXMEGA4, AVR_ISA_RMW,  "__AVR_ATxmega64C3__",      0x2000, 2, "x64c3")
+AVR_MCU ("atxmega64d4",      ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D4__",      0x2000, 2, "x64d4")
 /* Xmega, 64K < Flash <= 128K, RAM > 64K */
-AVR_MCU ("avrxmega5",        ARCH_AVRXMEGA5, NULL,                       0, 0, 0x2000, 2, "x64a1")
-AVR_MCU ("atxmega64a1",      ARCH_AVRXMEGA5, "__AVR_ATxmega64A1__",      0, 0, 0x2000, 2, "x64a1")
-AVR_MCU ("atxmega64a1u",     ARCH_AVRXMEGA5, "__AVR_ATxmega64A1U__",     0, 0, 0x2000, 2, "x64a1u")
+AVR_MCU ("avrxmega5",        ARCH_AVRXMEGA5, AVR_ISA_NONE, NULL,                       0x2000, 2, "x64a1")
+AVR_MCU ("atxmega64a1",      ARCH_AVRXMEGA5, AVR_ISA_NONE, "__AVR_ATxmega64A1__",      0x2000, 2, "x64a1")
+AVR_MCU ("atxmega64a1u",     ARCH_AVRXMEGA5, AVR_ISA_RMW,  "__AVR_ATxmega64A1U__",     0x2000, 2, "x64a1u")
 /* Xmega, 128K < Flash, RAM <= 64K */
-AVR_MCU ("avrxmega6",        ARCH_AVRXMEGA6, NULL,                       0, 0, 0x2000, 6, "x128a3")
-AVR_MCU ("atxmega128a3",     ARCH_AVRXMEGA6, "__AVR_ATxmega128A3__",     0, 0, 0x2000, 3, "x128a3")
-AVR_MCU ("atxmega128d3",     ARCH_AVRXMEGA6, "__AVR_ATxmega128D3__",     0, 0, 0x2000, 3, "x128d3")
-AVR_MCU ("atxmega192a3",     ARCH_AVRXMEGA6, "__AVR_ATxmega192A3__",     0, 0, 0x2000, 4, "x192a3")
-AVR_MCU ("atxmega192d3",     ARCH_AVRXMEGA6, "__AVR_ATxmega192D3__",     0, 0, 0x2000, 4, "x192d3")
-AVR_MCU ("atxmega256a3",     ARCH_AVRXMEGA6, "__AVR_ATxmega256A3__",     0, 0, 0x2000, 5, "x256a3")
-AVR_MCU ("atxmega256a3b",    ARCH_AVRXMEGA6, "__AVR_ATxmega256A3B__",    0, 0, 0x2000, 5, "x256a3b")
-AVR_MCU ("atxmega256a3bu",   ARCH_AVRXMEGA6, "__AVR_ATxmega256A3BU__",   0, 0, 0x2000, 5, "x256a3bu")
-AVR_MCU ("atxmega256d3",     ARCH_AVRXMEGA6, "__AVR_ATxmega256D3__",     0, 0, 0x2000, 5, "x256d3")
-AVR_MCU ("atxmega128a3u",    ARCH_AVRXMEGA6, "__AVR_ATxmega128A3U__",    0, 0, 0x2000, 3, "x128a3u")
-AVR_MCU ("atxmega128b1",     ARCH_AVRXMEGA6, "__AVR_ATxmega128B1__",     0, 0, 0x2000, 3, "x128b1")
-AVR_MCU ("atxmega128b3",     ARCH_AVRXMEGA6, "__AVR_ATxmega128B3__",     0, 0, 0x2000, 3, "x128b3")
-AVR_MCU ("atxmega128c3",     ARCH_AVRXMEGA6, "__AVR_ATxmega128C3__",     0, 0, 0x2000, 3, "x128c3")
-AVR_MCU ("atxmega128d4",     ARCH_AVRXMEGA6, "__AVR_ATxmega128D4__",     0, 0, 0x2000, 3, "x128d4")
-AVR_MCU ("atmxt540s",        ARCH_AVRXMEGA6, "__AVR_ATMXT540S__",        0, 0, 0x2000, 2, "mxt540s")
-AVR_MCU ("atmxt540sreva",    ARCH_AVRXMEGA6, "__AVR_ATMXT540SREVA__",    0, 0, 0x2000, 2, "mxt540sreva")
-AVR_MCU ("atxmega192a3u",    ARCH_AVRXMEGA6, "__AVR_ATxmega192A3U__",    0, 0, 0x2000, 4, "x192a3u")
-AVR_MCU ("atxmega192c3",     ARCH_AVRXMEGA6, "__AVR_ATxmega192C3__",     0, 0, 0x2000, 4, "x192c3")
-AVR_MCU ("atxmega256a3u",    ARCH_AVRXMEGA6, "__AVR_ATxmega256A3U__",    0, 0, 0x2000, 5, "x256a3u")
-AVR_MCU ("atxmega256c3",     ARCH_AVRXMEGA6, "__AVR_ATxmega256C3__",     0, 0, 0x2000, 5, "x256c3")
-AVR_MCU ("atxmega384c3",     ARCH_AVRXMEGA6, "__AVR_ATxmega384C3__",     0, 0, 0x2000, 6, "x384c3")
-AVR_MCU ("atxmega384d3",     ARCH_AVRXMEGA6, "__AVR_ATxmega384D3__",     0, 0, 0x2000, 6, "x384d3")
+AVR_MCU ("avrxmega6",        ARCH_AVRXMEGA6, AVR_ISA_NONE, NULL,                       0x2000, 6, "x128a3")
+AVR_MCU ("atxmega128a3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128A3__",     0x2000, 3, "x128a3")
+AVR_MCU ("atxmega128d3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128D3__",     0x2000, 3, "x128d3")
+AVR_MCU ("atxmega192a3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192A3__",     0x2000, 4, "x192a3")
+AVR_MCU ("atxmega192d3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192D3__",     0x2000, 4, "x192d3")
+AVR_MCU ("atxmega256a3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3__",     0x2000, 5, "x256a3")
+AVR_MCU ("atxmega256a3b",    ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3B__",    0x2000, 5, "x256a3b")
+AVR_MCU ("atxmega256a3bu",   ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega258A3BU__",   0x2000, 5, "x256a3bu")
+AVR_MCU ("atxmega256d3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256D3__",     0x2000, 5, "x256d3")
+AVR_MCU ("atxmega128a3u",    ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128A3U__",    0x2000, 3, "x128a3u")
+AVR_MCU ("atxmega128b1",     ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega128B1__",     0x2000, 3, "x128b1")
+AVR_MCU ("atxmega128b3",     ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega128B3__",     0x2000, 3, "x128b3")
+AVR_MCU ("atxmega128c3",     ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega128C3__",     0x2000, 3, "x128c3")
+AVR_MCU ("atxmega128d4",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128D4__",     0x2000, 3, "x128d4")
+AVR_MCU ("atmxt540s",        ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATMXT540S__",        0x2000, 2, "mxt540s")
+AVR_MCU ("atmxt540sreva",    ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATMXT540SREVA__",    0x2000, 2, "mxt540sreva")
+AVR_MCU ("atxmega192a3u",    ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega192A3U__",    0x2000, 4, "x192a3u")
+AVR_MCU ("atxmega192c3",     ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega192C3__",     0x2000, 4, "x192c3")
+AVR_MCU ("atxmega256a3u",    ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega256A3U__",    0x2000, 5, "x256a3u")
+AVR_MCU ("atxmega256c3",     ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega256C3__",     0x2000, 5, "x256c3")
+AVR_MCU ("atxmega384c3",     ARCH_AVRXMEGA6, AVR_ISA_RMW,  "__AVR_ATxmega384C3__",     0x2000, 6, "x384c3")
+AVR_MCU ("atxmega384d3",     ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega384D3__",     0x2000, 6, "x384d3")
 /* Xmega, 128K < Flash, RAM > 64K RAM.  */
-AVR_MCU ("avrxmega7",        ARCH_AVRXMEGA7, NULL,                       0, 0, 0x2000, 3, "x128a1")
-AVR_MCU ("atxmega128a1",     ARCH_AVRXMEGA7, "__AVR_ATxmega128A1__",     0, 0, 0x2000, 3, "x128a1")
-AVR_MCU ("atxmega128a1u",    ARCH_AVRXMEGA7, "__AVR_ATxmega128A1U__",    0, 0, 0x2000, 3, "x128a1u")
-AVR_MCU ("atxmega128a4u",    ARCH_AVRXMEGA7, "__AVR_ATxmega128A4U__",    0, 0, 0x2000, 3, "x128a4u")
+AVR_MCU ("avrxmega7",        ARCH_AVRXMEGA7, AVR_ISA_NONE, NULL,                       0x2000, 3, "x128a1")
+AVR_MCU ("atxmega128a1",     ARCH_AVRXMEGA7, AVR_ISA_NONE, "__AVR_ATxmega128A1__",     0x2000, 3, "x128a1")
+AVR_MCU ("atxmega128a1u",    ARCH_AVRXMEGA7, AVR_ISA_RMW,  "__AVR_ATxmega128A1U__",    0x2000, 3, "x128a1u")
+AVR_MCU ("atxmega128a4u",    ARCH_AVRXMEGA7, AVR_ISA_RMW,  "__AVR_ATxmega128A4U__",    0x2000, 3, "x128a4u")
 /* Assembler only.  */
-AVR_MCU ("avr1",                 ARCH_AVR1, NULL,                        0, 0, 0x0060, 1, "s1200")
-AVR_MCU ("at90s1200",            ARCH_AVR1, "__AVR_AT90S1200__",         0, 0, 0x0060, 1, "s1200")
-AVR_MCU ("attiny11",             ARCH_AVR1, "__AVR_ATtiny11__",          0, 0, 0x0060, 1, "tn11")
-AVR_MCU ("attiny12",             ARCH_AVR1, "__AVR_ATtiny12__",          0, 0, 0x0060, 1, "tn12")
-AVR_MCU ("attiny15",             ARCH_AVR1, "__AVR_ATtiny15__",          0, 0, 0x0060, 1, "tn15")
-AVR_MCU ("attiny28",             ARCH_AVR1, "__AVR_ATtiny28__",          0, 0, 0x0060, 1, "tn28")
+AVR_MCU ("avr1",                 ARCH_AVR1, AVR_ISA_NONE, NULL,                        0x0060, 1, "s1200")
+AVR_MCU ("at90s1200",            ARCH_AVR1, AVR_ISA_NONE, "__AVR_AT90S1200__",         0x0060, 1, "s1200")
+AVR_MCU ("attiny11",             ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny11__",          0x0060, 1, "tn11")
+AVR_MCU ("attiny12",             ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny12__",          0x0060, 1, "tn12")
+AVR_MCU ("attiny15",             ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny15__",          0x0060, 1, "tn15")
+AVR_MCU ("attiny28",             ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny28__",          0x0060, 1, "tn28")
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index 8ca7de0..99644ec 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -10120,7 +10120,7 @@ test_hard_reg_class (enum reg_class rclass, rtx x)
 static bool
 avr_2word_insn_p (rtx insn)
 {
-  if (avr_current_device->errata_skip
+  if ((avr_current_device->dev_attribute & AVR_ERRATA_SKIP)
       || !insn
       || 2 != get_attr_length (insn))
     {
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index 74be83c..78434ec 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -88,8 +88,9 @@ enum
    __AVR_HAVE_8BIT_SP__ and __AVR_HAVE_16BIT_SP__.  During multilib generation
    there is always __AVR_SP8__ == __AVR_HAVE_8BIT_SP__.  */
 
-#define AVR_HAVE_8BIT_SP                                                \
-  (avr_current_device->short_sp || TARGET_TINY_STACK || avr_sp8)
+#define AVR_HAVE_8BIT_SP                                 \
+  ((avr_current_device->dev_attribute & AVR_SHORT_SP) || \
+   TARGET_TINY_STACK || avr_sp8)
 
 #define AVR_HAVE_SPH (!avr_sp8)
 
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index f2d8605..d7baa4a 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -5342,7 +5342,7 @@
                       (label_ref (match_operand 0 "" ""))
                       (pc)))]
   "!AVR_HAVE_JMP_CALL
-   || !avr_current_device->errata_skip"
+   || !(avr_current_device->dev_attribute & AVR_ERRATA_SKIP)"
   {
     if (operands[2] == CONST0_RTX (<MODE>mode))
       operands[2] = zero_reg_rtx;
diff --git a/gcc/config/avr/driver-avr.c b/gcc/config/avr/driver-avr.c
index cb5dd1d..76c8b39 100644
--- a/gcc/config/avr/driver-avr.c
+++ b/gcc/config/avr/driver-avr.c
@@ -59,8 +59,8 @@ avr_device_to_as (int argc, const char **argv)
   avr_set_current_device (argv[0]);
 
   return concat ("-mmcu=", avr_current_arch->arch_name,
-                 avr_current_device->errata_skip ? "" : " -mno-skip-bug",
-                 NULL);
+    avr_current_device->dev_attribute & AVR_ERRATA_SKIP ? "" : " -mno-skip-bug",
+    avr_current_device->dev_attribute & AVR_ISA_RMW ? " -mrmw" : "", NULL);
 }
 
 /* Returns command line parameters to pass to ld.  */
@@ -144,7 +144,7 @@ avr_device_to_sp8 (int argc, const char **argv)
           || avr_current_device->arch == ARCH_AVR25))
     return "";
 
-  return avr_current_device->short_sp
+  return (avr_current_device->dev_attribute & AVR_SHORT_SP)
     ? "-msp8"
     : "%<msp8";
 }
diff --git a/gcc/config/avr/genmultilib.awk b/gcc/config/avr/genmultilib.awk
index 90e5e5c..1dfeabb 100644
--- a/gcc/config/avr/genmultilib.awk
+++ b/gcc/config/avr/genmultilib.awk
@@ -86,7 +86,7 @@ BEGIN {
     name = $2
     gsub ("\"", "", name)
 
-    if ($4 == "NULL")
+    if ($5 == "NULL")
     {
 	core = name
 
@@ -106,7 +106,17 @@ BEGIN {
     if (core == "avr1")
 	next
 
-    tiny_stack[name]  = $5
+    # split device specific feature list
+    n = split($4,dev_attribute,"|")
+
+    # set tiny_stack false by default
+    tiny_stack[name] = 0
+    for (i=1; i <= n; i++)
+      if (dev_attribute[i] == "AVR_SHORT_SP") {
+        tiny_stack[name]  = 1
+        break
+      }
+
     mcu[n_mcu] = name
     n_mcu++
     option[name]      = "mmcu=" name
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 24bd76e..1b232c9 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -12956,6 +12956,9 @@ instructions because of a hardware erratum.  Skip instructions are
 The second macro is only defined if @code{__AVR_HAVE_JMP_CALL__} is also
 set.
 
+@item __AVR_ISA_RMW__
+The device has Read-Modify-Write instructions (XCH, LAC, LAS and LAT).
+
 @item __AVR_SFR_OFFSET__=@var{offset}
 Instructions that can address I/O special function registers directly
 like @code{IN}, @code{OUT}, @code{SBI}, etc.@: may use a different
diff --git a/gcc/testsuite/gcc.target/avr/dev-specific-rmw.c b/gcc/testsuite/gcc.target/avr/dev-specific-rmw.c
new file mode 100644
index 0000000..0a8393e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/dev-specific-rmw.c
@@ -0,0 +1,13 @@
+/* Verify that rmw instructions supported */
+/* { dg-do assemble } */
+
+int main()
+{
+  #ifdef __AVR_ISA_RMW__
+    __asm("xch Z, r12");
+    __asm("las Z, r12");
+    __asm("lac Z, r12");
+    __asm("lat Z, r12");
+  #endif
+  return 0;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.