Commit e508f1d4 authored by verwaest@chromium.org's avatar verwaest@chromium.org

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
parent aa45ec52
This diff is collapsed.
This diff is collapsed.
......@@ -370,16 +370,6 @@ void PropertyHandlerCompiler::GenerateFastApiCall(
}
void NamedStoreHandlerCompiler::GenerateRestoreName(MacroAssembler* masm,
Label* label,
Handle<Name> 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> code) {
__ jmp(code, RelocInfo::CODE_TARGET);
}
#undef __
#define __ ACCESS_MASM(masm())
void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label,
Handle<Name> name) {
if (!label->is_unused()) {
__ bind(label);
__ mov(this->name(), Immediate(name));
}
}
void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup(
MacroAssembler* masm, Handle<JSObject> holder, Register holder_reg,
Handle<Name> name, Label* miss) {
if (holder->IsJSGlobalObject()) {
GenerateCheckPropertyCell(
masm, Handle<JSGlobalObject>::cast(holder), name, scratch1(), miss);
} else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) {
GenerateDictionaryNegativeLookup(
masm, miss, holder_reg, name, scratch1(), scratch2());
Register holder_reg, Handle<Name> name, Label* miss) {
if (holder()->IsJSGlobalObject()) {
GenerateCheckPropertyCell(masm(), Handle<JSGlobalObject>::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<Map> transition,
Handle<Name> name, Register receiver_reg, Register storage_reg,
Register value_reg, Register scratch1, Register scratch2, Register unused,
Label* miss_label, Label* slow) {
Handle<Map> transition, Handle<Name> 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<Object> constant(descriptors->GetValue(descriptor), masm->isolate());
Handle<Object> 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<JSObject> 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<JSObject> 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> 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> name, Label* miss,
......@@ -816,7 +812,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> 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<Code> 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<Code> PropertyICCompiler::CompileKeyedStorePolymorphic(
MapHandleList* receiver_maps, CodeHandleList* handler_stubs,
MapHandleList* transitioned_maps) {
......
......@@ -1435,7 +1435,7 @@ Handle<Code> 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<TimerEventIcMiss> timer(isolate);
HandleScope scope(isolate);
ASSERT(args.length() == 2);
Handle<JSArray> receiver = args.at<JSArray>(0);
Handle<Object> len = args.at<Object>(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.
......
......@@ -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) \
......
......@@ -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<Code> PropertyICCompiler::Find(Handle<Name> name,
CacheHolderFlag cache_holder) {
Code::Flags flags = Code::ComputeMonomorphicFlags(
kind, extra_state, cache_holder);
Handle<Object> probe(stub_holder->FindInCodeCache(*name, flags),
name->GetIsolate());
if (probe->IsCode()) return Handle<Code>::cast(probe);
Object* probe = stub_holder->FindInCodeCache(*name, flags);
if (probe->IsCode()) return handle(Code::cast(probe));
return Handle<Code>::null();
}
......@@ -121,10 +119,8 @@ Handle<Code> PropertyHandlerCompiler::Find(Handle<Name> name,
CacheHolderFlag cache_holder,
Code::StubType type) {
Code::Flags flags = Code::ComputeHandlerFlags(kind, type, cache_holder);
Handle<Object> probe(stub_holder->FindInCodeCache(*name, flags),
name->GetIsolate());
if (probe->IsCode()) return Handle<Code>::cast(probe);
Object* probe = stub_holder->FindInCodeCache(*name, flags);
if (probe->IsCode()) return handle(Code::cast(probe));
return Handle<Code>::null();
}
......@@ -957,7 +953,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadViaGetter(
// TODO(verwaest): Cleanup. holder() is actually the receiver.
Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
LookupResult* lookup, Handle<Map> transition, Handle<Name> name) {
Handle<Map> transition, Handle<Name> name) {
Label miss, slow;
// Ensure no transitions to deprecated maps are followed.
......@@ -982,23 +978,17 @@ Handle<Code> 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<Code> 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<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupResult* lookup,
}
Handle<Code> NamedStoreHandlerCompiler::CompileStoreArrayLength(
LookupResult* lookup, Handle<Name> 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<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
Handle<JSObject> object, Handle<Name> name, Handle<JSFunction> setter) {
Frontend(receiver(), name);
......
......@@ -561,26 +561,17 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
virtual ~NamedStoreHandlerCompiler() {}
Handle<Code> CompileStoreTransition(LookupResult* lookup,
Handle<Map> transition,
Handle<Code> CompileStoreTransition(Handle<Map> transition,
Handle<Name> name);
Handle<Code> CompileStoreField(LookupResult* lookup, Handle<Name> name);
Handle<Code> CompileStoreArrayLength(LookupResult* lookup, Handle<Name> name);
Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name,
Handle<ExecutableAccessorInfo> callback);
Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name,
const CallOptimization& call_optimization);
Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, Handle<Name> name,
Handle<JSFunction> setter);
Handle<Code> CompileStoreInterceptor(Handle<Name> name);
static void GenerateStoreViaSetter(MacroAssembler* masm,
Handle<HeapType> type, Register receiver,
Handle<JSFunction> setter);
......@@ -595,40 +586,22 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
Label* miss);
virtual void FrontendFooter(Handle<Name> name, Label* miss);
void GenerateRestoreName(MacroAssembler* masm, Label* label,
Handle<Name> name);
void GenerateRestoreName(Label* label, Handle<Name> name);
private:
void GenerateStoreArrayLength();
void GenerateNegativeHolderLookup(MacroAssembler* masm,
Handle<JSObject> holder,
Register holder_reg,
Handle<Name> name,
void GenerateNegativeHolderLookup(Register holder_reg, Handle<Name> name,
Label* miss);
void GenerateStoreTransition(MacroAssembler* masm,
LookupResult* lookup,
Handle<Map> transition,
Handle<Name> 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<JSObject> object,
LookupResult* lookup,
Register receiver_reg,
Register name_reg,
Register value_reg,
Register scratch1,
Register scratch2,
Label* miss_label);
void GenerateStoreTransition(Handle<Map> transition, Handle<Name> name,
Register receiver_reg, Register name_reg,
Register value_reg, Register scratch1,
Register scratch2, Register scratch3,
Label* miss_label, Label* slow);
void GenerateStoreField(Handle<JSObject> 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) {
......
......@@ -335,16 +335,6 @@ void PropertyHandlerCompiler::GenerateFastApiCall(
}
void NamedStoreHandlerCompiler::GenerateRestoreName(MacroAssembler* masm,
Label* label,
Handle<Name> name) {
if (!label->is_unused()) {
__ bind(label);
__ Move(this->name(), name);
}
}
void PropertyHandlerCompiler::GenerateCheckPropertyCell(
MacroAssembler* masm, Handle<JSGlobalObject> global, Handle<Name> name,
Register scratch, Label* miss) {
......@@ -358,15 +348,33 @@ void PropertyHandlerCompiler::GenerateCheckPropertyCell(
}
void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm,
Handle<Code> code) {
__ jmp(code, RelocInfo::CODE_TARGET);
}
#undef __
#define __ ACCESS_MASM((masm()))
void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label,
Handle<Name> name) {
if (!label->is_unused()) {
__ bind(label);
__ Move(this->name(), name);
}
}
void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup(
MacroAssembler* masm, Handle<JSObject> holder, Register holder_reg,
Handle<Name> name, Label* miss) {
if (holder->IsJSGlobalObject()) {
GenerateCheckPropertyCell(
masm, Handle<JSGlobalObject>::cast(holder), name, scratch1(), miss);
} else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) {
GenerateDictionaryNegativeLookup(
masm, miss, holder_reg, name, scratch1(), scratch2());
Register holder_reg, Handle<Name> name, Label* miss) {
if (holder()->IsJSGlobalObject()) {
GenerateCheckPropertyCell(masm(), Handle<JSGlobalObject>::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<Map> transition,
Handle<Name> name, Register receiver_reg, Register storage_reg,
Register value_reg, Register scratch1, Register scratch2, Register unused,
Label* miss_label, Label* slow) {
Handle<Map> transition, Handle<Name> 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<Object> constant(descriptors->GetValue(descriptor), masm->isolate());
Handle<Object> 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<JSObject> 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<JSObject> 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> 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> name, Label* miss,
......@@ -757,7 +753,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> 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<Code> 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<Code> PropertyICCompiler::CompileKeyedStorePolymorphic(
MapHandleList* receiver_maps, CodeHandleList* handler_stubs,
MapHandleList* transitioned_maps) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment