From e508f1d404aa2d058fd8705c379c9d94c6ab76a2 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Mon, 4 Aug 2014 09:09:21 +0000 Subject: [PATCH] Cleanup in stub-cache.cc; remove unused ArrayLength store ICs. BUG= R=ishell@chromium.org Review URL: https://codereview.chromium.org/430783002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22805 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/stub-cache-arm.cc | 300 +++++++++++++++++++--------------------- src/arm64/stub-cache-arm64.cc | 308 ++++++++++++++++++++---------------------- src/ia32/stub-cache-ia32.cc | 104 ++++++-------- src/ic.cc | 26 +--- src/ic.h | 1 - src/stub-cache.cc | 63 +++------ src/stub-cache.h | 53 ++------ src/x64/stub-cache-x64.cc | 104 ++++++-------- 8 files changed, 397 insertions(+), 562 deletions(-) diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc index 256d41e..2cb1a0e 100644 --- a/src/arm/stub-cache-arm.cc +++ b/src/arm/stub-cache-arm.cc @@ -293,15 +293,132 @@ void PropertyHandlerCompiler::GenerateCheckPropertyCell( } +static void PushInterceptorArguments(MacroAssembler* masm, Register receiver, + Register holder, Register name, + Handle holder_obj) { + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex == 0); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsInfoIndex == 1); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 2); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 3); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 4); + __ push(name); + Handle interceptor(holder_obj->GetNamedInterceptor()); + ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); + Register scratch = name; + __ mov(scratch, Operand(interceptor)); + __ push(scratch); + __ push(receiver); + __ push(holder); +} + + +static void CompileCallLoadPropertyWithInterceptor( + MacroAssembler* masm, Register receiver, Register holder, Register name, + Handle holder_obj, IC::UtilityId id) { + PushInterceptorArguments(masm, receiver, holder, name, holder_obj); + __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), + NamedLoadHandlerCompiler::kInterceptorArgsLength); +} + + +// Generate call to api function. +void PropertyHandlerCompiler::GenerateFastApiCall( + MacroAssembler* masm, const CallOptimization& optimization, + Handle receiver_map, Register receiver, Register scratch_in, + bool is_store, int argc, Register* values) { + ASSERT(!receiver.is(scratch_in)); + __ push(receiver); + // Write the arguments to stack frame. + for (int i = 0; i < argc; i++) { + Register arg = values[argc - 1 - i]; + ASSERT(!receiver.is(arg)); + ASSERT(!scratch_in.is(arg)); + __ push(arg); + } + ASSERT(optimization.is_simple_api_call()); + + // Abi for CallApiFunctionStub. + Register callee = r0; + Register call_data = r4; + Register holder = r2; + Register api_function_address = r1; + + // Put holder in place. + CallOptimization::HolderLookup holder_lookup; + Handle api_holder = + optimization.LookupHolderOfExpectedType(receiver_map, &holder_lookup); + switch (holder_lookup) { + case CallOptimization::kHolderIsReceiver: + __ Move(holder, receiver); + break; + case CallOptimization::kHolderFound: + __ Move(holder, api_holder); + break; + case CallOptimization::kHolderNotFound: + UNREACHABLE(); + break; + } + + Isolate* isolate = masm->isolate(); + Handle function = optimization.constant_function(); + Handle api_call_info = optimization.api_call_info(); + Handle call_data_obj(api_call_info->data(), isolate); + + // Put callee in place. + __ Move(callee, function); + + bool call_data_undefined = false; + // Put call_data in place. + if (isolate->heap()->InNewSpace(*call_data_obj)) { + __ Move(call_data, api_call_info); + __ ldr(call_data, FieldMemOperand(call_data, CallHandlerInfo::kDataOffset)); + } else if (call_data_obj->IsUndefined()) { + call_data_undefined = true; + __ LoadRoot(call_data, Heap::kUndefinedValueRootIndex); + } else { + __ Move(call_data, call_data_obj); + } + + // Put api_function_address in place. + Address function_address = v8::ToCData
(api_call_info->callback()); + ApiFunction fun(function_address); + ExternalReference::Type type = ExternalReference::DIRECT_API_CALL; + ExternalReference ref = ExternalReference(&fun, type, masm->isolate()); + __ mov(api_function_address, Operand(ref)); + + // Jump to stub. + CallApiFunctionStub stub(isolate, is_store, call_data_undefined, argc); + __ TailCallStub(&stub); +} + + +void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, + Handle code) { + __ Jump(code, RelocInfo::CODE_TARGET); +} + + +#undef __ +#define __ ACCESS_MASM(masm()) + + +void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, + Handle name) { + if (!label->is_unused()) { + __ bind(label); + __ mov(this->name(), Operand(name)); + } +} + + void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( - MacroAssembler* masm, Handle holder, Register holder_reg, - Handle name, Label* miss) { - if (holder->IsJSGlobalObject()) { - GenerateCheckPropertyCell( - masm, Handle::cast(holder), name, scratch1(), miss); - } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { - GenerateDictionaryNegativeLookup( - masm, miss, holder_reg, name, scratch1(), scratch2()); + Register holder_reg, Handle name, Label* miss) { + if (holder()->IsJSGlobalObject()) { + GenerateCheckPropertyCell(masm(), Handle::cast(holder()), + name, scratch1(), miss); + } else if (!holder()->HasFastProperties()) { + GenerateDictionaryNegativeLookup(masm(), miss, holder_reg, name, scratch1(), + scratch2()); } } @@ -311,10 +428,9 @@ void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( // may be clobbered. Upon branch to miss_label, the receiver and name // registers have their original values. void NamedStoreHandlerCompiler::GenerateStoreTransition( - MacroAssembler* masm, LookupResult* lookup, Handle transition, - Handle name, Register receiver_reg, Register storage_reg, - Register value_reg, Register scratch1, Register scratch2, Register scratch3, - Label* miss_label, Label* slow) { + Handle transition, Handle name, Register receiver_reg, + Register storage_reg, Register value_reg, Register scratch1, + Register scratch2, Register scratch3, Label* miss_label, Label* slow) { // r0 : value Label exit; @@ -325,7 +441,7 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( ASSERT(!representation.IsNone()); if (details.type() == CONSTANT) { - Handle constant(descriptors->GetValue(descriptor), masm->isolate()); + Handle constant(descriptors->GetValue(descriptor), isolate()); __ Move(scratch1, constant); __ cmp(value_reg, scratch1); __ b(ne, miss_label); @@ -383,9 +499,8 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ Push(r2, r0); __ TailCallExternalReference( ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), - masm->isolate()), - 3, - 1); + isolate()), + 3, 1); return; } @@ -483,15 +598,15 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( // may be clobbered. Upon branch to miss_label, the receiver and name // registers have their original values. void NamedStoreHandlerCompiler::GenerateStoreField( - MacroAssembler* masm, Handle object, LookupResult* lookup, - Register receiver_reg, Register name_reg, Register value_reg, - Register scratch1, Register scratch2, Label* miss_label) { + Handle object, LookupResult* lookup, Register receiver_reg, + Register name_reg, Register value_reg, Register scratch1, Register scratch2, + Label* miss_label) { // r0 : value Label exit; - // Stub never generated for non-global objects that require access - // checks. - ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); + // Stub never generated for objects that require access checks. + ASSERT(!object->IsAccessCheckNeeded()); + ASSERT(!object->IsJSGlobalProxy()); FieldIndex index = lookup->GetFieldIndex(); @@ -603,134 +718,6 @@ void NamedStoreHandlerCompiler::GenerateStoreField( } -void NamedStoreHandlerCompiler::GenerateRestoreName(MacroAssembler* masm, - Label* label, - Handle name) { - if (!label->is_unused()) { - __ bind(label); - __ mov(this->name(), Operand(name)); - } -} - - -static void PushInterceptorArguments(MacroAssembler* masm, - Register receiver, - Register holder, - Register name, - Handle holder_obj) { - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex == 0); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsInfoIndex == 1); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 2); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 3); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 4); - __ push(name); - Handle interceptor(holder_obj->GetNamedInterceptor()); - ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); - Register scratch = name; - __ mov(scratch, Operand(interceptor)); - __ push(scratch); - __ push(receiver); - __ push(holder); -} - - -static void CompileCallLoadPropertyWithInterceptor( - MacroAssembler* masm, - Register receiver, - Register holder, - Register name, - Handle holder_obj, - IC::UtilityId id) { - PushInterceptorArguments(masm, receiver, holder, name, holder_obj); - __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), - NamedLoadHandlerCompiler::kInterceptorArgsLength); -} - - -// Generate call to api function. -void PropertyHandlerCompiler::GenerateFastApiCall( - MacroAssembler* masm, const CallOptimization& optimization, - Handle receiver_map, Register receiver, Register scratch_in, - bool is_store, int argc, Register* values) { - ASSERT(!receiver.is(scratch_in)); - __ push(receiver); - // Write the arguments to stack frame. - for (int i = 0; i < argc; i++) { - Register arg = values[argc-1-i]; - ASSERT(!receiver.is(arg)); - ASSERT(!scratch_in.is(arg)); - __ push(arg); - } - ASSERT(optimization.is_simple_api_call()); - - // Abi for CallApiFunctionStub. - Register callee = r0; - Register call_data = r4; - Register holder = r2; - Register api_function_address = r1; - - // Put holder in place. - CallOptimization::HolderLookup holder_lookup; - Handle api_holder = optimization.LookupHolderOfExpectedType( - receiver_map, - &holder_lookup); - switch (holder_lookup) { - case CallOptimization::kHolderIsReceiver: - __ Move(holder, receiver); - break; - case CallOptimization::kHolderFound: - __ Move(holder, api_holder); - break; - case CallOptimization::kHolderNotFound: - UNREACHABLE(); - break; - } - - Isolate* isolate = masm->isolate(); - Handle function = optimization.constant_function(); - Handle api_call_info = optimization.api_call_info(); - Handle call_data_obj(api_call_info->data(), isolate); - - // Put callee in place. - __ Move(callee, function); - - bool call_data_undefined = false; - // Put call_data in place. - if (isolate->heap()->InNewSpace(*call_data_obj)) { - __ Move(call_data, api_call_info); - __ ldr(call_data, FieldMemOperand(call_data, CallHandlerInfo::kDataOffset)); - } else if (call_data_obj->IsUndefined()) { - call_data_undefined = true; - __ LoadRoot(call_data, Heap::kUndefinedValueRootIndex); - } else { - __ Move(call_data, call_data_obj); - } - - // Put api_function_address in place. - Address function_address = v8::ToCData
(api_call_info->callback()); - ApiFunction fun(function_address); - ExternalReference::Type type = ExternalReference::DIRECT_API_CALL; - ExternalReference ref = ExternalReference(&fun, - type, - masm->isolate()); - __ mov(api_function_address, Operand(ref)); - - // Jump to stub. - CallApiFunctionStub stub(isolate, is_store, call_data_undefined, argc); - __ TailCallStub(&stub); -} - - -void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, - Handle code) { - __ Jump(code, RelocInfo::CODE_TARGET); -} - - -#undef __ -#define __ ACCESS_MASM(masm()) - - Register PropertyHandlerCompiler::CheckPrototypes( Register object_reg, Register holder_reg, Register scratch1, Register scratch2, Handle name, Label* miss, @@ -856,7 +843,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle name, Label* miss) { if (!miss->is_unused()) { Label success; __ b(&success); - GenerateRestoreName(masm(), miss, name); + GenerateRestoreName(miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); __ bind(&success); } @@ -1305,17 +1292,6 @@ Handle PropertyICCompiler::CompilePolymorphic(TypeHandleList* types, } -void NamedStoreHandlerCompiler::GenerateStoreArrayLength() { - // Prepare tail call to StoreIC_ArrayLength. - __ Push(receiver(), value()); - - ExternalReference ref = - ExternalReference(IC_Utility(IC::kStoreIC_ArrayLength), - masm()->isolate()); - __ TailCallExternalReference(ref, 2, 1); -} - - Handle PropertyICCompiler::CompileKeyedStorePolymorphic( MapHandleList* receiver_maps, CodeHandleList* handler_stubs, MapHandleList* transitioned_maps) { diff --git a/src/arm64/stub-cache-arm64.cc b/src/arm64/stub-cache-arm64.cc index cdab29a..9335211 100644 --- a/src/arm64/stub-cache-arm64.cc +++ b/src/arm64/stub-cache-arm64.cc @@ -247,15 +247,135 @@ void PropertyHandlerCompiler::GenerateCheckPropertyCell( } +static void PushInterceptorArguments(MacroAssembler* masm, Register receiver, + Register holder, Register name, + Handle holder_obj) { + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex == 0); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsInfoIndex == 1); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 2); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 3); + STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 4); + + __ Push(name); + Handle interceptor(holder_obj->GetNamedInterceptor()); + ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); + Register scratch = name; + __ Mov(scratch, Operand(interceptor)); + __ Push(scratch, receiver, holder); +} + + +static void CompileCallLoadPropertyWithInterceptor( + MacroAssembler* masm, Register receiver, Register holder, Register name, + Handle holder_obj, IC::UtilityId id) { + PushInterceptorArguments(masm, receiver, holder, name, holder_obj); + + __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), + NamedLoadHandlerCompiler::kInterceptorArgsLength); +} + + +// Generate call to api function. +void PropertyHandlerCompiler::GenerateFastApiCall( + MacroAssembler* masm, const CallOptimization& optimization, + Handle receiver_map, Register receiver, Register scratch, + bool is_store, int argc, Register* values) { + ASSERT(!AreAliased(receiver, scratch)); + + MacroAssembler::PushPopQueue queue(masm); + queue.Queue(receiver); + // Write the arguments to the stack frame. + for (int i = 0; i < argc; i++) { + Register arg = values[argc - 1 - i]; + ASSERT(!AreAliased(receiver, scratch, arg)); + queue.Queue(arg); + } + queue.PushQueued(); + + ASSERT(optimization.is_simple_api_call()); + + // Abi for CallApiFunctionStub. + Register callee = x0; + Register call_data = x4; + Register holder = x2; + Register api_function_address = x1; + + // Put holder in place. + CallOptimization::HolderLookup holder_lookup; + Handle api_holder = + optimization.LookupHolderOfExpectedType(receiver_map, &holder_lookup); + switch (holder_lookup) { + case CallOptimization::kHolderIsReceiver: + __ Mov(holder, receiver); + break; + case CallOptimization::kHolderFound: + __ LoadObject(holder, api_holder); + break; + case CallOptimization::kHolderNotFound: + UNREACHABLE(); + break; + } + + Isolate* isolate = masm->isolate(); + Handle function = optimization.constant_function(); + Handle api_call_info = optimization.api_call_info(); + Handle call_data_obj(api_call_info->data(), isolate); + + // Put callee in place. + __ LoadObject(callee, function); + + bool call_data_undefined = false; + // Put call_data in place. + if (isolate->heap()->InNewSpace(*call_data_obj)) { + __ LoadObject(call_data, api_call_info); + __ Ldr(call_data, FieldMemOperand(call_data, CallHandlerInfo::kDataOffset)); + } else if (call_data_obj->IsUndefined()) { + call_data_undefined = true; + __ LoadRoot(call_data, Heap::kUndefinedValueRootIndex); + } else { + __ LoadObject(call_data, call_data_obj); + } + + // Put api_function_address in place. + Address function_address = v8::ToCData
(api_call_info->callback()); + ApiFunction fun(function_address); + ExternalReference ref = ExternalReference( + &fun, ExternalReference::DIRECT_API_CALL, masm->isolate()); + __ Mov(api_function_address, ref); + + // Jump to stub. + CallApiFunctionStub stub(isolate, is_store, call_data_undefined, argc); + __ TailCallStub(&stub); +} + + +void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, + Handle code) { + __ Jump(code, RelocInfo::CODE_TARGET); +} + + +#undef __ +#define __ ACCESS_MASM(masm()) + + +void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, + Handle name) { + if (!label->is_unused()) { + __ Bind(label); + __ Mov(this->name(), Operand(name)); + } +} + + void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( - MacroAssembler* masm, Handle holder, Register holder_reg, - Handle name, Label* miss) { - if (holder->IsJSGlobalObject()) { - GenerateCheckPropertyCell( - masm, Handle::cast(holder), name, scratch1(), miss); - } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { - GenerateDictionaryNegativeLookup( - masm, miss, holder_reg, name, scratch1(), scratch2()); + Register holder_reg, Handle name, Label* miss) { + if (holder()->IsJSGlobalObject()) { + GenerateCheckPropertyCell(masm(), Handle::cast(holder()), + name, scratch1(), miss); + } else if (!holder()->HasFastProperties()) { + GenerateDictionaryNegativeLookup(masm(), miss, holder_reg, name, scratch1(), + scratch2()); } } @@ -265,10 +385,9 @@ void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( // may be clobbered. Upon branch to miss_label, the receiver and name registers // have their original values. void NamedStoreHandlerCompiler::GenerateStoreTransition( - MacroAssembler* masm, LookupResult* lookup, Handle transition, - Handle name, Register receiver_reg, Register storage_reg, - Register value_reg, Register scratch1, Register scratch2, Register scratch3, - Label* miss_label, Label* slow) { + Handle transition, Handle name, Register receiver_reg, + Register storage_reg, Register value_reg, Register scratch1, + Register scratch2, Register scratch3, Label* miss_label, Label* slow) { Label exit; ASSERT(!AreAliased(receiver_reg, storage_reg, value_reg, @@ -284,7 +403,7 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( ASSERT(!representation.IsNone()); if (details.type() == CONSTANT) { - Handle constant(descriptors->GetValue(descriptor), masm->isolate()); + Handle constant(descriptors->GetValue(descriptor), isolate()); __ LoadObject(scratch1, constant); __ Cmp(value_reg, scratch1); __ B(ne, miss_label); @@ -309,7 +428,7 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ Bind(&do_store); } } else if (representation.IsDouble()) { - UseScratchRegisterScope temps(masm); + UseScratchRegisterScope temps(masm()); DoubleRegister temp_double = temps.AcquireD(); __ SmiUntagToDouble(temp_double, value_reg, kSpeculativeUntag); @@ -337,9 +456,8 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ Push(receiver_reg, scratch1, value_reg); __ TailCallExternalReference( ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), - masm->isolate()), - 3, - 1); + isolate()), + 3, 1); return; } @@ -430,15 +548,15 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( // be clobbered. Upon branch to miss_label, the receiver and name registers have // their original values. void NamedStoreHandlerCompiler::GenerateStoreField( - MacroAssembler* masm, Handle object, LookupResult* lookup, - Register receiver_reg, Register name_reg, Register value_reg, - Register scratch1, Register scratch2, Label* miss_label) { + Handle object, LookupResult* lookup, Register receiver_reg, + Register name_reg, Register value_reg, Register scratch1, Register scratch2, + Label* miss_label) { // x0 : value Label exit; - // Stub never generated for non-global objects that require access - // checks. - ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); + // Stub never generated for objects that require access checks. + ASSERT(!object->IsAccessCheckNeeded()); + ASSERT(!object->IsJSGlobalProxy()); FieldIndex index = lookup->GetFieldIndex(); @@ -465,7 +583,7 @@ void NamedStoreHandlerCompiler::GenerateStoreField( __ Bind(&do_store); } } else if (representation.IsDouble()) { - UseScratchRegisterScope temps(masm); + UseScratchRegisterScope temps(masm()); DoubleRegister temp_double = temps.AcquireD(); __ SmiUntagToDouble(temp_double, value_reg, kSpeculativeUntag); @@ -552,135 +670,6 @@ void NamedStoreHandlerCompiler::GenerateStoreField( } -void NamedStoreHandlerCompiler::GenerateRestoreName(MacroAssembler* masm, - Label* label, - Handle name) { - if (!label->is_unused()) { - __ Bind(label); - __ Mov(this->name(), Operand(name)); - } -} - - -static void PushInterceptorArguments(MacroAssembler* masm, - Register receiver, - Register holder, - Register name, - Handle holder_obj) { - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex == 0); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsInfoIndex == 1); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 2); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 3); - STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 4); - - __ Push(name); - Handle interceptor(holder_obj->GetNamedInterceptor()); - ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); - Register scratch = name; - __ Mov(scratch, Operand(interceptor)); - __ Push(scratch, receiver, holder); -} - - -static void CompileCallLoadPropertyWithInterceptor( - MacroAssembler* masm, - Register receiver, - Register holder, - Register name, - Handle holder_obj, - IC::UtilityId id) { - PushInterceptorArguments(masm, receiver, holder, name, holder_obj); - - __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), - NamedLoadHandlerCompiler::kInterceptorArgsLength); -} - - -// Generate call to api function. -void PropertyHandlerCompiler::GenerateFastApiCall( - MacroAssembler* masm, const CallOptimization& optimization, - Handle receiver_map, Register receiver, Register scratch, - bool is_store, int argc, Register* values) { - ASSERT(!AreAliased(receiver, scratch)); - - MacroAssembler::PushPopQueue queue(masm); - queue.Queue(receiver); - // Write the arguments to the stack frame. - for (int i = 0; i < argc; i++) { - Register arg = values[argc-1-i]; - ASSERT(!AreAliased(receiver, scratch, arg)); - queue.Queue(arg); - } - queue.PushQueued(); - - ASSERT(optimization.is_simple_api_call()); - - // Abi for CallApiFunctionStub. - Register callee = x0; - Register call_data = x4; - Register holder = x2; - Register api_function_address = x1; - - // Put holder in place. - CallOptimization::HolderLookup holder_lookup; - Handle api_holder = - optimization.LookupHolderOfExpectedType(receiver_map, &holder_lookup); - switch (holder_lookup) { - case CallOptimization::kHolderIsReceiver: - __ Mov(holder, receiver); - break; - case CallOptimization::kHolderFound: - __ LoadObject(holder, api_holder); - break; - case CallOptimization::kHolderNotFound: - UNREACHABLE(); - break; - } - - Isolate* isolate = masm->isolate(); - Handle function = optimization.constant_function(); - Handle api_call_info = optimization.api_call_info(); - Handle call_data_obj(api_call_info->data(), isolate); - - // Put callee in place. - __ LoadObject(callee, function); - - bool call_data_undefined = false; - // Put call_data in place. - if (isolate->heap()->InNewSpace(*call_data_obj)) { - __ LoadObject(call_data, api_call_info); - __ Ldr(call_data, FieldMemOperand(call_data, CallHandlerInfo::kDataOffset)); - } else if (call_data_obj->IsUndefined()) { - call_data_undefined = true; - __ LoadRoot(call_data, Heap::kUndefinedValueRootIndex); - } else { - __ LoadObject(call_data, call_data_obj); - } - - // Put api_function_address in place. - Address function_address = v8::ToCData
(api_call_info->callback()); - ApiFunction fun(function_address); - ExternalReference ref = ExternalReference(&fun, - ExternalReference::DIRECT_API_CALL, - masm->isolate()); - __ Mov(api_function_address, ref); - - // Jump to stub. - CallApiFunctionStub stub(isolate, is_store, call_data_undefined, argc); - __ TailCallStub(&stub); -} - - -void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, - Handle code) { - __ Jump(code, RelocInfo::CODE_TARGET); -} - - -#undef __ -#define __ ACCESS_MASM(masm()) - - Register PropertyHandlerCompiler::CheckPrototypes( Register object_reg, Register holder_reg, Register scratch1, Register scratch2, Handle name, Label* miss, @@ -809,7 +798,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle name, Label* miss) { Label success; __ B(&success); - GenerateRestoreName(masm(), miss, name); + GenerateRestoreName(miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); __ Bind(&success); @@ -1277,17 +1266,6 @@ Handle PropertyICCompiler::CompilePolymorphic(TypeHandleList* types, } -void NamedStoreHandlerCompiler::GenerateStoreArrayLength() { - // Prepare tail call to StoreIC_ArrayLength. - __ Push(receiver(), value()); - - ExternalReference ref = - ExternalReference(IC_Utility(IC::kStoreIC_ArrayLength), - masm()->isolate()); - __ TailCallExternalReference(ref, 2, 1); -} - - Handle PropertyICCompiler::CompileKeyedStorePolymorphic( MapHandleList* receiver_maps, CodeHandleList* handler_stubs, MapHandleList* transitioned_maps) { diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc index ca25d96..1c76300 100644 --- a/src/ia32/stub-cache-ia32.cc +++ b/src/ia32/stub-cache-ia32.cc @@ -370,16 +370,6 @@ void PropertyHandlerCompiler::GenerateFastApiCall( } -void NamedStoreHandlerCompiler::GenerateRestoreName(MacroAssembler* masm, - Label* label, - Handle name) { - if (!label->is_unused()) { - __ bind(label); - __ mov(this->name(), Immediate(name)); - } -} - - // Generate code to check that a global property cell is empty. Create // the property cell at compilation time if no cell exists for the // property. @@ -401,15 +391,33 @@ void PropertyHandlerCompiler::GenerateCheckPropertyCell( } +void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, + Handle code) { + __ jmp(code, RelocInfo::CODE_TARGET); +} + + +#undef __ +#define __ ACCESS_MASM(masm()) + + +void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, + Handle name) { + if (!label->is_unused()) { + __ bind(label); + __ mov(this->name(), Immediate(name)); + } +} + + void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( - MacroAssembler* masm, Handle holder, Register holder_reg, - Handle name, Label* miss) { - if (holder->IsJSGlobalObject()) { - GenerateCheckPropertyCell( - masm, Handle::cast(holder), name, scratch1(), miss); - } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { - GenerateDictionaryNegativeLookup( - masm, miss, holder_reg, name, scratch1(), scratch2()); + Register holder_reg, Handle name, Label* miss) { + if (holder()->IsJSGlobalObject()) { + GenerateCheckPropertyCell(masm(), Handle::cast(holder()), + name, scratch1(), miss); + } else if (!holder()->HasFastProperties()) { + GenerateDictionaryNegativeLookup(masm(), miss, holder_reg, name, scratch1(), + scratch2()); } } @@ -417,10 +425,9 @@ void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( // Receiver_reg is preserved on jumps to miss_label, but may be destroyed if // store is successful. void NamedStoreHandlerCompiler::GenerateStoreTransition( - MacroAssembler* masm, LookupResult* lookup, Handle transition, - Handle name, Register receiver_reg, Register storage_reg, - Register value_reg, Register scratch1, Register scratch2, Register unused, - Label* miss_label, Label* slow) { + Handle transition, Handle name, Register receiver_reg, + Register storage_reg, Register value_reg, Register scratch1, + Register scratch2, Register unused, Label* miss_label, Label* slow) { int descriptor = transition->LastAdded(); DescriptorArray* descriptors = transition->instance_descriptors(); PropertyDetails details = descriptors->GetDetails(descriptor); @@ -428,7 +435,7 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( ASSERT(!representation.IsNone()); if (details.type() == CONSTANT) { - Handle constant(descriptors->GetValue(descriptor), masm->isolate()); + Handle constant(descriptors->GetValue(descriptor), isolate()); __ CmpObject(value_reg, constant); __ j(not_equal, miss_label); } else if (representation.IsSmi()) { @@ -461,8 +468,8 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ jmp(&do_store); __ bind(&heap_number); - __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(), - miss_label, DONT_DO_SMI_CHECK); + __ CheckMap(value_reg, isolate()->factory()->heap_number_map(), miss_label, + DONT_DO_SMI_CHECK); __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset)); __ bind(&do_store); @@ -484,9 +491,8 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ push(scratch1); __ TailCallExternalReference( ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), - masm->isolate()), - 3, - 1); + isolate()), + 3, 1); return; } @@ -577,12 +583,12 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( // Both name_reg and receiver_reg are preserved on jumps to miss_label, // but may be destroyed if store is successful. void NamedStoreHandlerCompiler::GenerateStoreField( - MacroAssembler* masm, Handle object, LookupResult* lookup, - Register receiver_reg, Register name_reg, Register value_reg, - Register scratch1, Register scratch2, Label* miss_label) { - // Stub never generated for non-global objects that require access - // checks. - ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); + Handle object, LookupResult* lookup, Register receiver_reg, + Register name_reg, Register value_reg, Register scratch1, Register scratch2, + Label* miss_label) { + // Stub never generated for objects that require access checks. + ASSERT(!object->IsAccessCheckNeeded()); + ASSERT(!object->IsJSGlobalProxy()); FieldIndex index = lookup->GetFieldIndex(); @@ -624,8 +630,8 @@ void NamedStoreHandlerCompiler::GenerateStoreField( __ SmiTag(value_reg); __ jmp(&do_store); __ bind(&heap_number); - __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(), - miss_label, DONT_DO_SMI_CHECK); + __ CheckMap(value_reg, isolate()->factory()->heap_number_map(), miss_label, + DONT_DO_SMI_CHECK); __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset)); __ bind(&do_store); __ movsd(FieldOperand(scratch1, HeapNumber::kValueOffset), xmm0); @@ -681,16 +687,6 @@ void NamedStoreHandlerCompiler::GenerateStoreField( } -void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, - Handle code) { - __ jmp(code, RelocInfo::CODE_TARGET); -} - - -#undef __ -#define __ ACCESS_MASM(masm()) - - Register PropertyHandlerCompiler::CheckPrototypes( Register object_reg, Register holder_reg, Register scratch1, Register scratch2, Handle name, Label* miss, @@ -816,7 +812,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle name, Label* miss) { if (!miss->is_unused()) { Label success; __ jmp(&success); - GenerateRestoreName(masm(), miss, name); + GenerateRestoreName(miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); __ bind(&success); } @@ -1129,20 +1125,6 @@ Handle NamedStoreHandlerCompiler::CompileStoreInterceptor( } -void NamedStoreHandlerCompiler::GenerateStoreArrayLength() { - // Prepare tail call to StoreIC_ArrayLength. - __ pop(scratch1()); // remove the return address - __ push(receiver()); - __ push(value()); - __ push(scratch1()); // restore return address - - ExternalReference ref = - ExternalReference(IC_Utility(IC::kStoreIC_ArrayLength), - masm()->isolate()); - __ TailCallExternalReference(ref, 2, 1); -} - - Handle PropertyICCompiler::CompileKeyedStorePolymorphic( MapHandleList* receiver_maps, CodeHandleList* handler_stubs, MapHandleList* transitioned_maps) { diff --git a/src/ic.cc b/src/ic.cc index 0dc62aa..4fb55fc 100644 --- a/src/ic.cc +++ b/src/ic.cc @@ -1435,7 +1435,7 @@ Handle StoreIC::CompileStoreHandler(LookupResult* lookup, PropertyDetails details = lookup->GetPropertyDetails(); if (details.type() != CALLBACKS && details.attributes() == NONE) { - return compiler.CompileStoreTransition(lookup, transition, name); + return compiler.CompileStoreTransition(transition, name); } } else { switch (lookup->type()) { @@ -2067,30 +2067,6 @@ RUNTIME_FUNCTION(StoreIC_MissFromStubFailure) { } -RUNTIME_FUNCTION(StoreIC_ArrayLength) { - TimerEventScope timer(isolate); - HandleScope scope(isolate); - - ASSERT(args.length() == 2); - Handle receiver = args.at(0); - Handle len = args.at(1); - - // The generated code should filter out non-Smis before we get here. - ASSERT(len->IsSmi()); - -#ifdef DEBUG - // The length property has to be a writable callback property. - LookupResult debug_lookup(isolate); - receiver->LookupOwn(isolate->factory()->length_string(), &debug_lookup); - ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); -#endif - - RETURN_FAILURE_ON_EXCEPTION( - isolate, JSArray::SetElementsLength(receiver, len)); - return *len; -} - - // Extend storage is called in a store inline cache when // it is necessary to extend the properties array of a // JSObject. diff --git a/src/ic.h b/src/ic.h index 3b4b7fd..be90829 100644 --- a/src/ic.h +++ b/src/ic.h @@ -22,7 +22,6 @@ const int kMaxKeyedPolymorphism = 4; ICU(CallIC_Miss) \ ICU(CallIC_Customization_Miss) \ ICU(StoreIC_Miss) \ - ICU(StoreIC_ArrayLength) \ ICU(StoreIC_Slow) \ ICU(SharedStoreIC_ExtendStorage) \ ICU(KeyedStoreIC_Miss) \ diff --git a/src/stub-cache.cc b/src/stub-cache.cc index 5381ff1..edb6025 100644 --- a/src/stub-cache.cc +++ b/src/stub-cache.cc @@ -34,12 +34,12 @@ void StubCache::Initialize() { static Code::Flags CommonStubCacheChecks(Name* name, Map* map, - Code::Flags flags, Heap* heap) { + Code::Flags flags) { flags = Code::RemoveTypeAndHolderFromFlags(flags); // Validate that the name does not move on scavenge, and that we // can use identity checks instead of structural equality checks. - ASSERT(!heap->InNewSpace(name)); + ASSERT(!name->GetHeap()->InNewSpace(name)); ASSERT(name->IsUniqueName()); // The state bits are not important to the hash function because the stub @@ -57,8 +57,7 @@ static Code::Flags CommonStubCacheChecks(Name* name, Map* map, Code* StubCache::Set(Name* name, Map* map, Code* code) { - Code::Flags flags = - CommonStubCacheChecks(name, map, code->flags(), isolate()->heap()); + Code::Flags flags = CommonStubCacheChecks(name, map, code->flags()); // Compute the primary entry. int primary_offset = PrimaryOffset(name, flags, map); @@ -87,7 +86,7 @@ Code* StubCache::Set(Name* name, Map* map, Code* code) { Code* StubCache::Get(Name* name, Map* map, Code::Flags flags) { - flags = CommonStubCacheChecks(name, map, flags, isolate()->heap()); + flags = CommonStubCacheChecks(name, map, flags); int primary_offset = PrimaryOffset(name, flags, map); Entry* primary = entry(primary_, primary_offset); if (primary->key == name && primary->map == map) { @@ -108,9 +107,8 @@ Handle PropertyICCompiler::Find(Handle name, CacheHolderFlag cache_holder) { Code::Flags flags = Code::ComputeMonomorphicFlags( kind, extra_state, cache_holder); - Handle probe(stub_holder->FindInCodeCache(*name, flags), - name->GetIsolate()); - if (probe->IsCode()) return Handle::cast(probe); + Object* probe = stub_holder->FindInCodeCache(*name, flags); + if (probe->IsCode()) return handle(Code::cast(probe)); return Handle::null(); } @@ -121,10 +119,8 @@ Handle PropertyHandlerCompiler::Find(Handle name, CacheHolderFlag cache_holder, Code::StubType type) { Code::Flags flags = Code::ComputeHandlerFlags(kind, type, cache_holder); - - Handle probe(stub_holder->FindInCodeCache(*name, flags), - name->GetIsolate()); - if (probe->IsCode()) return Handle::cast(probe); + Object* probe = stub_holder->FindInCodeCache(*name, flags); + if (probe->IsCode()) return handle(Code::cast(probe)); return Handle::null(); } @@ -957,7 +953,7 @@ Handle NamedLoadHandlerCompiler::CompileLoadViaGetter( // TODO(verwaest): Cleanup. holder() is actually the receiver. Handle NamedStoreHandlerCompiler::CompileStoreTransition( - LookupResult* lookup, Handle transition, Handle name) { + Handle transition, Handle name) { Label miss, slow; // Ensure no transitions to deprecated maps are followed. @@ -982,23 +978,17 @@ Handle NamedStoreHandlerCompiler::CompileStoreTransition( // prototype chain) is in slow mode, we need to do a negative lookup on the // holder. if (is_nonexistent) { - GenerateNegativeHolderLookup(masm(), holder(), holder_reg, name, &miss); + GenerateNegativeHolderLookup(holder_reg, name, &miss); } - GenerateStoreTransition(masm(), - lookup, - transition, - name, - receiver(), this->name(), value(), - scratch1(), scratch2(), scratch3(), - &miss, - &slow); + GenerateStoreTransition(transition, name, receiver(), this->name(), value(), + scratch1(), scratch2(), scratch3(), &miss, &slow); // Handle store cache miss. - GenerateRestoreName(masm(), &miss, name); + GenerateRestoreName(&miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); - GenerateRestoreName(masm(), &slow, name); + GenerateRestoreName(&slow, name); TailCallBuiltin(masm(), SlowBuiltin(kind())); return GetCode(kind(), Code::FAST, name); } @@ -1011,8 +1001,8 @@ Handle NamedStoreHandlerCompiler::CompileStoreField(LookupResult* lookup, FrontendHeader(receiver(), name, &miss); // Generate store field code. - GenerateStoreField(masm(), holder(), lookup, receiver(), this->name(), - value(), scratch1(), scratch2(), &miss); + GenerateStoreField(holder(), lookup, receiver(), this->name(), value(), + scratch1(), scratch2(), &miss); // Handle store cache miss. __ bind(&miss); @@ -1021,27 +1011,6 @@ Handle NamedStoreHandlerCompiler::CompileStoreField(LookupResult* lookup, } -Handle NamedStoreHandlerCompiler::CompileStoreArrayLength( - LookupResult* lookup, Handle name) { - // This accepts as a receiver anything JSArray::SetElementsLength accepts - // (currently anything except for external arrays which means anything with - // elements of FixedArray type). Value must be a number, but only smis are - // accepted as the most common case. - Label miss; - - // Check that value is a smi. - __ JumpIfNotSmi(value(), &miss); - - // Generate tail call to StoreIC_ArrayLength. - GenerateStoreArrayLength(); - - // Handle miss case. - __ bind(&miss); - TailCallBuiltin(masm(), MissBuiltin(kind())); - return GetCode(kind(), Code::FAST, name); -} - - Handle NamedStoreHandlerCompiler::CompileStoreViaSetter( Handle object, Handle name, Handle setter) { Frontend(receiver(), name); diff --git a/src/stub-cache.h b/src/stub-cache.h index 9cf7d73..ec0ca4a 100644 --- a/src/stub-cache.h +++ b/src/stub-cache.h @@ -561,26 +561,17 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { virtual ~NamedStoreHandlerCompiler() {} - Handle CompileStoreTransition(LookupResult* lookup, - Handle transition, + Handle CompileStoreTransition(Handle transition, Handle name); - Handle CompileStoreField(LookupResult* lookup, Handle name); - - Handle CompileStoreArrayLength(LookupResult* lookup, Handle name); - Handle CompileStoreCallback(Handle object, Handle name, Handle callback); - Handle CompileStoreCallback(Handle object, Handle name, const CallOptimization& call_optimization); - Handle CompileStoreViaSetter(Handle object, Handle name, Handle setter); - Handle CompileStoreInterceptor(Handle name); - static void GenerateStoreViaSetter(MacroAssembler* masm, Handle type, Register receiver, Handle setter); @@ -595,40 +586,22 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { Label* miss); virtual void FrontendFooter(Handle name, Label* miss); - void GenerateRestoreName(MacroAssembler* masm, Label* label, - Handle name); + void GenerateRestoreName(Label* label, Handle name); private: - void GenerateStoreArrayLength(); - - void GenerateNegativeHolderLookup(MacroAssembler* masm, - Handle holder, - Register holder_reg, - Handle name, + void GenerateNegativeHolderLookup(Register holder_reg, Handle name, Label* miss); - void GenerateStoreTransition(MacroAssembler* masm, - LookupResult* lookup, - Handle transition, - Handle name, - Register receiver_reg, - Register name_reg, - Register value_reg, - Register scratch1, - Register scratch2, - Register scratch3, - Label* miss_label, - Label* slow); - - void GenerateStoreField(MacroAssembler* masm, - Handle object, - LookupResult* lookup, - Register receiver_reg, - Register name_reg, - Register value_reg, - Register scratch1, - Register scratch2, - Label* miss_label); + void GenerateStoreTransition(Handle transition, Handle name, + Register receiver_reg, Register name_reg, + Register value_reg, Register scratch1, + Register scratch2, Register scratch3, + Label* miss_label, Label* slow); + + void GenerateStoreField(Handle object, LookupResult* lookup, + Register receiver_reg, Register name_reg, + Register value_reg, Register scratch1, + Register scratch2, Label* miss_label); static Builtins::Name SlowBuiltin(Code::Kind kind) { switch (kind) { diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc index add7b8d..b0cc929 100644 --- a/src/x64/stub-cache-x64.cc +++ b/src/x64/stub-cache-x64.cc @@ -335,16 +335,6 @@ void PropertyHandlerCompiler::GenerateFastApiCall( } -void NamedStoreHandlerCompiler::GenerateRestoreName(MacroAssembler* masm, - Label* label, - Handle name) { - if (!label->is_unused()) { - __ bind(label); - __ Move(this->name(), name); - } -} - - void PropertyHandlerCompiler::GenerateCheckPropertyCell( MacroAssembler* masm, Handle global, Handle name, Register scratch, Label* miss) { @@ -358,15 +348,33 @@ void PropertyHandlerCompiler::GenerateCheckPropertyCell( } +void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, + Handle code) { + __ jmp(code, RelocInfo::CODE_TARGET); +} + + +#undef __ +#define __ ACCESS_MASM((masm())) + + +void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, + Handle name) { + if (!label->is_unused()) { + __ bind(label); + __ Move(this->name(), name); + } +} + + void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( - MacroAssembler* masm, Handle holder, Register holder_reg, - Handle name, Label* miss) { - if (holder->IsJSGlobalObject()) { - GenerateCheckPropertyCell( - masm, Handle::cast(holder), name, scratch1(), miss); - } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { - GenerateDictionaryNegativeLookup( - masm, miss, holder_reg, name, scratch1(), scratch2()); + Register holder_reg, Handle name, Label* miss) { + if (holder()->IsJSGlobalObject()) { + GenerateCheckPropertyCell(masm(), Handle::cast(holder()), + name, scratch1(), miss); + } else if (!holder()->HasFastProperties()) { + GenerateDictionaryNegativeLookup(masm(), miss, holder_reg, name, scratch1(), + scratch2()); } } @@ -374,10 +382,9 @@ void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( // Receiver_reg is preserved on jumps to miss_label, but may be destroyed if // store is successful. void NamedStoreHandlerCompiler::GenerateStoreTransition( - MacroAssembler* masm, LookupResult* lookup, Handle transition, - Handle name, Register receiver_reg, Register storage_reg, - Register value_reg, Register scratch1, Register scratch2, Register unused, - Label* miss_label, Label* slow) { + Handle transition, Handle name, Register receiver_reg, + Register storage_reg, Register value_reg, Register scratch1, + Register scratch2, Register unused, Label* miss_label, Label* slow) { int descriptor = transition->LastAdded(); DescriptorArray* descriptors = transition->instance_descriptors(); PropertyDetails details = descriptors->GetDetails(descriptor); @@ -385,7 +392,7 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( ASSERT(!representation.IsNone()); if (details.type() == CONSTANT) { - Handle constant(descriptors->GetValue(descriptor), masm->isolate()); + Handle constant(descriptors->GetValue(descriptor), isolate()); __ Cmp(value_reg, constant); __ j(not_equal, miss_label); } else if (representation.IsSmi()) { @@ -417,8 +424,8 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ jmp(&do_store); __ bind(&heap_number); - __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(), - miss_label, DONT_DO_SMI_CHECK); + __ CheckMap(value_reg, isolate()->factory()->heap_number_map(), miss_label, + DONT_DO_SMI_CHECK); __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset)); __ bind(&do_store); @@ -440,9 +447,8 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ PushReturnAddressFrom(scratch1); __ TailCallExternalReference( ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), - masm->isolate()), - 3, - 1); + isolate()), + 3, 1); return; } @@ -525,12 +531,12 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( // Both name_reg and receiver_reg are preserved on jumps to miss_label, // but may be destroyed if store is successful. void NamedStoreHandlerCompiler::GenerateStoreField( - MacroAssembler* masm, Handle object, LookupResult* lookup, - Register receiver_reg, Register name_reg, Register value_reg, - Register scratch1, Register scratch2, Label* miss_label) { - // Stub never generated for non-global objects that require access - // checks. - ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); + Handle object, LookupResult* lookup, Register receiver_reg, + Register name_reg, Register value_reg, Register scratch1, Register scratch2, + Label* miss_label) { + // Stub never generated for objects that require access checks. + ASSERT(!object->IsAccessCheckNeeded()); + ASSERT(!object->IsJSGlobalProxy()); FieldIndex index = lookup->GetFieldIndex(); @@ -573,8 +579,8 @@ void NamedStoreHandlerCompiler::GenerateStoreField( __ jmp(&do_store); __ bind(&heap_number); - __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(), - miss_label, DONT_DO_SMI_CHECK); + __ CheckMap(value_reg, isolate()->factory()->heap_number_map(), miss_label, + DONT_DO_SMI_CHECK); __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset)); __ bind(&do_store); __ movsd(FieldOperand(scratch1, HeapNumber::kValueOffset), xmm0); @@ -621,16 +627,6 @@ void NamedStoreHandlerCompiler::GenerateStoreField( } -void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, - Handle code) { - __ jmp(code, RelocInfo::CODE_TARGET); -} - - -#undef __ -#define __ ACCESS_MASM((masm())) - - Register PropertyHandlerCompiler::CheckPrototypes( Register object_reg, Register holder_reg, Register scratch1, Register scratch2, Handle name, Label* miss, @@ -757,7 +753,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle name, Label* miss) { if (!miss->is_unused()) { Label success; __ jmp(&success); - GenerateRestoreName(masm(), miss, name); + GenerateRestoreName(miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); __ bind(&success); } @@ -1052,20 +1048,6 @@ Handle NamedStoreHandlerCompiler::CompileStoreInterceptor( } -void NamedStoreHandlerCompiler::GenerateStoreArrayLength() { - // Prepare tail call to StoreIC_ArrayLength. - __ PopReturnAddressTo(scratch1()); - __ Push(receiver()); - __ Push(value()); - __ PushReturnAddressFrom(scratch1()); - - ExternalReference ref = - ExternalReference(IC_Utility(IC::kStoreIC_ArrayLength), - masm()->isolate()); - __ TailCallExternalReference(ref, 2, 1); -} - - Handle PropertyICCompiler::CompileKeyedStorePolymorphic( MapHandleList* receiver_maps, CodeHandleList* handler_stubs, MapHandleList* transitioned_maps) { -- 2.7.4