| Index: src/mips/stub-cache-mips.cc
|
| diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc
|
| index 959da8e7489c43bbdb38db7b0e0b198120a48261..954c6f71b5b9f4de1ec9781fb926e95ade689ec5 100644
|
| --- a/src/mips/stub-cache-mips.cc
|
| +++ b/src/mips/stub-cache-mips.cc
|
| @@ -2604,27 +2604,22 @@ 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 -------------
|
| - // -- a0 : value
|
| - // -- a1 : receiver
|
| - // -- a2 : name
|
| - // -- ra : return address
|
| - // -----------------------------------
|
| Label miss;
|
| // Check that the maps haven't changed.
|
| - __ JumpIfSmi(a1, &miss, a3);
|
| - CheckPrototypes(receiver, a1, holder, a3, t0, t1, name, &miss);
|
| + __ JumpIfSmi(receiver(), &miss);
|
| + CheckPrototypes(object, receiver(), holder,
|
| + scratch1(), scratch2(), scratch3(), name, &miss);
|
|
|
| // Stub never generated for non-global objects that require access
|
| // checks.
|
| ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded());
|
|
|
| - __ push(a1); // Receiver.
|
| - __ li(a3, Operand(callback)); // Callback info.
|
| - __ Push(a3, a2, a0);
|
| + __ push(receiver()); // Receiver.
|
| + __ li(at, Operand(callback)); // Callback info.
|
| + __ Push(at, this->name(), value());
|
|
|
| // Do tail-call to the runtime system.
|
| ExternalReference store_callback_property =
|
| @@ -2687,61 +2682,28 @@ 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 -------------
|
| - // -- a0 : value
|
| - // -- a1 : receiver
|
| - // -- a2 : name
|
| - // -- ra : return address
|
| - // -----------------------------------
|
| - Label miss;
|
| -
|
| - // Check that the maps haven't changed.
|
| - __ JumpIfSmi(a1, &miss);
|
| - CheckPrototypes(receiver, a1, holder, a3, t0, t1, name, &miss);
|
| -
|
| - GenerateStoreViaSetter(masm(), setter);
|
| -
|
| - __ bind(&miss);
|
| - 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 -------------
|
| - // -- a0 : value
|
| - // -- a1 : receiver
|
| - // -- a2 : name
|
| - // -- ra : return address
|
| - // -----------------------------------
|
| Label miss;
|
|
|
| // Check that the map of the object hasn't changed.
|
| - __ CheckMap(a1, a3, Handle<Map>(receiver->map()), &miss,
|
| + __ CheckMap(receiver(), scratch1(), Handle<Map>(object->map()), &miss,
|
| DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS);
|
|
|
| // Perform global security token check if needed.
|
| - if (receiver->IsJSGlobalProxy()) {
|
| - __ CheckAccessGlobalProxy(a1, a3, &miss);
|
| + if (object->IsJSGlobalProxy()) {
|
| + __ CheckAccessGlobalProxy(receiver(), scratch1(), &miss);
|
| }
|
|
|
| // Stub is never generated for non-global objects that require access
|
| // checks.
|
| - ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded());
|
| + ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
|
|
|
| - __ Push(a1, a2, a0); // Receiver, name, value.
|
| + __ Push(receiver(), this->name(), value());
|
|
|
| - __ li(a0, Operand(Smi::FromInt(strict_mode())));
|
| - __ push(a0); // Strict mode.
|
| + __ li(scratch1(), Operand(Smi::FromInt(strict_mode())));
|
| + __ push(scratch1()); // strict mode
|
|
|
| // Do tail-call to the runtime system.
|
| ExternalReference store_ic_property =
|
| @@ -2762,39 +2724,37 @@ Handle<Code> StoreStubCompiler::CompileStoreGlobal(
|
| Handle<GlobalObject> object,
|
| Handle<JSGlobalPropertyCell> cell,
|
| Handle<Name> name) {
|
| - // ----------- S t a t e -------------
|
| - // -- a0 : value
|
| - // -- a1 : receiver
|
| - // -- a2 : name
|
| - // -- ra : return address
|
| - // -----------------------------------
|
| Label miss;
|
|
|
| // Check that the map of the global has not changed.
|
| - __ lw(a3, FieldMemOperand(a1, HeapObject::kMapOffset));
|
| - __ Branch(&miss, ne, a3, Operand(Handle<Map>(object->map())));
|
| + __ lw(scratch1(), FieldMemOperand(receiver(), HeapObject::kMapOffset));
|
| + __ Branch(&miss, ne, scratch1(), Operand(Handle<Map>(object->map())));
|
|
|
| // 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
|
| // to update the property details in the property dictionary of the
|
| // global object. We bail out to the runtime system to do that.
|
| - __ li(t0, Operand(cell));
|
| - __ LoadRoot(t1, Heap::kTheHoleValueRootIndex);
|
| - __ lw(t2, FieldMemOperand(t0, JSGlobalPropertyCell::kValueOffset));
|
| - __ Branch(&miss, eq, t1, Operand(t2));
|
| + __ li(scratch1(), Operand(cell));
|
| + __ LoadRoot(scratch2(), Heap::kTheHoleValueRootIndex);
|
| + __ lw(scratch3(),
|
| + FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset));
|
| + __ Branch(&miss, eq, scratch3(), Operand(scratch2()));
|
|
|
| // Store the value in the cell.
|
| - __ sw(a0, FieldMemOperand(t0, JSGlobalPropertyCell::kValueOffset));
|
| + __ sw(value(),
|
| + FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset));
|
| __ mov(v0, a0); // Stored value must be returned in v0.
|
| // Cells are always rescanned, so no write barrier here.
|
|
|
| Counters* counters = masm()->isolate()->counters();
|
| - __ IncrementCounter(counters->named_store_global_inline(), 1, a1, a3);
|
| + __ IncrementCounter(
|
| + counters->named_store_global_inline(), 1, scratch1(), scratch2());
|
| __ Ret();
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| - __ IncrementCounter(counters->named_store_global_inline_miss(), 1, a1, a3);
|
| + __ IncrementCounter(
|
| + counters->named_store_global_inline_miss(), 1, scratch1(), scratch2());
|
| TailCallBuiltin(masm(), MissBuiltin(kind()));
|
|
|
| // Return the generated code.
|
| @@ -2936,33 +2896,6 @@ Handle<Code> LoadStubCompiler::CompileLoadGlobal(
|
| }
|
|
|
|
|
| -Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
|
| - Handle<Map> receiver_map) {
|
| - // ----------- S t a t e -------------
|
| - // -- ra : return address
|
| - // -- a0 : key
|
| - // -- a1 : receiver
|
| - // -----------------------------------
|
| - 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(a1, a2, receiver_map, stub, DO_SMI_CHECK);
|
| - } else {
|
| - Handle<Code> stub =
|
| - KeyedLoadDictionaryElementStub().GetCode(isolate());
|
| - __ DispatchMap(a1, a2, receiver_map, stub, DO_SMI_CHECK);
|
| - }
|
| -
|
| - TailCallBuiltin(masm(), MissBuiltin(kind()));
|
| -
|
| - // Return the generated code.
|
| - return GetICCode(kind(), Code::NORMAL, factory()->empty_string());
|
| -}
|
| -
|
| -
|
| Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC(
|
| MapHandleList* receiver_maps,
|
| CodeHandleList* handlers,
|
| @@ -2995,55 +2928,23 @@ Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC(
|
| }
|
|
|
|
|
| -Handle<Code> KeyedStoreStubCompiler::CompileStoreElement(
|
| - Handle<Map> receiver_map) {
|
| - // ----------- S t a t e -------------
|
| - // -- a0 : value
|
| - // -- a1 : key
|
| - // -- a2 : receiver
|
| - // -- ra : return address
|
| - // -- a3 : scratch
|
| - // -----------------------------------
|
| - ElementsKind elements_kind = receiver_map->elements_kind();
|
| - bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
|
| - Handle<Code> stub =
|
| - KeyedStoreElementStub(is_js_array,
|
| - elements_kind,
|
| - store_mode_).GetCode(isolate());
|
| -
|
| - __ DispatchMap(a2, a3, 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 -------------
|
| - // -- a0 : value
|
| - // -- a1 : key
|
| - // -- a2 : receiver
|
| - // -- ra : return address
|
| - // -- a3 : scratch
|
| - // -----------------------------------
|
| Label miss;
|
| - __ JumpIfSmi(a2, &miss);
|
| + __ JumpIfSmi(receiver(), &miss);
|
|
|
| int receiver_count = receiver_maps->length();
|
| - __ lw(a3, FieldMemOperand(a2, HeapObject::kMapOffset));
|
| + __ lw(scratch1(), FieldMemOperand(receiver(), HeapObject::kMapOffset));
|
| for (int i = 0; i < receiver_count; ++i) {
|
| if (transitioned_maps->at(i).is_null()) {
|
| __ Jump(handler_stubs->at(i), RelocInfo::CODE_TARGET, eq,
|
| - a3, Operand(receiver_maps->at(i)));
|
| + scratch1(), Operand(receiver_maps->at(i)));
|
| } else {
|
| Label next_map;
|
| - __ Branch(&next_map, ne, a3, Operand(receiver_maps->at(i)));
|
| - __ li(a3, Operand(transitioned_maps->at(i)));
|
| + __ Branch(&next_map, ne, scratch1(), Operand(receiver_maps->at(i)));
|
| + __ li(transition_map(), Operand(transitioned_maps->at(i)));
|
| __ Jump(handler_stubs->at(i), RelocInfo::CODE_TARGET);
|
| __ bind(&next_map);
|
| }
|
|
|