Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1253)

Unified Diff: runtime/vm/intrinsifier.cc

Issue 468793004: VM: Improve performance of method recognizer and unify the it with the intrinsifier. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/intrinsifier.h ('k') | runtime/vm/intrinsifier_arm.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intrinsifier.cc
===================================================================
--- runtime/vm/intrinsifier.cc (revision 39404)
+++ runtime/vm/intrinsifier.cc (working copy)
@@ -14,75 +14,6 @@
DEFINE_FLAG(bool, intrinsify, true, "Instrinsify when possible");
DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
-static bool CompareNames(const Library& lib,
- const char* test_name,
- const char* name) {
- static const char* kPrivateGetterPrefix = "get:_";
- static const char* kPrivateSetterPrefix = "set:_";
-
- if (test_name[0] == '_') {
- if (name[0] != '_') {
- return false;
- }
- } else if (strncmp(test_name,
- kPrivateGetterPrefix,
- strlen(kPrivateGetterPrefix)) == 0) {
- if (strncmp(name,
- kPrivateGetterPrefix,
- strlen(kPrivateGetterPrefix)) != 0) {
- return false;
- }
- } else if (strncmp(test_name,
- kPrivateSetterPrefix,
- strlen(kPrivateSetterPrefix)) == 0) {
- if (strncmp(name,
- kPrivateSetterPrefix,
- strlen(kPrivateSetterPrefix)) != 0) {
- return false;
- }
- } else {
- return (strcmp(test_name, name) == 0);
- }
-
- // Check if the private class is member of the library and matches
- // the test_class_name.
- const String& test_str = String::Handle(String::New(test_name));
- const String& test_str_with_key = String::Handle(
- String::Concat(test_str, String::Handle(lib.private_key())));
- if (strcmp(test_str_with_key.ToCString(), name) == 0) {
- return true;
- }
-
- return false;
-}
-
-
-// Returns true if the function matches function_name and class_name, with
-// special recognition of corelib private classes.
-static bool TestFunction(const Library& lib,
- const Function& function,
- const char* function_class_name,
- const char* function_name,
- const char* test_class_name,
- const char* test_function_name) {
- // If test_function_name starts with a '.' we use that to indicate
- // that it is a named constructor in the class. Therefore, if
- // the class matches and the rest of the method name starting with
- // the dot matches, we have found a match.
- // We do not store the entire factory constructor name with the class
- // (e.g: _GrowableList.withData) because the actual function name
- // that we see here includes the private key.
- if (test_function_name[0] == '.') {
- function_name = strstr(function_name, ".");
- if (function_name == NULL) {
- return false;
- }
- }
- return CompareNames(lib, test_class_name, function_class_name) &&
- CompareNames(lib, test_function_name, function_name);
-}
-
-
bool Intrinsifier::CanIntrinsify(const Function& function) {
if (!FLAG_intrinsify) return false;
if (function.IsClosureFunction()) return false;
@@ -127,13 +58,8 @@
lib = Library::CoreLibrary();
ASSERT(!lib.IsNull());
CORE_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
+ CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
- // Integer intrinsics are in the core library, but we don't want to intrinsify
- // when Smi > 32 bits if we are looking for javascript integer overflow.
- if (!FLAG_throw_on_javascript_int_overflow || (Smi::kBits < 32)) {
- CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
- }
-
// Set up all math lib functions that can be intrisified.
lib = Library::MathLibrary();
ASSERT(!lib.IsNull());
@@ -156,34 +82,38 @@
void Intrinsifier::Intrinsify(const Function& function, Assembler* assembler) {
if (!CanIntrinsify(function)) return;
- const char* function_name = String::Handle(function.name()).ToCString();
- const Class& function_class = Class::Handle(function.Owner());
- const char* class_name = String::Handle(function_class.Name()).ToCString();
- const Library& lib = Library::Handle(function_class.library());
+#define EMIT_CASE(test_class_name, test_function_name, enum_name, fp) \
+ case MethodRecognizer::k##enum_name: \
+ ASSERT(function.CheckSourceFingerprint(fp)); \
+ assembler->Comment("Intrinsic"); \
+ enum_name(assembler); \
+ break;
-#define FIND_INTRINSICS(test_class_name, test_function_name, destination, fp) \
- if (TestFunction(lib, function, \
- class_name, function_name, \
- #test_class_name, #test_function_name)) { \
- ASSERT(function.CheckSourceFingerprint(fp)); \
- assembler->Comment("Intrinsic"); \
- destination(assembler); \
- return; \
- } \
-
- if (lib.raw() == Library::CoreLibrary()) {
- CORE_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
- if (!FLAG_throw_on_javascript_int_overflow || (Smi::kBits < 32)) {
- CORE_INTEGER_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
+ if (FLAG_throw_on_javascript_int_overflow && (Smi::kBits >= 32)) {
+ // Integer intrinsics are in the core library, but we don't want to
+ // intrinsify when Smi > 32 bits if we are looking for javascript integer
+ // overflow.
+ switch (function.recognized_kind()) {
+ CORE_LIB_INTRINSIC_LIST(EMIT_CASE);
+ MATH_LIB_INTRINSIC_LIST(EMIT_CASE);
+ TYPED_DATA_LIB_INTRINSIC_LIST(EMIT_CASE);
+ PROFILER_LIB_INTRINSIC_LIST(EMIT_CASE);
+ default:
+ break;
}
- } else if (lib.raw() == Library::TypedDataLibrary()) {
- TYPED_DATA_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
- } else if (lib.raw() == Library::MathLibrary()) {
- MATH_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
- } else if (lib.raw() == Library::ProfilerLibrary()) {
- PROFILER_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
+ } else {
+ switch (function.recognized_kind()) {
+ CORE_LIB_INTRINSIC_LIST(EMIT_CASE);
+ CORE_INTEGER_LIB_INTRINSIC_LIST(EMIT_CASE);
+ MATH_LIB_INTRINSIC_LIST(EMIT_CASE);
+ TYPED_DATA_LIB_INTRINSIC_LIST(EMIT_CASE);
+ PROFILER_LIB_INTRINSIC_LIST(EMIT_CASE);
+ default:
+ UNREACHABLE();
+ break;
+ }
}
-#undef FIND_INTRINSICS
+#undef EMIT_INTRINSIC
}
} // namespace dart
« no previous file with comments | « runtime/vm/intrinsifier.h ('k') | runtime/vm/intrinsifier_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698