diff --git a/src/ic/arm/handler-compiler-arm.cc b/src/ic/arm/handler-compiler-arm.cc index ba499ab308..5dcbd0f35c 100644 --- a/src/ic/arm/handler-compiler-arm.cc +++ b/src/ic/arm/handler-compiler-arm.cc @@ -336,11 +336,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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); } diff --git a/src/ic/arm64/handler-compiler-arm64.cc b/src/ic/arm64/handler-compiler-arm64.cc index 2d5999ab47..9e414e2d40 100644 --- a/src/ic/arm64/handler-compiler-arm64.cc +++ b/src/ic/arm64/handler-compiler-arm64.cc @@ -380,11 +380,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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); } diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc index 9915ed11dc..fe451fd6c2 100644 --- a/src/ic/handler-compiler.cc +++ b/src/ic/handler-compiler.cc @@ -330,7 +330,7 @@ Handle NamedStoreHandlerCompiler::CompileStoreTransition( } int descriptor = transition->LastAdded(); - DescriptorArray* descriptors = transition->instance_descriptors(); + Handle descriptors(transition->instance_descriptors()); PropertyDetails details = descriptors->GetDetails(descriptor); Representation representation = details.representation(); DCHECK(!representation.IsNone()); @@ -340,9 +340,10 @@ Handle 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()); diff --git a/src/ic/handler-compiler.h b/src/ic/handler-compiler.h index ec07572fe5..efb0a397c8 100644 --- a/src/ic/handler-compiler.h +++ b/src/ic/handler-compiler.h @@ -234,7 +234,8 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { void GenerateRestoreMap(Handle 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, diff --git a/src/ic/ia32/handler-compiler-ia32.cc b/src/ic/ia32/handler-compiler-ia32.cc index d707e695d6..6e009038d2 100644 --- a/src/ic/ia32/handler-compiler-ia32.cc +++ b/src/ic/ia32/handler-compiler-ia32.cc @@ -343,10 +343,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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); } diff --git a/src/ic/mips/handler-compiler-mips.cc b/src/ic/mips/handler-compiler-mips.cc index 3167dea9d3..f8ebc9407c 100644 --- a/src/ic/mips/handler-compiler-mips.cc +++ b/src/ic/mips/handler-compiler-mips.cc @@ -332,11 +332,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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)); } diff --git a/src/ic/mips64/handler-compiler-mips64.cc b/src/ic/mips64/handler-compiler-mips64.cc index 6a35d6c174..df87625e56 100644 --- a/src/ic/mips64/handler-compiler-mips64.cc +++ b/src/ic/mips64/handler-compiler-mips64.cc @@ -333,11 +333,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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)); } diff --git a/src/ic/x64/handler-compiler-x64.cc b/src/ic/x64/handler-compiler-x64.cc index 2e19fb5aba..dfbadcce11 100644 --- a/src/ic/x64/handler-compiler-x64.cc +++ b/src/ic/x64/handler-compiler-x64.cc @@ -335,10 +335,19 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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); } diff --git a/src/ic/x87/handler-compiler-x87.cc b/src/ic/x87/handler-compiler-x87.cc index 1a2335b8a4..00a7e08caf 100644 --- a/src/ic/x87/handler-compiler-x87.cc +++ b/src/ic/x87/handler-compiler-x87.cc @@ -343,10 +343,18 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle 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); }