Commit 90e464a2 authored by Igor Sheludko's avatar Igor Sheludko Committed by Commit Bot

Interface descriptors cleanup: JSTrampolineDescriptor added.

This CL also adds macros for defining JS-compatible interface descriptors that
has additional parameters.
ArrayConstructorDescriptor is redefined using the new macros.

Bug: v8:7754
Change-Id: Id39cac9f234666576f35de755d11aba198248bea
Reviewed-on: https://chromium-review.googlesource.com/1100833
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53796}
parent a64c6239
...@@ -183,30 +183,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -183,30 +183,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {r1, r3, r0, r2};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// r0 -- number of arguments
// r1 -- function
// r2 -- allocation site with elements kind
Register registers[] = {r1, r2, r0};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {r1, r0}; Register registers[] = {r1, r0};
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void BinaryOpDescriptor::InitializePlatformSpecific( void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {r1, r0}; Register registers[] = {r1, r0};
......
...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = r0; ...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = r0;
constexpr Register kInterpreterBytecodeOffsetRegister = r5; constexpr Register kInterpreterBytecodeOffsetRegister = r5;
constexpr Register kInterpreterBytecodeArrayRegister = r6; constexpr Register kInterpreterBytecodeArrayRegister = r6;
constexpr Register kInterpreterDispatchTableRegister = r8; constexpr Register kInterpreterDispatchTableRegister = r8;
constexpr Register kJavaScriptCallArgCountRegister = r0; constexpr Register kJavaScriptCallArgCountRegister = r0;
constexpr Register kJavaScriptCallCodeStartRegister = r2; constexpr Register kJavaScriptCallCodeStartRegister = r2;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = r3; constexpr Register kJavaScriptCallNewTargetRegister = r3;
constexpr Register kJavaScriptCallExtraArg1Register = r2;
constexpr Register kOffHeapTrampolineRegister = ip; constexpr Register kOffHeapTrampolineRegister = ip;
constexpr Register kRuntimeCallFunctionRegister = r1; constexpr Register kRuntimeCallFunctionRegister = r1;
constexpr Register kRuntimeCallArgCountRegister = r0; constexpr Register kRuntimeCallArgCountRegister = r0;
......
...@@ -184,23 +184,6 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -184,23 +184,6 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {x1, x3, x0, x2};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// x1: function
// x2: allocation site with elements kind
// x0: number of arguments to the constructor function
Register registers[] = {x1, x2, x0};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
// x1: left operand // x1: left operand
...@@ -209,7 +192,6 @@ void CompareDescriptor::InitializePlatformSpecific( ...@@ -209,7 +192,6 @@ void CompareDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void BinaryOpDescriptor::InitializePlatformSpecific( void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
// x1: left operand // x1: left operand
......
...@@ -42,24 +42,28 @@ namespace v8 { ...@@ -42,24 +42,28 @@ namespace v8 {
namespace internal { namespace internal {
// Give alias names to registers for calling conventions. // Give alias names to registers for calling conventions.
#define kReturnRegister0 x0 constexpr Register kReturnRegister0 = x0;
#define kReturnRegister1 x1 constexpr Register kReturnRegister1 = x1;
#define kReturnRegister2 x2 constexpr Register kReturnRegister2 = x2;
#define kJSFunctionRegister x1 constexpr Register kJSFunctionRegister = x1;
#define kContextRegister cp constexpr Register kContextRegister = cp;
#define kAllocateSizeRegister x1 constexpr Register kAllocateSizeRegister = x1;
#define kSpeculationPoisonRegister x18 constexpr Register kSpeculationPoisonRegister = x18;
#define kInterpreterAccumulatorRegister x0 constexpr Register kInterpreterAccumulatorRegister = x0;
#define kInterpreterBytecodeOffsetRegister x19 constexpr Register kInterpreterBytecodeOffsetRegister = x19;
#define kInterpreterBytecodeArrayRegister x20 constexpr Register kInterpreterBytecodeArrayRegister = x20;
#define kInterpreterDispatchTableRegister x21 constexpr Register kInterpreterDispatchTableRegister = x21;
#define kJavaScriptCallArgCountRegister x0
#define kJavaScriptCallCodeStartRegister x2 constexpr Register kJavaScriptCallArgCountRegister = x0;
#define kJavaScriptCallNewTargetRegister x3 constexpr Register kJavaScriptCallCodeStartRegister = x2;
#define kOffHeapTrampolineRegister ip0 constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
#define kRuntimeCallFunctionRegister x1 constexpr Register kJavaScriptCallNewTargetRegister = x3;
#define kRuntimeCallArgCountRegister x0 constexpr Register kJavaScriptCallExtraArg1Register = x2;
#define kWasmInstanceRegister x7
constexpr Register kOffHeapTrampolineRegister = ip0;
constexpr Register kRuntimeCallFunctionRegister = x1;
constexpr Register kRuntimeCallArgCountRegister = x0;
constexpr Register kWasmInstanceRegister = x7;
#define LS_MACRO_LIST(V) \ #define LS_MACRO_LIST(V) \
V(Ldrb, Register&, rt, LDRB_w) \ V(Ldrb, Register&, rt, LDRB_w) \
......
...@@ -4031,7 +4031,7 @@ TF_BUILTIN(ArrayConstructor, ArrayBuiltinsAssembler) { ...@@ -4031,7 +4031,7 @@ TF_BUILTIN(ArrayConstructor, ArrayBuiltinsAssembler) {
// This is a trampoline to ArrayConstructorImpl which just adds // This is a trampoline to ArrayConstructorImpl which just adds
// allocation_site parameter value and sets new_target if necessary. // allocation_site parameter value and sets new_target if necessary.
TNode<Context> context = CAST(Parameter(Descriptor::kContext)); TNode<Context> context = CAST(Parameter(Descriptor::kContext));
TNode<JSFunction> function = CAST(Parameter(Descriptor::kFunction)); TNode<JSFunction> function = CAST(Parameter(Descriptor::kTarget));
TNode<Object> new_target = CAST(Parameter(Descriptor::kNewTarget)); TNode<Object> new_target = CAST(Parameter(Descriptor::kNewTarget));
TNode<Int32T> argc = TNode<Int32T> argc =
UncheckedCast<Int32T>(Parameter(Descriptor::kActualArgumentsCount)); UncheckedCast<Int32T>(Parameter(Descriptor::kActualArgumentsCount));
......
...@@ -80,7 +80,7 @@ namespace internal { ...@@ -80,7 +80,7 @@ namespace internal {
TFS(CreateShallowObjectLiteral, kFeedbackVector, kSlot, \ TFS(CreateShallowObjectLiteral, kFeedbackVector, kSlot, \
kBoilerplateDescription, kFlags) \ kBoilerplateDescription, kFlags) \
/* ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget) */ \ /* ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget) */ \
TFC(ConstructProxy, ConstructTrampoline, 1) \ TFC(ConstructProxy, JSTrampoline, 1) \
\ \
/* Apply and entries */ \ /* Apply and entries */ \
ASM(JSEntryTrampoline) \ ASM(JSEntryTrampoline) \
...@@ -120,9 +120,9 @@ namespace internal { ...@@ -120,9 +120,9 @@ namespace internal {
ASM(InterpreterOnStackReplacement) \ ASM(InterpreterOnStackReplacement) \
\ \
/* Code life-cycle */ \ /* Code life-cycle */ \
TFC(CompileLazy, ConstructTrampoline, 1) \ TFC(CompileLazy, JSTrampoline, 1) \
TFC(CompileLazyDeoptimizedCode, ConstructTrampoline, 1) \ TFC(CompileLazyDeoptimizedCode, JSTrampoline, 1) \
TFC(DeserializeLazy, ConstructTrampoline, 1) \ TFC(DeserializeLazy, JSTrampoline, 1) \
ASM(InstantiateAsmJs) \ ASM(InstantiateAsmJs) \
ASM(NotifyDeoptimized) \ ASM(NotifyDeoptimized) \
\ \
...@@ -235,7 +235,7 @@ namespace internal { ...@@ -235,7 +235,7 @@ namespace internal {
TFJ(ReturnReceiver, 0) \ TFJ(ReturnReceiver, 0) \
\ \
/* Array */ \ /* Array */ \
TFC(ArrayConstructor, ConstructTrampoline, 1) \ TFC(ArrayConstructor, JSTrampoline, 1) \
TFC(ArrayConstructorImpl, ArrayConstructor, 1) \ TFC(ArrayConstructorImpl, ArrayConstructor, 1) \
TFC(ArrayNoArgumentConstructor_PackedSmi_DontOverride, \ TFC(ArrayNoArgumentConstructor_PackedSmi_DontOverride, \
ArrayNoArgumentConstructor, 1) \ ArrayNoArgumentConstructor, 1) \
......
...@@ -147,13 +147,13 @@ void LazyBuiltinsAssembler::CompileLazy(TNode<JSFunction> function) { ...@@ -147,13 +147,13 @@ void LazyBuiltinsAssembler::CompileLazy(TNode<JSFunction> function) {
} }
TF_BUILTIN(CompileLazy, LazyBuiltinsAssembler) { TF_BUILTIN(CompileLazy, LazyBuiltinsAssembler) {
TNode<JSFunction> function = CAST(Parameter(Descriptor::kFunction)); TNode<JSFunction> function = CAST(Parameter(Descriptor::kTarget));
CompileLazy(function); CompileLazy(function);
} }
TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) { TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) {
TNode<JSFunction> function = CAST(Parameter(Descriptor::kFunction)); TNode<JSFunction> function = CAST(Parameter(Descriptor::kTarget));
// Set the code slot inside the JSFunction to CompileLazy. // Set the code slot inside the JSFunction to CompileLazy.
TNode<Code> code = HeapConstant(BUILTIN_CODE(isolate(), CompileLazy)); TNode<Code> code = HeapConstant(BUILTIN_CODE(isolate(), CompileLazy));
...@@ -165,7 +165,7 @@ TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) { ...@@ -165,7 +165,7 @@ TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) {
TF_BUILTIN(DeserializeLazy, LazyBuiltinsAssembler) { TF_BUILTIN(DeserializeLazy, LazyBuiltinsAssembler) {
Label deserialize_in_runtime(this, Label::kDeferred); Label deserialize_in_runtime(this, Label::kDeferred);
TNode<JSFunction> function = CAST(Parameter(Descriptor::kFunction)); TNode<JSFunction> function = CAST(Parameter(Descriptor::kTarget));
// Load the builtin id for lazy deserialization from SharedFunctionInfo. // Load the builtin id for lazy deserialization from SharedFunctionInfo.
TNode<SharedFunctionInfo> shared = TNode<SharedFunctionInfo> shared =
......
...@@ -12,7 +12,7 @@ namespace internal { ...@@ -12,7 +12,7 @@ namespace internal {
class LazyBuiltinsAssembler : public CodeStubAssembler { class LazyBuiltinsAssembler : public CodeStubAssembler {
public: public:
typedef ConstructTrampolineDescriptor Descriptor; typedef JSTrampolineDescriptor Descriptor;
explicit LazyBuiltinsAssembler(compiler::CodeAssemblerState* state) explicit LazyBuiltinsAssembler(compiler::CodeAssemblerState* state)
: CodeStubAssembler(state) {} : CodeStubAssembler(state) {}
......
...@@ -337,7 +337,7 @@ TF_BUILTIN(CallProxy, ProxiesCodeStubAssembler) { ...@@ -337,7 +337,7 @@ TF_BUILTIN(CallProxy, ProxiesCodeStubAssembler) {
TF_BUILTIN(ConstructProxy, ProxiesCodeStubAssembler) { TF_BUILTIN(ConstructProxy, ProxiesCodeStubAssembler) {
Node* argc = Parameter(Descriptor::kActualArgumentsCount); Node* argc = Parameter(Descriptor::kActualArgumentsCount);
Node* argc_ptr = ChangeInt32ToIntPtr(argc); Node* argc_ptr = ChangeInt32ToIntPtr(argc);
Node* proxy = Parameter(Descriptor::kFunction); Node* proxy = Parameter(Descriptor::kTarget);
Node* new_target = Parameter(Descriptor::kNewTarget); Node* new_target = Parameter(Descriptor::kNewTarget);
Node* context = Parameter(Descriptor::kContext); Node* context = Parameter(Descriptor::kContext);
......
...@@ -269,7 +269,7 @@ Callable CodeFactory::CallFunctionForwardVarargs(Isolate* isolate) { ...@@ -269,7 +269,7 @@ Callable CodeFactory::CallFunctionForwardVarargs(Isolate* isolate) {
// static // static
Callable CodeFactory::Construct(Isolate* isolate) { Callable CodeFactory::Construct(Isolate* isolate) {
return Callable(BUILTIN_CODE(isolate, Construct), return Callable(BUILTIN_CODE(isolate, Construct),
ConstructTrampolineDescriptor(isolate)); JSTrampolineDescriptor(isolate));
} }
// static // static
...@@ -281,7 +281,7 @@ Callable CodeFactory::ConstructWithSpread(Isolate* isolate) { ...@@ -281,7 +281,7 @@ Callable CodeFactory::ConstructWithSpread(Isolate* isolate) {
// static // static
Callable CodeFactory::ConstructFunction(Isolate* isolate) { Callable CodeFactory::ConstructFunction(Isolate* isolate) {
return Callable(BUILTIN_CODE(isolate, ConstructFunction), return Callable(BUILTIN_CODE(isolate, ConstructFunction),
ConstructTrampolineDescriptor(isolate)); JSTrampolineDescriptor(isolate));
} }
// static // static
......
...@@ -1236,9 +1236,7 @@ TNode<Object> CodeAssembler::TailCallJSCode(TNode<Code> code, ...@@ -1236,9 +1236,7 @@ TNode<Object> CodeAssembler::TailCallJSCode(TNode<Code> code,
TNode<JSFunction> function, TNode<JSFunction> function,
TNode<Object> new_target, TNode<Object> new_target,
TNode<Int32T> arg_count) { TNode<Int32T> arg_count) {
// Use the ConstructTrampolineDescriptor because it passes new.target too in JSTrampolineDescriptor descriptor(isolate());
// case this is called during construct.
ConstructTrampolineDescriptor descriptor(isolate());
size_t result_size = 1; size_t result_size = 1;
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
......
...@@ -183,30 +183,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -183,30 +183,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {edi, edx, eax, ebx};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// eax -- number of arguments
// edi -- function
// ebx -- allocation site with elements kind
Register registers[] = {edi, ebx, eax};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {edx, eax}; Register registers[] = {edx, eax};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr); data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
} }
void BinaryOpDescriptor::InitializePlatformSpecific( void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {edx, eax}; Register registers[] = {edx, eax};
......
...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = eax; ...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = eax;
constexpr Register kInterpreterBytecodeOffsetRegister = edx; constexpr Register kInterpreterBytecodeOffsetRegister = edx;
constexpr Register kInterpreterBytecodeArrayRegister = edi; constexpr Register kInterpreterBytecodeArrayRegister = edi;
constexpr Register kInterpreterDispatchTableRegister = esi; constexpr Register kInterpreterDispatchTableRegister = esi;
constexpr Register kJavaScriptCallArgCountRegister = eax; constexpr Register kJavaScriptCallArgCountRegister = eax;
constexpr Register kJavaScriptCallCodeStartRegister = ecx; constexpr Register kJavaScriptCallCodeStartRegister = ecx;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = edx; constexpr Register kJavaScriptCallNewTargetRegister = edx;
constexpr Register kJavaScriptCallExtraArg1Register = ebx;
constexpr Register kOffHeapTrampolineRegister = ecx; constexpr Register kOffHeapTrampolineRegister = ecx;
constexpr Register kRuntimeCallFunctionRegister = ebx; constexpr Register kRuntimeCallFunctionRegister = ebx;
constexpr Register kRuntimeCallArgCountRegister = eax; constexpr Register kRuntimeCallArgCountRegister = eax;
......
...@@ -37,6 +37,27 @@ void CallInterfaceDescriptorData::InitializePlatformIndependent( ...@@ -37,6 +37,27 @@ void CallInterfaceDescriptorData::InitializePlatformIndependent(
} }
} }
void CallInterfaceDescriptor::JSDefaultInitializePlatformSpecific(
CallInterfaceDescriptorData* data, int non_js_register_parameter_count) {
DCHECK_LE(static_cast<unsigned>(non_js_register_parameter_count), 1);
// 3 is for kTarget, kNewTarget and kActualArgumentsCount
int register_parameter_count = 3 + non_js_register_parameter_count;
DCHECK(!AreAliased(
kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
kJavaScriptCallArgCountRegister, kJavaScriptCallExtraArg1Register));
const Register default_js_stub_registers[] = {
kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
kJavaScriptCallArgCountRegister, kJavaScriptCallExtraArg1Register};
CHECK_LE(static_cast<size_t>(register_parameter_count),
arraysize(default_js_stub_registers));
data->InitializePlatformSpecific(register_parameter_count,
default_js_stub_registers);
}
const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const { const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const {
CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0); CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0);
size_t index = data_ - start; size_t index = data_ - start;
...@@ -450,34 +471,6 @@ void ConstructStubDescriptor::InitializePlatformIndependent( ...@@ -450,34 +471,6 @@ void ConstructStubDescriptor::InitializePlatformIndependent(
machine_types); machine_types);
} }
void ConstructTrampolineDescriptor::InitializePlatformIndependent(
CallInterfaceDescriptorData* data) {
// kFunction, kNewTarget, kActualArgumentsCount
MachineType machine_types[] = {
MachineType::AnyTagged(), MachineType::AnyTagged(), MachineType::Int32()};
data->InitializePlatformIndependent(arraysize(machine_types), 0,
machine_types);
}
void ConstructTrampolineDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {FunctionRegister(), NewTargetRegister(),
ActualArgumentsCountRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
const Register ConstructTrampolineDescriptor::FunctionRegister() {
return kJSFunctionRegister;
}
const Register ConstructTrampolineDescriptor::NewTargetRegister() {
return kJavaScriptCallNewTargetRegister;
}
const Register ConstructTrampolineDescriptor::ActualArgumentsCountRegister() {
return kJavaScriptCallArgCountRegister;
}
void BuiltinDescriptor::InitializePlatformIndependent( void BuiltinDescriptor::InitializePlatformIndependent(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kArgumentsCount // kTarget, kNewTarget, kArgumentsCount
...@@ -506,16 +499,6 @@ const Register BuiltinDescriptor::TargetRegister() { ...@@ -506,16 +499,6 @@ const Register BuiltinDescriptor::TargetRegister() {
return kJSFunctionRegister; return kJSFunctionRegister;
} }
void ArrayConstructorDescriptor::InitializePlatformIndependent(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
MachineType machine_types[] = {MachineType::AnyTagged(),
MachineType::AnyTagged(), MachineType::Int32(),
MachineType::AnyTagged()};
data->InitializePlatformIndependent(arraysize(machine_types), 0,
machine_types);
}
void ArrayNoArgumentConstructorDescriptor::InitializePlatformIndependent( void ArrayNoArgumentConstructorDescriptor::InitializePlatformIndependent(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
// kFunction, kAllocationSite, kActualArgumentsCount, kFunctionParameter // kFunction, kAllocationSite, kActualArgumentsCount, kFunctionParameter
...@@ -560,6 +543,17 @@ void ArrayNArgumentsConstructorDescriptor::InitializePlatformIndependent( ...@@ -560,6 +543,17 @@ void ArrayNArgumentsConstructorDescriptor::InitializePlatformIndependent(
machine_types); machine_types);
} }
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// Keep the arguments on the same registers as they were in
// ArrayConstructorDescriptor to avoid unnecessary register moves.
// kFunction, kAllocationSite, kActualArgumentsCount
Register registers[] = {kJavaScriptCallTargetRegister,
kJavaScriptCallExtraArg1Register,
kJavaScriptCallArgCountRegister};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void ArgumentAdaptorDescriptor::InitializePlatformIndependent( void ArgumentAdaptorDescriptor::InitializePlatformIndependent(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
// kFunction, kNewTarget, kActualArgumentsCount, kExpectedArgumentsCount // kFunction, kNewTarget, kActualArgumentsCount, kExpectedArgumentsCount
......
...@@ -47,7 +47,7 @@ class PlatformInterfaceDescriptor; ...@@ -47,7 +47,7 @@ class PlatformInterfaceDescriptor;
V(ConstructForwardVarargs) \ V(ConstructForwardVarargs) \
V(ConstructWithSpread) \ V(ConstructWithSpread) \
V(ConstructWithArrayLike) \ V(ConstructWithArrayLike) \
V(ConstructTrampoline) \ V(JSTrampoline) \
V(AbortJS) \ V(AbortJS) \
V(AllocateHeapNumber) \ V(AllocateHeapNumber) \
V(Builtin) \ V(Builtin) \
...@@ -223,6 +223,13 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor { ...@@ -223,6 +223,13 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
static void DefaultInitializePlatformSpecific( static void DefaultInitializePlatformSpecific(
CallInterfaceDescriptorData* data, int register_parameter_count); CallInterfaceDescriptorData* data, int register_parameter_count);
// Initializes |data| using the platform dependent default set of registers
// for JavaScript-compatible calling convention.
// It is intended to be used for TurboFan stubs being called with JavaScript
// linkage + additional parameters on registers and stack.
static void JSDefaultInitializePlatformSpecific(
CallInterfaceDescriptorData* data, int non_js_register_parameter_count);
private: private:
const CallInterfaceDescriptorData* data_; const CallInterfaceDescriptorData* data_;
}; };
...@@ -234,7 +241,7 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor { ...@@ -234,7 +241,7 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
} \ } \
static inline CallDescriptors::Key key(); static inline CallDescriptors::Key key();
static const int kMaxBuiltinRegisterParams = 5; constexpr int kMaxBuiltinRegisterParams = 5;
#define DECLARE_DEFAULT_DESCRIPTOR(name, base, parameter_count) \ #define DECLARE_DEFAULT_DESCRIPTOR(name, base, parameter_count) \
DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
...@@ -256,6 +263,32 @@ static const int kMaxBuiltinRegisterParams = 5; ...@@ -256,6 +263,32 @@ static const int kMaxBuiltinRegisterParams = 5;
\ \
public: public:
#define DECLARE_JS_COMPATIBLE_DESCRIPTOR(name, base, \
non_js_reg_parameters_count) \
DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
protected: \
void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \
override { \
JSDefaultInitializePlatformSpecific(data, non_js_reg_parameters_count); \
} \
name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \
\
public:
#define DEFINE_JS_PARAMETER_TYPES(...) \
void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
override { \
/* kTarget, kNewTarget, kActualArgumentsCount, */ \
MachineType machine_types[] = {MachineType::AnyTagged(), \
MachineType::AnyTagged(), \
MachineType::Int32(), __VA_ARGS__}; \
static_assert( \
kParameterCount == arraysize(machine_types), \
"Parameter names definition is not consistent with parameter types"); \
data->InitializePlatformIndependent(arraysize(machine_types), 0, \
machine_types); \
}
#define DECLARE_DESCRIPTOR(name, base) \ #define DECLARE_DESCRIPTOR(name, base) \
DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
protected: \ protected: \
...@@ -295,6 +328,17 @@ static const int kMaxBuiltinRegisterParams = 5; ...@@ -295,6 +328,17 @@ static const int kMaxBuiltinRegisterParams = 5;
kContext = kParameterCount /* implicit parameter */ \ kContext = kParameterCount /* implicit parameter */ \
}; };
#define DEFINE_JS_PARAMETERS(...) \
enum ParameterIndices { \
kTarget, \
kNewTarget, \
kActualArgumentsCount, \
##__VA_ARGS__, \
\
kParameterCount, \
kContext = kParameterCount /* implicit parameter */ \
};
#define DECLARE_BUILTIN_DESCRIPTOR(name) \ #define DECLARE_BUILTIN_DESCRIPTOR(name) \
DECLARE_DESCRIPTOR_WITH_BASE(name, BuiltinDescriptor) \ DECLARE_DESCRIPTOR_WITH_BASE(name, BuiltinDescriptor) \
protected: \ protected: \
...@@ -342,6 +386,19 @@ class AllocateDescriptor : public CallInterfaceDescriptor { ...@@ -342,6 +386,19 @@ class AllocateDescriptor : public CallInterfaceDescriptor {
CallInterfaceDescriptor) CallInterfaceDescriptor)
}; };
// This descriptor defines the JavaScript calling convention that can be used
// by stubs: target, new.target, argc (not including the receiver) and context
// are passed in registers while receiver and the rest of the JS arguments are
// passed on the stack.
class JSTrampolineDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_JS_PARAMETERS()
DEFINE_JS_PARAMETER_TYPES();
DECLARE_JS_COMPATIBLE_DESCRIPTOR(JSTrampolineDescriptor,
CallInterfaceDescriptor, 0)
};
class ContextOnlyDescriptor : public CallInterfaceDescriptor { class ContextOnlyDescriptor : public CallInterfaceDescriptor {
public: public:
DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor) DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor)
...@@ -606,19 +663,6 @@ class ConstructStubDescriptor : public CallInterfaceDescriptor { ...@@ -606,19 +663,6 @@ class ConstructStubDescriptor : public CallInterfaceDescriptor {
CallInterfaceDescriptor) CallInterfaceDescriptor)
}; };
// This descriptor is also used by DebugBreakTrampoline, CompileLazy* and
// DeserializeLazy builtins because it handles both regular function calls and
// construct calls, and we need to pass new.target for the latter.
class ConstructTrampolineDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kFunction, kNewTarget, kActualArgumentsCount)
DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructTrampolineDescriptor,
CallInterfaceDescriptor)
static const Register FunctionRegister();
static const Register NewTargetRegister();
static const Register ActualArgumentsCountRegister();
};
class CallFunctionDescriptor : public CallInterfaceDescriptor { class CallFunctionDescriptor : public CallInterfaceDescriptor {
public: public:
DECLARE_DESCRIPTOR(CallFunctionDescriptor, CallInterfaceDescriptor) DECLARE_DESCRIPTOR(CallFunctionDescriptor, CallInterfaceDescriptor)
...@@ -647,12 +691,13 @@ class BuiltinDescriptor : public CallInterfaceDescriptor { ...@@ -647,12 +691,13 @@ class BuiltinDescriptor : public CallInterfaceDescriptor {
static const Register TargetRegister(); static const Register TargetRegister();
}; };
// TODO(jgruber): Replace with generic TFS descriptor.
class ArrayConstructorDescriptor : public CallInterfaceDescriptor { class ArrayConstructorDescriptor : public CallInterfaceDescriptor {
public: public:
DEFINE_PARAMETERS(kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite) DEFINE_JS_PARAMETERS(kAllocationSite)
DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArrayConstructorDescriptor, DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged());
CallInterfaceDescriptor)
DECLARE_JS_COMPATIBLE_DESCRIPTOR(ArrayConstructorDescriptor,
CallInterfaceDescriptor, 1)
}; };
class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor { class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor {
...@@ -825,9 +870,12 @@ BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR) ...@@ -825,9 +870,12 @@ BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR)
#undef DECLARE_DEFAULT_DESCRIPTOR #undef DECLARE_DEFAULT_DESCRIPTOR
#undef DECLARE_DESCRIPTOR_WITH_BASE #undef DECLARE_DESCRIPTOR_WITH_BASE
#undef DECLARE_DESCRIPTOR #undef DECLARE_DESCRIPTOR
#undef DECLARE_JS_COMPATIBLE_DESCRIPTOR
#undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE #undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE
#undef DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG #undef DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG
#undef DEFINE_PARAMETERS #undef DEFINE_PARAMETERS
#undef DEFINE_JS_PARAMETES
#undef DEFINE_JS_PARAMETER_TYPES
// We define the association between CallDescriptors::Key and the specialized // We define the association between CallDescriptors::Key and the specialized
// descriptor here to reduce boilerplate and mistakes. // descriptor here to reduce boilerplate and mistakes.
......
...@@ -182,30 +182,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -182,30 +182,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {a1, a3, a0, a2};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// a0 -- number of arguments
// a1 -- function
// a2 -- allocation site with elements kind
Register registers[] = {a1, a2, a0};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {a1, a0}; Register registers[] = {a1, a0};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr); data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
} }
void BinaryOpDescriptor::InitializePlatformSpecific( void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {a1, a0}; Register registers[] = {a1, a0};
......
...@@ -25,9 +25,13 @@ constexpr Register kInterpreterAccumulatorRegister = v0; ...@@ -25,9 +25,13 @@ constexpr Register kInterpreterAccumulatorRegister = v0;
constexpr Register kInterpreterBytecodeOffsetRegister = t4; constexpr Register kInterpreterBytecodeOffsetRegister = t4;
constexpr Register kInterpreterBytecodeArrayRegister = t5; constexpr Register kInterpreterBytecodeArrayRegister = t5;
constexpr Register kInterpreterDispatchTableRegister = t6; constexpr Register kInterpreterDispatchTableRegister = t6;
constexpr Register kJavaScriptCallArgCountRegister = a0; constexpr Register kJavaScriptCallArgCountRegister = a0;
constexpr Register kJavaScriptCallCodeStartRegister = a2; constexpr Register kJavaScriptCallCodeStartRegister = a2;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = a3; constexpr Register kJavaScriptCallNewTargetRegister = a3;
constexpr Register kJavaScriptCallExtraArg1Register = a2;
constexpr Register kOffHeapTrampolineRegister = at; constexpr Register kOffHeapTrampolineRegister = at;
constexpr Register kRuntimeCallFunctionRegister = a1; constexpr Register kRuntimeCallFunctionRegister = a1;
constexpr Register kRuntimeCallArgCountRegister = a0; constexpr Register kRuntimeCallArgCountRegister = a0;
......
...@@ -182,30 +182,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -182,30 +182,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {a1, a3, a0, a2};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// a0 -- number of arguments
// a1 -- function
// a2 -- allocation site with elements kind
Register registers[] = {a1, a2, a0};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {a1, a0}; Register registers[] = {a1, a0};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr); data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
} }
void BinaryOpDescriptor::InitializePlatformSpecific( void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {a1, a0}; Register registers[] = {a1, a0};
......
...@@ -25,9 +25,13 @@ constexpr Register kInterpreterAccumulatorRegister = v0; ...@@ -25,9 +25,13 @@ constexpr Register kInterpreterAccumulatorRegister = v0;
constexpr Register kInterpreterBytecodeOffsetRegister = t0; constexpr Register kInterpreterBytecodeOffsetRegister = t0;
constexpr Register kInterpreterBytecodeArrayRegister = t1; constexpr Register kInterpreterBytecodeArrayRegister = t1;
constexpr Register kInterpreterDispatchTableRegister = t2; constexpr Register kInterpreterDispatchTableRegister = t2;
constexpr Register kJavaScriptCallArgCountRegister = a0; constexpr Register kJavaScriptCallArgCountRegister = a0;
constexpr Register kJavaScriptCallCodeStartRegister = a2; constexpr Register kJavaScriptCallCodeStartRegister = a2;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = a3; constexpr Register kJavaScriptCallNewTargetRegister = a3;
constexpr Register kJavaScriptCallExtraArg1Register = a2;
constexpr Register kOffHeapTrampolineRegister = at; constexpr Register kOffHeapTrampolineRegister = at;
constexpr Register kRuntimeCallFunctionRegister = a1; constexpr Register kRuntimeCallFunctionRegister = a1;
constexpr Register kRuntimeCallArgCountRegister = a0; constexpr Register kRuntimeCallArgCountRegister = a0;
......
...@@ -181,23 +181,6 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -181,23 +181,6 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {r4, r6, r3, r5};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// r3 -- number of arguments
// r4 -- function
// r5 -- allocation site with elements kind
Register registers[] = {r4, r5, r3};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {r4, r3}; Register registers[] = {r4, r3};
......
...@@ -27,9 +27,13 @@ constexpr Register kInterpreterAccumulatorRegister = r3; ...@@ -27,9 +27,13 @@ constexpr Register kInterpreterAccumulatorRegister = r3;
constexpr Register kInterpreterBytecodeOffsetRegister = r15; constexpr Register kInterpreterBytecodeOffsetRegister = r15;
constexpr Register kInterpreterBytecodeArrayRegister = r16; constexpr Register kInterpreterBytecodeArrayRegister = r16;
constexpr Register kInterpreterDispatchTableRegister = r17; constexpr Register kInterpreterDispatchTableRegister = r17;
constexpr Register kJavaScriptCallArgCountRegister = r3; constexpr Register kJavaScriptCallArgCountRegister = r3;
constexpr Register kJavaScriptCallNewTargetRegister = r6;
constexpr Register kJavaScriptCallCodeStartRegister = r5; constexpr Register kJavaScriptCallCodeStartRegister = r5;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = r6;
constexpr Register kJavaScriptCallExtraArg1Register = r5;
constexpr Register kOffHeapTrampolineRegister = ip; constexpr Register kOffHeapTrampolineRegister = ip;
constexpr Register kRuntimeCallFunctionRegister = r4; constexpr Register kRuntimeCallFunctionRegister = r4;
constexpr Register kRuntimeCallArgCountRegister = r3; constexpr Register kRuntimeCallArgCountRegister = r3;
......
...@@ -180,23 +180,6 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -180,23 +180,6 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {r3, r5, r2, r4};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// r2 -- number of arguments
// r3 -- function
// r4 -- allocation site with elements kind
Register registers[] = {r3, r4, r2};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {r3, r2}; Register registers[] = {r3, r2};
......
...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = r2; ...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = r2;
constexpr Register kInterpreterBytecodeOffsetRegister = r6; constexpr Register kInterpreterBytecodeOffsetRegister = r6;
constexpr Register kInterpreterBytecodeArrayRegister = r7; constexpr Register kInterpreterBytecodeArrayRegister = r7;
constexpr Register kInterpreterDispatchTableRegister = r8; constexpr Register kInterpreterDispatchTableRegister = r8;
constexpr Register kJavaScriptCallArgCountRegister = r2; constexpr Register kJavaScriptCallArgCountRegister = r2;
constexpr Register kJavaScriptCallNewTargetRegister = r5;
constexpr Register kJavaScriptCallCodeStartRegister = r4; constexpr Register kJavaScriptCallCodeStartRegister = r4;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = r5;
constexpr Register kJavaScriptCallExtraArg1Register = r4;
constexpr Register kOffHeapTrampolineRegister = ip; constexpr Register kOffHeapTrampolineRegister = ip;
constexpr Register kRuntimeCallFunctionRegister = r3; constexpr Register kRuntimeCallFunctionRegister = r3;
constexpr Register kRuntimeCallArgCountRegister = r2; constexpr Register kRuntimeCallArgCountRegister = r2;
......
...@@ -183,30 +183,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific( ...@@ -183,30 +183,12 @@ void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(0, nullptr, nullptr); data->InitializePlatformSpecific(0, nullptr, nullptr);
} }
void ArrayConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
Register registers[] = {rdi, rdx, rax, rbx};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// register state
// rax -- number of arguments
// rdi -- function
// rbx -- allocation site with elements kind
Register registers[] = {rdi, rbx, rax};
data->InitializePlatformSpecific(arraysize(registers), registers, nullptr);
}
void CompareDescriptor::InitializePlatformSpecific( void CompareDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {rdx, rax}; Register registers[] = {rdx, rax};
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void BinaryOpDescriptor::InitializePlatformSpecific( void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = {rdx, rax}; Register registers[] = {rdx, rax};
......
...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = rax; ...@@ -26,9 +26,13 @@ constexpr Register kInterpreterAccumulatorRegister = rax;
constexpr Register kInterpreterBytecodeOffsetRegister = r9; constexpr Register kInterpreterBytecodeOffsetRegister = r9;
constexpr Register kInterpreterBytecodeArrayRegister = r14; constexpr Register kInterpreterBytecodeArrayRegister = r14;
constexpr Register kInterpreterDispatchTableRegister = r15; constexpr Register kInterpreterDispatchTableRegister = r15;
constexpr Register kJavaScriptCallArgCountRegister = rax; constexpr Register kJavaScriptCallArgCountRegister = rax;
constexpr Register kJavaScriptCallCodeStartRegister = rcx; constexpr Register kJavaScriptCallCodeStartRegister = rcx;
constexpr Register kJavaScriptCallTargetRegister = kJSFunctionRegister;
constexpr Register kJavaScriptCallNewTargetRegister = rdx; constexpr Register kJavaScriptCallNewTargetRegister = rdx;
constexpr Register kJavaScriptCallExtraArg1Register = rbx;
constexpr Register kRuntimeCallFunctionRegister = rbx; constexpr Register kRuntimeCallFunctionRegister = rbx;
constexpr Register kRuntimeCallArgCountRegister = rax; constexpr Register kRuntimeCallArgCountRegister = rax;
constexpr Register kWasmInstanceRegister = rsi; constexpr Register kWasmInstanceRegister = rsi;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment