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