xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AVR/AVRDevices.td (revision 9f23cbd6cae82fd77edfad7173432fa8dccd0a95)
1//===---------------------------------------------------------------------===//
2// AVR Device Definitions
3//===---------------------------------------------------------------------===//
4
5// :TODO: Implement the skip errata, see `gcc/config/avr/avr-arch.h` for details
6// :TODO: We define all devices with SRAM to have all variants of LD/ST/LDD/STD.
7//        In reality, avr1 (no SRAM) has one variant each of `LD` and `ST`.
8//        avr2 (with SRAM) adds the rest of the variants.
9
10// A feature set aggregates features, grouping them. We don't want to create a
11// new member in AVRSubtarget (to store a value) for each set because we do not
12// care if the set is supported, only the subfeatures inside the set. We fix
13// this by simply setting the same dummy member for all feature sets, which is
14// then ignored.
15class FeatureSet<string name, string desc, list<SubtargetFeature> i>
16    : SubtargetFeature<name, "m_FeatureSetDummy", "true", desc, i>;
17
18// A family of microcontrollers, defining a set of supported features.
19class Family<string name, list<SubtargetFeature> i>
20    : FeatureSet<
21          name, !strconcat("The device is a part of the ", name, " family"), i>;
22
23// The device has SRAM, and supports the bare minimum of
24// SRAM-relevant instructions.
25//
26// These are:
27// LD - all 9 variants
28// ST - all 9 variants
29// LDD - two variants for Y and Z
30// STD - two variants for Y and Z
31// `LDS Rd, K`
32// `STS k, Rr`
33// `PUSH`/`POP`
34def FeatureSRAM : SubtargetFeature<"sram", "m_hasSRAM", "true",
35                                   "The device has random access memory">;
36
37// The device supports the `JMP k` and `CALL k` instructions.
38def FeatureJMPCALL : SubtargetFeature<"jmpcall", "m_hasJMPCALL", "true",
39                                      "The device supports the `JMP` and "
40                                      "`CALL` instructions">;
41
42// The device supports the indirect branches `IJMP` and `ICALL`.
43def FeatureIJMPCALL : SubtargetFeature<"ijmpcall", "m_hasIJMPCALL", "true",
44                                       "The device supports `IJMP`/`ICALL`"
45                                       "instructions">;
46
47// The device supports the extended indirect branches `EIJMP` and `EICALL`.
48def FeatureEIJMPCALL : SubtargetFeature<"eijmpcall", "m_hasEIJMPCALL", "true",
49                                        "The device supports the "
50                                        "`EIJMP`/`EICALL` instructions">;
51
52// The device supports `ADDI Rd, K`, `SUBI Rd, K`.
53def FeatureADDSUBIW : SubtargetFeature<"addsubiw", "m_hasADDSUBIW", "true",
54                                       "Enable 16-bit register-immediate "
55                                       "addition and subtraction instructions">;
56
57// The device has an 8-bit stack pointer (SP) register.
58def FeatureSmallStack
59    : SubtargetFeature<"smallstack", "m_hasSmallStack", "true",
60                       "The device has an 8-bit "
61                       "stack pointer">;
62
63// The device supports the 16-bit GPR pair MOVW instruction.
64def FeatureMOVW : SubtargetFeature<"movw", "m_hasMOVW", "true",
65                                   "The device supports the 16-bit MOVW "
66                                   "instruction">;
67
68// The device has a separate flash namespace that must be accessed using special
69// instructions like lpm.
70def FeaturePROGMEM : SubtargetFeature<"progmem", "m_hasPROGMEM", "true",
71                                      "The device has a separate flash namespace">;
72
73// The device supports the `LPM` instruction, with implied destination being r0.
74def FeatureLPM : SubtargetFeature<"lpm", "m_hasLPM", "true",
75                                  "The device supports the `LPM` instruction">;
76
77// The device supports the `LPM Rd, Z[+] instruction.
78def FeatureLPMX : SubtargetFeature<"lpmx", "m_hasLPMX", "true",
79                                   "The device supports the `LPM Rd, Z[+]` "
80                                   "instruction">;
81
82// The device supports the `ELPM` instruction.
83def FeatureELPM : SubtargetFeature<"elpm", "m_hasELPM", "true",
84                                   "The device supports the ELPM instruction">;
85
86// The device supports the `ELPM Rd, Z[+]` instructions.
87def FeatureELPMX : SubtargetFeature<"elpmx", "m_hasELPMX", "true",
88                                    "The device supports the `ELPM Rd, Z[+]` "
89                                    "instructions">;
90
91// The device supports the `SPM` instruction.
92def FeatureSPM : SubtargetFeature<"spm", "m_hasSPM", "true",
93                                  "The device supports the `SPM` instruction">;
94
95// The device supports the `SPM Z+` instruction.
96def FeatureSPMX : SubtargetFeature<"spmx", "m_hasSPMX", "true",
97                                   "The device supports the `SPM Z+` "
98                                   "instruction">;
99
100// The device supports the `DES k` instruction.
101def FeatureDES : SubtargetFeature<"des", "m_hasDES", "true",
102                                  "The device supports the `DES k` encryption "
103                                  "instruction">;
104
105// The device supports the Read-Write-Modify instructions
106// XCH, LAS, LAC, and LAT.
107def FeatureRMW : SubtargetFeature<"rmw", "m_supportsRMW", "true",
108                                  "The device supports the read-write-modify "
109                                  "instructions: XCH, LAS, LAC, LAT">;
110
111// The device supports the `[F]MUL[S][U]` family of instructions.
112def FeatureMultiplication
113    : SubtargetFeature<"mul", "m_supportsMultiplication", "true",
114                       "The device supports the "
115                       "multiplication instructions">;
116
117// The device supports the `BREAK` instruction.
118def FeatureBREAK : SubtargetFeature<"break", "m_hasBREAK", "true",
119                                    "The device supports the `BREAK` debugging "
120                                    "instruction">;
121
122// The device has instruction encodings specific to the Tiny core.
123def FeatureTinyEncoding
124    : SubtargetFeature<"tinyencoding", "m_hasTinyEncoding", "true",
125                       "The device has Tiny core specific "
126                       "instruction encodings">;
127
128// The device has CPU registers mapped in data address space
129def FeatureMMR : SubtargetFeature<"memmappedregs", "m_hasMemMappedGPR", "true",
130                                  "The device has CPU registers "
131                                  "mapped in data address space">;
132
133class ELFArch<string name>
134    : SubtargetFeature<"", "ELFArch", !strconcat("ELF::", name), "">;
135
136// ELF e_flags architecture values
137def ELFArchAVR1 : ELFArch<"EF_AVR_ARCH_AVR1">;
138def ELFArchAVR2 : ELFArch<"EF_AVR_ARCH_AVR2">;
139def ELFArchAVR25 : ELFArch<"EF_AVR_ARCH_AVR25">;
140def ELFArchAVR3 : ELFArch<"EF_AVR_ARCH_AVR3">;
141def ELFArchAVR31 : ELFArch<"EF_AVR_ARCH_AVR31">;
142def ELFArchAVR35 : ELFArch<"EF_AVR_ARCH_AVR35">;
143def ELFArchAVR4 : ELFArch<"EF_AVR_ARCH_AVR4">;
144def ELFArchAVR5 : ELFArch<"EF_AVR_ARCH_AVR5">;
145def ELFArchAVR51 : ELFArch<"EF_AVR_ARCH_AVR51">;
146def ELFArchAVR6 : ELFArch<"EF_AVR_ARCH_AVR6">;
147def ELFArchTiny : ELFArch<"EF_AVR_ARCH_AVRTINY">;
148def ELFArchXMEGA1 : ELFArch<"EF_AVR_ARCH_XMEGA1">;
149def ELFArchXMEGA2 : ELFArch<"EF_AVR_ARCH_XMEGA2">;
150def ELFArchXMEGA3 : ELFArch<"EF_AVR_ARCH_XMEGA3">;
151def ELFArchXMEGA4 : ELFArch<"EF_AVR_ARCH_XMEGA4">;
152def ELFArchXMEGA5 : ELFArch<"EF_AVR_ARCH_XMEGA5">;
153def ELFArchXMEGA6 : ELFArch<"EF_AVR_ARCH_XMEGA6">;
154def ELFArchXMEGA7 : ELFArch<"EF_AVR_ARCH_XMEGA7">;
155
156//===---------------------------------------------------------------------===//
157// AVR Families
158//===---------------------------------------------------------------------===//
159
160// The device has at least the bare minimum that **every** single AVR
161// device should have.
162def FamilyAVR0 : Family<"avr0", []>;
163
164def FamilyAVR1 : Family<"avr1", [FamilyAVR0, FeatureLPM, FeaturePROGMEM, FeatureMMR]>;
165
166def FamilyAVR2
167    : Family<"avr2",
168             [FamilyAVR1, FeatureIJMPCALL, FeatureADDSUBIW, FeatureSRAM]>;
169
170def FamilyAVR25
171    : Family<"avr25",
172             [FamilyAVR2, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureBREAK]>;
173
174def FamilyAVR3 : Family<"avr3", [FamilyAVR2, FeatureJMPCALL]>;
175
176def FamilyAVR31 : Family<"avr31", [FamilyAVR3, FeatureELPM]>;
177
178def FamilyAVR35
179    : Family<"avr35",
180             [FamilyAVR3, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureBREAK]>;
181
182def FamilyAVR4 : Family<"avr4",
183                        [FamilyAVR2, FeatureMultiplication, FeatureMOVW,
184                         FeatureLPMX, FeatureSPM, FeatureBREAK]>;
185
186def FamilyAVR5 : Family<"avr5",
187                        [FamilyAVR3, FeatureMultiplication, FeatureMOVW,
188                         FeatureLPMX, FeatureSPM, FeatureBREAK]>;
189
190def FamilyAVR51 : Family<"avr51", [FamilyAVR5, FeatureELPM, FeatureELPMX]>;
191
192def FamilyAVR6 : Family<"avr6", [FamilyAVR51, FeatureEIJMPCALL]>;
193
194def FamilyTiny
195    : Family<"avrtiny",
196             [FamilyAVR0, FeatureBREAK, FeatureSRAM, FeatureTinyEncoding,
197              FeatureSmallStack]>;
198
199def FamilyXMEGA3 : Family<"xmega3",
200                          [FamilyAVR0, FeatureLPM, FeaturePROGMEM, FeatureIJMPCALL,
201                           FeatureADDSUBIW, FeatureSRAM, FeatureJMPCALL,
202                           FeatureMultiplication, FeatureMOVW, FeatureLPMX,
203                           FeatureBREAK]>;
204
205def FamilyXMEGA : Family<"xmega",
206                         [FamilyAVR0, FeatureLPM, FeaturePROGMEM, FeatureIJMPCALL,
207                          FeatureADDSUBIW, FeatureSRAM, FeatureJMPCALL,
208                          FeatureMultiplication, FeatureMOVW, FeatureLPMX,
209                          FeatureSPM, FeatureBREAK, FeatureEIJMPCALL,
210                          FeatureSPMX, FeatureDES, FeatureELPM, FeatureELPMX]>;
211
212def FamilyXMEGAU : Family<"xmegau", [FamilyXMEGA, FeatureRMW]>;
213
214def FeatureSetSpecial
215    : FeatureSet<"special",
216                 "Enable use of the entire instruction "
217                 "set - used for debugging",
218                 [
219                   FeatureSRAM, FeatureJMPCALL, FeatureIJMPCALL,
220                   FeatureEIJMPCALL, FeatureADDSUBIW, FeatureMOVW, FeatureLPM,
221                   FeatureLPMX, FeatureELPM, FeatureELPMX, FeatureSPM,
222                   FeatureSPMX, FeatureDES, FeatureRMW, FeatureMultiplication,
223                   FeatureBREAK, FeatureMMR
224                 ]>;
225
226//===---------------------------------------------------------------------===//
227// AVR microcontrollers supported.
228//===---------------------------------------------------------------------===//
229
230class Device<string Name, Family Fam, ELFArch Arch,
231             list<SubtargetFeature> ExtraFeatures = []>
232    : Processor<Name, NoItineraries, !listconcat([Fam, Arch], ExtraFeatures)>;
233
234// Generic MCUs
235// Note that several versions of GCC has strange ELF architecture
236// settings for backwards compatibility - see `gas/config/tc-avr.c`
237// in AVR binutils. We do not replicate this.
238def : Device<"avr1", FamilyAVR1, ELFArchAVR1>;
239def : Device<"avr2", FamilyAVR2, ELFArchAVR2>;
240def : Device<"avr25", FamilyAVR25, ELFArchAVR25>;
241def : Device<"avr3", FamilyAVR3, ELFArchAVR3>;
242def : Device<"avr31", FamilyAVR31, ELFArchAVR31>;
243def : Device<"avr35", FamilyAVR35, ELFArchAVR35>;
244def : Device<"avr4", FamilyAVR4, ELFArchAVR4>;
245def : Device<"avr5", FamilyAVR5, ELFArchAVR5>;
246def : Device<"avr51", FamilyAVR51, ELFArchAVR51>;
247def : Device<"avr6", FamilyAVR6, ELFArchAVR6>;
248def : Device<"avrxmega1", FamilyXMEGA, ELFArchXMEGA1>;
249def : Device<"avrxmega2", FamilyXMEGA, ELFArchXMEGA2>;
250def : Device<"avrxmega3", FamilyXMEGA3, ELFArchXMEGA3>;
251def : Device<"avrxmega4", FamilyXMEGA, ELFArchXMEGA4>;
252def : Device<"avrxmega5", FamilyXMEGA, ELFArchXMEGA5>;
253def : Device<"avrxmega6", FamilyXMEGA, ELFArchXMEGA6>;
254def : Device<"avrxmega7", FamilyXMEGA, ELFArchXMEGA7>;
255def : Device<"avrtiny", FamilyTiny, ELFArchTiny>;
256
257// Specific MCUs
258// NOTE: This list has been synchronized with gcc-avr 5.4.0 and avr-libc 2.0.0.
259def : Device<"at90s1200", FamilyAVR0, ELFArchAVR1, [FeatureSmallStack]>;
260def : Device<"attiny11", FamilyAVR1, ELFArchAVR1, [FeatureSmallStack]>;
261def : Device<"attiny12", FamilyAVR1, ELFArchAVR1, [FeatureSmallStack]>;
262def : Device<"attiny15", FamilyAVR1, ELFArchAVR1, [FeatureSmallStack]>;
263def : Device<"attiny28", FamilyAVR1, ELFArchAVR1, [FeatureSmallStack]>;
264def : Device<"at90s2313", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
265def : Device<"at90s2323", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
266def : Device<"at90s2333", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
267def : Device<"at90s2343", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
268def : Device<"attiny22", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
269def : Device<"attiny26", FamilyAVR2, ELFArchAVR2,
270             [FeatureLPMX, FeatureSmallStack]>;
271def : Device<"at86rf401", FamilyAVR2, ELFArchAVR25, [FeatureMOVW, FeatureLPMX]>;
272def : Device<"at90s4414", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
273def : Device<"at90s4433", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
274def : Device<"at90s4434", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
275def : Device<"at90s8515", FamilyAVR2, ELFArchAVR2>;
276def : Device<"at90c8534", FamilyAVR2, ELFArchAVR2>;
277def : Device<"at90s8535", FamilyAVR2, ELFArchAVR2>;
278def : Device<"ata5272", FamilyAVR25, ELFArchAVR25>;
279def : Device<"ata6616c", FamilyAVR25, ELFArchAVR25>;
280def : Device<"attiny13", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
281def : Device<"attiny13a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
282def : Device<"attiny2313", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
283def : Device<"attiny2313a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
284def : Device<"attiny24", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
285def : Device<"attiny24a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
286def : Device<"attiny4313", FamilyAVR25, ELFArchAVR25>;
287def : Device<"attiny44", FamilyAVR25, ELFArchAVR25>;
288def : Device<"attiny44a", FamilyAVR25, ELFArchAVR25>;
289def : Device<"attiny84", FamilyAVR25, ELFArchAVR25>;
290def : Device<"attiny84a", FamilyAVR25, ELFArchAVR25>;
291def : Device<"attiny25", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
292def : Device<"attiny45", FamilyAVR25, ELFArchAVR25>;
293def : Device<"attiny85", FamilyAVR25, ELFArchAVR25>;
294def : Device<"attiny261", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
295def : Device<"attiny261a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
296def : Device<"attiny441", FamilyAVR25, ELFArchAVR25>;
297def : Device<"attiny461", FamilyAVR25, ELFArchAVR25>;
298def : Device<"attiny461a", FamilyAVR25, ELFArchAVR25>;
299def : Device<"attiny841", FamilyAVR25, ELFArchAVR25>;
300def : Device<"attiny861", FamilyAVR25, ELFArchAVR25>;
301def : Device<"attiny861a", FamilyAVR25, ELFArchAVR25>;
302def : Device<"attiny87", FamilyAVR25, ELFArchAVR25>;
303def : Device<"attiny43u", FamilyAVR25, ELFArchAVR25>;
304def : Device<"attiny48", FamilyAVR25, ELFArchAVR25>;
305def : Device<"attiny88", FamilyAVR25, ELFArchAVR25>;
306def : Device<"attiny828", FamilyAVR25, ELFArchAVR25>;
307def : Device<"at43usb355", FamilyAVR3, ELFArchAVR3>;
308def : Device<"at76c711", FamilyAVR3, ELFArchAVR3>;
309def : Device<"atmega103", FamilyAVR31, ELFArchAVR31>;
310def : Device<"at43usb320", FamilyAVR31, ELFArchAVR31>;
311def : Device<"attiny167", FamilyAVR35, ELFArchAVR35>;
312def : Device<"at90usb82", FamilyAVR35, ELFArchAVR35>;
313def : Device<"at90usb162", FamilyAVR35, ELFArchAVR35>;
314def : Device<"ata5505", FamilyAVR35, ELFArchAVR35>;
315def : Device<"ata6617c", FamilyAVR35, ELFArchAVR35>;
316def : Device<"ata664251", FamilyAVR35, ELFArchAVR35>;
317def : Device<"atmega8u2", FamilyAVR35, ELFArchAVR35>;
318def : Device<"atmega16u2", FamilyAVR35, ELFArchAVR35>;
319def : Device<"atmega32u2", FamilyAVR35, ELFArchAVR35>;
320def : Device<"attiny1634", FamilyAVR35, ELFArchAVR35>;
321def : Device<"atmega8", FamilyAVR2, ELFArchAVR4,
322             [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
323def : Device<"ata6289", FamilyAVR4, ELFArchAVR4>;
324def : Device<"atmega8a", FamilyAVR2, ELFArchAVR4,
325             [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
326def : Device<"ata6285", FamilyAVR4, ELFArchAVR4>;
327def : Device<"ata6286", FamilyAVR4, ELFArchAVR4>;
328def : Device<"ata6612c", FamilyAVR4, ELFArchAVR4>;
329def : Device<"atmega48", FamilyAVR4, ELFArchAVR4>;
330def : Device<"atmega48a", FamilyAVR4, ELFArchAVR4>;
331def : Device<"atmega48pa", FamilyAVR4, ELFArchAVR4>;
332def : Device<"atmega48pb", FamilyAVR4, ELFArchAVR4>;
333def : Device<"atmega48p", FamilyAVR4, ELFArchAVR4>;
334def : Device<"atmega88", FamilyAVR4, ELFArchAVR4>;
335def : Device<"atmega88a", FamilyAVR4, ELFArchAVR4>;
336def : Device<"atmega88p", FamilyAVR4, ELFArchAVR4>;
337def : Device<"atmega88pa", FamilyAVR4, ELFArchAVR4>;
338def : Device<"atmega88pb", FamilyAVR4, ELFArchAVR4>;
339def : Device<"atmega8515", FamilyAVR2, ELFArchAVR4,
340             [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
341def : Device<"atmega8535", FamilyAVR2, ELFArchAVR4,
342             [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
343def : Device<"atmega8hva", FamilyAVR4, ELFArchAVR4>;
344def : Device<"at90pwm1", FamilyAVR4, ELFArchAVR4>;
345def : Device<"at90pwm2", FamilyAVR4, ELFArchAVR4>;
346def : Device<"at90pwm2b", FamilyAVR4, ELFArchAVR4>;
347def : Device<"at90pwm3", FamilyAVR4, ELFArchAVR4>;
348def : Device<"at90pwm3b", FamilyAVR4, ELFArchAVR4>;
349def : Device<"at90pwm81", FamilyAVR4, ELFArchAVR4>;
350def : Device<"ata5702m322", FamilyAVR5, ELFArchAVR5>;
351def : Device<"ata5782", FamilyAVR5, ELFArchAVR5>;
352def : Device<"ata5790", FamilyAVR5, ELFArchAVR5>;
353def : Device<"ata5790n", FamilyAVR5, ELFArchAVR5>;
354def : Device<"ata5791", FamilyAVR5, ELFArchAVR5>;
355def : Device<"ata5795", FamilyAVR5, ELFArchAVR5>;
356def : Device<"ata5831", FamilyAVR5, ELFArchAVR5>;
357def : Device<"ata6613c", FamilyAVR5, ELFArchAVR5>;
358def : Device<"ata6614q", FamilyAVR5, ELFArchAVR5>;
359def : Device<"ata8210", FamilyAVR5, ELFArchAVR5>;
360def : Device<"ata8510", FamilyAVR5, ELFArchAVR5>;
361def : Device<"atmega16", FamilyAVR5, ELFArchAVR5>;
362def : Device<"atmega16a", FamilyAVR5, ELFArchAVR5>;
363def : Device<"atmega161", FamilyAVR3, ELFArchAVR5,
364             [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
365def : Device<"atmega162", FamilyAVR5, ELFArchAVR5>;
366def : Device<"atmega163", FamilyAVR3, ELFArchAVR5,
367             [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
368def : Device<"atmega164a", FamilyAVR5, ELFArchAVR5>;
369def : Device<"atmega164p", FamilyAVR5, ELFArchAVR5>;
370def : Device<"atmega164pa", FamilyAVR5, ELFArchAVR5>;
371def : Device<"atmega165", FamilyAVR5, ELFArchAVR5>;
372def : Device<"atmega165a", FamilyAVR5, ELFArchAVR5>;
373def : Device<"atmega165p", FamilyAVR5, ELFArchAVR5>;
374def : Device<"atmega165pa", FamilyAVR5, ELFArchAVR5>;
375def : Device<"atmega168", FamilyAVR5, ELFArchAVR5>;
376def : Device<"atmega168a", FamilyAVR5, ELFArchAVR5>;
377def : Device<"atmega168p", FamilyAVR5, ELFArchAVR5>;
378def : Device<"atmega168pa", FamilyAVR5, ELFArchAVR5>;
379def : Device<"atmega168pb", FamilyAVR5, ELFArchAVR5>;
380def : Device<"atmega169", FamilyAVR5, ELFArchAVR5>;
381def : Device<"atmega169a", FamilyAVR5, ELFArchAVR5>;
382def : Device<"atmega169p", FamilyAVR5, ELFArchAVR5>;
383def : Device<"atmega169pa", FamilyAVR5, ELFArchAVR5>;
384def : Device<"atmega32", FamilyAVR5, ELFArchAVR5>;
385def : Device<"atmega32a", FamilyAVR5, ELFArchAVR5>;
386def : Device<"atmega323", FamilyAVR5, ELFArchAVR5>;
387def : Device<"atmega324a", FamilyAVR5, ELFArchAVR5>;
388def : Device<"atmega324p", FamilyAVR5, ELFArchAVR5>;
389def : Device<"atmega324pa", FamilyAVR5, ELFArchAVR5>;
390def : Device<"atmega324pb", FamilyAVR5, ELFArchAVR5>;
391def : Device<"atmega325", FamilyAVR5, ELFArchAVR5>;
392def : Device<"atmega325a", FamilyAVR5, ELFArchAVR5>;
393def : Device<"atmega325p", FamilyAVR5, ELFArchAVR5>;
394def : Device<"atmega325pa", FamilyAVR5, ELFArchAVR5>;
395def : Device<"atmega3250", FamilyAVR5, ELFArchAVR5>;
396def : Device<"atmega3250a", FamilyAVR5, ELFArchAVR5>;
397def : Device<"atmega3250p", FamilyAVR5, ELFArchAVR5>;
398def : Device<"atmega3250pa", FamilyAVR5, ELFArchAVR5>;
399def : Device<"atmega328", FamilyAVR5, ELFArchAVR5>;
400def : Device<"atmega328p", FamilyAVR5, ELFArchAVR5>;
401def : Device<"atmega328pb", FamilyAVR5, ELFArchAVR5>;
402def : Device<"atmega329", FamilyAVR5, ELFArchAVR5>;
403def : Device<"atmega329a", FamilyAVR5, ELFArchAVR5>;
404def : Device<"atmega329p", FamilyAVR5, ELFArchAVR5>;
405def : Device<"atmega329pa", FamilyAVR5, ELFArchAVR5>;
406def : Device<"atmega3290", FamilyAVR5, ELFArchAVR5>;
407def : Device<"atmega3290a", FamilyAVR5, ELFArchAVR5>;
408def : Device<"atmega3290p", FamilyAVR5, ELFArchAVR5>;
409def : Device<"atmega3290pa", FamilyAVR5, ELFArchAVR5>;
410def : Device<"atmega406", FamilyAVR5, ELFArchAVR5>;
411def : Device<"atmega64", FamilyAVR5, ELFArchAVR5>;
412def : Device<"atmega64a", FamilyAVR5, ELFArchAVR5>;
413def : Device<"atmega640", FamilyAVR5, ELFArchAVR5>;
414def : Device<"atmega644", FamilyAVR5, ELFArchAVR5>;
415def : Device<"atmega644a", FamilyAVR5, ELFArchAVR5>;
416def : Device<"atmega644p", FamilyAVR5, ELFArchAVR5>;
417def : Device<"atmega644pa", FamilyAVR5, ELFArchAVR5>;
418def : Device<"atmega645", FamilyAVR5, ELFArchAVR5>;
419def : Device<"atmega645a", FamilyAVR5, ELFArchAVR5>;
420def : Device<"atmega645p", FamilyAVR5, ELFArchAVR5>;
421def : Device<"atmega649", FamilyAVR5, ELFArchAVR5>;
422def : Device<"atmega649a", FamilyAVR5, ELFArchAVR5>;
423def : Device<"atmega649p", FamilyAVR5, ELFArchAVR5>;
424def : Device<"atmega6450", FamilyAVR5, ELFArchAVR5>;
425def : Device<"atmega6450a", FamilyAVR5, ELFArchAVR5>;
426def : Device<"atmega6450p", FamilyAVR5, ELFArchAVR5>;
427def : Device<"atmega6490", FamilyAVR5, ELFArchAVR5>;
428def : Device<"atmega6490a", FamilyAVR5, ELFArchAVR5>;
429def : Device<"atmega6490p", FamilyAVR5, ELFArchAVR5>;
430def : Device<"atmega64rfr2", FamilyAVR5, ELFArchAVR5>;
431def : Device<"atmega644rfr2", FamilyAVR5, ELFArchAVR5>;
432def : Device<"atmega16hva", FamilyAVR5, ELFArchAVR5>;
433def : Device<"atmega16hva2", FamilyAVR5, ELFArchAVR5>;
434def : Device<"atmega16hvb", FamilyAVR5, ELFArchAVR5>;
435def : Device<"atmega16hvbrevb", FamilyAVR5, ELFArchAVR5>;
436def : Device<"atmega32hvb", FamilyAVR5, ELFArchAVR5>;
437def : Device<"atmega32hvbrevb", FamilyAVR5, ELFArchAVR5>;
438def : Device<"atmega64hve", FamilyAVR5, ELFArchAVR5>;
439def : Device<"atmega64hve2", FamilyAVR5, ELFArchAVR5>;
440def : Device<"at90can32", FamilyAVR5, ELFArchAVR5>;
441def : Device<"at90can64", FamilyAVR5, ELFArchAVR5>;
442def : Device<"at90pwm161", FamilyAVR5, ELFArchAVR5>;
443def : Device<"at90pwm216", FamilyAVR5, ELFArchAVR5>;
444def : Device<"at90pwm316", FamilyAVR5, ELFArchAVR5>;
445def : Device<"atmega32c1", FamilyAVR5, ELFArchAVR5>;
446def : Device<"atmega64c1", FamilyAVR5, ELFArchAVR5>;
447def : Device<"atmega16m1", FamilyAVR5, ELFArchAVR5>;
448def : Device<"atmega32m1", FamilyAVR5, ELFArchAVR5>;
449def : Device<"atmega64m1", FamilyAVR5, ELFArchAVR5>;
450def : Device<"atmega16u4", FamilyAVR5, ELFArchAVR5>;
451def : Device<"atmega32u4", FamilyAVR5, ELFArchAVR5>;
452def : Device<"atmega32u6", FamilyAVR5, ELFArchAVR5>;
453def : Device<"at90usb646", FamilyAVR5, ELFArchAVR5>;
454def : Device<"at90usb647", FamilyAVR5, ELFArchAVR5>;
455def : Device<"at90scr100", FamilyAVR5, ELFArchAVR5>;
456def : Device<"at94k", FamilyAVR3, ELFArchAVR5,
457             [FeatureMultiplication, FeatureMOVW, FeatureLPMX]>;
458def : Device<"m3000", FamilyAVR5, ELFArchAVR5>;
459def : Device<"atmega128", FamilyAVR51, ELFArchAVR51>;
460def : Device<"atmega128a", FamilyAVR51, ELFArchAVR51>;
461def : Device<"atmega1280", FamilyAVR51, ELFArchAVR51>;
462def : Device<"atmega1281", FamilyAVR51, ELFArchAVR51>;
463def : Device<"atmega1284", FamilyAVR51, ELFArchAVR51>;
464def : Device<"atmega1284p", FamilyAVR51, ELFArchAVR51>;
465def : Device<"atmega128rfa1", FamilyAVR51, ELFArchAVR51>;
466def : Device<"atmega128rfr2", FamilyAVR51, ELFArchAVR51>;
467def : Device<"atmega1284rfr2", FamilyAVR51, ELFArchAVR51>;
468def : Device<"at90can128", FamilyAVR51, ELFArchAVR51>;
469def : Device<"at90usb1286", FamilyAVR51, ELFArchAVR51>;
470def : Device<"at90usb1287", FamilyAVR51, ELFArchAVR51>;
471def : Device<"atmega2560", FamilyAVR6, ELFArchAVR6>;
472def : Device<"atmega2561", FamilyAVR6, ELFArchAVR6>;
473def : Device<"atmega256rfr2", FamilyAVR6, ELFArchAVR6>;
474def : Device<"atmega2564rfr2", FamilyAVR6, ELFArchAVR6>;
475def : Device<"atxmega16a4", FamilyXMEGA, ELFArchXMEGA2>;
476def : Device<"atxmega16a4u", FamilyXMEGAU, ELFArchXMEGA2>;
477def : Device<"atxmega16c4", FamilyXMEGAU, ELFArchXMEGA2>;
478def : Device<"atxmega16d4", FamilyXMEGA, ELFArchXMEGA2>;
479def : Device<"atxmega32a4", FamilyXMEGA, ELFArchXMEGA2>;
480def : Device<"atxmega32a4u", FamilyXMEGAU, ELFArchXMEGA2>;
481def : Device<"atxmega32c3", FamilyXMEGAU, ELFArchXMEGA2>;
482def : Device<"atxmega32c4", FamilyXMEGAU, ELFArchXMEGA2>;
483def : Device<"atxmega32d3", FamilyXMEGA, ELFArchXMEGA2>;
484def : Device<"atxmega32d4", FamilyXMEGA, ELFArchXMEGA2>;
485def : Device<"atxmega32e5", FamilyXMEGAU, ELFArchXMEGA2>;
486def : Device<"atxmega16e5", FamilyXMEGAU, ELFArchXMEGA2>;
487def : Device<"atxmega8e5", FamilyXMEGAU, ELFArchXMEGA2>;
488def : Device<"atxmega64a3", FamilyXMEGA, ELFArchXMEGA4>;
489def : Device<"atxmega64a3u", FamilyXMEGAU, ELFArchXMEGA4>;
490def : Device<"atxmega64a4u", FamilyXMEGAU, ELFArchXMEGA4>;
491def : Device<"atxmega64b1", FamilyXMEGAU, ELFArchXMEGA4>;
492def : Device<"atxmega64b3", FamilyXMEGAU, ELFArchXMEGA4>;
493def : Device<"atxmega64c3", FamilyXMEGAU, ELFArchXMEGA4>;
494def : Device<"atxmega64d3", FamilyXMEGA, ELFArchXMEGA4>;
495def : Device<"atxmega64d4", FamilyXMEGA, ELFArchXMEGA4>;
496def : Device<"atxmega64a1", FamilyXMEGA, ELFArchXMEGA5>;
497def : Device<"atxmega64a1u", FamilyXMEGAU, ELFArchXMEGA5>;
498def : Device<"atxmega128a3", FamilyXMEGA, ELFArchXMEGA6>;
499def : Device<"atxmega128a3u", FamilyXMEGAU, ELFArchXMEGA6>;
500def : Device<"atxmega128b1", FamilyXMEGAU, ELFArchXMEGA6>;
501def : Device<"atxmega128b3", FamilyXMEGAU, ELFArchXMEGA6>;
502def : Device<"atxmega128c3", FamilyXMEGAU, ELFArchXMEGA6>;
503def : Device<"atxmega128d3", FamilyXMEGA, ELFArchXMEGA6>;
504def : Device<"atxmega128d4", FamilyXMEGA, ELFArchXMEGA6>;
505def : Device<"atxmega192a3", FamilyXMEGA, ELFArchXMEGA6>;
506def : Device<"atxmega192a3u", FamilyXMEGAU, ELFArchXMEGA6>;
507def : Device<"atxmega192c3", FamilyXMEGAU, ELFArchXMEGA6>;
508def : Device<"atxmega192d3", FamilyXMEGA, ELFArchXMEGA6>;
509def : Device<"atxmega256a3", FamilyXMEGA, ELFArchXMEGA6>;
510def : Device<"atxmega256a3u", FamilyXMEGAU, ELFArchXMEGA6>;
511def : Device<"atxmega256a3b", FamilyXMEGA, ELFArchXMEGA6>;
512def : Device<"atxmega256a3bu", FamilyXMEGAU, ELFArchXMEGA6>;
513def : Device<"atxmega256c3", FamilyXMEGAU, ELFArchXMEGA6>;
514def : Device<"atxmega256d3", FamilyXMEGA, ELFArchXMEGA6>;
515def : Device<"atxmega384c3", FamilyXMEGAU, ELFArchXMEGA6>;
516def : Device<"atxmega384d3", FamilyXMEGA, ELFArchXMEGA6>;
517def : Device<"atxmega128a1", FamilyXMEGA, ELFArchXMEGA7>;
518def : Device<"atxmega128a1u", FamilyXMEGAU, ELFArchXMEGA7>;
519def : Device<"atxmega128a4u", FamilyXMEGAU, ELFArchXMEGA7>;
520def : Device<"attiny4", FamilyTiny, ELFArchTiny>;
521def : Device<"attiny5", FamilyTiny, ELFArchTiny>;
522def : Device<"attiny9", FamilyTiny, ELFArchTiny>;
523def : Device<"attiny10", FamilyTiny, ELFArchTiny>;
524def : Device<"attiny20", FamilyTiny, ELFArchTiny>;
525def : Device<"attiny40", FamilyTiny, ELFArchTiny>;
526def : Device<"attiny102", FamilyTiny, ELFArchTiny>;
527def : Device<"attiny104", FamilyTiny, ELFArchTiny>;
528def : Device<"attiny202", FamilyXMEGA3, ELFArchXMEGA3>;
529def : Device<"attiny402", FamilyXMEGA3, ELFArchXMEGA3>;
530def : Device<"attiny204", FamilyXMEGA3, ELFArchXMEGA3>;
531def : Device<"attiny404", FamilyXMEGA3, ELFArchXMEGA3>;
532def : Device<"attiny804", FamilyXMEGA3, ELFArchXMEGA3>;
533def : Device<"attiny1604", FamilyXMEGA3, ELFArchXMEGA3>;
534def : Device<"attiny406", FamilyXMEGA3, ELFArchXMEGA3>;
535def : Device<"attiny806", FamilyXMEGA3, ELFArchXMEGA3>;
536def : Device<"attiny1606", FamilyXMEGA3, ELFArchXMEGA3>;
537def : Device<"attiny807", FamilyXMEGA3, ELFArchXMEGA3>;
538def : Device<"attiny1607", FamilyXMEGA3, ELFArchXMEGA3>;
539def : Device<"attiny212", FamilyXMEGA3, ELFArchXMEGA3>;
540def : Device<"attiny412", FamilyXMEGA3, ELFArchXMEGA3>;
541def : Device<"attiny214", FamilyXMEGA3, ELFArchXMEGA3>;
542def : Device<"attiny414", FamilyXMEGA3, ELFArchXMEGA3>;
543def : Device<"attiny814", FamilyXMEGA3, ELFArchXMEGA3>;
544def : Device<"attiny1614", FamilyXMEGA3, ELFArchXMEGA3>;
545def : Device<"attiny416", FamilyXMEGA3, ELFArchXMEGA3>;
546def : Device<"attiny816", FamilyXMEGA3, ELFArchXMEGA3>;
547def : Device<"attiny1616", FamilyXMEGA3, ELFArchXMEGA3>;
548def : Device<"attiny3216", FamilyXMEGA3, ELFArchXMEGA3>;
549def : Device<"attiny417", FamilyXMEGA3, ELFArchXMEGA3>;
550def : Device<"attiny817", FamilyXMEGA3, ELFArchXMEGA3>;
551def : Device<"attiny1617", FamilyXMEGA3, ELFArchXMEGA3>;
552def : Device<"attiny3217", FamilyXMEGA3, ELFArchXMEGA3>;
553def : Device<"attiny1624", FamilyXMEGA3, ELFArchXMEGA3>;
554def : Device<"attiny1626", FamilyXMEGA3, ELFArchXMEGA3>;
555def : Device<"attiny1627", FamilyXMEGA3, ELFArchXMEGA3>;
556def : Device<"atmega808", FamilyXMEGA3, ELFArchXMEGA3>;
557def : Device<"atmega809", FamilyXMEGA3, ELFArchXMEGA3>;
558def : Device<"atmega1608", FamilyXMEGA3, ELFArchXMEGA3>;
559def : Device<"atmega1609", FamilyXMEGA3, ELFArchXMEGA3>;
560def : Device<"atmega3208", FamilyXMEGA3, ELFArchXMEGA3>;
561def : Device<"atmega3209", FamilyXMEGA3, ELFArchXMEGA3>;
562def : Device<"atmega4808", FamilyXMEGA3, ELFArchXMEGA3>;
563def : Device<"atmega4809", FamilyXMEGA3, ELFArchXMEGA3>;
564