LLVM 17.0.0git
AVRSubtarget.h
Go to the documentation of this file.
1//===-- AVRSubtarget.h - Define Subtarget for the AVR -----------*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares the AVR specific subclass of TargetSubtargetInfo.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_AVR_SUBTARGET_H
14#define LLVM_AVR_SUBTARGET_H
15
17#include "llvm/IR/DataLayout.h"
19
20#include "AVRFrameLowering.h"
21#include "AVRISelLowering.h"
22#include "AVRInstrInfo.h"
23#include "AVRSelectionDAGInfo.h"
25
26#define GET_SUBTARGETINFO_HEADER
27#include "AVRGenSubtargetInfo.inc"
28
29namespace llvm {
30
31/// A specific AVR target MCU.
33public:
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);
41
42 const AVRInstrInfo *getInstrInfo() const override { return &InstrInfo; }
43 const TargetFrameLowering *getFrameLowering() const override {
44 return &FrameLowering;
45 }
46 const AVRTargetLowering *getTargetLowering() const override {
47 return &TLInfo;
48 }
49 const AVRSelectionDAGInfo *getSelectionDAGInfo() const override {
50 return &TSInfo;
51 }
52 const AVRRegisterInfo *getRegisterInfo() const override {
53 return &InstrInfo.getRegisterInfo();
54 }
55
56 /// Parses a subtarget feature string, setting appropriate options.
57 /// \note Definition of function is auto generated by `tblgen`.
59
61 const TargetMachine &TM);
62
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
85 uint8_t getIORegisterOffset() const { return hasMemMappedGPR() ? 0x20 : 0x0; }
86
87 /// Gets the ELF architecture for the e_flags field
88 /// of an ELF object file.
89 unsigned getELFArch() const {
90 assert(ELFArch != 0 &&
91 "every device must have an associate ELF architecture");
92 return ELFArch;
93 }
94
95 /// Get I/O register addresses.
96 int getIORegRAMPZ() const { return hasELPM() ? 0x3b : -1; }
97 int getIORegEIND() const { return hasEIJMPCALL() ? 0x3c : -1; }
98 int getIORegSPL() const { return 0x3d; }
99 int getIORegSPH() const { return hasSmallStack() ? -1 : 0x3e; }
100 int getIORegSREG() const { return 0x3f; }
101
102 /// Get GPR aliases.
103 int getRegTmpIndex() const { return hasTinyEncoding() ? 16 : 0; }
104 int getRegZeroIndex() const { return hasTinyEncoding() ? 17 : 1; }
105
107 return hasTinyEncoding() ? AVR::R16 : AVR::R0;
108 }
110 return hasTinyEncoding() ? AVR::R17 : AVR::R1;
111 }
112
113private:
114 /// The ELF e_flags architecture.
115 unsigned ELFArch = 0;
116
117 // Subtarget feature settings
118 // See AVR.td for details.
119 bool m_hasSRAM = false;
120 bool m_hasJMPCALL = false;
121 bool m_hasIJMPCALL = false;
122 bool m_hasEIJMPCALL = false;
123 bool m_hasADDSUBIW = false;
124 bool m_hasSmallStack = false;
125 bool m_hasMOVW = false;
126 bool m_hasLPM = false;
127 bool m_hasLPMX = false;
128 bool m_hasELPM = false;
129 bool m_hasELPMX = false;
130 bool m_hasSPM = false;
131 bool m_hasSPMX = false;
132 bool m_hasDES = false;
133 bool m_supportsRMW = false;
134 bool m_supportsMultiplication = false;
135 bool m_hasBREAK = false;
136 bool m_hasTinyEncoding = false;
137 bool m_hasMemMappedGPR = false;
138
139 // Dummy member, used by FeatureSet's. We cannot have a SubtargetFeature with
140 // no variable, so we instead bind pseudo features to this variable.
141 bool m_FeatureSetDummy = false;
142
143 AVRInstrInfo InstrInfo;
144 AVRFrameLowering FrameLowering;
145 AVRTargetLowering TLInfo;
146 AVRSelectionDAGInfo TSInfo;
147};
148
149} // end namespace llvm
150
151#endif // LLVM_AVR_SUBTARGET_H
const char LLVMTargetMachineRef TM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Utilities for creating function call frames.
Utilities related to the AVR instruction set.
Definition: AVRInstrInfo.h:64
const AVRRegisterInfo & getRegisterInfo() const
Definition: AVRInstrInfo.h:68
Utilities relating to AVR registers.
Holds information about the AVR instruction selection DAG.
A specific AVR target MCU.
Definition: AVRSubtarget.h:32
Register getTmpRegister() const
Definition: AVRSubtarget.h:106
uint8_t getIORegisterOffset() const
Definition: AVRSubtarget.h:85
unsigned getELFArch() const
Gets the ELF architecture for the e_flags field of an ELF object file.
Definition: AVRSubtarget.h:89
bool hasMemMappedGPR() const
Definition: AVRSubtarget.h:83
bool hasDES() const
Definition: AVRSubtarget.h:78
bool hasSPMX() const
Definition: AVRSubtarget.h:77
bool hasSmallStack() const
Definition: AVRSubtarget.h:70
bool supportsRMW() const
Definition: AVRSubtarget.h:79
bool hasMOVW() const
Definition: AVRSubtarget.h:71
bool hasIJMPCALL() const
Definition: AVRSubtarget.h:67
bool hasTinyEncoding() const
Definition: AVRSubtarget.h:82
bool hasELPM() const
Definition: AVRSubtarget.h:74
const TargetFrameLowering * getFrameLowering() const override
Definition: AVRSubtarget.h:43
int getIORegRAMPZ() const
Get I/O register addresses.
Definition: AVRSubtarget.h:96
Register getZeroRegister() const
Definition: AVRSubtarget.h:109
int getIORegSPL() const
Definition: AVRSubtarget.h:98
int getRegTmpIndex() const
Get GPR aliases.
Definition: AVRSubtarget.h:103
bool hasSRAM() const
Definition: AVRSubtarget.h:65
const AVRInstrInfo * getInstrInfo() const override
Definition: AVRSubtarget.h:42
int getIORegSREG() const
Definition: AVRSubtarget.h:100
bool hasBREAK() const
Definition: AVRSubtarget.h:81
int getIORegEIND() const
Definition: AVRSubtarget.h:97
bool hasEIJMPCALL() const
Definition: AVRSubtarget.h:68
bool hasJMPCALL() const
Definition: AVRSubtarget.h:66
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
Parses a subtarget feature string, setting appropriate options.
bool supportsMultiplication() const
Definition: AVRSubtarget.h:80
const AVRSelectionDAGInfo * getSelectionDAGInfo() const override
Definition: AVRSubtarget.h:49
int getRegZeroIndex() const
Definition: AVRSubtarget.h:104
const AVRTargetLowering * getTargetLowering() const override
Definition: AVRSubtarget.h:46
bool hasSPM() const
Definition: AVRSubtarget.h:76
bool hasLPMX() const
Definition: AVRSubtarget.h:73
bool hasELPMX() const
Definition: AVRSubtarget.h:75
bool hasLPM() const
Definition: AVRSubtarget.h:72
AVRSubtarget & initializeSubtargetDependencies(StringRef CPU, StringRef FS, const TargetMachine &TM)
bool hasADDSUBIW() const
Definition: AVRSubtarget.h:69
int getIORegSPH() const
Definition: AVRSubtarget.h:99
const AVRRegisterInfo * getRegisterInfo() const override
Definition: AVRSubtarget.h:52
Performs target lowering for the AVR.
A generic AVR implementation.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Information about stack frame layout on the target.
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:78
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18