CodeGenTarget.h revision dc29c447136aabf05f48a7119e48065c3b4cee9b
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" 2209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen#include "Record.h" 23e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner#include "llvm/Support/raw_ostream.h" 248a17870da491b9598418fce180857515208b7393Dan Gohman#include <algorithm> 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 281fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerstruct CodeGenRegister; 298850a1bcef0c2a785f918395fe0a05054914b349Chris Lattnerclass CodeGenTarget; 3045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 3194b3040fef9475c74b877fb32cb45200cea273bbEvan Cheng// SelectionDAG node properties. 3228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang// SDNPMemOperand: indicates that a node touches memory and therefore must 3328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang// have an associated memory operand that describes the access. 34c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattnerenum SDNP { 35510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach SDNPCommutative, 36510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach SDNPAssociative, 37c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner SDNPHasChain, 38036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner SDNPOutGlue, 39036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner SDNPInGlue, 40036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner SDNPOptInGlue, 41710e995889c71812743f3f33861c24273f4569a7Chris Lattner SDNPMayLoad, 42bc0b9f70ae072d695e0eb7ceb729b3306b0679feChris Lattner SDNPMayStore, 4328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang SDNPSideEffect, 44e8cabf3c2eb835f9189a39c810654d9bd302f7eeChris Lattner SDNPMemOperand, 4552a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner SDNPVariadic, 4652a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner SDNPWantRoot, 4752a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner SDNPWantParent 48c8478d8b12c2d7e4cea32d0c9940f5cac2baa4ddChris Lattner}; 4994b3040fef9475c74b877fb32cb45200cea273bbEvan Cheng 50825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson/// getValueType - Return the MVT::SimpleValueType that the specified TableGen 5183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands/// record corresponds to. 52825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen AndersonMVT::SimpleValueType getValueType(Record *Rec); 5345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 54825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonstd::string getName(MVT::SimpleValueType T); 55825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonstd::string getEnumName(MVT::SimpleValueType T); 5645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 576cefb77a7073057fecd721ae141140d75ce76512Chris Lattner/// getQualifiedName - Return the name of the specified record, with a 586cefb77a7073057fecd721ae141140d75ce76512Chris Lattner/// namespace qualifier if the record contains one. 596cefb77a7073057fecd721ae141140d75ce76512Chris Lattnerstd::string getQualifiedName(const Record *R); 60510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 6145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// CodeGenTarget - This class corresponds to the Target class in the .td files. 6245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// 6345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass CodeGenTarget { 6467db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &Records; 6545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *TargetRec; 6645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 67e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner mutable DenseMap<const Record*, CodeGenInstruction*> Instructions; 68dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen mutable CodeGenRegBank *RegBank; 6926693113201f4c9d441678e50d96f38d3288798eChris Lattner mutable std::vector<CodeGenRegister> Registers; 70056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner mutable std::vector<CodeGenRegisterClass> RegisterClasses; 71825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson mutable std::vector<MVT::SimpleValueType> LegalValueTypes; 7226693113201f4c9d441678e50d96f38d3288798eChris Lattner void ReadRegisters() const; 73056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner void ReadRegisterClasses() const; 74056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner void ReadInstructions() const; 75e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner void ReadLegalValueTypes() const; 76510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 776a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner mutable std::vector<const CodeGenInstruction*> InstrsByEnum; 7845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerpublic: 7967db883487fca3472fdde51e931657e22d4d0495Chris Lattner CodeGenTarget(RecordKeeper &Records); 8045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 8145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *getTargetRecord() const { return TargetRec; } 8245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner const std::string &getName() const; 8345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 841e0ee4bc38e9cdc7e7ac49968527e2c05f927904Dan Gohman /// getInstNamespace - Return the target-specific instruction namespace. 851e0ee4bc38e9cdc7e7ac49968527e2c05f927904Dan Gohman /// 861e0ee4bc38e9cdc7e7ac49968527e2c05f927904Dan Gohman std::string getInstNamespace() const; 871e0ee4bc38e9cdc7e7ac49968527e2c05f927904Dan Gohman 88175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// getInstructionSet - Return the InstructionSet object. 89ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// 9045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *getInstructionSet() const; 9145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 920e2771f4c4a6e1ffc664eb23487087f824340255Daniel Dunbar /// getAsmParser - Return the AssemblyParser definition for this target. 930e2771f4c4a6e1ffc664eb23487087f824340255Daniel Dunbar /// 940e2771f4c4a6e1ffc664eb23487087f824340255Daniel Dunbar Record *getAsmParser() const; 950e2771f4c4a6e1ffc664eb23487087f824340255Daniel Dunbar 96175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// getAsmWriter - Return the AssemblyWriter definition for this target. 97175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// 98175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner Record *getAsmWriter() const; 99175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner 100dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen /// getRegBank - Return the register bank description. 101dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen CodeGenRegBank &getRegBank() const; 102dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 103e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<CodeGenRegister> &getRegisters() const { 10426693113201f4c9d441678e50d96f38d3288798eChris Lattner if (Registers.empty()) ReadRegisters(); 10526693113201f4c9d441678e50d96f38d3288798eChris Lattner return Registers; 10626693113201f4c9d441678e50d96f38d3288798eChris Lattner } 107510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 108ec6f096c36f4144ff9b3b24c2939720cdcbb7bccChris Lattner /// getRegisterByName - If there is a register with the specific AsmName, 109ec6f096c36f4144ff9b3b24c2939720cdcbb7bccChris Lattner /// return it. 110ec6f096c36f4144ff9b3b24c2939720cdcbb7bccChris Lattner const CodeGenRegister *getRegisterByName(StringRef Name) const; 111ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 112e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<CodeGenRegisterClass> &getRegisterClasses() const { 113056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner if (RegisterClasses.empty()) ReadRegisterClasses(); 114056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner return RegisterClasses; 115056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner } 11609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen 117ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman const CodeGenRegisterClass &getRegisterClass(Record *R) const { 118ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman const std::vector<CodeGenRegisterClass> &RC = getRegisterClasses(); 119ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman for (unsigned i = 0, e = RC.size(); i != e; ++i) 120ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman if (RC[i].TheDef == R) 121ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman return RC[i]; 122ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman assert(0 && "Didn't find the register class"); 123ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman abort(); 124ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman } 125510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 1265c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// getRegisterClassForRegister - Find the register class that contains the 1278a17870da491b9598418fce180857515208b7393Dan Gohman /// specified physical register. If the register is not in a register 1288a17870da491b9598418fce180857515208b7393Dan Gohman /// class, return null. If the register is in multiple classes, and the 1298a17870da491b9598418fce180857515208b7393Dan Gohman /// classes have a superset-subset relationship and the same set of 1308a17870da491b9598418fce180857515208b7393Dan Gohman /// types, return the superclass. Otherwise return null. 1315c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass *getRegisterClassForRegister(Record *R) const { 1325c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses(); 1335c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass *FoundRC = 0; 1345c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner for (unsigned i = 0, e = RCs.size(); i != e; ++i) { 1355c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass &RC = RegisterClasses[i]; 1365c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) { 1378a17870da491b9598418fce180857515208b7393Dan Gohman if (R != RC.Elements[ei]) 1388a17870da491b9598418fce180857515208b7393Dan Gohman continue; 1398a17870da491b9598418fce180857515208b7393Dan Gohman 1408a17870da491b9598418fce180857515208b7393Dan Gohman // If a register's classes have different types, return null. 1418a17870da491b9598418fce180857515208b7393Dan Gohman if (FoundRC && RC.getValueTypes() != FoundRC->getValueTypes()) 1428a17870da491b9598418fce180857515208b7393Dan Gohman return 0; 1438a17870da491b9598418fce180857515208b7393Dan Gohman 1448a17870da491b9598418fce180857515208b7393Dan Gohman // If this is the first class that contains the register, 1458a17870da491b9598418fce180857515208b7393Dan Gohman // make a note of it and go on to the next class. 1468a17870da491b9598418fce180857515208b7393Dan Gohman if (!FoundRC) { 1478a17870da491b9598418fce180857515208b7393Dan Gohman FoundRC = &RC; 1488a17870da491b9598418fce180857515208b7393Dan Gohman break; 1498a17870da491b9598418fce180857515208b7393Dan Gohman } 1508a17870da491b9598418fce180857515208b7393Dan Gohman 1518a17870da491b9598418fce180857515208b7393Dan Gohman std::vector<Record *> Elements(RC.Elements); 1528a17870da491b9598418fce180857515208b7393Dan Gohman std::vector<Record *> FoundElements(FoundRC->Elements); 1538a17870da491b9598418fce180857515208b7393Dan Gohman std::sort(Elements.begin(), Elements.end()); 1548a17870da491b9598418fce180857515208b7393Dan Gohman std::sort(FoundElements.begin(), FoundElements.end()); 1558a17870da491b9598418fce180857515208b7393Dan Gohman 1568a17870da491b9598418fce180857515208b7393Dan Gohman // Check to see if the previously found class that contains 1578a17870da491b9598418fce180857515208b7393Dan Gohman // the register is a subclass of the current class. If so, 1588a17870da491b9598418fce180857515208b7393Dan Gohman // prefer the superclass. 1598a17870da491b9598418fce180857515208b7393Dan Gohman if (std::includes(Elements.begin(), Elements.end(), 1608a17870da491b9598418fce180857515208b7393Dan Gohman FoundElements.begin(), FoundElements.end())) { 1615c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner FoundRC = &RC; 1625c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner break; 1635c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1648a17870da491b9598418fce180857515208b7393Dan Gohman 1658a17870da491b9598418fce180857515208b7393Dan Gohman // Check to see if the previously found class that contains 1668a17870da491b9598418fce180857515208b7393Dan Gohman // the register is a superclass of the current class. If so, 1678a17870da491b9598418fce180857515208b7393Dan Gohman // prefer the superclass. 1688a17870da491b9598418fce180857515208b7393Dan Gohman if (std::includes(FoundElements.begin(), FoundElements.end(), 1698a17870da491b9598418fce180857515208b7393Dan Gohman Elements.begin(), Elements.end())) 1708a17870da491b9598418fce180857515208b7393Dan Gohman break; 1718a17870da491b9598418fce180857515208b7393Dan Gohman 1728a17870da491b9598418fce180857515208b7393Dan Gohman // Multiple classes, and neither is a superclass of the other. 1738a17870da491b9598418fce180857515208b7393Dan Gohman // Return null. 1748a17870da491b9598418fce180857515208b7393Dan Gohman return 0; 1755c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1765c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1775c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner return FoundRC; 1785c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 17944a65fa552ed61cf9dba8f68f59b05e5137e6b01Evan Cheng 18083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands /// getRegisterVTs - Find the union of all possible SimpleValueTypes for the 18144a65fa552ed61cf9dba8f68f59b05e5137e6b01Evan Cheng /// specified physical register. 1822cacec55f947c716b058a39038889550d7e39b3cChris Lattner std::vector<MVT::SimpleValueType> getRegisterVTs(Record *R) const; 183510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 184825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const std::vector<MVT::SimpleValueType> &getLegalValueTypes() const { 185e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner if (LegalValueTypes.empty()) ReadLegalValueTypes(); 186e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner return LegalValueTypes; 187e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner } 188510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 189e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner /// isLegalValueType - Return true if the specified value type is natively 190e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner /// supported by the target (i.e. there are registers that directly hold it). 191825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson bool isLegalValueType(MVT::SimpleValueType VT) const { 192825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const std::vector<MVT::SimpleValueType> &LegalVTs = getLegalValueTypes(); 193e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner for (unsigned i = 0, e = LegalVTs.size(); i != e; ++i) 194e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner if (LegalVTs[i] == VT) return true; 195510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach return false; 196e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner } 197056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner 198b61e09de6d0cd7241ddc6dee3efef416552eec3bChris Lattnerprivate: 199e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner DenseMap<const Record*, CodeGenInstruction*> &getInstructions() const { 200ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Instructions.empty()) ReadInstructions(); 201ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner return Instructions; 202ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner } 203f30187a36324fb75042d9ffd20c3fb70aff7763dChris Lattnerpublic: 204510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 205e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner CodeGenInstruction &getInstruction(const Record *InstRec) const { 206e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner if (Instructions.empty()) ReadInstructions(); 207e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner DenseMap<const Record*, CodeGenInstruction*>::iterator I = 208e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner Instructions.find(InstRec); 209e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner assert(I != Instructions.end() && "Not an instruction"); 210e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner return *I->second; 211e14d2e210dc7fe28009f44818a057622a73322e4Chris Lattner } 212a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner 213d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner /// getInstructionsByEnumValue - Return all of the instructions defined by the 214d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner /// target, ordered by their enum value. 2156a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner const std::vector<const CodeGenInstruction*> & 2166a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner getInstructionsByEnumValue() const { 217f65027842e82027dd6e8020586a299aaa548e355Chris Lattner if (InstrsByEnum.empty()) ComputeInstrsByEnum(); 218f65027842e82027dd6e8020586a299aaa548e355Chris Lattner return InstrsByEnum; 219f65027842e82027dd6e8020586a299aaa548e355Chris Lattner } 220d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner 2216a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner typedef std::vector<const CodeGenInstruction*>::const_iterator inst_iterator; 2226a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner inst_iterator inst_begin() const{return getInstructionsByEnumValue().begin();} 2236a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner inst_iterator inst_end() const { return getInstructionsByEnumValue().end(); } 224510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 225510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 22635e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman /// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]? 22735e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman /// 22835e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman bool isLittleEndianEncoding() const; 229510207cb1e7427df711ac85002cab622f67bdf7cJim Grosbach 230f65027842e82027dd6e8020586a299aaa548e355Chris Lattnerprivate: 2316a91b18e5777f39e52e93221453abfa4553b6f93Chris Lattner void ComputeInstrsByEnum() const; 23245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner}; 23345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 2340fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern 2350fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// tablegen class in TargetSelectionDAG.td 2360fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengclass ComplexPattern { 237825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MVT::SimpleValueType Ty; 2380fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng unsigned NumOperands; 2390fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng std::string SelectFunc; 2403aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng std::vector<Record*> RootNodes; 2418535624739e55ab7424eadf792e1a3b4123421c7Christopher Lamb unsigned Properties; // Node properties 2420fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengpublic: 243c128b3e74eaba34a8f6d2b8c3dc19861b9cbd901Chris Lattner ComplexPattern() : NumOperands(0) {} 2440fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng ComplexPattern(Record *R); 2450fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng 246825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MVT::SimpleValueType getValueType() const { return Ty; } 2470fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng unsigned getNumOperands() const { return NumOperands; } 2480fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng const std::string &getSelectFunc() const { return SelectFunc; } 2493aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng const std::vector<Record*> &getRootNodes() const { 2503aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng return RootNodes; 2510fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng } 25294b3040fef9475c74b877fb32cb45200cea273bbEvan Cheng bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } 2530fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng}; 2540fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng 255d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 256d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25745872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner#endif 258