Reland 'Do not embed constant functions in StoreTransition stub.'

BUG=v8:3629
LOG=N

Review URL: https://codereview.chromium.org/787153002

Cr-Commit-Position: refs/heads/master@{#25738}
This commit is contained in:
ulan 2014-12-10 02:28:41 -08:00 committed by Commit bot
parent ea11ffc65b
commit 3834b78465
9 changed files with 77 additions and 22 deletions

View File

@ -336,11 +336,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ Move(scratch1(), handle(constant, isolate()));
__ cmp(value_reg, scratch1());
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ ldr(scratch,
FieldMemOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ cmp(value_reg, scratch);
__ b(ne, miss_label);
}

View File

@ -380,11 +380,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ LoadObject(scratch1(), handle(constant, isolate()));
__ Cmp(value_reg, scratch1());
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ Ldr(scratch,
FieldMemOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ Cmp(value_reg, scratch);
__ B(ne, miss_label);
}

View File

@ -330,7 +330,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
}
int descriptor = transition->LastAdded();
DescriptorArray* descriptors = transition->instance_descriptors();
Handle<DescriptorArray> descriptors(transition->instance_descriptors());
PropertyDetails details = descriptors->GetDetails(descriptor);
Representation representation = details.representation();
DCHECK(!representation.IsNone());
@ -340,9 +340,10 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
// Call to respective StoreTransitionStub.
if (details.type() == CONSTANT) {
GenerateConstantCheck(descriptors->GetValue(descriptor), value(), &miss);
GenerateRestoreMap(transition, scratch2(), &miss);
DCHECK(descriptors->GetValue(descriptor)->IsJSFunction());
Register map_reg = StoreTransitionDescriptor::MapRegister();
GenerateConstantCheck(map_reg, descriptor, value(), scratch2(), &miss);
GenerateRestoreName(name);
StoreTransitionStub stub(isolate());
GenerateTailCall(masm(), stub.GetCode());

View File

@ -234,7 +234,8 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
void GenerateRestoreMap(Handle<Map> transition, Register scratch,
Label* miss);
void GenerateConstantCheck(Object* constant, Register value_reg,
void GenerateConstantCheck(Register map_reg, int descriptor,
Register value_reg, Register scratch,
Label* miss_label);
void GenerateFieldTypeChecks(HeapType* field_type, Register value_reg,

View File

@ -343,10 +343,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ CmpObject(value_reg, handle(constant, isolate()));
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ mov(scratch,
FieldOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ cmp(value_reg, scratch);
__ j(not_equal, miss_label);
}

View File

@ -332,11 +332,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ li(scratch1(), handle(constant, isolate()));
__ Branch(miss_label, ne, value_reg, Operand(scratch1()));
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ lw(scratch,
FieldMemOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ Branch(miss_label, ne, value_reg, Operand(scratch));
}

View File

@ -333,11 +333,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ li(scratch1(), handle(constant, isolate()));
__ Branch(miss_label, ne, value_reg, Operand(scratch1()));
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ ld(scratch,
FieldMemOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ Branch(miss_label, ne, value_reg, Operand(scratch));
}

View File

@ -335,10 +335,19 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ Cmp(value_reg, handle(constant, isolate()));
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ movp(scratch,
FieldOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ cmpp(value_reg, scratch);
__ j(not_equal, miss_label);
}

View File

@ -343,10 +343,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
}
void NamedStoreHandlerCompiler::GenerateConstantCheck(Object* constant,
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
int descriptor,
Register value_reg,
Register scratch,
Label* miss_label) {
__ CmpObject(value_reg, handle(constant, isolate()));
DCHECK(!map_reg.is(scratch));
DCHECK(!map_reg.is(value_reg));
DCHECK(!value_reg.is(scratch));
__ LoadInstanceDescriptors(map_reg, scratch);
__ mov(scratch,
FieldOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
__ cmp(value_reg, scratch);
__ j(not_equal, miss_label);
}