slightly improve the runtime and code size of the Intrinsics info table by not
authorChris Lattner <sabre@nondot.org>
Mon, 6 Sep 2010 01:44:44 +0000 (01:44 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 6 Sep 2010 01:44:44 +0000 (01:44 +0000)
comparing the "llvm." prefix in the memcmp, and not storing it in the string literal.

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

utils/TableGen/IntrinsicEmitter.cpp

index ba30d97eaa35b4103447a666d0a943fd81b7ee36..cd992c8181cd8c99bbe12c1a05a0960f47bc0d73 100644 (file)
@@ -99,33 +99,35 @@ EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints,
   // Build a function name -> intrinsic name mapping.
   std::map<std::string, unsigned> IntMapping;
   for (unsigned i = 0, e = Ints.size(); i != e; ++i)
-    IntMapping[Ints[i].Name] = i;
+    IntMapping[Ints[i].Name.substr(5)] = i;
     
   OS << "// Function name -> enum value recognizer code.\n";
   OS << "#ifdef GET_FUNCTION_RECOGNIZER\n";
-  OS << "  switch (Name[5]) {\n";
+  OS << "  Name += 5; Len -= 5;  // Skip over 'llvm.'\n";
+  OS << "  switch (*Name) {      // Dispatch on first letter.\n";
   OS << "  default:\n";
   // Emit the intrinsics in sorted order.
   char LastChar = 0;
   for (std::map<std::string, unsigned>::iterator I = IntMapping.begin(),
        E = IntMapping.end(); I != E; ++I) {
-    if (I->first[5] != LastChar) {
-      LastChar = I->first[5];
+    if (I->first[0] != LastChar) {
+      LastChar = I->first[0];
       OS << "    break;\n";
       OS << "  case '" << LastChar << "':\n";
     }
     
     // For overloaded intrinsics, only the prefix needs to match
-    if (Ints[I->second].isOverloaded)
-      OS << "    if (Len > " << I->first.size()
-       << " && !memcmp(Name, \"" << I->first << ".\", "
-       << (I->first.size() + 1) << ")) return " << TargetPrefix << "Intrinsic::"
+    std::string TheStr = I->first;
+    if (Ints[I->second].isOverloaded) {
+      TheStr += '.';  // Require "bswap." instead of bswap.
+      OS << "    if (Len > " << I->first.size();
+    } else {
+      OS << "    if (Len == " << I->first.size();
+    }
+      
+    OS << " && !memcmp(Name, \"" << TheStr << "\", "
+       << TheStr.size() << ")) return " << TargetPrefix << "Intrinsic::"
        << Ints[I->second].EnumName << ";\n";
-    else 
-      OS << "    if (Len == " << I->first.size()
-         << " && !memcmp(Name, \"" << I->first << "\", "
-         << I->first.size() << ")) return " << TargetPrefix << "Intrinsic::"
-         << Ints[I->second].EnumName << ";\n";
   }
   OS << "  }\n";
   OS << "#endif\n\n";