CodeGenTarget.h revision 3aa39f439a0971a2502b2c728a8006becaf96601
1803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner//===- CodeGenTarget.h - Target Class Wrapper -------------------*- C++ -*-===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// This file was developed by the LLVM research group and is distributed under
601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// the University of Illinois Open Source 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;
3045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
3145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// getValueType - Return the MVT::ValueType that the specified TableGen record
3245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// corresponds to.
3345872079672a4fb500fdcb9c77b23e3e550c8f97Chris LattnerMVT::ValueType getValueType(Record *Rec);
3445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
3545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerstd::ostream &operator<<(std::ostream &OS, MVT::ValueType T);
36d3464c19a8b6acecd8a9618489ec7612505fd4bdChris Lattnerstd::string getName(MVT::ValueType T);
37b72fb7ef75862269879ecaaf8e31c5d9a6bb56e5Chris Lattnerstd::string getEnumName(MVT::ValueType T);
3845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
3945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
4045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// CodeGenTarget - This class corresponds to the Target class in the .td files.
4145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner///
4245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass CodeGenTarget {
4345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  Record *TargetRec;
4445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  std::vector<Record*> CalleeSavedRegisters;
4545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  MVT::ValueType PointerType;
4645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
47ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  mutable std::map<std::string, CodeGenInstruction> Instructions;
4826693113201f4c9d441678e50d96f38d3288798eChris Lattner  mutable std::vector<CodeGenRegister> Registers;
49056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner  mutable std::vector<CodeGenRegisterClass> RegisterClasses;
50e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  mutable std::vector<MVT::ValueType> LegalValueTypes;
5126693113201f4c9d441678e50d96f38d3288798eChris Lattner  void ReadRegisters() const;
52056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner  void ReadRegisterClasses() const;
53056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner  void ReadInstructions() const;
54e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  void ReadLegalValueTypes() const;
5545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerpublic:
5645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  CodeGenTarget();
5745872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
5845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  Record *getTargetRecord() const { return TargetRec; }
5945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  const std::string &getName() const;
6045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
6145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  const std::vector<Record*> &getCalleeSavedRegisters() const {
6245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner    return CalleeSavedRegisters;
6345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  }
6445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
6554c66feed926f6cdaf544895f78b5bb1ead6f0eaChris Lattner  MVT::ValueType getPointerType() const { return PointerType; }
6654c66feed926f6cdaf544895f78b5bb1ead6f0eaChris Lattner
67175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner  /// getInstructionSet - Return the InstructionSet object.
68ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  ///
6945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner  Record *getInstructionSet() const;
7045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
71175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner  /// getAsmWriter - Return the AssemblyWriter definition for this target.
72175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner  ///
73175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner  Record *getAsmWriter() const;
74175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner
75e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  const std::vector<CodeGenRegister> &getRegisters() const {
7626693113201f4c9d441678e50d96f38d3288798eChris Lattner    if (Registers.empty()) ReadRegisters();
7726693113201f4c9d441678e50d96f38d3288798eChris Lattner    return Registers;
7826693113201f4c9d441678e50d96f38d3288798eChris Lattner  }
79ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner
80e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  const std::vector<CodeGenRegisterClass> &getRegisterClasses() const {
81056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    if (RegisterClasses.empty()) ReadRegisterClasses();
82056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    return RegisterClasses;
83056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner  }
84ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman
85ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman  const CodeGenRegisterClass &getRegisterClass(Record *R) const {
86ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman    const std::vector<CodeGenRegisterClass> &RC = getRegisterClasses();
87ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman    for (unsigned i = 0, e = RC.size(); i != e; ++i)
88ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman      if (RC[i].TheDef == R)
89ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman        return RC[i];
90ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman    assert(0 && "Didn't find the register class");
91ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman    abort();
92ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman  }
935c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner
945c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner  /// getRegisterClassForRegister - Find the register class that contains the
955c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner  /// specified physical register.  If there register exists in multiple
965c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner  /// register classes or is not in a register class, return null.
975c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner  const CodeGenRegisterClass *getRegisterClassForRegister(Record *R) const {
985c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses();
995c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    const CodeGenRegisterClass *FoundRC = 0;
1005c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    for (unsigned i = 0, e = RCs.size(); i != e; ++i) {
1015c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner      const CodeGenRegisterClass &RC = RegisterClasses[i];
1025c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner      for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) {
1035c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner        if (R == RC.Elements[ei]) {
1045c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner          if (FoundRC) return 0;  // In multiple RC's
1055c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner          FoundRC = &RC;
1065c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner          break;
1075c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner        }
1085c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner      }
1095c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    }
1105c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    return FoundRC;
1115c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner  }
1125c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner
113e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  const std::vector<MVT::ValueType> &getLegalValueTypes() const {
114e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner    if (LegalValueTypes.empty()) ReadLegalValueTypes();
115e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner    return LegalValueTypes;
116e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  }
117e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner
118e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  /// isLegalValueType - Return true if the specified value type is natively
119e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  /// supported by the target (i.e. there are registers that directly hold it).
120e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  bool isLegalValueType(MVT::ValueType VT) const {
121e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner    const std::vector<MVT::ValueType> &LegalVTs = getLegalValueTypes();
122e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner    for (unsigned i = 0, e = LegalVTs.size(); i != e; ++i)
123e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner      if (LegalVTs[i] == VT) return true;
124e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner    return false;
125e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner  }
126056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner
127ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  /// getInstructions - Return all of the instructions defined for this target.
128ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  ///
129ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  const std::map<std::string, CodeGenInstruction> &getInstructions() const {
130ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner    if (Instructions.empty()) ReadInstructions();
131ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner    return Instructions;
132ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  }
133ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner
134a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner  CodeGenInstruction &getInstruction(const std::string &Name) const {
135a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner    const std::map<std::string, CodeGenInstruction> &Insts = getInstructions();
136a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner    assert(Insts.count(Name) && "Not an instruction!");
137a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner    return const_cast<CodeGenInstruction&>(Insts.find(Name)->second);
138a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner  }
139a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner
140ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  typedef std::map<std::string,
141ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner                   CodeGenInstruction>::const_iterator inst_iterator;
142ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  inst_iterator inst_begin() const { return getInstructions().begin(); }
143ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner  inst_iterator inst_end() const { return Instructions.end(); }
14426693113201f4c9d441678e50d96f38d3288798eChris Lattner
145d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner  /// getInstructionsByEnumValue - Return all of the instructions defined by the
146d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner  /// target, ordered by their enum value.
147d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner  void getInstructionsByEnumValue(std::vector<const CodeGenInstruction*>
148d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner                                                &NumberedInstructions);
149d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner
150d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner
15126693113201f4c9d441678e50d96f38d3288798eChris Lattner  /// getPHIInstruction - Return the designated PHI instruction.
15226693113201f4c9d441678e50d96f38d3288798eChris Lattner  ///
15326693113201f4c9d441678e50d96f38d3288798eChris Lattner  const CodeGenInstruction &getPHIInstruction() const;
15435e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman
15535e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman  /// isLittleEndianEncoding - are instruction bit patterns defined as  [0..n]?
15635e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman  ///
15735e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman  bool isLittleEndianEncoding() const;
15845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner};
15945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner
1600fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern
1610fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// tablegen class in TargetSelectionDAG.td
1620fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengclass ComplexPattern {
1633aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng  MVT::ValueType Ty;
1640fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  unsigned NumOperands;
1650fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  std::string SelectFunc;
1663aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng  std::vector<Record*> RootNodes;
1670fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengpublic:
1680fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  ComplexPattern() : NumOperands(0) {};
1690fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  ComplexPattern(Record *R);
1700fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng
1713aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng  MVT::ValueType getValueType() const { return Ty; }
1720fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  unsigned getNumOperands() const { return NumOperands; }
1730fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  const std::string &getSelectFunc() const { return SelectFunc; }
1743aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng  const std::vector<Record*> &getRootNodes() const {
1753aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng    return RootNodes;
1760fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng  }
1770fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng};
1780fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng
179d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
180d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
18145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner#endif
182