Read in expanders too
authorChris Lattner <sabre@nondot.org>
Thu, 7 Aug 2003 19:21:10 +0000 (19:21 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 7 Aug 2003 19:21:10 +0000 (19:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7678 91177308-0d34-0410-b5e6-96231b3b80d8

support/tools/TableGen/InstrSelectorEmitter.cpp
support/tools/TableGen/InstrSelectorEmitter.h
utils/TableGen/InstrSelectorEmitter.cpp
utils/TableGen/InstrSelectorEmitter.h

index cf3fa68cb7e882491f85f689a64faec8a4633eb7..702438a8e103848c733197005f2aed62de66f414 100644 (file)
@@ -42,6 +42,7 @@ void TreePatternNode::dump() const { std::cerr << *this; }
 ///
 void InstrSelectorEmitter::ProcessNodeTypes() {
   std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
+  DEBUG(std::cerr << "Getting node types: ");
   for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
     Record *Node = Nodes[i];
     
@@ -70,8 +71,9 @@ void InstrSelectorEmitter::ProcessNodeTypes() {
 
     // Add the node type mapping now...
     NodeTypes[Node] = NodeType(RetTy, ArgTypes);
-    DEBUG(std::cerr << "Got node type '" << Node->getName() << "'\n");
+    DEBUG(std::cerr << Node->getName() << ", ");
   }
+  DEBUG(std::cerr << "DONE!\n");
 }
 
 static MVT::ValueType getIntrinsicType(Record *R) {
@@ -106,10 +108,10 @@ Pattern::Pattern(PatternType pty, DagInit *RawPat, Record *TheRec,
     AnyUnset = InferTypes(Tree, MadeChange);
   } while ((AnyUnset || MadeChange) && !(AnyUnset && !MadeChange));
 
-  if (PTy == Instruction) {
+  if (PTy == Instruction || PTy == Expander) {
     // Check to make sure there is not any unset types in the tree pattern...
     if (AnyUnset) {
-      std::cerr << "In instruction pattern: " << *Tree << "\n";
+      std::cerr << "In pattern: " << *Tree << "\n";
       error("Could not infer all types!");
     }
 
@@ -296,6 +298,20 @@ void InstrSelectorEmitter::ProcessInstructionPatterns() {
   }
 }
 
+/// ProcessExpanderPatterns - Read in all expander patterns...
+///
+void InstrSelectorEmitter::ProcessExpanderPatterns() {
+  std::vector<Record*> Expanders = Records.getAllDerivedDefinitions("Expander");
+  for (unsigned i = 0, e = Expanders.size(); i != e; ++i) {
+    Record *Expander = Expanders[i];
+    DagInit *DI = Expanders[i]->getValueAsDag("Pattern");
+
+    Pattern *P = new Pattern(Pattern::Expander, DI, Expanders[i], *this);
+
+    DEBUG(std::cerr << "Parsed " << *P << "\n");
+  }
+}
+
 
 void InstrSelectorEmitter::run(std::ostream &OS) {
   // Type-check all of the node types to ensure we "understand" them.
@@ -308,5 +324,5 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
   ProcessInstructionPatterns();
 
   // Read all of the Expander patterns in...
-  
+  ProcessExpanderPatterns();
 }
index b168e50686f9b518eb0c5fd2aa183622d2b3a80f..681830ffa8ff8a5d7968f02037ce73b86e489d2f 100644 (file)
@@ -199,6 +199,9 @@ private:
   // ProcessInstructionPatterns - Read in all subclasses of Instruction, and
   // process those with a useful Pattern field.
   void ProcessInstructionPatterns();
+
+  // ProcessExpanderPatterns - Read in all of the expanded patterns.
+  void ProcessExpanderPatterns();
 };
 
 #endif
index cf3fa68cb7e882491f85f689a64faec8a4633eb7..702438a8e103848c733197005f2aed62de66f414 100644 (file)
@@ -42,6 +42,7 @@ void TreePatternNode::dump() const { std::cerr << *this; }
 ///
 void InstrSelectorEmitter::ProcessNodeTypes() {
   std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
+  DEBUG(std::cerr << "Getting node types: ");
   for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
     Record *Node = Nodes[i];
     
@@ -70,8 +71,9 @@ void InstrSelectorEmitter::ProcessNodeTypes() {
 
     // Add the node type mapping now...
     NodeTypes[Node] = NodeType(RetTy, ArgTypes);
-    DEBUG(std::cerr << "Got node type '" << Node->getName() << "'\n");
+    DEBUG(std::cerr << Node->getName() << ", ");
   }
+  DEBUG(std::cerr << "DONE!\n");
 }
 
 static MVT::ValueType getIntrinsicType(Record *R) {
@@ -106,10 +108,10 @@ Pattern::Pattern(PatternType pty, DagInit *RawPat, Record *TheRec,
     AnyUnset = InferTypes(Tree, MadeChange);
   } while ((AnyUnset || MadeChange) && !(AnyUnset && !MadeChange));
 
-  if (PTy == Instruction) {
+  if (PTy == Instruction || PTy == Expander) {
     // Check to make sure there is not any unset types in the tree pattern...
     if (AnyUnset) {
-      std::cerr << "In instruction pattern: " << *Tree << "\n";
+      std::cerr << "In pattern: " << *Tree << "\n";
       error("Could not infer all types!");
     }
 
@@ -296,6 +298,20 @@ void InstrSelectorEmitter::ProcessInstructionPatterns() {
   }
 }
 
+/// ProcessExpanderPatterns - Read in all expander patterns...
+///
+void InstrSelectorEmitter::ProcessExpanderPatterns() {
+  std::vector<Record*> Expanders = Records.getAllDerivedDefinitions("Expander");
+  for (unsigned i = 0, e = Expanders.size(); i != e; ++i) {
+    Record *Expander = Expanders[i];
+    DagInit *DI = Expanders[i]->getValueAsDag("Pattern");
+
+    Pattern *P = new Pattern(Pattern::Expander, DI, Expanders[i], *this);
+
+    DEBUG(std::cerr << "Parsed " << *P << "\n");
+  }
+}
+
 
 void InstrSelectorEmitter::run(std::ostream &OS) {
   // Type-check all of the node types to ensure we "understand" them.
@@ -308,5 +324,5 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
   ProcessInstructionPatterns();
 
   // Read all of the Expander patterns in...
-  
+  ProcessExpanderPatterns();
 }
index b168e50686f9b518eb0c5fd2aa183622d2b3a80f..681830ffa8ff8a5d7968f02037ce73b86e489d2f 100644 (file)
@@ -199,6 +199,9 @@ private:
   // ProcessInstructionPatterns - Read in all subclasses of Instruction, and
   // process those with a useful Pattern field.
   void ProcessInstructionPatterns();
+
+  // ProcessExpanderPatterns - Read in all of the expanded patterns.
+  void ProcessExpanderPatterns();
 };
 
 #endif