Revision: 8253
Author:   [email protected]
Date:     Fri Jun 10 00:49:49 2011
Log: Refactor platform-specific code for determining shared stub for keyed load/stores.

[email protected]
BUG=none
TEST=none

Review URL: http://codereview.chromium.org/7044083
http://code.google.com/p/v8/source/detail?r=8253

Modified:
 /branches/bleeding_edge/src/arm/stub-cache-arm.cc
 /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
 /branches/bleeding_edge/src/stub-cache.cc
 /branches/bleeding_edge/src/stub-cache.h
 /branches/bleeding_edge/src/x64/stub-cache-x64.cc

=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Thu Jun 9 08:19:37 2011 +++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Fri Jun 10 00:49:49 2011
@@ -3121,15 +3121,8 @@
   //  -- r0    : key
   //  -- r1    : receiver
   // -----------------------------------
-  MaybeObject* maybe_stub;
-  if (receiver_map->has_fast_elements()) {
-    maybe_stub = KeyedLoadFastElementStub().TryGetCode();
-  } else {
-    ASSERT(receiver_map->has_external_array_elements());
-    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
-    maybe_stub = KeyedLoadExternalArrayStub(elements_kind).TryGetCode();
-  }
   Code* stub;
+ MaybeObject* maybe_stub = ComputeSharedKeyedLoadElementStub(receiver_map);
   if (!maybe_stub->To(&stub)) return maybe_stub;
   __ DispatchMap(r1,
                  r2,
@@ -3213,8 +3206,7 @@
 }


-MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(
-    Map* receiver_map) {
+MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) {
   // ----------- S t a t e -------------
   //  -- r0    : value
   //  -- r1    : key
@@ -3222,16 +3214,8 @@
   //  -- lr    : return address
   //  -- r3    : scratch
   // -----------------------------------
-  MaybeObject* maybe_stub;
-  if (receiver_map->has_fast_elements()) {
-    bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
-    maybe_stub = KeyedStoreFastElementStub(is_js_array).TryGetCode();
-  } else {
-    ASSERT(receiver_map->has_external_array_elements());
-    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
-    maybe_stub = KeyedStoreExternalArrayStub(elements_kind).TryGetCode();
-  }
   Code* stub;
+ MaybeObject* maybe_stub = ComputeSharedKeyedStoreElementStub(receiver_map);
   if (!maybe_stub->To(&stub)) return maybe_stub;
   __ DispatchMap(r2,
                  r3,
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Thu Jun 9 08:19:37 2011 +++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Fri Jun 10 00:49:49 2011
@@ -2699,24 +2699,15 @@
 }


-MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(
-    Map* receiver_map) {
+MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) {
   // ----------- S t a t e -------------
   //  -- eax    : value
   //  -- ecx    : key
   //  -- edx    : receiver
   //  -- esp[0] : return address
   // -----------------------------------
-  MaybeObject* maybe_stub;
-  if (receiver_map->has_fast_elements()) {
-    bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
-    maybe_stub = KeyedStoreFastElementStub(is_js_array).TryGetCode();
-  } else {
-    ASSERT(receiver_map->has_external_array_elements());
-    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
-    maybe_stub = KeyedStoreExternalArrayStub(elements_kind).TryGetCode();
-  }
   Code* stub;
+ MaybeObject* maybe_stub = ComputeSharedKeyedStoreElementStub(receiver_map);
   if (!maybe_stub->To(&stub)) return maybe_stub;
   __ DispatchMap(edx,
                  Handle<Map>(receiver_map),
@@ -3175,15 +3166,8 @@
   //  -- edx    : receiver
   //  -- esp[0] : return address
   // -----------------------------------
-  MaybeObject* maybe_stub;
-  if (receiver_map->has_fast_elements()) {
-    maybe_stub = KeyedLoadFastElementStub().TryGetCode();
-  } else {
-    ASSERT(receiver_map->has_external_array_elements());
-    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
-    maybe_stub = KeyedLoadExternalArrayStub(elements_kind).TryGetCode();
-  }
   Code* stub;
+ MaybeObject* maybe_stub = ComputeSharedKeyedLoadElementStub(receiver_map);
   if (!maybe_stub->To(&stub)) return maybe_stub;
   __ DispatchMap(edx,
                  Handle<Map>(receiver_map),
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc   Thu Jun  9 08:19:37 2011
+++ /branches/bleeding_edge/src/stub-cache.cc   Fri Jun 10 00:49:49 2011
@@ -29,6 +29,7 @@

 #include "api.h"
 #include "arguments.h"
+#include "code-stubs.h"
 #include "gdb-jit.h"
 #include "ic-inl.h"
 #include "stub-cache.h"
@@ -502,12 +503,13 @@
   if (!maybe_code->IsUndefined()) return Code::cast(maybe_code);

   MaybeObject* maybe_new_code = NULL;
+  Map* receiver_map = receiver->map();
   if (is_store) {
     KeyedStoreStubCompiler compiler(strict_mode);
-    maybe_new_code = compiler.CompileStoreElement(receiver->map());
+    maybe_new_code = compiler.CompileStoreElement(receiver_map);
   } else {
     KeyedLoadStubCompiler compiler;
-    maybe_new_code = compiler.CompileLoadElement(receiver->map());
+    maybe_new_code = compiler.CompileLoadElement(receiver_map);
   }
   Code* code;
   if (!maybe_new_code->To(&code)) return maybe_new_code;
@@ -1643,6 +1645,21 @@
   }
   return result;
 }
+
+
+MaybeObject* KeyedLoadStubCompiler::ComputeSharedKeyedLoadElementStub(
+    Map* receiver_map) {
+  MaybeObject* maybe_stub = NULL;
+  if (receiver_map->has_fast_elements()) {
+    maybe_stub = KeyedLoadFastElementStub().TryGetCode();
+  } else if (receiver_map->has_external_array_elements()) {
+    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
+    maybe_stub = KeyedLoadExternalArrayStub(elements_kind).TryGetCode();
+  } else {
+    UNREACHABLE();
+  }
+  return maybe_stub;
+}


 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) {
@@ -1679,6 +1696,22 @@
   }
   return result;
 }
