| Index: src/ia32/stub-cache-ia32.cc
|
| diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc
|
| index 710b232c6fb7ee0dd2bc4609a97e6cf79456e391..19ba8249a1dee7dc5790ff926d9c5418d38c1493 100644
|
| --- a/src/ia32/stub-cache-ia32.cc
|
| +++ b/src/ia32/stub-cache-ia32.cc
|
| @@ -2551,31 +2551,25 @@ Handle<Code> CallStubCompiler::CompileCallGlobal(
|
|
|
| Handle<Code> StoreStubCompiler::CompileStoreCallback(
|
| Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| + Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| Handle<ExecutableAccessorInfo> callback) {
|
| - // ----------- S t a t e -------------
|
| - // -- eax : value
|
| - // -- ecx : name
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| - Label miss;
|
| + Label miss, miss_restore_name;
|
| // Check that the maps haven't changed, preserving the value register.
|
| - __ push(eax);
|
| - __ JumpIfSmi(edx, &miss);
|
| - CheckPrototypes(receiver, edx, holder, ebx, eax, edi, name, &miss);
|
| - __ pop(eax); // restore value
|
| + __ JumpIfSmi(receiver(), &miss);
|
| + CheckPrototypes(object, receiver(), holder,
|
| + scratch1(), this->name(), scratch2(),
|
| + name, &miss_restore_name);
|
|
|
| // Stub never generated for non-global objects that require access checks.
|
| ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded());
|
|
|
| - __ pop(ebx); // remove the return address
|
| - __ push(edx); // receiver
|
| - __ push(Immediate(callback)); // callback info
|
| - __ push(ecx); // name
|
| - __ push(eax); // value
|
| - __ push(ebx); // restore return address
|
| + __ pop(scratch1()); // remove the return address
|
| + __ push(receiver());
|
| + __ Push(callback);
|
| + __ Push(name);
|
| + __ push(value());
|
| + __ push(scratch1()); // restore return address
|
|
|
| // Do tail-call to the runtime system.
|
| ExternalReference store_callback_property =
|
| @@ -2583,8 +2577,8 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
|
| __ TailCallExternalReference(store_callback_property, 4, 1);
|
|
|
| // Handle store cache miss.
|
| + GenerateRestoreName(masm(), &miss_restore_name, name);
|
| __ bind(&miss);
|
| - __ pop(eax);
|
| TailCallBuiltin(masm(), MissBuiltin(kind()));
|
|
|
| // Return the generated code.
|
| @@ -2638,66 +2632,30 @@ void StoreStubCompiler::GenerateStoreViaSetter(
|
| #define __ ACCESS_MASM(masm())
|
|
|
|
|
| -Handle<Code> StoreStubCompiler::CompileStoreViaSetter(
|
| - Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| - Handle<JSObject> holder,
|
| - Handle<JSFunction> setter) {
|
| - // ----------- S t a t e -------------
|
| - // -- eax : value
|
| - // -- ecx : name
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| - Label miss;
|
| -
|
| - // Check that the maps haven't changed, preserving the name register.
|
| - __ push(ecx);
|
| - __ JumpIfSmi(edx, &miss);
|
| - CheckPrototypes(receiver, edx, holder, ebx, ecx, edi, name, &miss);
|
| - __ pop(ecx);
|
| -
|
| - GenerateStoreViaSetter(masm(), setter);
|
| -
|
| - __ bind(&miss);
|
| - __ pop(ecx);
|
| - TailCallBuiltin(masm(), MissBuiltin(kind()));
|
| -
|
| - // Return the generated code.
|
| - return GetICCode(kind(), Code::CALLBACKS, name);
|
| -}
|
| -
|
| -
|
| Handle<Code> StoreStubCompiler::CompileStoreInterceptor(
|
| - Handle<JSObject> receiver,
|
| + Handle<JSObject> object,
|
| Handle<Name> name) {
|
| - // ----------- S t a t e -------------
|
| - // -- eax : value
|
| - // -- ecx : name
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| Label miss;
|
|
|
| // Check that the map of the object hasn't changed.
|
| - __ CheckMap(edx, Handle<Map>(receiver->map()),
|
| + __ CheckMap(receiver(), Handle<Map>(object->map()),
|
| &miss, DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS);
|
|
|
| // Perform global security token check if needed.
|
| - if (receiver->IsJSGlobalProxy()) {
|
| + if (object->IsJSGlobalProxy()) {
|
| __ CheckAccessGlobalProxy(edx, ebx, &miss);
|
| }
|
|
|
| // Stub never generated for non-global objects that require access
|
| // checks.
|
| - ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded());
|
| + ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
|
|
|
| - __ pop(ebx); // remove the return address
|
| - __ push(edx); // receiver
|
| - __ push(ecx); // name
|
| - __ push(eax); // value
|
| + __ pop(scratch1()); // remove the return address
|
| + __ push(receiver());
|
| + __ push(this->name());
|
| + __ push(value());
|
| __ push(Immediate(Smi::FromInt(strict_mode())));
|
| - __ push(ebx); // restore return address
|
| + __ push(scratch1()); // restore return address
|
|
|
| // Do tail-call to the runtime system.
|
| ExternalReference store_ic_property =
|
| @@ -2717,22 +2675,17 @@ Handle<Code> StoreStubCompiler::CompileStoreGlobal(
|
| Handle<GlobalObject> object,
|
| Handle<JSGlobalPropertyCell> cell,
|
| Handle<Name> name) {
|
| - // ----------- S t a t e -------------
|
| - // -- eax : value
|
| - // -- ecx : name
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| Label miss;
|
|
|
| // Check that the map of the global has not changed.
|
| - __ cmp(FieldOperand(edx, HeapObject::kMapOffset),
|
| + __ cmp(FieldOperand(receiver(), HeapObject::kMapOffset),
|
| Immediate(Handle<Map>(object->map())));
|
| __ j(not_equal, &miss);
|
|
|
| // Compute the cell operand to use.
|
| - __ mov(ebx, Immediate(cell));
|
| - Operand cell_operand = FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset);
|
| + __ mov(scratch1(), Immediate(cell));
|
| + Operand cell_operand =
|
| + FieldOperand(scratch1(), JSGlobalPropertyCell::kValueOffset);
|
|
|
| // Check that the value in the cell is not the hole. If it is, this
|
| // cell could have been deleted and reintroducing the global needs
|
| @@ -2742,7 +2695,7 @@ Handle<Code> StoreStubCompiler::CompileStoreGlobal(
|
| __ j(equal, &miss);
|
|
|
| // Store the value in the cell.
|
| - __ mov(cell_operand, eax);
|
| + __ mov(cell_operand, value());
|
| // No write barrier here, because cells are always rescanned.
|
|
|
| // Return the value (register eax).
|
| @@ -2760,52 +2713,21 @@ Handle<Code> StoreStubCompiler::CompileStoreGlobal(
|
| }
|
|
|
|
|
| -Handle<Code> KeyedStoreStubCompiler::CompileStoreElement(
|
| - Handle<Map> receiver_map) {
|
| - // ----------- S t a t e -------------
|
| - // -- eax : value
|
| - // -- ecx : key
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| - ElementsKind elements_kind = receiver_map->elements_kind();
|
| - bool is_jsarray = receiver_map->instance_type() == JS_ARRAY_TYPE;
|
| - Handle<Code> stub =
|
| - KeyedStoreElementStub(is_jsarray,
|
| - elements_kind,
|
| - store_mode_).GetCode(isolate());
|
| -
|
| - __ DispatchMap(edx, receiver_map, stub, DO_SMI_CHECK);
|
| -
|
| - TailCallBuiltin(masm(), MissBuiltin(kind()));
|
| -
|
| - // Return the generated code.
|
| - return GetICCode(kind(), Code::NORMAL, factory()->empty_string());
|
| -}
|
| -
|
| -
|
| Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic(
|
| MapHandleList* receiver_maps,
|
| CodeHandleList* handler_stubs,
|
| MapHandleList* transitioned_maps) {
|
| - // ----------- S t a t e -------------
|
| - // -- eax : value
|
| - // -- ecx : key
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| Label miss;
|
| - __ JumpIfSmi(edx, &miss, Label::kNear);
|
| - __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset));
|
| - // ebx: receiver->map().
|
| + __ JumpIfSmi(receiver(), &miss, Label::kNear);
|
| + __ mov(scratch1(), FieldOperand(receiver(), HeapObject::kMapOffset));
|
| for (int i = 0; i < receiver_maps->length(); ++i) {
|
| - __ cmp(edi, receiver_maps->at(i));
|
| + __ cmp(scratch1(), receiver_maps->at(i));
|
| if (transitioned_maps->at(i).is_null()) {
|
| __ j(equal, handler_stubs->at(i));
|
| } else {
|
| Label next_map;
|
| __ j(not_equal, &next_map, Label::kNear);
|
| - __ mov(ebx, Immediate(transitioned_maps->at(i)));
|
| + __ mov(transition_map(), Immediate(transitioned_maps->at(i)));
|
| __ jmp(handler_stubs->at(i), RelocInfo::CODE_TARGET);
|
| __ bind(&next_map);
|
| }
|
| @@ -2961,34 +2883,6 @@ Handle<Code> LoadStubCompiler::CompileLoadGlobal(
|
| }
|
|
|
|
|
| -Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
|
| - Handle<Map> receiver_map) {
|
| - // ----------- S t a t e -------------
|
| - // -- ecx : key
|
| - // -- edx : receiver
|
| - // -- esp[0] : return address
|
| - // -----------------------------------
|
| -
|
| - ElementsKind elements_kind = receiver_map->elements_kind();
|
| - if (receiver_map->has_fast_elements() ||
|
| - receiver_map->has_external_array_elements()) {
|
| - Handle<Code> stub = KeyedLoadFastElementStub(
|
| - receiver_map->instance_type() == JS_ARRAY_TYPE,
|
| - elements_kind).GetCode(isolate());
|
| - __ DispatchMap(edx, receiver_map, stub, DO_SMI_CHECK);
|
| - } else {
|
| - Handle<Code> stub =
|
| - KeyedLoadDictionaryElementStub().GetCode(isolate());
|
| - __ DispatchMap(edx, receiver_map, stub, DO_SMI_CHECK);
|
| - }
|
| -
|
| - TailCallBuiltin(masm(), Builtins::kKeyedLoadIC_Miss);
|
| -
|
| - // Return the generated code.
|
| - return GetICCode(kind(), Code::NORMAL, factory()->empty_string());
|
| -}
|
| -
|
| -
|
| Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC(
|
| MapHandleList* receiver_maps,
|
| CodeHandleList* handlers,
|
|
|