[llvm-commits] [llvm] r118225 - /llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp

Chris Lattner sabre at nondot.org
Wed Nov 3 18:42:59 PDT 2010


Author: lattner
Date: Wed Nov  3 20:42:59 2010
New Revision: 118225

URL: http://llvm.org/viewvc/llvm-project?rev=118225&view=rev
Log:
replace SrcOpNum with SrcOpName, eliminating a numering dependency
on the incoming operand list.  This also makes the code simpler.

Modified:
    llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp

Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=118225&r1=118224&r2=118225&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Wed Nov  3 20:42:59 2010
@@ -250,10 +250,10 @@
     /// The unique class instance this operand should match.
     ClassInfo *Class;
 
-    /// The original operand this corresponds to.
-    int SrcOpNum;
+    /// The operand name this is, if anything.
+    StringRef SrcOpName;
     
-    explicit AsmOperand(StringRef T) : Token(T), Class(0), SrcOpNum(-1) {}
+    explicit AsmOperand(StringRef T) : Token(T), Class(0) {}
   };
   
   /// ResOperand - This represents a single operand in the result instruction
@@ -1141,7 +1141,7 @@
     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
       if (Operands[i].MIOperandNo == unsigned(OITied)) {
         OI = &Operands[i];
-        Idx = i;
+        OperandName = OI->Name;
         break;
       }
     }
@@ -1150,40 +1150,37 @@
   }
   
   Op.Class = getOperandClass(Token, *OI);
-  Op.SrcOpNum = Idx;
+  Op.SrcOpName = OperandName;
 }
 
 void MatchableInfo::BuildResultOperands() {
-  /// OperandMap - This is a mapping from the MCInst operands (specified by the
-  /// II.OperandList operands) to the AsmOperands that they are filled in from.
-  SmallVector<int, 16> OperandMap(TheOperandList.size(), -1);
-  
-  // Order the (class) operands by the order to convert them into an MCInst.
-  for (unsigned i = 0, e = AsmOperands.size(); i != e; ++i) {
-    MatchableInfo::AsmOperand &Op = AsmOperands[i];
-    if (Op.SrcOpNum != -1)
-      OperandMap[Op.SrcOpNum] = i;
-  }
-  
   for (unsigned i = 0, e = TheOperandList.size(); i != e; ++i) {
     const CGIOperandList::OperandInfo &OpInfo = TheOperandList[i];
+
+    // If this is a tied operand, just copy from the previously handled operand.
+    int TiedOp = OpInfo.getTiedRegister();
+    if (TiedOp != -1) {
+      ResOperands.push_back(ResOperand::getTiedOp(TiedOp, &OpInfo));
+      continue;
+    }
     
     // Find out what operand from the asmparser that this MCInst operand comes
     // from.
-    int SrcOperand = OperandMap[i];
-    if (SrcOperand != -1) {
+    int SrcOperand = -1;
+    for (unsigned op = 0, e = AsmOperands.size(); op != e; ++op)
+      if (OpInfo.Name == AsmOperands[op].SrcOpName) {
+        SrcOperand = op;
+        break;
+      }
+
+    if (!OpInfo.Name.empty() && SrcOperand != -1) {
       ResOperands.push_back(ResOperand::getRenderedOp(SrcOperand, &OpInfo));
       continue;
     }
     
-    // Otherwise, this must be a tied operand.
-    int TiedOp = OpInfo.getTiedRegister();
-    if (TiedOp == -1)
-      throw TGError(TheDef->getLoc(), "Instruction '" +
-                    TheDef->getName() + "' has operand '" + OpInfo.Name +
-                    "' that doesn't appear in asm string!");
-
-    ResOperands.push_back(ResOperand::getTiedOp(TiedOp, &OpInfo));
+    throw TGError(TheDef->getLoc(), "Instruction '" +
+                  TheDef->getName() + "' has operand '" + OpInfo.Name +
+                  "' that doesn't appear in asm string!");
   }
 }
 





More information about the llvm-commits mailing list