1 //===-- AVRSubtarget.h - Define Subtarget for the AVR -----------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file declares the AVR specific subclass of TargetSubtargetInfo.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_AVR_SUBTARGET_H
14 #define LLVM_AVR_SUBTARGET_H
16 #include "llvm/CodeGen/TargetSubtargetInfo.h"
17 #include "llvm/IR/DataLayout.h"
18 #include "llvm/Target/TargetMachine.h"
20 #include "AVRFrameLowering.h"
21 #include "AVRISelLowering.h"
22 #include "AVRInstrInfo.h"
23 #include "AVRSelectionDAGInfo.h"
24 #include "MCTargetDesc/AVRMCTargetDesc.h"
26 #define GET_SUBTARGETINFO_HEADER
27 #include "AVRGenSubtargetInfo.inc"
31 /// A specific AVR target MCU.
32 class AVRSubtarget : public AVRGenSubtargetInfo {
34 //! Creates an AVR subtarget.
35 //! \param TT The target triple.
36 //! \param CPU The CPU to target.
37 //! \param FS The feature string.
38 //! \param TM The target machine.
39 AVRSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
40 const AVRTargetMachine &TM);
42 const AVRInstrInfo *getInstrInfo() const override { return &InstrInfo; }
43 const TargetFrameLowering *getFrameLowering() const override {
44 return &FrameLowering;
46 const AVRTargetLowering *getTargetLowering() const override {
49 const AVRSelectionDAGInfo *getSelectionDAGInfo() const override {
52 const AVRRegisterInfo *getRegisterInfo() const override {
53 return &InstrInfo.getRegisterInfo();
56 /// Parses a subtarget feature string, setting appropriate options.
57 /// \note Definition of function is auto generated by `tblgen`.
58 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
60 AVRSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS,
61 const TargetMachine &TM);
63 // Subtarget feature getters.
64 // See AVR.td for details.
65 bool hasSRAM() const { return m_hasSRAM; }
66 bool hasJMPCALL() const { return m_hasJMPCALL; }
67 bool hasIJMPCALL() const { return m_hasIJMPCALL; }
68 bool hasEIJMPCALL() const { return m_hasEIJMPCALL; }
69 bool hasADDSUBIW() const { return m_hasADDSUBIW; }
70 bool hasSmallStack() const { return m_hasSmallStack; }
71 bool hasMOVW() const { return m_hasMOVW; }
72 bool hasLPM() const { return m_hasLPM; }
73 bool hasLPMX() const { return m_hasLPMX; }
74 bool hasELPM() const { return m_hasELPM; }
75 bool hasELPMX() const { return m_hasELPMX; }
76 bool hasSPM() const { return m_hasSPM; }
77 bool hasSPMX() const { return m_hasSPMX; }
78 bool hasDES() const { return m_hasDES; }
79 bool supportsRMW() const { return m_supportsRMW; }
80 bool supportsMultiplication() const { return m_supportsMultiplication; }
81 bool hasBREAK() const { return m_hasBREAK; }
82 bool hasTinyEncoding() const { return m_hasTinyEncoding; }
83 bool hasMemMappedGPR() const { return m_hasMemMappedGPR; }
84 bool hasLowByteFirst() const { return m_hasLowByteFirst; }
86 uint8_t getIORegisterOffset() const { return hasMemMappedGPR() ? 0x20 : 0x0; }
88 bool enableSubRegLiveness() const override { return true; }
90 /// Gets the ELF architecture for the e_flags field
91 /// of an ELF object file.
92 unsigned getELFArch() const {
93 assert(ELFArch != 0 &&
94 "every device must have an associate ELF architecture");
98 /// Get I/O register addresses.
99 int getIORegRAMPZ() const { return hasELPM() ? 0x3b : -1; }
100 int getIORegEIND() const { return hasEIJMPCALL() ? 0x3c : -1; }
101 int getIORegSPL() const { return 0x3d; }
102 int getIORegSPH() const { return hasSmallStack() ? -1 : 0x3e; }
103 int getIORegSREG() const { return 0x3f; }
106 int getRegTmpIndex() const { return hasTinyEncoding() ? 16 : 0; }
107 int getRegZeroIndex() const { return hasTinyEncoding() ? 17 : 1; }
109 Register getTmpRegister() const {
110 return hasTinyEncoding() ? AVR::R16 : AVR::R0;
112 Register getZeroRegister() const {
113 return hasTinyEncoding() ? AVR::R17 : AVR::R1;
117 /// The ELF e_flags architecture.
118 unsigned ELFArch = 0;
120 // Subtarget feature settings
121 // See AVR.td for details.
122 bool m_hasSRAM = false;
123 bool m_hasJMPCALL = false;
124 bool m_hasIJMPCALL = false;
125 bool m_hasEIJMPCALL = false;
126 bool m_hasADDSUBIW = false;
127 bool m_hasSmallStack = false;
128 bool m_hasMOVW = false;
129 bool m_hasLPM = false;
130 bool m_hasLPMX = false;
131 bool m_hasELPM = false;
132 bool m_hasELPMX = false;
133 bool m_hasSPM = false;
134 bool m_hasSPMX = false;
135 bool m_hasDES = false;
136 bool m_supportsRMW = false;
137 bool m_supportsMultiplication = false;
138 bool m_hasBREAK = false;
139 bool m_hasTinyEncoding = false;
140 bool m_hasLowByteFirst = false;
141 bool m_hasMemMappedGPR = false;
143 // Dummy member, used by FeatureSet's. We cannot have a SubtargetFeature with
144 // no variable, so we instead bind pseudo features to this variable.
145 bool m_FeatureSetDummy = false;
147 AVRInstrInfo InstrInfo;
148 AVRFrameLowering FrameLowering;
149 AVRTargetLowering TLInfo;
150 AVRSelectionDAGInfo TSInfo;
153 } // end namespace llvm
155 #endif // LLVM_AVR_SUBTARGET_H