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

Daniel Dunbar daniel at zuster.org
Thu Feb 11 17:46:55 PST 2010


Author: ddunbar
Date: Thu Feb 11 19:46:54 2010
New Revision: 95956

URL: http://llvm.org/viewvc/llvm-project?rev=95956&view=rev
Log:
MC: Fix bug where trailing tied operands were forgotten; the X86 assembler
matcher is now free of implicit operands!
 - Still need to clean up the code now that we don't to worry about implicit
   operands, and to make it a hard error if an instruction fails to specify all
   of its operands for some reason.

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=95956&r1=95955&r2=95956&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Thu Feb 11 19:46:54 2010
@@ -975,6 +975,16 @@
   std::sort(Classes.begin(), Classes.end(), less_ptr<ClassInfo>());
 }
 
+static std::pair<unsigned, unsigned> *
+GetTiedOperandAtIndex(SmallVectorImpl<std::pair<unsigned, unsigned> > &List,
+                      unsigned Index) {
+  for (unsigned i = 0, e = List.size(); i != e; ++i)
+    if (Index == List[i].first)
+      return &List[i];
+
+  return 0;
+}
+
 static void EmitConvertToMCInst(CodeGenTarget &Target,
                                 std::vector<InstructionInfo*> &Infos,
                                 raw_ostream &OS) {
@@ -1051,15 +1061,12 @@
       //
       // FIXME: This should be removed from the MCInst structure.
       for (; CurIndex != Op.OperandInfo->MIOperandNo; ++CurIndex) {
-        // See if this is a tied operand.
-        unsigned i, e = TiedOperands.size();
-        for (i = 0; i != e; ++i)
-          if (CurIndex == TiedOperands[i].first)
-            break;
-        if (i == e)
+        std::pair<unsigned, unsigned> *Tie = GetTiedOperandAtIndex(TiedOperands,
+                                                                   CurIndex);
+        if (!Tie)
           Signature += "__Imp";
         else
-          Signature += "__Tie" + utostr(TiedOperands[i].second);
+          Signature += "__Tie" + utostr(Tie->second);
       }
 
       Signature += "__";
@@ -1080,8 +1087,14 @@
     }
 
     // Add any trailing implicit operands.
-    for (; CurIndex != NumMIOperands; ++CurIndex)
-      Signature += "__Imp";
+    for (; CurIndex != NumMIOperands; ++CurIndex) {
+      std::pair<unsigned, unsigned> *Tie = GetTiedOperandAtIndex(TiedOperands,
+                                                                 CurIndex);
+      if (!Tie)
+        Signature += "__Imp";
+      else
+        Signature += "__Tie" + utostr(Tie->second);
+    }
 
     II.ConversionFnKind = Signature;
 
@@ -1103,21 +1116,18 @@
       // Add the implicit operands.
       for (; CurIndex != Op.OperandInfo->MIOperandNo; ++CurIndex) {
         // See if this is a tied operand.
-        unsigned i, e = TiedOperands.size();
-        for (i = 0; i != e; ++i)
-          if (CurIndex == TiedOperands[i].first)
-            break;
+        std::pair<unsigned, unsigned> *Tie = GetTiedOperandAtIndex(TiedOperands,
+                                                                   CurIndex);
 
-        if (i == e) {
+        if (!Tie) {
           // If not, this is some implicit operand. Just assume it is a register
           // for now.
           CvtOS << "    Inst.addOperand(MCOperand::CreateReg(0));\n";
         } else {
           // Copy the tied operand.
-          assert(TiedOperands[i].first > TiedOperands[i].second &&
-                 "Tied operand preceeds its target!");
+          assert(Tie->first>Tie->second && "Tied operand preceeds its target!");
           CvtOS << "    Inst.addOperand(Inst.getOperand("
-                << TiedOperands[i].second << "));\n";
+                << Tie->second << "));\n";
         }
       }
 
@@ -1129,8 +1139,22 @@
     }
     
     // And add trailing implicit operands.
-    for (; CurIndex != NumMIOperands; ++CurIndex)
-      CvtOS << "    Inst.addOperand(MCOperand::CreateReg(0));\n";
+    for (; CurIndex != NumMIOperands; ++CurIndex) {
+      std::pair<unsigned, unsigned> *Tie = GetTiedOperandAtIndex(TiedOperands,
+                                                                 CurIndex);
+
+      if (!Tie) {
+        // If not, this is some implicit operand. Just assume it is a register
+        // for now.
+        CvtOS << "    Inst.addOperand(MCOperand::CreateReg(0));\n";
+      } else {
+        // Copy the tied operand.
+        assert(Tie->first>Tie->second && "Tied operand preceeds its target!");
+        CvtOS << "    Inst.addOperand(Inst.getOperand("
+              << Tie->second << "));\n";
+      }
+    }
+
     CvtOS << "    break;\n";
   }
 





More information about the llvm-commits mailing list