From 2738ff9c22d27ce3e4aee6f250eb68f594db1ce9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 6 Sep 2010 01:44:44 +0000 Subject: [PATCH] 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 --- utils/TableGen/IntrinsicEmitter.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) 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";