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:
parent
ea11ffc65b
commit
3834b78465
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user