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