Rewrite tblgen handling of subtarget features so
[oota-llvm.git] / utils / TableGen / DAGISelEmitter.h
index 7b5f4f84b0e685476f7018fd777dae3a721cf050..534326e926173aa76aeb243ca8f0b43f07344280 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Chris Lattner and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
 #ifndef DAGISEL_EMITTER_H
 #define DAGISEL_EMITTER_H
 
-#include "TableGenBackend.h"
-#include "CodeGenTarget.h"
+#include "CodeGenDAGPatterns.h"
+#include <set>
 
 namespace llvm {
 
-/// InstrSelectorEmitter - The top-level class which coordinates construction
+/// DAGISelEmitter - The top-level class which coordinates construction
 /// and emission of the instruction selector.
 ///
 class DAGISelEmitter : public TableGenBackend {
   RecordKeeper &Records;
-  CodeGenTarget Target;
-
+  CodeGenDAGPatterns CGP;
 public:
-  DAGISelEmitter(RecordKeeper &R) : Records(R) {}
+  DAGISelEmitter(RecordKeeper &R) : Records(R), CGP(R) {}
 
   // run - Output the isel, returning true on failure.
-  void run(std::ostream &OS) {}
+  void run(std::ostream &OS);
+  
+  
+private:
+  void EmitNodeTransforms(std::ostream &OS);
+  void EmitPredicateFunctions(std::ostream &OS);
+  
+  void GenerateCodeForPattern(const PatternToMatch &Pattern,
+                  std::vector<std::pair<unsigned, std::string> > &GeneratedCode,
+                              std::set<std::string> &GeneratedDecl,
+                              std::vector<std::string> &TargetOpcodes,
+                              std::vector<std::string> &TargetVTs);
+  void EmitPatterns(std::vector<std::pair<const PatternToMatch*, 
+                  std::vector<std::pair<unsigned, std::string> > > > &Patterns, 
+                    unsigned Indent, std::ostream &OS);
+  
+  void EmitInstructionSelector(std::ostream &OS);
 };
 
 } // End llvm namespace