Reviewers: Yang, Igor Sheludko,
Message:
PTAL
https://codereview.chromium.org/787153002/diff/1/src/ic/handler-compiler.cc
File src/ic/handler-compiler.cc (right):
https://codereview.chromium.org/787153002/diff/1/src/ic/handler-compiler.cc#newcode333
src/ic/handler-compiler.cc:333: Handle<DescriptorArray>
descriptors(transition->instance_descriptors());
This is the only diff from the original CL. We need to use handle here
because GenerateRestoreMap below can cause GC.
Description:
Reland 'Do not embed constant functions in StoreTransition stub.'
BUG=v8:3629
LOG=N
Please review this at https://codereview.chromium.org/787153002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+77, -22 lines):
M src/ic/arm/handler-compiler-arm.cc
M src/ic/arm64/handler-compiler-arm64.cc
M src/ic/handler-compiler.h
M src/ic/handler-compiler.cc
M src/ic/ia32/handler-compiler-ia32.cc
M src/ic/mips/handler-compiler-mips.cc
M src/ic/mips64/handler-compiler-mips64.cc
M src/ic/x64/handler-compiler-x64.cc
M src/ic/x87/handler-compiler-x87.cc
Index: src/ic/arm/handler-compiler-arm.cc
diff --git a/src/ic/arm/handler-compiler-arm.cc
b/src/ic/arm/handler-compiler-arm.cc
index
ba499ab308e30946bb5d0b422ce57671e579c8da..5dcbd0f35c3614a28d05cca62ee80302913cafc4
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<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);
}
Index: src/ic/arm64/handler-compiler-arm64.cc
diff --git a/src/ic/arm64/handler-compiler-arm64.cc
b/src/ic/arm64/handler-compiler-arm64.cc
index
2d5999ab4794a8b24d1ea61d9541b3966ddb5196..9e414e2d40f428de76c07752e959aeee70190ab7
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<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);
}
Index: src/ic/handler-compiler.cc
diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc
index
9915ed11dcb302c238104f6b23883edf30c0d90c..fe451fd6c22d62378275808fdd182d412aeedc22
100644
--- a/src/ic/handler-compiler.cc
+++ b/src/ic/handler-compiler.cc
@@ -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());
Index: src/ic/handler-compiler.h
diff --git a/src/ic/handler-compiler.h b/src/ic/handler-compiler.h
index
ec07572fe563d82a9198990914dfb13f17f822b1..efb0a397c877e5f0cc28f35851dc0dca8e68a46a
100644
--- a/src/ic/handler-compiler.h
+++ b/src/ic/handler-compiler.h
@@ -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,
Index: src/ic/ia32/handler-compiler-ia32.cc
diff --git a/src/ic/ia32/handler-compiler-ia32.cc
b/src/ic/ia32/handler-compiler-ia32.cc
index
d707e695d63c0b055b0348a3e0daa06b05347ac8..6e009038d22671f7c8ea717c1a479aaa6e00a585
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<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);
}
Index: src/ic/mips/handler-compiler-mips.cc
diff --git a/src/ic/mips/handler-compiler-mips.cc
b/src/ic/mips/handler-compiler-mips.cc
index
3167dea9d326a134bf029946d306fbbfdd737f50..f8ebc9407c825e22f6547d187a9106aa5ace3ca0
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<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));
}
Index: src/ic/mips64/handler-compiler-mips64.cc
diff --git a/src/ic/mips64/handler-compiler-mips64.cc
b/src/ic/mips64/handler-compiler-mips64.cc
index
6a35d6c17475ba66d4a0a7579e241f1e220208ee..df87625e56a85473d1cf84d586d4e9864c068665
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<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));
}
Index: src/ic/x64/handler-compiler-x64.cc
diff --git a/src/ic/x64/handler-compiler-x64.cc
b/src/ic/x64/handler-compiler-x64.cc
index
2e19fb5abab47a437d8d9a0a8eeadb760cfd20a0..dfbadcce1175f0014e661ab4db42f860ea82dd4f
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<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);
}
Index: src/ic/x87/handler-compiler-x87.cc
diff --git a/src/ic/x87/handler-compiler-x87.cc
b/src/ic/x87/handler-compiler-x87.cc
index
1a2335b8a4bc30243c77a957018b45efce7c64d0..00a7e08caf6d91b55cdd591307a5ca832d24d28a
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<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);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.