Reviewers: Jakob, danno,

Message:
First draft. Please take a look before I continue with the other platforms.

Description:
Refactor elements kind conversion.


Please review this at http://codereview.chromium.org/8355035/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/code-stubs.h
  M src/code-stubs.cc
  M src/flag-definitions.h
  M src/ia32/code-stubs-ia32.cc
  M src/ia32/ic-ia32.cc
  M src/ic.cc


Index: src/code-stubs.cc
diff --git a/src/code-stubs.cc b/src/code-stubs.cc
index 896ffad054e41f0a9a93319d86b19db0b2ae398b..02885e67bf9e3e46fbf77be13744465cca99cf3c 100644
--- a/src/code-stubs.cc
+++ b/src/code-stubs.cc
@@ -415,12 +415,13 @@ bool ToBooleanStub::Types::CanBeUndetectable() const {
 }


-void FastElementsConversionStub::Generate(MacroAssembler* masm) {
+void ElementsTransitionAndStoreStub::Generate(MacroAssembler* masm) {
+  Label fail;
   if (to_ == FAST_ELEMENTS) {
     if (from_ == FAST_SMI_ONLY_ELEMENTS) {
-      GenerateSmiOnlyToObject(masm);
+      ElementsTransitionGenerator::GenerateSmiOnlyToObject(masm);
     } else if (from_ == FAST_DOUBLE_ELEMENTS) {
-      GenerateDoubleToObject(masm, strict_mode_);
+      ElementsTransitionGenerator::GenerateDoubleToObject(masm, &fail);
     } else {
       UNREACHABLE();
     }
@@ -428,11 +429,13 @@ void FastElementsConversionStub::Generate(MacroAssembler* masm) {
                                                      is_jsarray_,
                                                      FAST_ELEMENTS);
} else if (from_ == FAST_SMI_ONLY_ELEMENTS && to_ == FAST_DOUBLE_ELEMENTS) {
-    GenerateSmiOnlyToDouble(masm, strict_mode_);
+    ElementsTransitionGenerator::GenerateSmiOnlyToDouble(masm, &fail);
KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(masm, is_jsarray_);
   } else {
     UNREACHABLE();
   }
+  masm->bind(&fail);
+  KeyedStoreIC::GenerateRuntimeSetProperty(masm, strict_mode_);
 }

 } }  // namespace v8::internal
Index: src/code-stubs.h
diff --git a/src/code-stubs.h b/src/code-stubs.h
index ab582a2ba9440541ac90b2054ddd31061920289c..d763542549b386860c414c23d13a95a4942ab4cc 100644
--- a/src/code-stubs.h
+++ b/src/code-stubs.h
@@ -70,7 +70,7 @@ namespace internal {
   V(KeyedStoreElement)                   \
   V(DebuggerStatement)                   \
   V(StringDictionaryLookup)              \
-  V(FastElementsConversion)
+  V(ElementsTransitionAndStore)

 // List of code stubs only used on ARM platforms.
 #ifdef V8_TARGET_ARCH_ARM
@@ -1028,12 +1028,23 @@ class ToBooleanStub: public CodeStub {
 };


-class FastElementsConversionStub : public CodeStub {
+class ElementsTransitionGenerator : public AllStatic {
  public:
-  FastElementsConversionStub(ElementsKind from,
-                             ElementsKind to,
-                             bool is_jsarray,
-                             StrictModeFlag strict_mode)
+  static void GenerateSmiOnlyToObject(MacroAssembler* masm);
+  static void GenerateSmiOnlyToDouble(MacroAssembler* masm, Label* fail);
+  static void GenerateDoubleToObject(MacroAssembler* masm, Label* fail);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ElementsTransitionGenerator);
+};
+
+
+class ElementsTransitionAndStoreStub : public CodeStub {
+ public:
+  ElementsTransitionAndStoreStub(ElementsKind from,
+                                 ElementsKind to,
+                                 bool is_jsarray,
+                                 StrictModeFlag strict_mode)
       : from_(from),
         to_(to),
         is_jsarray_(is_jsarray),
@@ -1045,7 +1056,7 @@ class FastElementsConversionStub : public CodeStub {
   class IsJSArrayBits:  public BitField<bool,           16, 8> {};
   class StrictModeBits: public BitField<StrictModeFlag, 24, 8> {};

-  Major MajorKey() { return FastElementsConversion; }
+  Major MajorKey() { return ElementsTransitionAndStore; }
   int MinorKey() {
     return FromBits::encode(from_) |
         ToBits::encode(to_) |
@@ -1054,18 +1065,13 @@ class FastElementsConversionStub : public CodeStub {
   }

   void Generate(MacroAssembler* masm);
-  static void GenerateSmiOnlyToObject(MacroAssembler* masm);
-  static void GenerateSmiOnlyToDouble(MacroAssembler* masm,
-                                      StrictModeFlag strict_mode);
-  static void GenerateDoubleToObject(MacroAssembler* masm,
-                                     StrictModeFlag strict_mode);

   ElementsKind from_;
   ElementsKind to_;
   bool is_jsarray_;
   StrictModeFlag strict_mode_;

-  DISALLOW_COPY_AND_ASSIGN(FastElementsConversionStub);
+  DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub);
 };

 } }  // namespace v8::internal
