| Index: src/arm64/code-stubs-arm64.cc
|
| diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc
|
| index 5b76f1ad29f287f5be20cb890661534884dc8f7e..338762b9f7e1dd6ea33a4e09c4cab7f58b970225 100644
|
| --- a/src/arm64/code-stubs-arm64.cc
|
| +++ b/src/arm64/code-stubs-arm64.cc
|
| @@ -16,8 +16,9 @@ namespace internal {
|
|
|
| void FastNewClosureStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x2: function info
|
| - Register registers[] = { x2 };
|
| + Register registers[] = { cp, x2 };
|
| descriptor->Initialize(
|
| ARRAY_SIZE(registers), registers,
|
| Runtime::FunctionForId(Runtime::kNewClosureFromStubFailure)->entry);
|
| @@ -26,24 +27,27 @@ void FastNewClosureStub::InitializeInterfaceDescriptor(
|
|
|
| void FastNewContextStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x1: function
|
| - Register registers[] = { x1 };
|
| + Register registers[] = { cp, x1 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
|
|
|
|
| void ToNumberStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x0: value
|
| - Register registers[] = { x0 };
|
| + Register registers[] = { cp, x0 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
|
|
|
|
| void NumberToStringStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x0: value
|
| - Register registers[] = { x0 };
|
| + Register registers[] = { cp, x0 };
|
| descriptor->Initialize(
|
| ARRAY_SIZE(registers), registers,
|
| Runtime::FunctionForId(Runtime::kNumberToStringRT)->entry);
|
| @@ -52,12 +56,14 @@ void NumberToStringStub::InitializeInterfaceDescriptor(
|
|
|
| void FastCloneShallowArrayStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x3: array literals array
|
| // x2: array literal index
|
| // x1: constant elements
|
| - Register registers[] = { x3, x2, x1 };
|
| + Register registers[] = { cp, x3, x2, x1 };
|
| Representation representations[] = {
|
| Representation::Tagged(),
|
| + Representation::Tagged(),
|
| Representation::Smi(),
|
| Representation::Tagged() };
|
| descriptor->Initialize(
|
| @@ -70,11 +76,12 @@ void FastCloneShallowArrayStub::InitializeInterfaceDescriptor(
|
|
|
| void FastCloneShallowObjectStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x3: object literals array
|
| // x2: object literal index
|
| // x1: constant properties
|
| // x0: object literal flags
|
| - Register registers[] = { x3, x2, x1, x0 };
|
| + Register registers[] = { cp, x3, x2, x1, x0 };
|
| descriptor->Initialize(
|
| ARRAY_SIZE(registers), registers,
|
| Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry);
|
| @@ -83,19 +90,21 @@ void FastCloneShallowObjectStub::InitializeInterfaceDescriptor(
|
|
|
| void CreateAllocationSiteStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x2: feedback vector
|
| // x3: call feedback slot
|
| - Register registers[] = { x2, x3 };
|
| + Register registers[] = { cp, x2, x3 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
|
|
|
|
| void RegExpConstructResultStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x2: length
|
| // x1: index (of last match)
|
| // x0: string
|
| - Register registers[] = { x2, x1, x0 };
|
| + Register registers[] = { cp, x2, x1, x0 };
|
| descriptor->Initialize(
|
| ARRAY_SIZE(registers), registers,
|
| Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry);
|
| @@ -104,9 +113,10 @@ void RegExpConstructResultStub::InitializeInterfaceDescriptor(
|
|
|
| void TransitionElementsKindStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x0: value (js_array)
|
| // x1: to_map
|
| - Register registers[] = { x0, x1 };
|
| + Register registers[] = { cp, x0, x1 };
|
| Address entry =
|
| Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry;
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| @@ -116,8 +126,9 @@ void TransitionElementsKindStub::InitializeInterfaceDescriptor(
|
|
|
| void CompareNilICStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x0: value to compare
|
| - Register registers[] = { x0 };
|
| + Register registers[] = { cp, x0 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| FUNCTION_ADDR(CompareNilIC_Miss));
|
| descriptor->SetMissHandler(
|
| @@ -125,9 +136,13 @@ void CompareNilICStub::InitializeInterfaceDescriptor(
|
| }
|
|
|
|
|
| +const Register InterfaceDescriptor::ContextRegister() { return cp; }
|
| +
|
| +
|
| static void InitializeArrayConstructorDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor,
|
| int constant_stack_parameter_count) {
|
| + // cp: context
|
| // x1: function
|
| // x2: allocation site with elements kind
|
| // x0: number of arguments to the constructor function
|
| @@ -135,7 +150,7 @@ static void InitializeArrayConstructorDescriptor(
|
| Runtime::kArrayConstructor)->entry;
|
|
|
| if (constant_stack_parameter_count == 0) {
|
| - Register registers[] = { x1, x2 };
|
| + Register registers[] = { cp, x1, x2 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| deopt_handler,
|
| NULL,
|
| @@ -143,10 +158,11 @@ static void InitializeArrayConstructorDescriptor(
|
| JS_FUNCTION_STUB_MODE);
|
| } else {
|
| // stack param count needs (constructor pointer, and single argument)
|
| - Register registers[] = { x1, x2, x0 };
|
| + Register registers[] = { cp, x1, x2, x0 };
|
| Representation representations[] = {
|
| Representation::Tagged(),
|
| Representation::Tagged(),
|
| + Representation::Tagged(),
|
| Representation::Integer32() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| x0,
|
| @@ -180,13 +196,14 @@ void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor(
|
| static void InitializeInternalArrayConstructorDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor,
|
| int constant_stack_parameter_count) {
|
| + // cp: context
|
| // x1: constructor function
|
| // x0: number of arguments to the constructor function
|
| Address deopt_handler = Runtime::FunctionForId(
|
| Runtime::kInternalArrayConstructor)->entry;
|
|
|
| if (constant_stack_parameter_count == 0) {
|
| - Register registers[] = { x1 };
|
| + Register registers[] = { cp, x1 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| deopt_handler,
|
| NULL,
|
| @@ -194,9 +211,10 @@ static void InitializeInternalArrayConstructorDescriptor(
|
| JS_FUNCTION_STUB_MODE);
|
| } else {
|
| // stack param count needs (constructor pointer, and single argument)
|
| - Register registers[] = { x1, x0 };
|
| + Register registers[] = { cp, x1, x0 };
|
| Representation representations[] = {
|
| Representation::Tagged(),
|
| + Representation::Tagged(),
|
| Representation::Integer32() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| x0,
|
| @@ -229,8 +247,9 @@ void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor(
|
|
|
| void ToBooleanStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x0: value
|
| - Register registers[] = { x0 };
|
| + Register registers[] = { cp, x0 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| FUNCTION_ADDR(ToBooleanIC_Miss));
|
| descriptor->SetMissHandler(
|
| @@ -240,11 +259,12 @@ void ToBooleanStub::InitializeInterfaceDescriptor(
|
|
|
| void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x0: value
|
| // x3: target map
|
| // x1: key
|
| // x2: receiver
|
| - Register registers[] = { x0, x3, x1, x2 };
|
| + Register registers[] = { cp, x0, x3, x1, x2 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
|
| }
|
| @@ -252,9 +272,10 @@ void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
|
|
|
| void BinaryOpICStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x1: left operand
|
| // x0: right operand
|
| - Register registers[] = { x1, x0 };
|
| + Register registers[] = { cp, x1, x0 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| FUNCTION_ADDR(BinaryOpIC_Miss));
|
| descriptor->SetMissHandler(
|
| @@ -264,10 +285,11 @@ void BinaryOpICStub::InitializeInterfaceDescriptor(
|
|
|
| void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x2: allocation site
|
| // x1: left operand
|
| // x0: right operand
|
| - Register registers[] = { x2, x1, x0 };
|
| + Register registers[] = { cp, x2, x1, x0 };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite));
|
| }
|
| @@ -275,9 +297,10 @@ void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor(
|
|
|
| void StringAddStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| + // cp: context
|
| // x1: left operand
|
| // x0: right operand
|
| - Register registers[] = { x1, x0 };
|
| + Register registers[] = { cp, x1, x0 };
|
| descriptor->Initialize(
|
| ARRAY_SIZE(registers), registers,
|
| Runtime::FunctionForId(Runtime::kStringAdd)->entry);
|
| @@ -285,23 +308,23 @@ void StringAddStub::InitializeInterfaceDescriptor(
|
|
|
|
|
| void CallDescriptors::InitializeForIsolate(Isolate* isolate) {
|
| - static PlatformCallInterfaceDescriptor default_descriptor =
|
| - PlatformCallInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
|
| + static PlatformInterfaceDescriptor default_descriptor =
|
| + PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
|
|
|
| - static PlatformCallInterfaceDescriptor noInlineDescriptor =
|
| - PlatformCallInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
|
| + static PlatformInterfaceDescriptor noInlineDescriptor =
|
| + PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
|
|
|
| {
|
| CallInterfaceDescriptor* descriptor =
|
| isolate->call_descriptor(Isolate::ArgumentAdaptorCall);
|
| - Register registers[] = { x1, // JSFunction
|
| - cp, // context
|
| + Register registers[] = { cp, // context
|
| + x1, // JSFunction
|
| x0, // actual number of arguments
|
| x2, // expected number of arguments
|
| };
|
| Representation representations[] = {
|
| - Representation::Tagged(), // JSFunction
|
| Representation::Tagged(), // context
|
| + Representation::Tagged(), // JSFunction
|
| Representation::Integer32(), // actual number of arguments
|
| Representation::Integer32(), // expected number of arguments
|
| };
|
| @@ -350,18 +373,18 @@ void CallDescriptors::InitializeForIsolate(Isolate* isolate) {
|
| {
|
| CallInterfaceDescriptor* descriptor =
|
| isolate->call_descriptor(Isolate::ApiFunctionCall);
|
| - Register registers[] = { x0, // callee
|
| + Register registers[] = { cp, // context
|
| + x0, // callee
|
| x4, // call_data
|
| x2, // holder
|
| x1, // api_function_address
|
| - cp, // context
|
| };
|
| Representation representations[] = {
|
| + Representation::Tagged(), // context
|
| Representation::Tagged(), // callee
|
| Representation::Tagged(), // call_data
|
| Representation::Tagged(), // holder
|
| Representation::External(), // api_function_address
|
| - Representation::Tagged(), // context
|
| };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| representations, &default_descriptor);
|
| @@ -377,22 +400,22 @@ void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) {
|
| isolate()->counters()->code_stubs()->Increment();
|
|
|
| CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor();
|
| - int param_count = descriptor->register_param_count();
|
| + int param_count = descriptor->GetEnvironmentParameterCount();
|
| {
|
| // Call the runtime system in a fresh internal frame.
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| - ASSERT((descriptor->register_param_count() == 0) ||
|
| - x0.Is(descriptor->GetParameterRegister(param_count - 1)));
|
| + ASSERT((param_count == 0) ||
|
| + x0.Is(descriptor->GetEnvironmentParameterRegister(param_count - 1)));
|
|
|
| // Push arguments
|
| MacroAssembler::PushPopQueue queue(masm);
|
| for (int i = 0; i < param_count; ++i) {
|
| - queue.Queue(descriptor->GetParameterRegister(i));
|
| + queue.Queue(descriptor->GetEnvironmentParameterRegister(i));
|
| }
|
| queue.PushQueued();
|
|
|
| ExternalReference miss = descriptor->miss_handler();
|
| - __ CallExternalReference(miss, descriptor->register_param_count());
|
| + __ CallExternalReference(miss, param_count);
|
| }
|
|
|
| __ Ret();
|
|
|