OSDN Git Service

change OperandsSignature to use SmallVector<char> instead of std::vector<string>
authorChris Lattner <sabre@nondot.org>
Sun, 17 Apr 2011 22:24:13 +0000 (22:24 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 17 Apr 2011 22:24:13 +0000 (22:24 +0000)
since the strings are always exactly one character, and there are usually only 2-3 operands.

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

utils/TableGen/CodeGenInstruction.h
utils/TableGen/FastISelEmitter.cpp

index 6d2d8fb..5f1e0be 100644 (file)
@@ -137,6 +137,7 @@ namespace llvm {
     bool isVariadic;
 
     // Provide transparent accessors to the operand list.
+    bool empty() const { return OperandList.empty(); }
     unsigned size() const { return OperandList.size(); }
     const OperandInfo &operator[](unsigned i) const { return OperandList[i]; }
     OperandInfo &operator[](unsigned i) { return OperandList[i]; }
index 8e04e40..62ac64d 100644 (file)
@@ -40,7 +40,7 @@ struct InstructionMemo {
 /// types. It has utility methods for emitting text based on the operands.
 ///
 struct OperandsSignature {
-  std::vector<std::string> Operands;
+  SmallVector<char, 3> Operands;
 
   bool operator<(const OperandsSignature &O) const {
     return Operands < O.Operands;
@@ -57,11 +57,11 @@ struct OperandsSignature {
 
     if (!InstPatNode->isLeaf()) {
       if (InstPatNode->getOperator()->getName() == "imm") {
-        Operands.push_back("i");
+        Operands.push_back('i');
         return true;
       }
       if (InstPatNode->getOperator()->getName() == "fpimm") {
-        Operands.push_back("f");
+        Operands.push_back('f');
         return true;
       }
     }
@@ -78,11 +78,11 @@ struct OperandsSignature {
 
       if (!Op->isLeaf()) {
         if (Op->getOperator()->getName() == "imm") {
-          Operands.push_back("i");
+          Operands.push_back('i');
           continue;
         }
         if (Op->getOperator()->getName() == "fpimm") {
-          Operands.push_back("f");
+          Operands.push_back('f');
           continue;
         }
         // For now, ignore other non-leaf nodes.
@@ -122,18 +122,18 @@ struct OperandsSignature {
           return false;
       } else
         DstRC = RC;
-      Operands.push_back("r");
+      Operands.push_back('r');
     }
     return true;
   }
 
   void PrintParameters(raw_ostream &OS) const {
     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
-      if (Operands[i] == "r") {
+      if (Operands[i] == 'r') {
         OS << "unsigned Op" << i << ", bool Op" << i << "IsKill";
-      } else if (Operands[i] == "i") {
+      } else if (Operands[i] == 'i') {
         OS << "uint64_t imm" << i;
-      } else if (Operands[i] == "f") {
+      } else if (Operands[i] == 'f') {
         OS << "ConstantFP *f" << i;
       } else {
         assert("Unknown operand kind!");
@@ -155,13 +155,13 @@ struct OperandsSignature {
 
       if (PrintedArg)
         OS << ", ";
-      if (Operands[i] == "r") {
+      if (Operands[i] == 'r') {
         OS << "Op" << i << ", Op" << i << "IsKill";
         PrintedArg = true;
-      } else if (Operands[i] == "i") {
+      } else if (Operands[i] == 'i') {
         OS << "imm" << i;
         PrintedArg = true;
-      } else if (Operands[i] == "f") {
+      } else if (Operands[i] == 'f') {
         OS << "f" << i;
         PrintedArg = true;
       } else {
@@ -173,11 +173,11 @@ struct OperandsSignature {
 
   void PrintArguments(raw_ostream &OS) const {
     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
-      if (Operands[i] == "r") {
+      if (Operands[i] == 'r') {
         OS << "Op" << i << ", Op" << i << "IsKill";
-      } else if (Operands[i] == "i") {
+      } else if (Operands[i] == 'i') {
         OS << "imm" << i;
-      } else if (Operands[i] == "f") {
+      } else if (Operands[i] == 'f') {
         OS << "f" << i;
       } else {
         assert("Unknown operand kind!");
@@ -266,7 +266,7 @@ void FastISelMap::CollectPatterns(CodeGenDAGPatterns &CGP) {
     if (!Op->isSubClassOf("Instruction"))
       continue;
     CodeGenInstruction &II = CGP.getTargetInfo().getInstruction(Op);
-    if (II.Operands.size() == 0)
+    if (II.Operands.empty())
       continue;
 
     // For now, ignore multi-instruction patterns.