Reviewers: danno, mvstanton, paul.l..., gergely.kis.imgtec,
akos.palfi.imgtec, dusmil.imgtec,
Description:
MIPS: Use a trampoline stub to load the type feedback vector for CallICs.
Port 2a567faa3e7242359e29c63f8dc8c18104af0610
BUG=
Please review this at https://codereview.chromium.org/882683002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+54, -12 lines):
M src/mips/code-stubs-mips.cc
M src/mips/full-codegen-mips.cc
M src/mips/interface-descriptors-mips.cc
M src/mips64/code-stubs-mips64.cc
M src/mips64/full-codegen-mips64.cc
M src/mips64/interface-descriptors-mips64.cc
Index: src/mips/code-stubs-mips.cc
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc
index
65c398dc65267c7ad5d27376c4869eff1c84098e..5ce502cab3f3a351f483777099431ba9ea8dd278
100644
--- a/src/mips/code-stubs-mips.cc
+++ b/src/mips/code-stubs-mips.cc
@@ -2746,10 +2746,9 @@ static void
EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) {
void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
// a1 - function
// a3 - slot id
+ // a2 - vector
Label miss;
- EmitLoadTypeFeedbackVector(masm, a2);
-
__ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at);
__ Branch(&miss, ne, a1, Operand(at));
@@ -2784,6 +2783,7 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm)
{
void CallICStub::Generate(MacroAssembler* masm) {
// a1 - function
// a3 - slot id (Smi)
+ // a2 - vector
const int with_types_offset =
FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex);
const int generic_offset =
@@ -2794,8 +2794,6 @@ void CallICStub::Generate(MacroAssembler* masm) {
int argc = arg_count();
ParameterCount actual(argc);
- EmitLoadTypeFeedbackVector(masm, a2);
-
// The checks. First, does r1 match the recorded monomorphic target?
__ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
__ Addu(t0, a2, Operand(t0));
@@ -4479,6 +4477,20 @@ void
KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) {
}
+void CallICTrampolineStub::Generate(MacroAssembler* masm) {
+ EmitLoadTypeFeedbackVector(masm, a2);
+ CallICStub stub(isolate(), state());
+ __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
+}
+
+
+void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) {
+ EmitLoadTypeFeedbackVector(masm, a2);
+ CallIC_ArrayStub stub(isolate(), state());
+ __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
+}
+
+
void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) {
if (masm->isolate()->function_entry_hook() != NULL) {
ProfileEntryHookStub stub(masm->isolate());
Index: src/mips/full-codegen-mips.cc
diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
index
9baeaa74cd69581d762fe89308f7f1dfb0a285a3..25ec2b578cdfb3c8077d4d71d1df068da1aefaf0
100644
--- a/src/mips/full-codegen-mips.cc
+++ b/src/mips/full-codegen-mips.cc
@@ -2982,8 +2982,7 @@ void FullCodeGenerator::EmitCall(Call* expr,
CallICState::CallType call_type) {
// Record source position of the IC call.
SetSourcePosition(expr->position());
- Handle<Code> ic = CallIC::initialize_stub(
- isolate(), arg_count, call_type);
+ Handle<Code> ic = CodeFactory::CallIC(isolate(), arg_count,
call_type).code();
__ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot())));
__ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize));
// Don't assign a type feedback id to the IC, since type feedback is
provided
Index: src/mips/interface-descriptors-mips.cc
diff --git a/src/mips/interface-descriptors-mips.cc
b/src/mips/interface-descriptors-mips.cc
index
979fbf45f0356316fbdd14155adefa32283f5d17..b2ac478a584b3ce41bb51ebcb89e206ed92cd9c8
100644
--- a/src/mips/interface-descriptors-mips.cc
+++ b/src/mips/interface-descriptors-mips.cc
@@ -125,6 +125,16 @@ void CallFunctionWithFeedbackDescriptor::Initialize(
}
+void CallFunctionWithFeedbackAndVectorDescriptor::Initialize(
+ CallInterfaceDescriptorData* data) {
+ Register registers[] = {cp, a1, a3, a2};
+ Representation representations[] = {
+ Representation::Tagged(), Representation::Tagged(),
Representation::Smi(),
+ Representation::Tagged()};
+ data->Initialize(arraysize(registers), registers, representations);
+}
+
+
void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData*
data) {
// a0 : number of arguments
// a1 : the function to call
Index: src/mips64/code-stubs-mips64.cc
diff --git a/src/mips64/code-stubs-mips64.cc
b/src/mips64/code-stubs-mips64.cc
index
627d65b4314fc37fbcb4a241835f784797f5d668..4419409707006e52b6cf7bf141a9d2ab9599c74a
100644
--- a/src/mips64/code-stubs-mips64.cc
+++ b/src/mips64/code-stubs-mips64.cc
@@ -2821,10 +2821,9 @@ static void
EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) {
void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
// a1 - function
// a3 - slot id
+ // a2 - vector
Label miss;
- EmitLoadTypeFeedbackVector(masm, a2);
-
__ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at);
__ Branch(&miss, ne, a1, Operand(at));
@@ -2859,6 +2858,7 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm)
{
void CallICStub::Generate(MacroAssembler* masm) {
// a1 - function
// a3 - slot id (Smi)
+ // a2 - vector
const int with_types_offset =
FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex);
const int generic_offset =
@@ -2869,8 +2869,6 @@ void CallICStub::Generate(MacroAssembler* masm) {
int argc = arg_count();
ParameterCount actual(argc);
- EmitLoadTypeFeedbackVector(masm, a2);
-
// The checks. First, does r1 match the recorded monomorphic target?
__ dsrl(a4, a3, 32 - kPointerSizeLog2);
__ Daddu(a4, a2, Operand(a4));
@@ -4519,6 +4517,20 @@ void
KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) {
}
+void CallICTrampolineStub::Generate(MacroAssembler* masm) {
+ EmitLoadTypeFeedbackVector(masm, a2);
+ CallICStub stub(isolate(), state());
+ __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
+}
+
+
+void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) {
+ EmitLoadTypeFeedbackVector(masm, a2);
+ CallIC_ArrayStub stub(isolate(), state());
+ __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
+}
+
+
void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) {
if (masm->isolate()->function_entry_hook() != NULL) {
ProfileEntryHookStub stub(masm->isolate());
Index: src/mips64/full-codegen-mips64.cc
diff --git a/src/mips64/full-codegen-mips64.cc
b/src/mips64/full-codegen-mips64.cc
index
ef71af461e49e2a2747f218eeb278b9dfffc9706..d639c10f001cdcf0339960456b2af3da93749d2e
100644
--- a/src/mips64/full-codegen-mips64.cc
+++ b/src/mips64/full-codegen-mips64.cc
@@ -2982,8 +2982,7 @@ void FullCodeGenerator::EmitCall(Call* expr,
CallICState::CallType call_type) {
// Record source position of the IC call.
SetSourcePosition(expr->position());
- Handle<Code> ic = CallIC::initialize_stub(
- isolate(), arg_count, call_type);
+ Handle<Code> ic = CodeFactory::CallIC(isolate(), arg_count,
call_type).code();
__ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot())));
__ ld(a1, MemOperand(sp, (arg_count + 1) * kPointerSize));
// Don't assign a type feedback id to the IC, since type feedback is
provided
Index: src/mips64/interface-descriptors-mips64.cc
diff --git a/src/mips64/interface-descriptors-mips64.cc
b/src/mips64/interface-descriptors-mips64.cc
index
8f76ff8909e92df0c20db6106efd138341776baf..d7f0fe5317766ef4f1bc00128ba494168461c618
100644
--- a/src/mips64/interface-descriptors-mips64.cc
+++ b/src/mips64/interface-descriptors-mips64.cc
@@ -119,6 +119,16 @@ void CallFunctionWithFeedbackDescriptor::Initialize(
}
+void CallFunctionWithFeedbackAndVectorDescriptor::Initialize(
+ CallInterfaceDescriptorData* data) {
+ Register registers[] = {cp, a1, a3, a2};
+ Representation representations[] = {
+ Representation::Tagged(), Representation::Tagged(),
Representation::Smi(),
+ Representation::Tagged()};
+ data->Initialize(arraysize(registers), registers, representations);
+}
+
+
void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data)
{
Register registers[] = {cp, a1};
data->Initialize(arraysize(registers), registers, NULL);
--
--
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.