From: Chris Lattner Date: Mon, 6 Sep 2010 01:44:44 +0000 (+0000) Subject: slightly improve the runtime and code size of the Intrinsics info table by not X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=2738ff9c22d27ce3e4aee6f250eb68f594db1ce9;p=oota-llvm.git slightly improve the runtime and code size of the Intrinsics info table by not 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 --- diff --git a/utils/TableGen/IntrinsicEmitter.cpp b/utils/TableGen/IntrinsicEmitter.cpp index ba30d97eaa3..cd992c8181c 100644 --- a/utils/TableGen/IntrinsicEmitter.cpp +++ b/utils/TableGen/IntrinsicEmitter.cpp @@ -99,33 +99,35 @@ EmitFnNameRecognizer(const std::vector &Ints, // Build a function name -> intrinsic name mapping. std::map 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::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";