summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-09-06 01:44:44 +0000
committerChris Lattner <sabre@nondot.org>2010-09-06 01:44:44 +0000
commitfb43da66b59ad34493af16d690885b119c197951 (patch)
tree0c9102e75364efecd178d454b6660b621cd1fcba
parente34c835bdef14f08b512ec5669f47b921ddd309f (diff)
downloadbcm5719-llvm-fb43da66b59ad34493af16d690885b119c197951.tar.gz
bcm5719-llvm-fb43da66b59ad34493af16d690885b119c197951.zip
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. llvm-svn: 113136
-rw-r--r--llvm/utils/TableGen/IntrinsicEmitter.cpp28
1 files changed, 15 insertions, 13 deletions
diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp
index ba30d97eaa3..cd992c8181c 100644
--- a/llvm/utils/TableGen/IntrinsicEmitter.cpp
+++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp
@@ -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";
OpenPOWER on IntegriCloud