Index: src/arm/stub-cache-arm.cc |
diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
index f852786f1d6eee44edf9c8a5a5e8da2c4dfdc145..4558afe68aa4e10e22af5b1e2e7b02904becd73d 100644 |
--- a/src/arm/stub-cache-arm.cc |
+++ b/src/arm/stub-cache-arm.cc |
@@ -3178,7 +3178,7 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) { |
} |
-MaybeObject* KeyedLoadStubCompiler::CompileLoadMegamorphic( |
+MaybeObject* KeyedLoadStubCompiler::CompileLoadPolymorphic( |
MapList* receiver_maps, |
CodeList* handler_ics) { |
// ----------- S t a t e ------------- |
@@ -3274,64 +3274,10 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { |
} |
-MaybeObject* KeyedStoreStubCompiler::CompileStoreElementWithTransition( |
- Map* transitioned_map, |
- Map* untransitioned_map_1, |
- Map* untransitioned_map_2) { |
- // ----------- S t a t e ------------- |
- // -- r0 : value |
- // -- r1 : key |
- // -- r2 : receiver |
- // -- lr : return address |
- // -- r3 : scratch |
- // ----------------------------------- |
- |
- // The order of map occurrences in the generated code below is important. |
- // Both IC code and Crankshaft rely on |transitioned_map| being the first |
- // map in the stub. |
- |
- Code* notransition_stub; |
- ElementsKind elements_kind = transitioned_map->elements_kind(); |
- bool is_js_array = transitioned_map->instance_type() == JS_ARRAY_TYPE; |
- MaybeObject* maybe_stub = |
- KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode(); |
- if (!maybe_stub->To(¬ransition_stub)) return maybe_stub; |
- |
- Label just_store, miss; |
- __ JumpIfSmi(r2, &miss); |
- __ ldr(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); |
- // r3: receiver->map(). |
- __ mov(ip, Operand(Handle<Map>(transitioned_map))); |
- __ cmp(r3, ip); |
- __ b(eq, &just_store); |
- ASSERT_NE(untransitioned_map_1, NULL); |
- __ mov(ip, Operand(Handle<Map>(untransitioned_map_1))); |
- __ cmp(r3, ip); |
- Code* generic_stub = (strict_mode_ == kStrictMode) |
- ? isolate()->builtins()->builtin(Builtins::kKeyedStoreIC_Generic_Strict) |
- : isolate()->builtins()->builtin(Builtins::kKeyedStoreIC_Generic); |
- __ Jump(Handle<Code>(generic_stub), RelocInfo::CODE_TARGET, eq); |
- if (untransitioned_map_2 != NULL) { |
- __ mov(ip, Operand(Handle<Map>(untransitioned_map_2))); |
- __ cmp(r3, ip); |
- __ Jump(Handle<Code>(generic_stub), RelocInfo::CODE_TARGET, eq); |
- } |
- |
- __ bind(&miss); |
- Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
- __ Jump(ic, RelocInfo::CODE_TARGET); |
- |
- __ bind(&just_store); |
- __ Jump(Handle<Code>(notransition_stub), RelocInfo::CODE_TARGET); |
- |
- // Return the generated code. |
- return GetCode(NORMAL, NULL, MEGAMORPHIC); |
-} |
- |
- |
-MaybeObject* KeyedStoreStubCompiler::CompileStoreMegamorphic( |
+MaybeObject* KeyedStoreStubCompiler::CompileStorePolymorphic( |
MapList* receiver_maps, |
- CodeList* handler_ics) { |
+ CodeList* handler_stubs, |
+ MapList* transitioned_maps) { |
// ----------- S t a t e ------------- |
// -- r0 : value |
// -- r1 : key |
@@ -3344,12 +3290,20 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreMegamorphic( |
int receiver_count = receiver_maps->length(); |
__ ldr(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); |
- for (int current = 0; current < receiver_count; ++current) { |
- Handle<Map> map(receiver_maps->at(current)); |
- Handle<Code> code(handler_ics->at(current)); |
+ for (int i = 0; i < receiver_count; ++i) { |
+ Handle<Map> map(receiver_maps->at(i)); |
+ Handle<Code> code(handler_stubs->at(i)); |
__ mov(ip, Operand(map)); |
__ cmp(r3, ip); |
- __ Jump(code, RelocInfo::CODE_TARGET, eq); |
+ if (transitioned_maps->at(i) == NULL) { |
+ __ Jump(code, RelocInfo::CODE_TARGET, eq); |
+ } else { |
+ Label next_map; |
+ __ b(eq, &next_map); |
+ __ mov(r4, Operand(Handle<Map>(transitioned_maps->at(i)))); |
+ __ Jump(code, RelocInfo::CODE_TARGET, al); |
+ __ bind(&next_map); |
+ } |
} |
__ bind(&miss); |