+
+
+MaybeObject* KeyedStoreStubCompiler::ComputeSharedKeyedStoreElementStub(
+    Map* receiver_map) {
+  MaybeObject* maybe_stub = NULL;
+  if (receiver_map->has_fast_elements()) {
+    bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
+    maybe_stub = KeyedStoreFastElementStub(is_js_array).TryGetCode();
+  } else if (receiver_map->has_external_array_elements()) {
+    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
+    maybe_stub = KeyedStoreExternalArrayStub(elements_kind).TryGetCode();
+  } else {
+    UNREACHABLE();
+  }
+  return maybe_stub;
+}


 CallStubCompiler::CallStubCompiler(int argc,
=======================================
--- /branches/bleeding_edge/src/stub-cache.h    Thu Jun  9 08:19:37 2011
+++ /branches/bleeding_edge/src/stub-cache.h    Fri Jun 10 00:49:49 2011
@@ -661,6 +661,8 @@
   MaybeObject* GetCode(PropertyType type,
                        String* name,
                        InlineCacheState state = MONOMORPHIC);
+
+  MaybeObject* ComputeSharedKeyedLoadElementStub(Map* receiver_map);
 };


@@ -718,6 +720,8 @@
                        String* name,
                        InlineCacheState state = MONOMORPHIC);

+  MaybeObject* ComputeSharedKeyedStoreElementStub(Map* receiver_map);
+
   StrictModeFlag strict_mode_;
 };

=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Thu Jun 9 08:19:37 2011 +++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Fri Jun 10 00:49:49 2011
@@ -2530,24 +2530,15 @@
 }


-MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(
-    Map* receiver_map) {
+MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) {
   // ----------- S t a t e -------------
   //  -- rax    : value
   //  -- rcx    : key
   //  -- rdx    : receiver
   //  -- rsp[0] : return address
   // -----------------------------------
-  MaybeObject* maybe_stub;
-  if (receiver_map->has_fast_elements()) {
-    bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
-    maybe_stub = KeyedStoreFastElementStub(is_js_array).TryGetCode();
-  } else {
-    ASSERT(receiver_map->has_external_array_elements());
-    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
-    maybe_stub = KeyedStoreExternalArrayStub(elements_kind).TryGetCode();
-  }
   Code* stub;
+ MaybeObject* maybe_stub = ComputeSharedKeyedStoreElementStub(receiver_map);
   if (!maybe_stub->To(&stub)) return maybe_stub;
   __ DispatchMap(rdx,
                  Handle<Map>(receiver_map),
@@ -3002,15 +2993,8 @@
   //  -- rdx    : receiver
   //  -- rsp[0] : return address
   // -----------------------------------
-  MaybeObject* maybe_stub;
-  if (receiver_map->has_fast_elements()) {
-    maybe_stub = KeyedLoadFastElementStub().TryGetCode();
-  } else {
-    ASSERT(receiver_map->has_external_array_elements());
-    JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
-    maybe_stub = KeyedLoadExternalArrayStub(elements_kind).TryGetCode();
-  }
   Code* stub;
+ MaybeObject* maybe_stub = ComputeSharedKeyedLoadElementStub(receiver_map);
   if (!maybe_stub->To(&stub)) return maybe_stub;
   __ DispatchMap(rdx,
                  Handle<Map>(receiver_map),

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to