From 9420c278b500eb4465794f812d110f98a9b04b6c Mon Sep 17 00:00:00 2001 From: "balazs.kilvady@imgtec.com" Date: Mon, 1 Sep 2014 18:02:35 +0000 Subject: [PATCH] MIPS: Multiple stubs can point to the same calling convention. Port r23546 (068adb0) BUG= R=paul.lind@imgtec.com Review URL: https://codereview.chromium.org/525403003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23573 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ic/mips/ic-conventions-mips.cc | 14 +- src/ic/mips64/ic-conventions-mips64.cc | 14 +- src/mips/code-stubs-mips.cc | 213 ++++------------------------- src/mips/interface-descriptors-mips.cc | 131 ++++++++++++++++++ src/mips64/code-stubs-mips64.cc | 213 ++++------------------------- src/mips64/interface-descriptors-mips64.cc | 131 ++++++++++++++++++ 6 files changed, 328 insertions(+), 388 deletions(-) diff --git a/src/ic/mips/ic-conventions-mips.cc b/src/ic/mips/ic-conventions-mips.cc index fe3ab7c..4b06fa5 100644 --- a/src/ic/mips/ic-conventions-mips.cc +++ b/src/ic/mips/ic-conventions-mips.cc @@ -17,22 +17,20 @@ const Register LoadConvention::ReceiverRegister() { return a1; } const Register LoadConvention::NameRegister() { return a2; } -const Register VectorLoadConvention::SlotRegister() { - DCHECK(FLAG_vector_ics); - return a0; -} +const Register VectorLoadConvention::SlotRegister() { return a0; } -const Register FullVectorLoadConvention::VectorRegister() { - DCHECK(FLAG_vector_ics); - return a3; -} +const Register FullVectorLoadConvention::VectorRegister() { return a3; } const Register StoreConvention::ReceiverRegister() { return a1; } const Register StoreConvention::NameRegister() { return a2; } const Register StoreConvention::ValueRegister() { return a0; } const Register StoreConvention::MapRegister() { return a3; } + + +const Register InstanceofConvention::left() { return a0; } +const Register InstanceofConvention::right() { return a1; } } } // namespace v8::internal diff --git a/src/ic/mips64/ic-conventions-mips64.cc b/src/ic/mips64/ic-conventions-mips64.cc index b42e60b..19ca5c7 100644 --- a/src/ic/mips64/ic-conventions-mips64.cc +++ b/src/ic/mips64/ic-conventions-mips64.cc @@ -17,22 +17,20 @@ const Register LoadConvention::ReceiverRegister() { return a1; } const Register LoadConvention::NameRegister() { return a2; } -const Register VectorLoadConvention::SlotRegister() { - DCHECK(FLAG_vector_ics); - return a0; -} +const Register VectorLoadConvention::SlotRegister() { return a0; } -const Register FullVectorLoadConvention::VectorRegister() { - DCHECK(FLAG_vector_ics); - return a3; -} +const Register FullVectorLoadConvention::VectorRegister() { return a3; } const Register StoreConvention::ReceiverRegister() { return a1; } const Register StoreConvention::NameRegister() { return a2; } const Register StoreConvention::ValueRegister() { return a0; } const Register StoreConvention::MapRegister() { return a3; } + + +const Register InstanceofConvention::left() { return a0; } +const Register InstanceofConvention::right() { return a1; } } } // namespace v8::internal diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index 9c0abe8..a175e79 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -19,136 +19,23 @@ namespace v8 { namespace internal { -void FastNewClosureStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kNewClosureFromStubFailure)->entry); -} - - -void FastNewContextStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a1 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers); -} - - -void ToNumberStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers); -} - - -void NumberToStringStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kNumberToStringRT)->entry); -} - - -void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a3, a2, a1 }; - Representation representations[] = { - Representation::Tagged(), - Representation::Tagged(), - Representation::Smi(), - Representation::Tagged() }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry, - representations); -} - - -void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a3, a2, a1, a0 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry); -} - - -void CreateAllocationSiteStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2, a3 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers); -} - - -void CallFunctionStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - UNIMPLEMENTED(); -} - - -void CallConstructStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - UNIMPLEMENTED(); -} - - -void RegExpConstructResultStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2, a1, a0 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry); -} - - -void TransitionElementsKindStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0, a1 }; - Address entry = - Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(entry)); -} - - -void CompareNilICStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(CompareNilIC_Miss)); - descriptor->SetMissHandler( - ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate())); -} - - static void InitializeArrayConstructorDescriptor( - CodeStub::Major major, CodeStubInterfaceDescriptor* descriptor, + Isolate* isolate, CodeStub::Major major, + CodeStubInterfaceDescriptor* descriptor, int constant_stack_parameter_count) { - // register state - // cp -- context - // a0 -- number of arguments - // a1 -- function - // a2 -- allocation site with elements kind Address deopt_handler = Runtime::FunctionForId( Runtime::kArrayConstructor)->entry; if (constant_stack_parameter_count == 0) { - Register registers[] = { cp, a1, a2 }; - descriptor->Initialize(major, arraysize(registers), registers, - deopt_handler, NULL, constant_stack_parameter_count, + CallInterfaceDescriptor* call_descriptor = isolate->call_descriptor( + CallDescriptorKey::ArrayConstructorConstantArgCountCall); + descriptor->Initialize(major, call_descriptor, deopt_handler, + constant_stack_parameter_count, JS_FUNCTION_STUB_MODE); } else { - // stack param count needs (constructor pointer, and single argument) - Register registers[] = { cp, a1, a2, a0 }; - Representation representations[] = { - Representation::Tagged(), - Representation::Tagged(), - Representation::Tagged(), - Representation::Integer32() }; - descriptor->Initialize(major, arraysize(registers), registers, a0, - deopt_handler, representations, + CallInterfaceDescriptor* call_descriptor = + isolate->call_descriptor(CallDescriptorKey::ArrayConstructorCall); + descriptor->Initialize(major, call_descriptor, a0, deopt_handler, constant_stack_parameter_count, JS_FUNCTION_STUB_MODE, PASS_ARGUMENTS); } @@ -156,29 +43,22 @@ static void InitializeArrayConstructorDescriptor( static void InitializeInternalArrayConstructorDescriptor( - CodeStub::Major major, CodeStubInterfaceDescriptor* descriptor, + Isolate* isolate, CodeStub::Major major, + CodeStubInterfaceDescriptor* descriptor, int constant_stack_parameter_count) { - // register state - // cp -- context - // a0 -- number of arguments - // a1 -- constructor function Address deopt_handler = Runtime::FunctionForId( Runtime::kInternalArrayConstructor)->entry; if (constant_stack_parameter_count == 0) { - Register registers[] = { cp, a1 }; - descriptor->Initialize(major, arraysize(registers), registers, - deopt_handler, NULL, constant_stack_parameter_count, + CallInterfaceDescriptor* call_descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorConstantArgCountCall); + descriptor->Initialize(major, call_descriptor, deopt_handler, + constant_stack_parameter_count, JS_FUNCTION_STUB_MODE); } else { - // stack param count needs (constructor pointer, and single argument) - Register registers[] = { cp, a1, a0 }; - Representation representations[] = { - Representation::Tagged(), - Representation::Tagged(), - Representation::Integer32() }; - descriptor->Initialize(major, arraysize(registers), registers, a0, - deopt_handler, representations, + CallInterfaceDescriptor* call_descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorCall); + descriptor->Initialize(major, call_descriptor, a0, deopt_handler, constant_stack_parameter_count, JS_FUNCTION_STUB_MODE, PASS_ARGUMENTS); } @@ -187,73 +67,40 @@ static void InitializeInternalArrayConstructorDescriptor( void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeArrayConstructorDescriptor(MajorKey(), descriptor, 0); + InitializeArrayConstructorDescriptor(isolate(), MajorKey(), descriptor, 0); } void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeArrayConstructorDescriptor(MajorKey(), descriptor, 1); + InitializeArrayConstructorDescriptor(isolate(), MajorKey(), descriptor, 1); } void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeArrayConstructorDescriptor(MajorKey(), descriptor, -1); -} - - -void ToBooleanStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(ToBooleanIC_Miss)); - descriptor->SetMissHandler( - ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate())); + InitializeArrayConstructorDescriptor(isolate(), MajorKey(), descriptor, -1); } void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeInternalArrayConstructorDescriptor(MajorKey(), descriptor, 0); + InitializeInternalArrayConstructorDescriptor(isolate(), MajorKey(), + descriptor, 0); } void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeInternalArrayConstructorDescriptor(MajorKey(), descriptor, 1); + InitializeInternalArrayConstructorDescriptor(isolate(), MajorKey(), + descriptor, 1); } void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeInternalArrayConstructorDescriptor(MajorKey(), descriptor, -1); -} - - -void BinaryOpICStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a1, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(BinaryOpIC_Miss)); - descriptor->SetMissHandler( - ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate())); -} - - -void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2, a1, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite)); -} - - -void StringAddStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a1, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kStringAdd)->entry); + InitializeInternalArrayConstructorDescriptor(isolate(), MajorKey(), + descriptor, -1); } @@ -1886,12 +1733,6 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) { } -Register InstanceofStub::left() { return a0; } - - -Register InstanceofStub::right() { return a1; } - - void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { // The displacement is the offset of the last parameter (if any) // relative to the frame pointer. diff --git a/src/mips/interface-descriptors-mips.cc b/src/mips/interface-descriptors-mips.cc index 3bbc583..41c4513 100644 --- a/src/mips/interface-descriptors-mips.cc +++ b/src/mips/interface-descriptors-mips.cc @@ -15,6 +15,137 @@ const Register InterfaceDescriptor::ContextRegister() { return cp; } void CallDescriptors::InitializeForIsolate(Isolate* isolate) { + InitializeForIsolateAllPlatforms(isolate); + + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastNewClosureCall); + Register registers[] = {cp, a2}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastNewContextCall); + Register registers[] = {cp, a1}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::ToNumberCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::NumberToStringCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastCloneShallowArrayCall); + Register registers[] = {cp, a3, a2, a1}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), + Representation::Smi(), Representation::Tagged()}; + descriptor->Initialize(arraysize(registers), registers, representations); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastCloneShallowObjectCall); + Register registers[] = {cp, a3, a2, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::CreateAllocationSiteCall); + Register registers[] = {cp, a2, a3}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::RegExpConstructResultCall); + Register registers[] = {cp, a2, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::TransitionElementsKindCall); + Register registers[] = {cp, a0, a1}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::ArrayConstructorConstantArgCountCall); + // register state + // cp -- context + // a0 -- number of arguments + // a1 -- function + // a2 -- allocation site with elements kind + Register registers[] = {cp, a1, a2}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::ArrayConstructorCall); + // stack param count needs (constructor pointer, and single argument) + Register registers[] = {cp, a1, a2, a0}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), + Representation::Tagged(), Representation::Integer32()}; + descriptor->Initialize(arraysize(registers), registers, representations); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorConstantArgCountCall); + // register state + // cp -- context + // a0 -- number of arguments + // a1 -- constructor function + Register registers[] = {cp, a1}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorCall); + // stack param count needs (constructor pointer, and single argument) + Register registers[] = {cp, a1, a0}; + Representation representations[] = {Representation::Tagged(), + Representation::Tagged(), + Representation::Integer32()}; + descriptor->Initialize(arraysize(registers), registers, representations); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::CompareNilCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::ToBooleanCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::BinaryOpCall); + Register registers[] = {cp, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::BinaryOpWithAllocationSiteCall); + Register registers[] = {cp, a2, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::StringAddCall); + Register registers[] = {cp, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { CallInterfaceDescriptor* descriptor = isolate->call_descriptor(CallDescriptorKey::ArgumentAdaptorCall); diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc index e2b8f92..eefcdc2 100644 --- a/src/mips64/code-stubs-mips64.cc +++ b/src/mips64/code-stubs-mips64.cc @@ -19,136 +19,23 @@ namespace v8 { namespace internal { -void FastNewClosureStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kNewClosureFromStubFailure)->entry); -} - - -void FastNewContextStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a1 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers); -} - - -void ToNumberStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers); -} - - -void NumberToStringStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kNumberToStringRT)->entry); -} - - -void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a3, a2, a1 }; - Representation representations[] = { - Representation::Tagged(), - Representation::Tagged(), - Representation::Smi(), - Representation::Tagged() }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry, - representations); -} - - -void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a3, a2, a1, a0 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry); -} - - -void CallFunctionStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - UNIMPLEMENTED(); -} - - -void CallConstructStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - UNIMPLEMENTED(); -} - - -void CreateAllocationSiteStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2, a3 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers); -} - - -void RegExpConstructResultStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2, a1, a0 }; - descriptor->Initialize( - MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry); -} - - -void TransitionElementsKindStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0, a1 }; - Address entry = - Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(entry)); -} - - -void CompareNilICStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(CompareNilIC_Miss)); - descriptor->SetMissHandler( - ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate())); -} - - static void InitializeArrayConstructorDescriptor( - CodeStub::Major major, CodeStubInterfaceDescriptor* descriptor, + Isolate* isolate, CodeStub::Major major, + CodeStubInterfaceDescriptor* descriptor, int constant_stack_parameter_count) { - // register state - // cp -- context - // a0 -- number of arguments - // a1 -- function - // a2 -- allocation site with elements kind Address deopt_handler = Runtime::FunctionForId( Runtime::kArrayConstructor)->entry; if (constant_stack_parameter_count == 0) { - Register registers[] = { cp, a1, a2 }; - descriptor->Initialize(major, arraysize(registers), registers, - deopt_handler, NULL, constant_stack_parameter_count, + CallInterfaceDescriptor* call_descriptor = isolate->call_descriptor( + CallDescriptorKey::ArrayConstructorConstantArgCountCall); + descriptor->Initialize(major, call_descriptor, deopt_handler, + constant_stack_parameter_count, JS_FUNCTION_STUB_MODE); } else { - // stack param count needs (constructor pointer, and single argument) - Register registers[] = { cp, a1, a2, a0 }; - Representation representations[] = { - Representation::Tagged(), - Representation::Tagged(), - Representation::Tagged(), - Representation::Integer32() }; - descriptor->Initialize(major, arraysize(registers), registers, a0, - deopt_handler, representations, + CallInterfaceDescriptor* call_descriptor = + isolate->call_descriptor(CallDescriptorKey::ArrayConstructorCall); + descriptor->Initialize(major, call_descriptor, a0, deopt_handler, constant_stack_parameter_count, JS_FUNCTION_STUB_MODE, PASS_ARGUMENTS); } @@ -156,29 +43,22 @@ static void InitializeArrayConstructorDescriptor( static void InitializeInternalArrayConstructorDescriptor( - CodeStub::Major major, CodeStubInterfaceDescriptor* descriptor, + Isolate* isolate, CodeStub::Major major, + CodeStubInterfaceDescriptor* descriptor, int constant_stack_parameter_count) { - // register state - // cp -- context - // a0 -- number of arguments - // a1 -- constructor function Address deopt_handler = Runtime::FunctionForId( Runtime::kInternalArrayConstructor)->entry; if (constant_stack_parameter_count == 0) { - Register registers[] = { cp, a1 }; - descriptor->Initialize(major, arraysize(registers), registers, - deopt_handler, NULL, constant_stack_parameter_count, + CallInterfaceDescriptor* call_descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorConstantArgCountCall); + descriptor->Initialize(major, call_descriptor, deopt_handler, + constant_stack_parameter_count, JS_FUNCTION_STUB_MODE); } else { - // stack param count needs (constructor pointer, and single argument) - Register registers[] = { cp, a1, a0 }; - Representation representations[] = { - Representation::Tagged(), - Representation::Tagged(), - Representation::Integer32() }; - descriptor->Initialize(major, arraysize(registers), registers, a0, - deopt_handler, representations, + CallInterfaceDescriptor* call_descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorCall); + descriptor->Initialize(major, call_descriptor, a0, deopt_handler, constant_stack_parameter_count, JS_FUNCTION_STUB_MODE, PASS_ARGUMENTS); } @@ -187,73 +67,40 @@ static void InitializeInternalArrayConstructorDescriptor( void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeArrayConstructorDescriptor(MajorKey(), descriptor, 0); + InitializeArrayConstructorDescriptor(isolate(), MajorKey(), descriptor, 0); } void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeArrayConstructorDescriptor(MajorKey(), descriptor, 1); + InitializeArrayConstructorDescriptor(isolate(), MajorKey(), descriptor, 1); } void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeArrayConstructorDescriptor(MajorKey(), descriptor, -1); -} - - -void ToBooleanStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(ToBooleanIC_Miss)); - descriptor->SetMissHandler( - ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate())); + InitializeArrayConstructorDescriptor(isolate(), MajorKey(), descriptor, -1); } void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeInternalArrayConstructorDescriptor(MajorKey(), descriptor, 0); + InitializeInternalArrayConstructorDescriptor(isolate(), MajorKey(), + descriptor, 0); } void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeInternalArrayConstructorDescriptor(MajorKey(), descriptor, 1); + InitializeInternalArrayConstructorDescriptor(isolate(), MajorKey(), + descriptor, 1); } void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { - InitializeInternalArrayConstructorDescriptor(MajorKey(), descriptor, -1); -} - - -void BinaryOpICStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a1, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(BinaryOpIC_Miss)); - descriptor->SetMissHandler( - ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate())); -} - - -void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a2, a1, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite)); -} - - -void StringAddStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { cp, a1, a0 }; - descriptor->Initialize(MajorKey(), arraysize(registers), registers, - Runtime::FunctionForId(Runtime::kStringAdd)->entry); + InitializeInternalArrayConstructorDescriptor(isolate(), MajorKey(), + descriptor, -1); } @@ -1884,12 +1731,6 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) { } -Register InstanceofStub::left() { return a0; } - - -Register InstanceofStub::right() { return a1; } - - void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { // The displacement is the offset of the last parameter (if any) // relative to the frame pointer. diff --git a/src/mips64/interface-descriptors-mips64.cc b/src/mips64/interface-descriptors-mips64.cc index ee4cfb8..7b920c7 100644 --- a/src/mips64/interface-descriptors-mips64.cc +++ b/src/mips64/interface-descriptors-mips64.cc @@ -15,6 +15,137 @@ const Register InterfaceDescriptor::ContextRegister() { return cp; } void CallDescriptors::InitializeForIsolate(Isolate* isolate) { + InitializeForIsolateAllPlatforms(isolate); + + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastNewClosureCall); + Register registers[] = {cp, a2}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastNewContextCall); + Register registers[] = {cp, a1}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::ToNumberCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::NumberToStringCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastCloneShallowArrayCall); + Register registers[] = {cp, a3, a2, a1}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), + Representation::Smi(), Representation::Tagged()}; + descriptor->Initialize(arraysize(registers), registers, representations); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::FastCloneShallowObjectCall); + Register registers[] = {cp, a3, a2, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::CreateAllocationSiteCall); + Register registers[] = {cp, a2, a3}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::RegExpConstructResultCall); + Register registers[] = {cp, a2, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::TransitionElementsKindCall); + Register registers[] = {cp, a0, a1}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::ArrayConstructorConstantArgCountCall); + // register state + // cp -- context + // a0 -- number of arguments + // a1 -- function + // a2 -- allocation site with elements kind + Register registers[] = {cp, a1, a2}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::ArrayConstructorCall); + // stack param count needs (constructor pointer, and single argument) + Register registers[] = {cp, a1, a2, a0}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), + Representation::Tagged(), Representation::Integer32()}; + descriptor->Initialize(arraysize(registers), registers, representations); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorConstantArgCountCall); + // register state + // cp -- context + // a0 -- number of arguments + // a1 -- constructor function + Register registers[] = {cp, a1}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::InternalArrayConstructorCall); + // stack param count needs (constructor pointer, and single argument) + Register registers[] = {cp, a1, a0}; + Representation representations[] = {Representation::Tagged(), + Representation::Tagged(), + Representation::Integer32()}; + descriptor->Initialize(arraysize(registers), registers, representations); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::CompareNilCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::ToBooleanCall); + Register registers[] = {cp, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::BinaryOpCall); + Register registers[] = {cp, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = isolate->call_descriptor( + CallDescriptorKey::BinaryOpWithAllocationSiteCall); + Register registers[] = {cp, a2, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { + CallInterfaceDescriptor* descriptor = + isolate->call_descriptor(CallDescriptorKey::StringAddCall); + Register registers[] = {cp, a1, a0}; + descriptor->Initialize(arraysize(registers), registers, NULL); + } + { CallInterfaceDescriptor* descriptor = isolate->call_descriptor(CallDescriptorKey::ArgumentAdaptorCall); -- 2.7.4