when parsing instructions remember information about the types taken and
authorChris Lattner <sabre@nondot.org>
Thu, 15 Sep 2005 21:51:12 +0000 (21:51 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Sep 2005 21:51:12 +0000 (21:51 +0000)
returned.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23367 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp
utils/TableGen/DAGISelEmitter.h

index 8e7569bcfe7ca3fe8f10927310edee1ae491980c..dcdbb1cb6ad2dfec834b378fc0442f2d7b7e7db6 100644 (file)
@@ -805,6 +805,7 @@ void DAGISelEmitter::ParseInstructions() {
     CodeGenInstruction &CGI = Target.getInstruction(Instrs[i]->getName());
 
     // Check that all of the results occur first in the list.
+    std::vector<MVT::ValueType> ResultTypes;
     for (unsigned i = 0; i != NumResults; ++i) {
       if (i == CGI.OperandList.size())
         I->error("'" + InstResults.begin()->first +
@@ -820,6 +821,9 @@ void DAGISelEmitter::ParseInstructions() {
       if (CGI.OperandList[i].Rec != R)
         I->error("Operand $" + OpName + " class mismatch!");
       
+      // Remember the return type.
+      ResultTypes.push_back(CGI.OperandList[i].Ty);
+      
       // Okay, this one checks out.
       InstResults.erase(OpName);
     }
@@ -829,6 +833,7 @@ void DAGISelEmitter::ParseInstructions() {
     std::map<std::string, TreePatternNode*> InstInputsCheck(InstInputs);
 
     std::vector<TreePatternNode*> ResultNodeOperands;
+    std::vector<MVT::ValueType> OperandTypes;
     for (unsigned i = NumResults, e = CGI.OperandList.size(); i != e; ++i) {
       const std::string &OpName = CGI.OperandList[i].Name;
       if (OpName.empty())
@@ -842,6 +847,7 @@ void DAGISelEmitter::ParseInstructions() {
       if (CGI.OperandList[i].Ty != InVal->getType())
         I->error("Operand $" + OpName +
                  "'s type disagrees between the operand and pattern");
+      OperandTypes.push_back(InVal->getType());
       
       // Construct the result for the dest-pattern operand list.
       TreePatternNode *OpNode = InVal->clone();
@@ -867,10 +873,8 @@ void DAGISelEmitter::ParseInstructions() {
     TreePatternNode *ResultPattern =
       new TreePatternNode(I->getRecord(), ResultNodeOperands);
     
-    unsigned NumOperands = CGI.OperandList.size()-NumResults;
-     
     DEBUG(I->dump());
-    Instructions.push_back(DAGInstruction(I, NumResults, NumOperands,
+    Instructions.push_back(DAGInstruction(I, ResultTypes, OperandTypes,
                                           ResultPattern));
   }
    
index 280cab35560af604372a8011bfacdadd53f81c62..a8726d9b8dc30b9d1302c0dea13b16d2f4598e96 100644 (file)
@@ -279,16 +279,30 @@ namespace llvm {
     TreePattern *Pattern;
     unsigned NumResults;
     unsigned NumOperands;
+    std::vector<MVT::ValueType> ResultTypes;
+    std::vector<MVT::ValueType> OperandTypes;
     TreePatternNode *ResultPattern;
   public:
-    DAGInstruction(TreePattern *TP, unsigned results, unsigned ops,
+    DAGInstruction(TreePattern *TP,
+                   const std::vector<MVT::ValueType> &resultTypes,
+                   const std::vector<MVT::ValueType> &operandTypes,
                    TreePatternNode *resultPattern)
-      : Pattern(TP), NumResults(results), NumOperands(ops), 
+      : Pattern(TP), ResultTypes(resultTypes), OperandTypes(operandTypes), 
         ResultPattern(resultPattern) {}
 
     TreePattern *getPattern() const { return Pattern; }
-    unsigned getNumResults() const { return NumResults; }
-    unsigned getNumOperands() const { return NumOperands; }
+    unsigned getNumResults() const { return ResultTypes.size(); }
+    unsigned getNumOperands() const { return OperandTypes.size(); }
+    
+    MVT::ValueType getResultType(unsigned RN) const {
+      assert(RN < ResultTypes.size());
+      return ResultTypes[RN];
+    }
+    
+    MVT::ValueType getOperandType(unsigned ON) const {
+      assert(ON < OperandTypes.size());
+      return OperandTypes[ON];
+    }
     TreePatternNode *getResultPattern() const { return ResultPattern; }
   };