CodeGenTarget.h revision 83ec4b6711980242ef3c55a4fa36b2d7a39c1bfb
1803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner//===- CodeGenTarget.h - Target Class Wrapper -------------------*- C++ -*-===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner// 10803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// This file defines wrappers for the Target class and related global 11803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// functionality. This makes it easier to access the data and provides a single 12803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// place that needs to check it for validity. All of these classes throw 13803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// exceptions on error conditions. 1445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner// 1545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner//===----------------------------------------------------------------------===// 1645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 17803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner#ifndef CODEGEN_TARGET_H 18803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner#define CODEGEN_TARGET_H 1945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 2026693113201f4c9d441678e50d96f38d3288798eChris Lattner#include "CodeGenRegisters.h" 21ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include "CodeGenInstruction.h" 2245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner#include <iosfwd> 23ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <map> 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2745872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass Record; 2845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass RecordKeeper; 291fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerstruct CodeGenRegister; 308850a1bcef0c2a785f918395fe0a05054914b349Chris Lattnerclass CodeGenTarget; 3145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 3294b3040fef9475c74b877fb32cb45200cea273bbEvan Cheng// SelectionDAG node properties. 33c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattnerenum SDNP { 34c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPCommutative, 35c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPAssociative, 36c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPHasChain, 37c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPOutFlag, 38c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPInFlag, 39c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPOptInFlag, 40710e995889c71812743f3f33861c24273f4569a7Chris Lattner SDNPMayLoad, 41bc0b9f70ae072d695e0eb7ceb729b3306b0679feChris Lattner SDNPMayStore, 42bc0b9f70ae072d695e0eb7ceb729b3306b0679feChris Lattner SDNPSideEffect 43c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner}; 4494b3040fef9475c74b877fb32cb45200cea273bbEvan Cheng 458535624739e55ab7424eadf792e1a3b4123421c7Christopher Lamb// ComplexPattern attributes. 468535624739e55ab7424eadf792e1a3b4123421c7Christopher Lambenum CPAttr { CPAttrParentAsRoot }; 478535624739e55ab7424eadf792e1a3b4123421c7Christopher Lamb 4883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands/// getValueType - Return the MVT::SimpleValueType that the specified TableGen 4983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands/// record corresponds to. 5083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan SandsMVT::SimpleValueType getValueType(Record *Rec); 5145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 5283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sandsstd::string getName(MVT::SimpleValueType T); 5383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sandsstd::string getEnumName(MVT::SimpleValueType T); 5445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 556cefb77a7073057fecd721ae141140d75ce76512Chris Lattner/// getQualifiedName - Return the name of the specified record, with a 566cefb77a7073057fecd721ae141140d75ce76512Chris Lattner/// namespace qualifier if the record contains one. 576cefb77a7073057fecd721ae141140d75ce76512Chris Lattnerstd::string getQualifiedName(const Record *R); 586cefb77a7073057fecd721ae141140d75ce76512Chris Lattner 5945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// CodeGenTarget - This class corresponds to the Target class in the .td files. 6045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// 6145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass CodeGenTarget { 6245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *TargetRec; 6345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 64ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner mutable std::map<std::string, CodeGenInstruction> Instructions; 6526693113201f4c9d441678e50d96f38d3288798eChris Lattner mutable std::vector<CodeGenRegister> Registers; 66056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner mutable std::vector<CodeGenRegisterClass> RegisterClasses; 6783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands mutable std::vector<MVT::SimpleValueType> LegalValueTypes; 6826693113201f4c9d441678e50d96f38d3288798eChris Lattner void ReadRegisters() const; 69056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner void ReadRegisterClasses() const; 70056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner void ReadInstructions() const; 71e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner void ReadLegalValueTypes() const; 7245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerpublic: 7345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner CodeGenTarget(); 7445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 7545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *getTargetRecord() const { return TargetRec; } 7645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner const std::string &getName() const; 7745872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 78175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// getInstructionSet - Return the InstructionSet object. 79ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// 8045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *getInstructionSet() const; 8145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 82175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// getAsmWriter - Return the AssemblyWriter definition for this target. 83175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// 84175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner Record *getAsmWriter() const; 85175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner 86e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<CodeGenRegister> &getRegisters() const { 8726693113201f4c9d441678e50d96f38d3288798eChris Lattner if (Registers.empty()) ReadRegisters(); 8826693113201f4c9d441678e50d96f38d3288798eChris Lattner return Registers; 8926693113201f4c9d441678e50d96f38d3288798eChris Lattner } 90ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 91e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<CodeGenRegisterClass> &getRegisterClasses() const { 92056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner if (RegisterClasses.empty()) ReadRegisterClasses(); 93056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner return RegisterClasses; 94056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner } 95ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman 96ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman const CodeGenRegisterClass &getRegisterClass(Record *R) const { 97ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman const std::vector<CodeGenRegisterClass> &RC = getRegisterClasses(); 98ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman for (unsigned i = 0, e = RC.size(); i != e; ++i) 99ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman if (RC[i].TheDef == R) 100ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman return RC[i]; 101ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman assert(0 && "Didn't find the register class"); 102ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman abort(); 103ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman } 1045c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner 1055c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// getRegisterClassForRegister - Find the register class that contains the 1065c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// specified physical register. If there register exists in multiple 1075c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// register classes or is not in a register class, return null. 1085c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass *getRegisterClassForRegister(Record *R) const { 1095c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses(); 1105c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass *FoundRC = 0; 1115c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner for (unsigned i = 0, e = RCs.size(); i != e; ++i) { 1125c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass &RC = RegisterClasses[i]; 1135c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) { 1145c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner if (R == RC.Elements[ei]) { 1155c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner if (FoundRC) return 0; // In multiple RC's 1165c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner FoundRC = &RC; 1175c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner break; 1185c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1195c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1205c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1215c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner return FoundRC; 1225c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 12344a65fa552ed61cf9dba8f68f59b05e5137e6b01Evan Cheng 12483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands /// getRegisterVTs - Find the union of all possible SimpleValueTypes for the 12544a65fa552ed61cf9dba8f68f59b05e5137e6b01Evan Cheng /// specified physical register. 12644a65fa552ed61cf9dba8f68f59b05e5137e6b01Evan Cheng std::vector<unsigned char> getRegisterVTs(Record *R) const; 1275c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner 12883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands const std::vector<MVT::SimpleValueType> &getLegalValueTypes() const { 129e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner if (LegalValueTypes.empty()) ReadLegalValueTypes(); 130e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner return LegalValueTypes; 131e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner } 132e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner 133e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner /// isLegalValueType - Return true if the specified value type is natively 134e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner /// supported by the target (i.e. there are registers that directly hold it). 13583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands bool isLegalValueType(MVT::SimpleValueType VT) const { 13683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands const std::vector<MVT::SimpleValueType> &LegalVTs = getLegalValueTypes(); 137e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner for (unsigned i = 0, e = LegalVTs.size(); i != e; ++i) 138e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner if (LegalVTs[i] == VT) return true; 139e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner return false; 140e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner } 141056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner 142ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// getInstructions - Return all of the instructions defined for this target. 143ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// 144ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner const std::map<std::string, CodeGenInstruction> &getInstructions() const { 145ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Instructions.empty()) ReadInstructions(); 146ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner return Instructions; 147ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner } 148ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman std::map<std::string, CodeGenInstruction> &getInstructions() { 149ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman if (Instructions.empty()) ReadInstructions(); 150ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman return Instructions; 151ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman } 152ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 153a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner CodeGenInstruction &getInstruction(const std::string &Name) const { 154a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner const std::map<std::string, CodeGenInstruction> &Insts = getInstructions(); 155a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner assert(Insts.count(Name) && "Not an instruction!"); 156a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner return const_cast<CodeGenInstruction&>(Insts.find(Name)->second); 157a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner } 158a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner 159ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner typedef std::map<std::string, 160ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner CodeGenInstruction>::const_iterator inst_iterator; 161ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner inst_iterator inst_begin() const { return getInstructions().begin(); } 162ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner inst_iterator inst_end() const { return Instructions.end(); } 16326693113201f4c9d441678e50d96f38d3288798eChris Lattner 164d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner /// getInstructionsByEnumValue - Return all of the instructions defined by the 165d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner /// target, ordered by their enum value. 166d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner void getInstructionsByEnumValue(std::vector<const CodeGenInstruction*> 167d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner &NumberedInstructions); 168d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner 169d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner 17035e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman /// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]? 17135e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman /// 17235e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman bool isLittleEndianEncoding() const; 17345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner}; 17445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 1750fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern 1760fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// tablegen class in TargetSelectionDAG.td 1770fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengclass ComplexPattern { 17883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands MVT::SimpleValueType Ty; 1790fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng unsigned NumOperands; 1800fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng std::string SelectFunc; 1813aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng std::vector<Record*> RootNodes; 1828535624739e55ab7424eadf792e1a3b4123421c7Christopher Lamb unsigned Properties; // Node properties 1838535624739e55ab7424eadf792e1a3b4123421c7Christopher Lamb unsigned Attributes; // Pattern attributes 1840fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengpublic: 1850fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng ComplexPattern() : NumOperands(0) {}; 1860fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng ComplexPattern(Record *R); 1870fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng 18883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands MVT::SimpleValueType getValueType() const { return Ty; } 1890fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng unsigned getNumOperands() const { return NumOperands; } 1900fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng const std::string &getSelectFunc() const { return SelectFunc; } 1913aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng const std::vector<Record*> &getRootNodes() const { 1923aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng return RootNodes; 1930fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng } 19494b3040fef9475c74b877fb32cb45200cea273bbEvan Cheng bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } 1958535624739e55ab7424eadf792e1a3b4123421c7Christopher Lamb bool hasAttribute(enum CPAttr Attr) const { return Attributes & (1 << Attr); } 1960fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng}; 1970fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng 198d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 199d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 20045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner#endif 201