1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Add AVR.td and AVRRegisterInfo.td

Summary:
This adds the core AVR TableGen file, along with the register descriptions.

Lines in AVR.td which require other TableGen files which haven't been committed
yet are commented out.

This is a fairly trivial patch, and should only require a quick review.

I kept the line width smaller than 80 columns, but there are a few exceptions
because I'm not sure how to split a string over several lines.

Reviewers: stoklund

Subscribers: dylanmckay, agnat

Differential Revision: http://reviews.llvm.org/D14684

llvm-svn: 256120
This commit is contained in:
Dylan McKay 2015-12-20 12:16:20 +00:00
parent ff8004bbec
commit f28a05c29f
4 changed files with 783 additions and 1 deletions

563
lib/Target/AVR/AVR.td Normal file
View File

@ -0,0 +1,563 @@
//===-- AVR.td - Describe the AVR Target Machine ----------*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===---------------------------------------------------------------------===//
// This is the top level entry point for the AVR target.
//===---------------------------------------------------------------------===//
//===---------------------------------------------------------------------===//
// Target-independent interfaces which we are implementing
//===---------------------------------------------------------------------===//
include "llvm/Target/Target.td"
//===---------------------------------------------------------------------===//
// AVR Subtarget Features.
//===---------------------------------------------------------------------===//
// :TODO: Implement the skip errata, see `gcc/config/avr/avr-arch.h` for details
// :TODO: We define all devices with SRAM to have all variants of LD/ST/LDD/STD.
// In reality, avr1 (no SRAM) has one variant each of `LD` and `ST`.
// avr2 (with SRAM) adds the rest of the variants.
// :TODO: s/AVRTiny/Tiny
// A feature set aggregates features, grouping them. We don't want to create a
// new member in AVRSubtarget (to store a value) for each set because we do not
// care if the set is supported, only the subfeatures inside the set. We fix
// this by simply setting the same dummy member for all feature sets, which is
// then ignored.
class FeatureSet<string name, string desc, list<SubtargetFeature> i>
: SubtargetFeature<name, "m_FeatureSetDummy", "true", desc, i>;
// A family of microcontrollers, defining a set of supported features.
class Family<string name, list<SubtargetFeature> i>
: FeatureSet<name, !strconcat("The device is a part of the ",
name, " family"), i>;
// The device has SRAM, and supports the bare minimum of
// SRAM-relevant instructions.
//
// These are:
// LD - all 9 variants
// ST - all 9 variants
// LDD - two variants for Y and Z
// STD - two variants for Y and Z
// `LDS Rd, K`
// `STS k, Rr`
// `PUSH`/`POP`
def FeatureSRAM : SubtargetFeature<"sram", "m_hasSRAM", "true",
"The device has random access memory">;
// The device supports the `JMP k` and `CALL k` instructions.
def FeatureJMPCALL : SubtargetFeature<"jmpcall", "m_hasJMPCALL", "true",
"The device supports the `JMP` and "
"`CALL` instructions">;
// The device supports the indirect branches `IJMP` and `ICALL`.
def FeatureIJMPCALL : SubtargetFeature<"ijmpcall", "m_hasIJMPCALL",
"true",
"The device supports `IJMP`/`ICALL`"
"instructions">;
// The device supports the extended indirect branches `EIJMP` and `EICALL`.
def FeatureEIJMPCALL : SubtargetFeature<"eijmpcall", "m_hasEIJMPCALL",
"true", "The device supports the "
"`EIJMP`/`EICALL` instructions">;
// The device supports `ADDI Rd, K`, `SUBI Rd, K`.
def FeatureADDSUBIW : SubtargetFeature<"addsubiw", "m_hasADDSUBIW",
"true", "Enable 16-bit register-immediate "
"addition and subtraction instructions">;
// The device has an 8-bit stack pointer (SP) register.
def FeatureSmallStack : SubtargetFeature<"smallstack", "m_hasSmallStack",
"true", "The device has an 8-bit "
"stack pointer">;
// The device supports the 16-bit GPR pair MOVW instruction.
def FeatureMOVW : SubtargetFeature<"movw", "m_hasMOVW", "true",
"The device supports the 16-bit MOVW "
"instruction">;
// The device supports the `LPM` instruction, with implied destination being r0.
def FeatureLPM : SubtargetFeature<"lpm", "m_hasLPM", "true",
"The device supports the `LPM` instruction">;
// The device supports the `LPM Rd, Z[+] instruction.
def FeatureLPMX : SubtargetFeature<"lpmx", "m_hasLPMX", "true",
"The device supports the `LPM Rd, Z[+]` "
"instruction">;
// The device supports the `ELPM` instruction.
def FeatureELPM : SubtargetFeature<"elpm", "m_hasELPM", "true",
"The device supports the ELPM instruction">;
// The device supports the `ELPM Rd, Z[+]` instructions.
def FeatureELPMX : SubtargetFeature<"elpmx", "m_hasELPMX", "true",
"The device supports the `ELPM Rd, Z[+]` "
"instructions">;
// The device supports the `SPM` instruction.
def FeatureSPM : SubtargetFeature<"spm", "m_hasSPM", "true",
"The device supports the `SPM` instruction">;
// The device supports the `SPM Z+` instruction.
def FeatureSPMX : SubtargetFeature<"spmx", "m_hasSPMX", "true",
"The device supports the `SPM Z+` "
"instruction">;
// The device supports the `DES k` instruction.
def FeatureDES : SubtargetFeature<"des", "m_hasDES", "true",
"The device supports the `DES k` encryption "
"instruction">;
// The device supports the Read-Write-Modify instructions
// XCH, LAS, LAC, and LAT.
def FeatureRMW : SubtargetFeature<"rmw", "m_supportsRMW", "true",
"The device supports the read-write-modify "
"instructions: XCH, LAS, LAC, LAT">;
// The device supports the `[F]MUL[S][U]` family of instructions.
def FeatureMultiplication : SubtargetFeature<"mul", "m_supportsMultiplication",
"true", "The device supports the "
"multiplication instructions">;
// The device supports the `BREAK` instruction.
def FeatureBREAK : SubtargetFeature<"break", "m_hasBREAK", "true",
"The device supports the `BREAK` debugging "
"instruction">;
// The device has instruction encodings specific to the Tiny core.
def FeatureTinyEncoding : SubtargetFeature<"tinyencoding",
"m_hasTinyEncoding", "true",
"The device has Tiny core specific "
"instruction encodings">;
class ELFArch<string name> : SubtargetFeature<"", "ELFArch",
!strconcat("ELF::",name), "">;
// ELF e_flags architecture values
def ELFArchAVR1 : ELFArch<"EF_AVR_ARCH_AVR1">;
def ELFArchAVR2 : ELFArch<"EF_AVR_ARCH_AVR2">;
def ELFArchAVR25 : ELFArch<"EF_AVR_ARCH_AVR25">;
def ELFArchAVR3 : ELFArch<"EF_AVR_ARCH_AVR3">;
def ELFArchAVR31 : ELFArch<"EF_AVR_ARCH_AVR31">;
def ELFArchAVR35 : ELFArch<"EF_AVR_ARCH_AVR35">;
def ELFArchAVR4 : ELFArch<"EF_AVR_ARCH_AVR4">;
def ELFArchAVR5 : ELFArch<"EF_AVR_ARCH_AVR5">;
def ELFArchAVR51 : ELFArch<"EF_AVR_ARCH_AVR51">;
def ELFArchAVR6 : ELFArch<"EF_AVR_ARCH_AVR6">;
def ELFArchAVRTiny : ELFArch<"EF_AVR_ARCH_AVRTINY">;
def ELFArchXMEGA1 : ELFArch<"EF_AVR_ARCH_XMEGA1">;
def ELFArchXMEGA2 : ELFArch<"EF_AVR_ARCH_XMEGA2">;
def ELFArchXMEGA3 : ELFArch<"EF_AVR_ARCH_XMEGA3">;
def ELFArchXMEGA4 : ELFArch<"EF_AVR_ARCH_XMEGA4">;
def ELFArchXMEGA5 : ELFArch<"EF_AVR_ARCH_XMEGA5">;
def ELFArchXMEGA6 : ELFArch<"EF_AVR_ARCH_XMEGA6">;
def ELFArchXMEGA7 : ELFArch<"EF_AVR_ARCH_XMEGA7">;
//===---------------------------------------------------------------------===//
// AVR Families
//===---------------------------------------------------------------------===//
// The device has at least the bare minimum that **every** single AVR
// device should have.
def FamilyAVR0 : Family<"avr0", []>;
def FamilyAVR1 : Family<"avr1", [FamilyAVR0, FeatureLPM]>;
def FamilyAVR2 : Family<"avr2",
[FamilyAVR1, FeatureIJMPCALL, FeatureADDSUBIW,
FeatureSRAM]>;
def FamilyAVR25 : Family<"avr25",
[FamilyAVR2, FeatureMOVW, FeatureLPMX,
FeatureSPM, FeatureBREAK]>;
def FamilyAVR3 : Family<"avr3",
[FamilyAVR2, FeatureJMPCALL]>;
def FamilyAVR31 : Family<"avr31",
[FamilyAVR3, FeatureELPM]>;
def FamilyAVR35 : Family<"avr35",
[FamilyAVR3, FeatureMOVW, FeatureLPMX,
FeatureSPM, FeatureBREAK]>;
def FamilyAVR4 : Family<"avr4",
[FamilyAVR2, FeatureMultiplication,
FeatureMOVW, FeatureLPMX, FeatureSPM,
FeatureBREAK]>;
def FamilyAVR5 : Family<"avr5",
[FamilyAVR3, FeatureMultiplication,
FeatureMOVW, FeatureLPMX, FeatureSPM,
FeatureBREAK]>;
def FamilyAVR51 : Family<"avr51",
[FamilyAVR5, FeatureELPM, FeatureELPMX]>;
def FamilyAVR6 : Family<"avr6",
[FamilyAVR51]>;
def FamilyAVRTiny : Family<"avrtiny",
[FamilyAVR0, FeatureBREAK, FeatureSRAM,
FeatureTinyEncoding]>;
def FamilyXMEGA : Family<"xmega",
[FamilyAVR51, FeatureEIJMPCALL, FeatureSPMX,
FeatureDES]>;
def FamilyXMEGAU : Family<"xmegau",
[FamilyXMEGA, FeatureRMW]>;
def FeatureSetSpecial : FeatureSet<"special",
"Enable use of the entire instruction "
"set - used for debugging",
[FeatureSRAM, FeatureJMPCALL,
FeatureIJMPCALL, FeatureEIJMPCALL,
FeatureADDSUBIW, FeatureMOVW,
FeatureLPM, FeatureLPMX, FeatureELPM,
FeatureELPMX, FeatureSPM, FeatureSPMX,
FeatureDES, FeatureRMW,
FeatureMultiplication, FeatureBREAK]>;
//===---------------------------------------------------------------------===//
// AVR microcontrollers supported.
//===---------------------------------------------------------------------===//
class Device<string Name, Family Fam, ELFArch Arch,
list<SubtargetFeature> ExtraFeatures = []>
: Processor<Name, NoItineraries, !listconcat([Fam,Arch],ExtraFeatures)>;
// Generic MCUs
// Note that several versions of GCC has strange ELF architecture
// settings for backwards compatibility - see `gas/config/tc-avr.c`
// in AVR binutils. We do not replicate this.
def : Device<"avr1", FamilyAVR1, ELFArchAVR1>;
def : Device<"avr2", FamilyAVR2, ELFArchAVR2>;
def : Device<"avr25", FamilyAVR25, ELFArchAVR25>;
def : Device<"avr3", FamilyAVR3, ELFArchAVR3>;
def : Device<"avr31", FamilyAVR31, ELFArchAVR31>;
def : Device<"avr35", FamilyAVR35, ELFArchAVR35>;
def : Device<"avr4", FamilyAVR4, ELFArchAVR4>;
def : Device<"avr5", FamilyAVR5, ELFArchAVR5>;
def : Device<"avr51", FamilyAVR51, ELFArchAVR51>;
def : Device<"avr6", FamilyAVR6, ELFArchAVR6>;
def : Device<"avrxmega1", FamilyXMEGA, ELFArchXMEGA1>;
def : Device<"avrxmega2", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"avrxmega3", FamilyXMEGA, ELFArchXMEGA3>;
def : Device<"avrxmega4", FamilyXMEGA, ELFArchXMEGA4>;
def : Device<"avrxmega5", FamilyXMEGA, ELFArchXMEGA5>;
def : Device<"avrxmega6", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"avrxmega7", FamilyXMEGA, ELFArchXMEGA7>;
def : Device<"avrtiny", FamilyAVRTiny, ELFArchAVRTiny>;
// Specific MCUs
def : Device<"at90s1200", FamilyAVR0, ELFArchAVR1>;
def : Device<"attiny11", FamilyAVR1, ELFArchAVR1>;
def : Device<"attiny12", FamilyAVR1, ELFArchAVR1>;
def : Device<"attiny15", FamilyAVR1, ELFArchAVR1>;
def : Device<"attiny28", FamilyAVR1, ELFArchAVR1>;
def : Device<"at90s2313", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s2323", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s2333", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s2343", FamilyAVR2, ELFArchAVR2>;
def : Device<"attiny22", FamilyAVR2, ELFArchAVR2>;
def : Device<"attiny26", FamilyAVR2, ELFArchAVR2, [FeatureLPMX]>;
def : Device<"at86rf401", FamilyAVR2, ELFArchAVR25,
[FeatureMOVW, FeatureLPMX]>;
def : Device<"at90s4414", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s4433", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s4434", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s8515", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90c8534", FamilyAVR2, ELFArchAVR2>;
def : Device<"at90s8535", FamilyAVR2, ELFArchAVR2>;
def : Device<"ata5272", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny13", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny13a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny2313", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny2313a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny24", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny24a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny4313", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny44", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny44a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny84", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny84a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny25", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny45", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny85", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny261", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny261a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny461", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny461a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny861", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny861a", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny87", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny43u", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny48", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny88", FamilyAVR25, ELFArchAVR25>;
def : Device<"attiny828", FamilyAVR25, ELFArchAVR25>;
def : Device<"at43usb355", FamilyAVR3, ELFArchAVR3>;
def : Device<"at76c711", FamilyAVR3, ELFArchAVR3>;
def : Device<"atmega103", FamilyAVR31, ELFArchAVR31>;
def : Device<"at43usb320", FamilyAVR31, ELFArchAVR31>;
def : Device<"attiny167", FamilyAVR35, ELFArchAVR35>;
def : Device<"at90usb82", FamilyAVR35, ELFArchAVR35>;
def : Device<"at90usb162", FamilyAVR35, ELFArchAVR35>;
def : Device<"ata5505", FamilyAVR35, ELFArchAVR35>;
def : Device<"atmega8u2", FamilyAVR35, ELFArchAVR35>;
def : Device<"atmega16u2", FamilyAVR35, ELFArchAVR35>;
def : Device<"atmega32u2", FamilyAVR35, ELFArchAVR35>;
def : Device<"attiny1634", FamilyAVR35, ELFArchAVR35>;
def : Device<"atmega8", FamilyAVR4, ELFArchAVR4>; // FIXME: family may be wrong
def : Device<"ata6289", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega8a", FamilyAVR4, ELFArchAVR4>;
def : Device<"ata6285", FamilyAVR4, ELFArchAVR4>;
def : Device<"ata6286", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega48", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega48a", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega48pa", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega48p", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega88", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega88a", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega88p", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega88pa", FamilyAVR4, ELFArchAVR4>;
def : Device<"atmega8515", FamilyAVR2, ELFArchAVR4,
[FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
def : Device<"atmega8535", FamilyAVR2, ELFArchAVR4,
[FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
def : Device<"atmega8hva", FamilyAVR4, ELFArchAVR4>;
def : Device<"at90pwm1", FamilyAVR4, ELFArchAVR4>;
def : Device<"at90pwm2", FamilyAVR4, ELFArchAVR4>;
def : Device<"at90pwm2b", FamilyAVR4, ELFArchAVR4>;
def : Device<"at90pwm3", FamilyAVR4, ELFArchAVR4>;
def : Device<"at90pwm3b", FamilyAVR4, ELFArchAVR4>;
def : Device<"at90pwm81", FamilyAVR4, ELFArchAVR4>;
def : Device<"ata5790", FamilyAVR5, ELFArchAVR5>;
def : Device<"ata5795", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega161", FamilyAVR3, ELFArchAVR5,
[FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
def : Device<"atmega162", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega163", FamilyAVR3, ELFArchAVR5,
[FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
def : Device<"atmega164a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega164p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega164pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega165", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega165a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega165p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega165pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega168", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega168a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega168p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega168pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega169", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega169a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega169p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega169pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega323", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega324a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega324p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega324pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega325", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega325a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega325p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega325pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3250", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3250a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3250p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3250pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega328", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega328p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega329", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega329a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega329p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega329pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3290", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3290a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3290p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega3290pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega406", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega64", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega64a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega640", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega644", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega644a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega644p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega644pa", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega645", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega645a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega645p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega649", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega649a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega649p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega6450", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega6450a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega6450p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega6490", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega6490a", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega6490p", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega64rfr2", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega644rfr2", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16hva", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16hva2", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16hvb", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16hvbrevb", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32hvb", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32hvbrevb", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega64hve", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90can32", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90can64", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90pwm161", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90pwm216", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90pwm316", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32c1", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega64c1", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16m1", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32m1", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega64m1", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega16u4", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32u4", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega32u6", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90usb646", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90usb647", FamilyAVR5, ELFArchAVR5>;
def : Device<"at90scr100", FamilyAVR5, ELFArchAVR5>;
def : Device<"at94k", FamilyAVR3, ELFArchAVR5,
[FeatureMultiplication, FeatureMOVW, FeatureLPMX]>;
def : Device<"m3000", FamilyAVR5, ELFArchAVR5>;
def : Device<"atmega128", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega128a", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega1280", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega1281", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega1284", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega1284p", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega128rfa1", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega128rfr2", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega1284rfr2", FamilyAVR51, ELFArchAVR51>;
def : Device<"at90can128", FamilyAVR51, ELFArchAVR51>;
def : Device<"at90usb1286", FamilyAVR51, ELFArchAVR51>;
def : Device<"at90usb1287", FamilyAVR51, ELFArchAVR51>;
def : Device<"atmega2560", FamilyAVR6, ELFArchAVR6>;
def : Device<"atmega2561", FamilyAVR6, ELFArchAVR6>;
def : Device<"atmega256rfr2", FamilyAVR6, ELFArchAVR6>;
def : Device<"atmega2564rfr2", FamilyAVR6, ELFArchAVR6>;
def : Device<"atxmega16a4", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega16a4u", FamilyXMEGAU, ELFArchXMEGA2>;
def : Device<"atxmega16c4", FamilyXMEGAU, ELFArchXMEGA2>;
def : Device<"atxmega16d4", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega32a4", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega32a4u", FamilyXMEGAU, ELFArchXMEGA2>;
def : Device<"atxmega32c4", FamilyXMEGAU, ELFArchXMEGA2>;
def : Device<"atxmega32d4", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega32e5", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega16e5", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega8e5", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega32x1", FamilyXMEGA, ELFArchXMEGA2>;
def : Device<"atxmega64a3", FamilyXMEGA, ELFArchXMEGA4>;
def : Device<"atxmega64a3u", FamilyXMEGAU, ELFArchXMEGA4>;
def : Device<"atxmega64a4u", FamilyXMEGAU, ELFArchXMEGA4>;
def : Device<"atxmega64b1", FamilyXMEGAU, ELFArchXMEGA4>;
def : Device<"atxmega64b3", FamilyXMEGAU, ELFArchXMEGA4>;
def : Device<"atxmega64c3", FamilyXMEGAU, ELFArchXMEGA4>;
def : Device<"atxmega64d3", FamilyXMEGA, ELFArchXMEGA4>;
def : Device<"atxmega64d4", FamilyXMEGA, ELFArchXMEGA4>;
def : Device<"atxmega64a1", FamilyXMEGA, ELFArchXMEGA5>;
def : Device<"atxmega64a1u", FamilyXMEGAU, ELFArchXMEGA5>;
def : Device<"atxmega128a3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega128a3u", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega128b1", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega128b3", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega128c3", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega128d3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega128d4", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega192a3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega192a3u", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega192c3", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega192d3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega256a3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega256a3u", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega256a3b", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega256a3bu", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega256c3", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega256d3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega384c3", FamilyXMEGAU, ELFArchXMEGA6>;
def : Device<"atxmega384d3", FamilyXMEGA, ELFArchXMEGA6>;
def : Device<"atxmega128a1", FamilyXMEGA, ELFArchXMEGA7>;
def : Device<"atxmega128a1u", FamilyXMEGAU, ELFArchXMEGA7>;
def : Device<"atxmega128a4u", FamilyXMEGAU, ELFArchXMEGA7>;
def : Device<"attiny4", FamilyAVRTiny, ELFArchAVRTiny>;
def : Device<"attiny5", FamilyAVRTiny, ELFArchAVRTiny>;
def : Device<"attiny9", FamilyAVRTiny, ELFArchAVRTiny>;
def : Device<"attiny10", FamilyAVRTiny, ELFArchAVRTiny>;
def : Device<"attiny20", FamilyAVRTiny, ELFArchAVRTiny>;
def : Device<"attiny40", FamilyAVRTiny, ELFArchAVRTiny>;
//===---------------------------------------------------------------------===//
// Register File Description
//===---------------------------------------------------------------------===//
include "AVRRegisterInfo.td"
//===---------------------------------------------------------------------===//
// Instruction Descriptions
//===---------------------------------------------------------------------===//
//include "AVRInstrInfo.td"
//def AVRInstrInfo : InstrInfo;
//===---------------------------------------------------------------------===//
// Calling Conventions
//===---------------------------------------------------------------------===//
//include "AVRCallingConv.td"
//===---------------------------------------------------------------------===//
// Assembly Printers
//===---------------------------------------------------------------------===//
// def AVRAsmWriter : AsmWriter {
// string AsmWriterClassName = "InstPrinter";
// bit isMCAsmWriter = 1;
// }
//===---------------------------------------------------------------------===//
// Assembly Parsers
//===---------------------------------------------------------------------===//
// def AVRAsmParser : AsmParser {
// let ShouldEmitMatchRegisterName = 1;
// let ShouldEmitMatchRegisterAltName = 1;
// }
// def AVRAsmParserVariant : AsmParserVariant {
// int Variant = 0;
//
// // Recognize hard coded registers.
// string RegisterPrefix = "$";
// }
//===---------------------------------------------------------------------===//
// Target Declaration
//===---------------------------------------------------------------------===//
def AVR : Target {
// let InstructionSet = AVRInstrInfo;
// let AssemblyWriters = [AVRAsmWriter];
//
// let AssemblyParsers = [AVRAsmParser];
// let AssemblyParserVariants = [AVRAsmParserVariant];
}

View File

@ -0,0 +1,216 @@
//===-- AVRRegisterInfo.td - AVR Register defs -------------*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Declarations that describe the AVR register file
//===----------------------------------------------------------------------===//
// 8-bit General purpose register definition.
class AVRReg<bits<16> num,
string name,
list<Register> subregs = [],
list<string> altNames = []>
: RegisterWithSubRegs<name, subregs>
{
field bits<16> Num = num;
let HWEncoding = num;
let Namespace = "AVR";
let SubRegs = subregs;
let AltNames = altNames;
}
// Subregister indices.
let Namespace = "AVR" in
{
def sub_lo : SubRegIndex<8>;
def sub_hi : SubRegIndex<8, 8>;
}
let Namespace = "AVR" in {
def ptr : RegAltNameIndex;
}
//===----------------------------------------------------------------------===//
// 8-bit general purpose registers
//===----------------------------------------------------------------------===//
def R0 : AVRReg<0, "r0">, DwarfRegNum<[0]>;
def R1 : AVRReg<1, "r1">, DwarfRegNum<[1]>;
def R2 : AVRReg<2, "r2">, DwarfRegNum<[2]>;
def R3 : AVRReg<3, "r3">, DwarfRegNum<[3]>;
def R4 : AVRReg<4, "r4">, DwarfRegNum<[4]>;
def R5 : AVRReg<5, "r5">, DwarfRegNum<[5]>;
def R6 : AVRReg<6, "r6">, DwarfRegNum<[6]>;
def R7 : AVRReg<7, "r7">, DwarfRegNum<[7]>;
def R8 : AVRReg<8, "r8">, DwarfRegNum<[8]>;
def R9 : AVRReg<9, "r9">, DwarfRegNum<[9]>;
def R10 : AVRReg<10, "r10">, DwarfRegNum<[10]>;
def R11 : AVRReg<11, "r11">, DwarfRegNum<[11]>;
def R12 : AVRReg<12, "r12">, DwarfRegNum<[12]>;
def R13 : AVRReg<13, "r13">, DwarfRegNum<[13]>;
def R14 : AVRReg<14, "r14">, DwarfRegNum<[14]>;
def R15 : AVRReg<15, "r15">, DwarfRegNum<[15]>;
def R16 : AVRReg<16, "r16">, DwarfRegNum<[16]>;
def R17 : AVRReg<17, "r17">, DwarfRegNum<[17]>;
def R18 : AVRReg<18, "r18">, DwarfRegNum<[18]>;
def R19 : AVRReg<19, "r19">, DwarfRegNum<[19]>;
def R20 : AVRReg<20, "r20">, DwarfRegNum<[20]>;
def R21 : AVRReg<21, "r21">, DwarfRegNum<[21]>;
def R22 : AVRReg<22, "r22">, DwarfRegNum<[22]>;
def R23 : AVRReg<23, "r23">, DwarfRegNum<[23]>;
def R24 : AVRReg<24, "r24">, DwarfRegNum<[24]>;
def R25 : AVRReg<25, "r25">, DwarfRegNum<[25]>;
def R26 : AVRReg<26, "r26">, DwarfRegNum<[26]>;
def R27 : AVRReg<27, "r27">, DwarfRegNum<[27]>;
def R28 : AVRReg<28, "r28">, DwarfRegNum<[28]>;
def R29 : AVRReg<29, "r29">, DwarfRegNum<[29]>;
def R30 : AVRReg<30, "r30">, DwarfRegNum<[30]>;
def R31 : AVRReg<31, "r31">, DwarfRegNum<[31]>;
def SPL : AVRReg<32, "SPL">, DwarfRegNum<[32]>;
def SPH : AVRReg<33, "SPH">, DwarfRegNum<[33]>;
let SubRegIndices = [sub_lo, sub_hi],
CoveredBySubRegs = 1 in
{
// 16 bit GPR pairs.
def SP : AVRReg<32, "SP", [SPL, SPH]>, DwarfRegNum<[32]>;
// The pointer registers (X,Y,Z) are a special case because they
// are printed as a `high:low` pair when a DREG is expected,
// but printed using `X`, `Y`, `Z` when a pointer register is expected.
let RegAltNameIndices = [ptr] in {
def R31R30 : AVRReg<30, "r31:r30", [R30, R31], ["Z"]>, DwarfRegNum<[30]>;
def R29R28 : AVRReg<28, "r29:r28", [R28, R29], ["Y"]>, DwarfRegNum<[28]>;
def R27R26 : AVRReg<26, "r27:r26", [R26, R27], ["X"]>, DwarfRegNum<[26]>;
}
def R25R24 : AVRReg<24, "r25:r24", [R24, R25]>, DwarfRegNum<[24]>;
def R23R22 : AVRReg<22, "r23:r22", [R22, R23]>, DwarfRegNum<[22]>;
def R21R20 : AVRReg<20, "r21:r20", [R20, R21]>, DwarfRegNum<[20]>;
def R19R18 : AVRReg<18, "r19:r18", [R18, R19]>, DwarfRegNum<[18]>;
def R17R16 : AVRReg<16, "r17:r16", [R16, R17]>, DwarfRegNum<[16]>;
def R15R14 : AVRReg<14, "r15:r14", [R14, R15]>, DwarfRegNum<[14]>;
def R13R12 : AVRReg<12, "r13:r12", [R12, R13]>, DwarfRegNum<[12]>;
def R11R10 : AVRReg<10, "r11:r10", [R10, R11]>, DwarfRegNum<[10]>;
def R9R8 : AVRReg<8, "r9:r8", [R8, R9]>, DwarfRegNum<[8]>;
def R7R6 : AVRReg<6, "r7:r6", [R6, R7]>, DwarfRegNum<[6]>;
def R5R4 : AVRReg<4, "r5:r4", [R4, R5]>, DwarfRegNum<[4]>;
def R3R2 : AVRReg<2, "r3:r2", [R2, R3]>, DwarfRegNum<[2]>;
def R1R0 : AVRReg<0, "r1:r0", [R0, R1]>, DwarfRegNum<[0]>;
}
//===----------------------------------------------------------------------===//
// Register Classes
//===----------------------------------------------------------------------===//
//:TODO: use proper set instructions instead of using always "add"
// Main 8-bit register class.
def GPR8 : RegisterClass<"AVR", [i8], 8,
(
// Return value and argument registers.
add R24, R25, R18, R19, R20, R21, R22, R23,
// Scratch registers.
R30, R31, R26, R27,
// Callee saved registers.
R28, R29, R17, R16, R15, R14, R13, R12, R11, R10,
R9, R8, R7, R6, R5, R4, R3, R2, R0, R1
)>;
// Simple lower registers r0..r15
def GPR8lo : RegisterClass<"AVR", [i8], 8,
(
add R15, R14, R13, R12, R11, R10, R9, R8, R7, R6, R5, R4, R3, R2, R0, R1
)>;
// 8-bit register class for instructions which take immediates.
def LD8 : RegisterClass<"AVR", [i8], 8,
(
// Return value and arguments.
add R24, R25, R18, R19, R20, R21, R22, R23,
// Scratch registers.
R30, R31, R26, R27,
// Callee saved registers.
R28, R29, R17, R16
)>;
// Simple lower registers r16..r23
def LD8lo : RegisterClass<"AVR", [i8], 8,
(
add R23, R22, R21, R20, R19, R18, R17, R16
)>;
// Main 16-bit pair register class.
def DREGS : RegisterClass<"AVR", [i16], 8,
(
// Return value and arguments.
add R25R24, R19R18, R21R20, R23R22,
// Scratch registers.
R31R30, R27R26,
// Callee saved registers.
R29R28, R17R16, R15R14, R13R12, R11R10,
R9R8, R7R6, R5R4, R3R2, R1R0
)>;
// 16-bit register class for immediate instructions.
def DLDREGS : RegisterClass<"AVR", [i16], 8,
(
// Return value and arguments.
add R25R24, R19R18, R21R20, R23R22,
// Scratch registers.
R31R30, R27R26,
// Callee saved registers.
R29R28, R17R16
)>;
// 16-bit register class for the adiw/sbiw instructions.
def IWREGS : RegisterClass<"AVR", [i16], 8,
(
// Return value and arguments.
add R25R24,
// Scratch registers.
R31R30, R27R26,
// Callee saved registers.
R29R28
)>;
// 16-bit register class for the ld and st instructions.
// AKA X,Y, and Z
def PTRREGS : RegisterClass<"AVR", [i16], 8,
(
add R27R26, // X
R29R28, // Y
R31R30 // Z
), ptr>;
// 16-bit register class for the ldd and std instructions.
// AKA Y and Z.
def PTRDISPREGS : RegisterClass<"AVR", [i16], 8,
(
add R31R30, R29R28
), ptr>;
// We have a bunch of instructions with an explicit Z register argument. We
// model this using a register class containing only the Z register.
// :TODO: Rename to 'ZREG'.
def ZREGS : RegisterClass<"AVR", [i16], 8, (add R31R30)>;
// Register class used for the stack read pseudo instruction.
def GPRSP: RegisterClass<"AVR", [i16], 8, (add SP)>;
//:TODO: if we remove this we get an error in tablegen
//:TODO: this is just a hack, remove it once add16 works!
// Status register.
def SREG : AVRReg<14, "FLAGS">, DwarfRegNum<[88]>;
def CCR : RegisterClass<"AVR", [i8], 8, (add SREG)>
{
let CopyCost = -1; // Don't allow copying of status registers
}

View File

@ -1,4 +1,7 @@
set(LLVM_TARGET_DEFINITIONS AVR.td)
tablegen(LLVM AVRGenRegisterInfo.inc -gen-register-info)
add_public_tablegen_target(AVRCommonTableGen)
add_llvm_target(AVRCodeGen
AVRTargetMachine.cpp

View File

@ -12,7 +12,7 @@ LIBRARYNAME = LLVMAVRCodeGen
TARGET = AVR
# Make sure that tblgen is run, first thing.
BUILT_SOURCES =
BUILT_SOURCES = AVRGenRegisterInfo.inc
DIRS = TargetInfo