allow ptr_rc to explicitly appear in an instructions operand list, it doesn't
authorChris Lattner <sabre@nondot.org>
Fri, 10 Nov 2006 02:01:40 +0000 (02:01 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 10 Nov 2006 02:01:40 +0000 (02:01 +0000)
have to be a subpart of a complex operand.

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

utils/TableGen/CodeGenTarget.cpp
utils/TableGen/InstrInfoEmitter.cpp

index 440e7c6703465649ba93ca0f3eb004cc907fc013..8aad3def21c50543409fe06ddaeaabfd948a45e2 100644 (file)
@@ -386,7 +386,8 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr)
     } else if (Rec->getName() == "variable_ops") {
       hasVariableNumberOfOperands = true;
       continue;
-    } else if (!Rec->isSubClassOf("RegisterClass"))
+    } else if (!Rec->isSubClassOf("RegisterClass") && 
+               Rec->getName() != "ptr_rc")
       throw "Unknown operand class '" + Rec->getName() +
             "' in instruction '" + R->getName() + "' instruction!";
 
index deee320c5d510c2f6fb019ab6d338feb6cadf658..7c5cc3b65eff271406c0c20077abaddcb288d8df 100644 (file)
@@ -66,50 +66,53 @@ void InstrInfoEmitter::printDefList(const std::vector<Record*> &Uses,
 std::vector<std::string>
 InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
   std::vector<std::string> Result;
+  
   for (unsigned i = 0, e = Inst.OperandList.size(); i != e; ++i) {
-    if (Inst.OperandList[i].Rec->isSubClassOf("RegisterClass")) {
-      std::string OpStr = getQualifiedName(Inst.OperandList[i].Rec);
-      OpStr += "RegClassID, 0, ";
-      OpStr += Inst.OperandList[i].Constraint;
-
-      Result.push_back(OpStr);
+    // Handle aggregate operands and normal operands the same way by expanding
+    // either case into a list of operands for this op.
+    std::vector<CodeGenInstruction::OperandInfo> OperandList;
+
+    // This might be a multiple operand thing.  Targets like X86 have
+    // registers in their multi-operand operands.  It may also be an anonymous
+    // operand, which has a single operand, but no declared class for the
+    // operand.
+    DagInit *MIOI = Inst.OperandList[i].MIOperandInfo;
+    
+    if (!MIOI || MIOI->getNumArgs() == 0) {
+      // Single, anonymous, operand.
+      OperandList.push_back(Inst.OperandList[i]);
     } else {
-      // This might be a multiple operand thing.  Targets like X86 have
-      // registers in their multi-operand operands.  It may also be an anonymous
-      // operand, which has a single operand, but no declared class for the
-      // operand.
-      DagInit *MIOI = Inst.OperandList[i].MIOperandInfo;
-      
       for (unsigned j = 0, e = Inst.OperandList[i].MINumOperands; j != e; ++j) {
-        Record *OpR = 0;
-        if (MIOI && j < MIOI->getNumArgs())
-          if (DefInit *Def = dynamic_cast<DefInit*>(MIOI->getArg(j)))
-            OpR = Def->getDef();
-
-        
-        std::string Res;
-
-        if (OpR && OpR->isSubClassOf("RegisterClass"))
-          Res += getQualifiedName(OpR) + "RegClassID, ";
-        else
-          Res += "0, ";
+        OperandList.push_back(Inst.OperandList[i]);
 
-        // Fill in applicable flags.
-        Res += "0";
-        
-        // Ptr value whose register class is resolved via callback.
-        if (OpR && OpR->getName() == "ptr_rc")
-          Res += "|M_LOOK_UP_PTR_REG_CLASS";
+        Record *OpR = dynamic_cast<DefInit*>(MIOI->getArg(j))->getDef();
+        OperandList.back().Rec = OpR;
+      }
+    }
 
-        // Predicate operands.
-        if (j == 0 && Inst.OperandList[i].Rec->isSubClassOf("PredicateOperand"))
-          Res += "|M_PREDICATE_OPERAND";
+    for (unsigned j = 0, e = OperandList.size(); j != e; ++j) {
+      Record *OpR = OperandList[j].Rec;
+      std::string Res;
+      
+      if (OpR->isSubClassOf("RegisterClass"))
+        Res += getQualifiedName(OpR) + "RegClassID, ";
+      else
+        Res += "0, ";
+      // Fill in applicable flags.
+      Res += "0";
         
-        // fill in constraint info.
-        Res += ", " + Inst.OperandList[i].Constraint;
+      // Ptr value whose register class is resolved via callback.
+      if (OpR->getName() == "ptr_rc")
+        Res += "|M_LOOK_UP_PTR_REG_CLASS";
+
+      // Predicate operands.  Check to see if the original unexpanded operand
+      // was of type PredicateOperand.
+      if (j == 0 && Inst.OperandList[i].Rec->isSubClassOf("PredicateOperand"))
+        Res += "|M_PREDICATE_OPERAND";
         
-        Result.push_back(Res);
-      }
+      // Fill in constraint info.
+      Res += ", " + Inst.OperandList[i].Constraint;
+      Result.push_back(Res);
     }
   }