Index: src/flag-definitions.h
diff --git a/src/flag-definitions.h b/src/flag-definitions.h
index 58fab14e1cb927a724c690b46f34df03e16296ca..e218f4ff1f68fc8c363791c2fc0bd875da855f9b 100644
--- a/src/flag-definitions.h
+++ b/src/flag-definitions.h
@@ -105,7 +105,7 @@ DEFINE_bool(harmony, false, "enable all harmony features")

 // Flags for experimental implementation features.
DEFINE_bool(unbox_double_arrays, true, "automatically unbox arrays of doubles")
-DEFINE_bool(smi_only_arrays, false, "tracks arrays with only smi values")
+DEFINE_bool(smi_only_arrays, true, "tracks arrays with only smi values")
 DEFINE_bool(string_slices, true, "use string slices")

 DEFINE_bool(clever_optimizations,
Index: src/ia32/code-stubs-ia32.cc
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
index fe1641c374bc769d2bbb1bde13d2b6a5e2ec1e56..1a7487e43391c02a790361b910fad892f132bdfd 100644
--- a/src/ia32/code-stubs-ia32.cc
+++ b/src/ia32/code-stubs-ia32.cc
@@ -7023,7 +7023,8 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker(
 }


-void FastElementsConversionStub::GenerateSmiOnlyToObject(MacroAssembler* masm) {
+void ElementsTransitionGenerator::GenerateSmiOnlyToObject(
+    MacroAssembler* masm) {
   // ----------- S t a t e -------------
   //  -- eax    : value
   //  -- ebx    : target map
@@ -7043,8 +7044,8 @@ void FastElementsConversionStub::GenerateSmiOnlyToObject(MacroAssembler* masm) {
 }


-void FastElementsConversionStub::GenerateSmiOnlyToDouble(
-    MacroAssembler* masm, StrictModeFlag strict_mode) {
+void ElementsTransitionGenerator::GenerateSmiOnlyToDouble(
+    MacroAssembler* masm, Label* fail) {
   // ----------- S t a t e -------------
   //  -- eax    : value
   //  -- ebx    : target map
@@ -7102,7 +7103,7 @@ void FastElementsConversionStub::GenerateSmiOnlyToDouble(
   __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
   __ pop(ebx);
   __ pop(eax);
-  KeyedStoreIC::GenerateRuntimeSetProperty(masm, strict_mode);
+  __ jmp(fail);

   // Convert and copy elements
   // esi: source FixedArray
@@ -7162,8 +7163,8 @@ void FastElementsConversionStub::GenerateSmiOnlyToDouble(
 }


-void FastElementsConversionStub::GenerateDoubleToObject(
-    MacroAssembler* masm, StrictModeFlag strict_mode) {
+void ElementsTransitionGenerator::GenerateDoubleToObject(
+    MacroAssembler* masm, Label* fail) {
   // ----------- S t a t e -------------
   //  -- eax    : value
   //  -- ebx    : target map
@@ -7199,7 +7200,7 @@ void FastElementsConversionStub::GenerateDoubleToObject(
   __ pop(ebx);
   __ pop(edx);
   __ pop(eax);
-  KeyedStoreIC::GenerateRuntimeSetProperty(masm, strict_mode);
+  __ jmp(fail);

   // Box doubles into heap numbers.
   // edi: source FixedDoubleArray
Index: src/ia32/ic-ia32.cc
diff --git a/src/ia32/ic-ia32.cc b/src/ia32/ic-ia32.cc
index 4a12dc8565348535f0004a3395e7067a31415557..b7c2f468a3c8fd23f6a9f6aaca0ff43754b155ad 100644
--- a/src/ia32/ic-ia32.cc
+++ b/src/ia32/ic-ia32.cc
@@ -1603,10 +1603,15 @@ void KeyedStoreIC::GenerateTransitionElementsDoubleToObject(
   // -----------------------------------
   // Must return the modified receiver in eax.

+  Label fail;
+  ElementsTransitionGenerator::GenerateDoubleToObject(masm, &fail);
+  __ mov(eax, edx);
+  __ Ret();
+
+  __ bind(&fail);
   __ pop(ebx);
   __ push(edx);
   __ push(ebx);  // return address
-
   __ TailCallRuntime(Runtime::kTransitionElementsDoubleToObject, 1, 1);
 }

Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index b85265fea7d73180c42645e8cd631d5d12809951..2477175db48cd332ed3000ada84f3b51c4d99e50 100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1732,7 +1732,7 @@ MaybeObject* KeyedStoreIC::ComputePolymorphicStub(
     MaybeObject* maybe_cached_stub = NULL;
Map* transitioned_map = receiver_map->FindTransitionedMap(receiver_maps);
     if (transitioned_map != NULL) {
-      maybe_cached_stub = FastElementsConversionStub(
+      maybe_cached_stub = ElementsTransitionAndStoreStub(
           receiver_map->elements_kind(),  // original elements_kind
           transitioned_map->elements_kind(),
           receiver_map->instance_type() == JS_ARRAY_TYPE,  // is_js_array


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

Reply via email to