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