xref: /aosp_15_r20/external/llvm/utils/TableGen/CodeGenTarget.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- CodeGenTarget.h - Target Class Wrapper -------------------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines wrappers for the Target class and related global
11*9880d681SAndroid Build Coastguard Worker // functionality.  This makes it easier to access the data and provides a single
12*9880d681SAndroid Build Coastguard Worker // place that needs to check it for validity.  All of these classes abort
13*9880d681SAndroid Build Coastguard Worker // on error conditions.
14*9880d681SAndroid Build Coastguard Worker //
15*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_UTILS_TABLEGEN_CODEGENTARGET_H
18*9880d681SAndroid Build Coastguard Worker #define LLVM_UTILS_TABLEGEN_CODEGENTARGET_H
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker #include "CodeGenInstruction.h"
21*9880d681SAndroid Build Coastguard Worker #include "CodeGenRegisters.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/TableGen/Record.h"
24*9880d681SAndroid Build Coastguard Worker #include <algorithm>
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker namespace llvm {
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker struct CodeGenRegister;
29*9880d681SAndroid Build Coastguard Worker class CodeGenSchedModels;
30*9880d681SAndroid Build Coastguard Worker class CodeGenTarget;
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker // SelectionDAG node properties.
33*9880d681SAndroid Build Coastguard Worker //  SDNPMemOperand: indicates that a node touches memory and therefore must
34*9880d681SAndroid Build Coastguard Worker //                  have an associated memory operand that describes the access.
35*9880d681SAndroid Build Coastguard Worker enum SDNP {
36*9880d681SAndroid Build Coastguard Worker   SDNPCommutative,
37*9880d681SAndroid Build Coastguard Worker   SDNPAssociative,
38*9880d681SAndroid Build Coastguard Worker   SDNPHasChain,
39*9880d681SAndroid Build Coastguard Worker   SDNPOutGlue,
40*9880d681SAndroid Build Coastguard Worker   SDNPInGlue,
41*9880d681SAndroid Build Coastguard Worker   SDNPOptInGlue,
42*9880d681SAndroid Build Coastguard Worker   SDNPMayLoad,
43*9880d681SAndroid Build Coastguard Worker   SDNPMayStore,
44*9880d681SAndroid Build Coastguard Worker   SDNPSideEffect,
45*9880d681SAndroid Build Coastguard Worker   SDNPMemOperand,
46*9880d681SAndroid Build Coastguard Worker   SDNPVariadic,
47*9880d681SAndroid Build Coastguard Worker   SDNPWantRoot,
48*9880d681SAndroid Build Coastguard Worker   SDNPWantParent
49*9880d681SAndroid Build Coastguard Worker };
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker /// getValueType - Return the MVT::SimpleValueType that the specified TableGen
52*9880d681SAndroid Build Coastguard Worker /// record corresponds to.
53*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType getValueType(Record *Rec);
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker StringRef getName(MVT::SimpleValueType T);
56*9880d681SAndroid Build Coastguard Worker StringRef getEnumName(MVT::SimpleValueType T);
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker /// getQualifiedName - Return the name of the specified record, with a
59*9880d681SAndroid Build Coastguard Worker /// namespace qualifier if the record contains one.
60*9880d681SAndroid Build Coastguard Worker std::string getQualifiedName(const Record *R);
61*9880d681SAndroid Build Coastguard Worker 
62*9880d681SAndroid Build Coastguard Worker /// CodeGenTarget - This class corresponds to the Target class in the .td files.
63*9880d681SAndroid Build Coastguard Worker ///
64*9880d681SAndroid Build Coastguard Worker class CodeGenTarget {
65*9880d681SAndroid Build Coastguard Worker   RecordKeeper &Records;
66*9880d681SAndroid Build Coastguard Worker   Record *TargetRec;
67*9880d681SAndroid Build Coastguard Worker 
68*9880d681SAndroid Build Coastguard Worker   mutable DenseMap<const Record*,
69*9880d681SAndroid Build Coastguard Worker                    std::unique_ptr<CodeGenInstruction>> Instructions;
70*9880d681SAndroid Build Coastguard Worker   mutable std::unique_ptr<CodeGenRegBank> RegBank;
71*9880d681SAndroid Build Coastguard Worker   mutable std::vector<Record*> RegAltNameIndices;
72*9880d681SAndroid Build Coastguard Worker   mutable SmallVector<MVT::SimpleValueType, 8> LegalValueTypes;
73*9880d681SAndroid Build Coastguard Worker   void ReadRegAltNameIndices() const;
74*9880d681SAndroid Build Coastguard Worker   void ReadInstructions() const;
75*9880d681SAndroid Build Coastguard Worker   void ReadLegalValueTypes() const;
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker   mutable std::unique_ptr<CodeGenSchedModels> SchedModels;
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker   mutable std::vector<const CodeGenInstruction*> InstrsByEnum;
80*9880d681SAndroid Build Coastguard Worker public:
81*9880d681SAndroid Build Coastguard Worker   CodeGenTarget(RecordKeeper &Records);
82*9880d681SAndroid Build Coastguard Worker   ~CodeGenTarget();
83*9880d681SAndroid Build Coastguard Worker 
getTargetRecord()84*9880d681SAndroid Build Coastguard Worker   Record *getTargetRecord() const { return TargetRec; }
85*9880d681SAndroid Build Coastguard Worker   const std::string &getName() const;
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker   /// getInstNamespace - Return the target-specific instruction namespace.
88*9880d681SAndroid Build Coastguard Worker   ///
89*9880d681SAndroid Build Coastguard Worker   std::string getInstNamespace() const;
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker   /// getInstructionSet - Return the InstructionSet object.
92*9880d681SAndroid Build Coastguard Worker   ///
93*9880d681SAndroid Build Coastguard Worker   Record *getInstructionSet() const;
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker   /// getAsmParser - Return the AssemblyParser definition for this target.
96*9880d681SAndroid Build Coastguard Worker   ///
97*9880d681SAndroid Build Coastguard Worker   Record *getAsmParser() const;
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker   /// getAsmParserVariant - Return the AssmblyParserVariant definition for
100*9880d681SAndroid Build Coastguard Worker   /// this target.
101*9880d681SAndroid Build Coastguard Worker   ///
102*9880d681SAndroid Build Coastguard Worker   Record *getAsmParserVariant(unsigned i) const;
103*9880d681SAndroid Build Coastguard Worker 
104*9880d681SAndroid Build Coastguard Worker   /// getAsmParserVariantCount - Return the AssmblyParserVariant definition
105*9880d681SAndroid Build Coastguard Worker   /// available for this target.
106*9880d681SAndroid Build Coastguard Worker   ///
107*9880d681SAndroid Build Coastguard Worker   unsigned getAsmParserVariantCount() const;
108*9880d681SAndroid Build Coastguard Worker 
109*9880d681SAndroid Build Coastguard Worker   /// getAsmWriter - Return the AssemblyWriter definition for this target.
110*9880d681SAndroid Build Coastguard Worker   ///
111*9880d681SAndroid Build Coastguard Worker   Record *getAsmWriter() const;
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker   /// getRegBank - Return the register bank description.
114*9880d681SAndroid Build Coastguard Worker   CodeGenRegBank &getRegBank() const;
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker   /// getRegisterByName - If there is a register with the specific AsmName,
117*9880d681SAndroid Build Coastguard Worker   /// return it.
118*9880d681SAndroid Build Coastguard Worker   const CodeGenRegister *getRegisterByName(StringRef Name) const;
119*9880d681SAndroid Build Coastguard Worker 
getRegAltNameIndices()120*9880d681SAndroid Build Coastguard Worker   const std::vector<Record*> &getRegAltNameIndices() const {
121*9880d681SAndroid Build Coastguard Worker     if (RegAltNameIndices.empty()) ReadRegAltNameIndices();
122*9880d681SAndroid Build Coastguard Worker     return RegAltNameIndices;
123*9880d681SAndroid Build Coastguard Worker   }
124*9880d681SAndroid Build Coastguard Worker 
getRegisterClass(Record * R)125*9880d681SAndroid Build Coastguard Worker   const CodeGenRegisterClass &getRegisterClass(Record *R) const {
126*9880d681SAndroid Build Coastguard Worker     return *getRegBank().getRegClass(R);
127*9880d681SAndroid Build Coastguard Worker   }
128*9880d681SAndroid Build Coastguard Worker 
129*9880d681SAndroid Build Coastguard Worker   /// getRegisterVTs - Find the union of all possible SimpleValueTypes for the
130*9880d681SAndroid Build Coastguard Worker   /// specified physical register.
131*9880d681SAndroid Build Coastguard Worker   std::vector<MVT::SimpleValueType> getRegisterVTs(Record *R) const;
132*9880d681SAndroid Build Coastguard Worker 
getLegalValueTypes()133*9880d681SAndroid Build Coastguard Worker   ArrayRef<MVT::SimpleValueType> getLegalValueTypes() const {
134*9880d681SAndroid Build Coastguard Worker     if (LegalValueTypes.empty()) ReadLegalValueTypes();
135*9880d681SAndroid Build Coastguard Worker     return LegalValueTypes;
136*9880d681SAndroid Build Coastguard Worker   }
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   /// isLegalValueType - Return true if the specified value type is natively
139*9880d681SAndroid Build Coastguard Worker   /// supported by the target (i.e. there are registers that directly hold it).
isLegalValueType(MVT::SimpleValueType VT)140*9880d681SAndroid Build Coastguard Worker   bool isLegalValueType(MVT::SimpleValueType VT) const {
141*9880d681SAndroid Build Coastguard Worker     ArrayRef<MVT::SimpleValueType> LegalVTs = getLegalValueTypes();
142*9880d681SAndroid Build Coastguard Worker     return std::find(LegalVTs.begin(), LegalVTs.end(), VT) != LegalVTs.end();
143*9880d681SAndroid Build Coastguard Worker   }
144*9880d681SAndroid Build Coastguard Worker 
145*9880d681SAndroid Build Coastguard Worker   CodeGenSchedModels &getSchedModels() const;
146*9880d681SAndroid Build Coastguard Worker 
147*9880d681SAndroid Build Coastguard Worker private:
148*9880d681SAndroid Build Coastguard Worker   DenseMap<const Record*, std::unique_ptr<CodeGenInstruction>> &
getInstructions()149*9880d681SAndroid Build Coastguard Worker   getInstructions() const {
150*9880d681SAndroid Build Coastguard Worker     if (Instructions.empty()) ReadInstructions();
151*9880d681SAndroid Build Coastguard Worker     return Instructions;
152*9880d681SAndroid Build Coastguard Worker   }
153*9880d681SAndroid Build Coastguard Worker public:
154*9880d681SAndroid Build Coastguard Worker 
getInstruction(const Record * InstRec)155*9880d681SAndroid Build Coastguard Worker   CodeGenInstruction &getInstruction(const Record *InstRec) const {
156*9880d681SAndroid Build Coastguard Worker     if (Instructions.empty()) ReadInstructions();
157*9880d681SAndroid Build Coastguard Worker     auto I = Instructions.find(InstRec);
158*9880d681SAndroid Build Coastguard Worker     assert(I != Instructions.end() && "Not an instruction");
159*9880d681SAndroid Build Coastguard Worker     return *I->second;
160*9880d681SAndroid Build Coastguard Worker   }
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker   /// getInstructionsByEnumValue - Return all of the instructions defined by the
163*9880d681SAndroid Build Coastguard Worker   /// target, ordered by their enum value.
164*9880d681SAndroid Build Coastguard Worker   ArrayRef<const CodeGenInstruction *>
getInstructionsByEnumValue()165*9880d681SAndroid Build Coastguard Worker   getInstructionsByEnumValue() const {
166*9880d681SAndroid Build Coastguard Worker     if (InstrsByEnum.empty()) ComputeInstrsByEnum();
167*9880d681SAndroid Build Coastguard Worker     return InstrsByEnum;
168*9880d681SAndroid Build Coastguard Worker   }
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker   typedef ArrayRef<const CodeGenInstruction *>::const_iterator inst_iterator;
inst_begin()171*9880d681SAndroid Build Coastguard Worker   inst_iterator inst_begin() const{return getInstructionsByEnumValue().begin();}
inst_end()172*9880d681SAndroid Build Coastguard Worker   inst_iterator inst_end() const { return getInstructionsByEnumValue().end(); }
173*9880d681SAndroid Build Coastguard Worker 
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker   /// isLittleEndianEncoding - are instruction bit patterns defined as  [0..n]?
176*9880d681SAndroid Build Coastguard Worker   ///
177*9880d681SAndroid Build Coastguard Worker   bool isLittleEndianEncoding() const;
178*9880d681SAndroid Build Coastguard Worker 
179*9880d681SAndroid Build Coastguard Worker   /// reverseBitsForLittleEndianEncoding - For little-endian instruction bit
180*9880d681SAndroid Build Coastguard Worker   /// encodings, reverse the bit order of all instructions.
181*9880d681SAndroid Build Coastguard Worker   void reverseBitsForLittleEndianEncoding();
182*9880d681SAndroid Build Coastguard Worker 
183*9880d681SAndroid Build Coastguard Worker   /// guessInstructionProperties - should we just guess unset instruction
184*9880d681SAndroid Build Coastguard Worker   /// properties?
185*9880d681SAndroid Build Coastguard Worker   bool guessInstructionProperties() const;
186*9880d681SAndroid Build Coastguard Worker 
187*9880d681SAndroid Build Coastguard Worker private:
188*9880d681SAndroid Build Coastguard Worker   void ComputeInstrsByEnum() const;
189*9880d681SAndroid Build Coastguard Worker };
190*9880d681SAndroid Build Coastguard Worker 
191*9880d681SAndroid Build Coastguard Worker /// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern
192*9880d681SAndroid Build Coastguard Worker /// tablegen class in TargetSelectionDAG.td
193*9880d681SAndroid Build Coastguard Worker class ComplexPattern {
194*9880d681SAndroid Build Coastguard Worker   MVT::SimpleValueType Ty;
195*9880d681SAndroid Build Coastguard Worker   unsigned NumOperands;
196*9880d681SAndroid Build Coastguard Worker   std::string SelectFunc;
197*9880d681SAndroid Build Coastguard Worker   std::vector<Record*> RootNodes;
198*9880d681SAndroid Build Coastguard Worker   unsigned Properties; // Node properties
199*9880d681SAndroid Build Coastguard Worker public:
ComplexPattern()200*9880d681SAndroid Build Coastguard Worker   ComplexPattern() : NumOperands(0) {}
201*9880d681SAndroid Build Coastguard Worker   ComplexPattern(Record *R);
202*9880d681SAndroid Build Coastguard Worker 
getValueType()203*9880d681SAndroid Build Coastguard Worker   MVT::SimpleValueType getValueType() const { return Ty; }
getNumOperands()204*9880d681SAndroid Build Coastguard Worker   unsigned getNumOperands() const { return NumOperands; }
getSelectFunc()205*9880d681SAndroid Build Coastguard Worker   const std::string &getSelectFunc() const { return SelectFunc; }
getRootNodes()206*9880d681SAndroid Build Coastguard Worker   const std::vector<Record*> &getRootNodes() const {
207*9880d681SAndroid Build Coastguard Worker     return RootNodes;
208*9880d681SAndroid Build Coastguard Worker   }
hasProperty(enum SDNP Prop)209*9880d681SAndroid Build Coastguard Worker   bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); }
210*9880d681SAndroid Build Coastguard Worker };
211*9880d681SAndroid Build Coastguard Worker 
212*9880d681SAndroid Build Coastguard Worker } // End llvm namespace
213*9880d681SAndroid Build Coastguard Worker 
214*9880d681SAndroid Build Coastguard Worker #endif
215