summaryrefslogtreecommitdiff
path: root/deps/v8/src/interface-descriptors.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/interface-descriptors.h')
-rw-r--r--deps/v8/src/interface-descriptors.h852
1 files changed, 502 insertions, 350 deletions
diff --git a/deps/v8/src/interface-descriptors.h b/deps/v8/src/interface-descriptors.h
index 3f047098b1..cf841383b2 100644
--- a/deps/v8/src/interface-descriptors.h
+++ b/deps/v8/src/interface-descriptors.h
@@ -15,24 +15,24 @@
namespace v8 {
namespace internal {
-class PlatformInterfaceDescriptor;
-
#define INTERFACE_DESCRIPTOR_LIST(V) \
+ V(CppBuiltinAdaptor) \
+ V(CEntry1ArgvOnStack) \
+ V(Allocate) \
V(Void) \
V(ContextOnly) \
+ V(NoContext) \
V(Load) \
V(LoadWithVector) \
V(LoadGlobal) \
V(LoadGlobalWithVector) \
V(Store) \
V(StoreWithVector) \
- V(StoreNamedTransition) \
V(StoreTransition) \
V(StoreGlobal) \
V(StoreGlobalWithVector) \
V(FastNewFunctionContext) \
V(FastNewObject) \
- V(FastNewArguments) \
V(RecordWrite) \
V(TypeConversion) \
V(TypeConversionStackParameter) \
@@ -48,13 +48,10 @@ class PlatformInterfaceDescriptor;
V(ConstructForwardVarargs) \
V(ConstructWithSpread) \
V(ConstructWithArrayLike) \
- V(ConstructTrampoline) \
- V(TransitionElementsKind) \
- V(AbortJS) \
+ V(JSTrampoline) \
+ V(Abort) \
V(AllocateHeapNumber) \
- V(Builtin) \
V(ArrayConstructor) \
- V(IteratingArrayBuiltin) \
V(ArrayNoArgumentConstructor) \
V(ArraySingleArgumentConstructor) \
V(ArrayNArgumentsConstructor) \
@@ -62,61 +59,72 @@ class PlatformInterfaceDescriptor;
V(BinaryOp) \
V(StringAt) \
V(StringSubstring) \
- V(ForInPrepare) \
V(GetProperty) \
V(ArgumentAdaptor) \
V(ApiCallback) \
V(ApiGetter) \
- V(MathPowTagged) \
- V(MathPowInteger) \
V(GrowArrayElements) \
V(NewArgumentsElements) \
V(InterpreterDispatch) \
V(InterpreterPushArgsThenCall) \
V(InterpreterPushArgsThenConstruct) \
- V(InterpreterCEntry) \
+ V(InterpreterCEntry1) \
+ V(InterpreterCEntry2) \
V(ResumeGenerator) \
V(FrameDropperTrampoline) \
- V(WasmRuntimeCall) \
V(RunMicrotasks) \
+ V(WasmGrowMemory) \
BUILTIN_LIST_TFS(V)
class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
public:
- CallInterfaceDescriptorData()
- : register_param_count_(-1),
- param_count_(-1),
- allocatable_registers_(0) {}
+ enum Flag {
+ kNoFlags = 0u,
+ kNoContext = 1u << 0,
+ };
+ typedef base::Flags<Flag> Flags;
+
+ CallInterfaceDescriptorData() = default;
// A copy of the passed in registers and param_representations is made
// and owned by the CallInterfaceDescriptorData.
- void InitializePlatformSpecific(
- int register_parameter_count, const Register* registers,
- PlatformInterfaceDescriptor* platform_descriptor = nullptr);
+ void InitializePlatformSpecific(int register_parameter_count,
+ const Register* registers);
// if machine_types is null, then an array of size
- // (parameter_count + extra_parameter_count) will be created with
+ // (return_count + parameter_count) will be created with
// MachineType::AnyTagged() for each member.
//
// if machine_types is not null, then it should be of the size
- // parameter_count. Those members of the parameter array will be initialized
- // from {machine_types}, and the rest initialized to MachineType::AnyTagged().
- void InitializePlatformIndependent(int parameter_count,
- int extra_parameter_count,
- const MachineType* machine_types);
+ // (return_count + parameter_count). Those members of the parameter array will
+ // be initialized from {machine_types}, and the rest initialized to
+ // MachineType::AnyTagged().
+ void InitializePlatformIndependent(Flags flags, int return_count,
+ int parameter_count,
+ const MachineType* machine_types,
+ int machine_types_length);
+
+ void Reset();
bool IsInitialized() const {
- return register_param_count_ >= 0 && param_count_ >= 0;
+ return register_param_count_ >= 0 && return_count_ >= 0 &&
+ param_count_ >= 0;
}
+ Flags flags() const { return flags_; }
+ int return_count() const { return return_count_; }
int param_count() const { return param_count_; }
int register_param_count() const { return register_param_count_; }
Register register_param(int index) const { return register_params_[index]; }
- Register* register_params() const { return register_params_.get(); }
- MachineType param_type(int index) const { return machine_types_[index]; }
- PlatformInterfaceDescriptor* platform_specific_descriptor() const {
- return platform_specific_descriptor_;
+ Register* register_params() const { return register_params_; }
+ MachineType return_type(int index) const {
+ DCHECK_LT(index, return_count_);
+ return machine_types_[index];
+ }
+ MachineType param_type(int index) const {
+ DCHECK_LT(index, param_count_);
+ return machine_types_[return_count_ + index];
}
void RestrictAllocatableRegisters(const Register* registers, int num) {
@@ -130,27 +138,28 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
RegList allocatable_registers() const { return allocatable_registers_; }
private:
- int register_param_count_;
- int param_count_;
+ int register_param_count_ = -1;
+ int return_count_ = -1;
+ int param_count_ = -1;
+ Flags flags_ = kNoFlags;
// Specifying the set of registers that could be used by the register
// allocator. Currently, it's only used by RecordWrite code stub.
- RegList allocatable_registers_;
-
- // The Register params are allocated dynamically by the
- // InterfaceDescriptor, and freed on destruction. This is because static
- // arrays of Registers cause creation of runtime static initializers
- // which we don't want.
- std::unique_ptr<Register[]> register_params_;
- std::unique_ptr<MachineType[]> machine_types_;
+ RegList allocatable_registers_ = 0;
- PlatformInterfaceDescriptor* platform_specific_descriptor_;
+ // |registers_params_| defines registers that are used for parameter passing.
+ // |machine_types_| defines machine types for resulting values and incomping
+ // parameters.
+ // Both arrays are allocated dynamically by the InterfaceDescriptor and
+ // freed on destruction. This is because static arrays cause creation of
+ // runtime static initializers which we don't want.
+ Register* register_params_ = nullptr;
+ MachineType* machine_types_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(CallInterfaceDescriptorData);
};
-
-class CallDescriptors {
+class V8_EXPORT_PRIVATE CallDescriptors : public AllStatic {
public:
enum Key {
#define DEF_ENUM(name, ...) name,
@@ -158,15 +167,49 @@ class CallDescriptors {
#undef DEF_ENUM
NUMBER_OF_DESCRIPTORS
};
+
+ static void InitializeOncePerProcess();
+ static void TearDown();
+
+ static CallInterfaceDescriptorData* call_descriptor_data(
+ CallDescriptors::Key key) {
+ return &call_descriptor_data_[key];
+ }
+
+ static Key GetKey(const CallInterfaceDescriptorData* data) {
+ ptrdiff_t index = data - call_descriptor_data_;
+ DCHECK_LE(0, index);
+ DCHECK_LT(index, CallDescriptors::NUMBER_OF_DESCRIPTORS);
+ return static_cast<CallDescriptors::Key>(index);
+ }
+
+ private:
+ static CallInterfaceDescriptorData
+ call_descriptor_data_[NUMBER_OF_DESCRIPTORS];
};
class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
public:
+ typedef CallInterfaceDescriptorData::Flags Flags;
+
CallInterfaceDescriptor() : data_(nullptr) {}
virtual ~CallInterfaceDescriptor() {}
- CallInterfaceDescriptor(Isolate* isolate, CallDescriptors::Key key)
- : data_(isolate->call_descriptor_data(key)) {}
+ CallInterfaceDescriptor(CallDescriptors::Key key)
+ : data_(CallDescriptors::call_descriptor_data(key)) {}
+
+ Flags flags() const { return data()->flags(); }
+
+ bool HasContextParameter() const {
+ return (flags() & CallInterfaceDescriptorData::kNoContext) == 0;
+ }
+
+ int GetReturnCount() const { return data()->return_count(); }
+
+ MachineType GetReturnType(int index) const {
+ DCHECK_LT(index, data()->return_count());
+ return data()->return_type(index);
+ }
int GetParameterCount() const { return data()->param_count(); }
@@ -183,22 +226,17 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
}
MachineType GetParameterType(int index) const {
- DCHECK(index < data()->param_count());
+ DCHECK_LT(index, data()->param_count());
return data()->param_type(index);
}
- // Some platforms have extra information to associate with the descriptor.
- PlatformInterfaceDescriptor* platform_specific_descriptor() const {
- return data()->platform_specific_descriptor();
- }
-
RegList allocatable_registers() const {
return data()->allocatable_registers();
}
static const Register ContextRegister();
- const char* DebugName(Isolate* isolate) const;
+ const char* DebugName() const;
protected:
const CallInterfaceDescriptorData* data() const { return data_; }
@@ -209,19 +247,11 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
virtual void InitializePlatformIndependent(
CallInterfaceDescriptorData* data) {
- data->InitializePlatformIndependent(data->register_param_count(), 0,
- nullptr);
- }
-
- void Initialize(Isolate* isolate, CallDescriptors::Key key) {
- if (!data()->IsInitialized()) {
- // We should only initialize descriptors on the isolate's main thread.
- DCHECK(ThreadId::Current().Equals(isolate->thread_id()));
- CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key);
- DCHECK(d == data()); // d should be a modifiable pointer to data().
- InitializePlatformSpecific(d);
- InitializePlatformIndependent(d);
- }
+ // Default descriptor configuration: one result, all parameters are passed
+ // in registers and all parameters have MachineType::AnyTagged() type.
+ data->InitializePlatformIndependent(CallInterfaceDescriptorData::kNoFlags,
+ 1, data->register_param_count(),
+ nullptr, 0);
}
// Initializes |data| using the platform dependent default set of registers.
@@ -230,133 +260,190 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
static void DefaultInitializePlatformSpecific(
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:
+ // {CallDescriptors} is allowed to call the private {Initialize} method.
+ friend class CallDescriptors;
+
const CallInterfaceDescriptorData* data_;
+
+ void Initialize(CallInterfaceDescriptorData* data) {
+ // The passed pointer should be a modifiable pointer to our own data.
+ DCHECK_EQ(data, data_);
+ DCHECK(!data->IsInitialized());
+ InitializePlatformSpecific(data);
+ InitializePlatformIndependent(data);
+ DCHECK(data->IsInitialized());
+ }
};
-#define DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
- public: \
- explicit name(Isolate* isolate) : base(isolate, key()) { \
- Initialize(isolate, key()); \
- } \
+#define DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
+ public: \
+ explicit name() : base(key()) {} \
static inline CallDescriptors::Key key();
-static const int kMaxBuiltinRegisterParams = 5;
-
-#define DECLARE_DEFAULT_DESCRIPTOR(name, base, parameter_count) \
- DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
- protected: \
- static const int kRegisterParams = \
- parameter_count > kMaxBuiltinRegisterParams ? kMaxBuiltinRegisterParams \
- : parameter_count; \
- static const int kStackParams = parameter_count - kRegisterParams; \
- void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \
- override { \
- DefaultInitializePlatformSpecific(data, kRegisterParams); \
- } \
- void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
- override { \
- data->InitializePlatformIndependent(kRegisterParams, kStackParams, \
- nullptr); \
- } \
- name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \
- \
- public:
+constexpr int kMaxBuiltinRegisterParams = 5;
-#define DECLARE_DESCRIPTOR(name, base) \
+#define DECLARE_DEFAULT_DESCRIPTOR(name, base) \
DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
protected: \
- void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \
- name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \
+ static const int kRegisterParams = \
+ kParameterCount > kMaxBuiltinRegisterParams ? kMaxBuiltinRegisterParams \
+ : kParameterCount; \
+ static const int kStackParams = kParameterCount - kRegisterParams; \
+ void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \
+ override { \
+ DefaultInitializePlatformSpecific(data, kRegisterParams); \
+ } \
+ void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
+ override { \
+ data->InitializePlatformIndependent(Flags(kDescriptorFlags), kReturnCount, \
+ kParameterCount, nullptr, 0); \
+ } \
+ name(CallDescriptors::Key key) : base(key) {} \
\
public:
-#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \
- DECLARE_DESCRIPTOR(name, base) \
- protected: \
- void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
- override; \
- \
- public:
-
-#define DECLARE_DESCRIPTOR_WITH_STACK_ARGS(name, base) \
- DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
- protected: \
- void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
- override { \
- data->InitializePlatformIndependent(0, kParameterCount, nullptr); \
- } \
- void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \
- override { \
- data->InitializePlatformSpecific(0, nullptr); \
- } \
- \
- 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(CallDescriptors::Key key) : base(key) {} \
+ \
+ public:
+
+#define DEFINE_RESULT_AND_PARAMETERS(return_count, ...) \
+ static constexpr int kDescriptorFlags = \
+ CallInterfaceDescriptorData::kNoFlags; \
+ static constexpr int kReturnCount = return_count; \
+ enum ParameterIndices { \
+ __dummy = -1, /* to be able to pass zero arguments */ \
+ ##__VA_ARGS__, \
+ \
+ kParameterCount, \
+ kContext = kParameterCount /* implicit parameter */ \
+ };
-#define DEFINE_EMPTY_PARAMETERS() \
- enum ParameterIndices { \
- kParameterCount, \
- kContext = kParameterCount /* implicit parameter */ \
+#define DEFINE_RESULT_AND_PARAMETERS_NO_CONTEXT(return_count, ...) \
+ static constexpr int kDescriptorFlags = \
+ CallInterfaceDescriptorData::kNoContext; \
+ static constexpr int kReturnCount = return_count; \
+ enum ParameterIndices { \
+ __dummy = -1, /* to be able to pass zero arguments */ \
+ ##__VA_ARGS__, \
+ \
+ kParameterCount \
};
-#define DEFINE_PARAMETERS(...) \
+#define DEFINE_PARAMETERS(...) DEFINE_RESULT_AND_PARAMETERS(1, ##__VA_ARGS__)
+
+#define DEFINE_PARAMETERS_NO_CONTEXT(...) \
+ DEFINE_RESULT_AND_PARAMETERS_NO_CONTEXT(1, ##__VA_ARGS__)
+
+#define DEFINE_RESULT_AND_PARAMETER_TYPES(...) \
+ void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
+ override { \
+ MachineType machine_types[] = {__VA_ARGS__}; \
+ static_assert( \
+ kReturnCount + kParameterCount == arraysize(machine_types), \
+ "Parameter names definition is not consistent with parameter types"); \
+ data->InitializePlatformIndependent(Flags(kDescriptorFlags), kReturnCount, \
+ kParameterCount, machine_types, \
+ arraysize(machine_types)); \
+ }
+
+#define DEFINE_PARAMETER_TYPES(...) \
+ DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged() /* result */, \
+ ##__VA_ARGS__)
+
+#define DEFINE_JS_PARAMETERS(...) \
+ static constexpr int kDescriptorFlags = \
+ CallInterfaceDescriptorData::kNoFlags; \
+ static constexpr int kReturnCount = 1; \
enum ParameterIndices { \
- __VA_ARGS__, \
+ kTarget, \
+ kNewTarget, \
+ kActualArgumentsCount, \
+ ##__VA_ARGS__, \
\
kParameterCount, \
kContext = kParameterCount /* implicit parameter */ \
};
-#define DECLARE_BUILTIN_DESCRIPTOR(name) \
- DECLARE_DESCRIPTOR_WITH_BASE(name, BuiltinDescriptor) \
- protected: \
- void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
- override { \
- MachineType machine_types[] = {MachineType::AnyTagged(), \
- MachineType::AnyTagged(), \
- MachineType::Int32()}; \
- data->InitializePlatformIndependent(arraysize(machine_types), \
- kStackParameterCount, machine_types); \
- } \
- void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \
- override { \
- Register registers[] = {TargetRegister(), NewTargetRegister(), \
- ArgumentsCountRegister()}; \
- data->InitializePlatformSpecific(arraysize(registers), registers); \
- } \
- \
- public:
-
-#define DEFINE_BUILTIN_PARAMETERS(...) \
- enum ParameterIndices { \
- kReceiver, \
- kBeforeFirstStackParameter = kReceiver, \
- __VA_ARGS__, \
- kAfterLastStackParameter, \
- kNewTarget = kAfterLastStackParameter, \
- kArgumentsCount, \
- kContext, /* implicit parameter */ \
- kParameterCount = kContext, \
- kArity = kAfterLastStackParameter - kBeforeFirstStackParameter - 1, \
- kStackParameterCount = kArity + 1 \
- };
+#define DEFINE_JS_PARAMETER_TYPES(...) \
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), /* kTarget */ \
+ MachineType::AnyTagged(), /* kNewTarget */ \
+ MachineType::Int32(), /* kActualArgumentsCount */ \
+ ##__VA_ARGS__)
+
+#define DECLARE_DESCRIPTOR(name, base) \
+ DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
+ protected: \
+ void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \
+ name(CallDescriptors::Key key) : base(key) {} \
+ \
+ public:
class V8_EXPORT_PRIVATE VoidDescriptor : public CallInterfaceDescriptor {
public:
+ DEFINE_PARAMETERS()
+ DEFINE_PARAMETER_TYPES()
DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor)
};
+class AllocateDescriptor : public CallInterfaceDescriptor {
+ public:
+ DEFINE_PARAMETERS_NO_CONTEXT(kRequestedSize)
+ DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::TaggedPointer(), // result 1
+ MachineType::Int32()) // kRequestedSize
+ DECLARE_DESCRIPTOR(AllocateDescriptor, 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 {
public:
+ DEFINE_PARAMETERS()
+ DEFINE_PARAMETER_TYPES()
DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor)
};
+class NoContextDescriptor : public CallInterfaceDescriptor {
+ public:
+ DEFINE_PARAMETERS_NO_CONTEXT()
+ DEFINE_PARAMETER_TYPES()
+ DECLARE_DESCRIPTOR(NoContextDescriptor, CallInterfaceDescriptor)
+};
+
// LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs.
class LoadDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kName, kSlot)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kName
+ MachineType::TaggedSigned()) // kSlot
+ DECLARE_DESCRIPTOR(LoadDescriptor, CallInterfaceDescriptor)
static const Register ReceiverRegister();
static const Register NameRegister();
@@ -366,8 +453,9 @@ class LoadDescriptor : public CallInterfaceDescriptor {
class LoadGlobalDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kName, kSlot)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kName
+ MachineType::TaggedSigned()) // kSlot
+ DECLARE_DESCRIPTOR(LoadGlobalDescriptor, CallInterfaceDescriptor)
static const Register NameRegister() {
return LoadDescriptor::NameRegister();
@@ -381,8 +469,11 @@ class LoadGlobalDescriptor : public CallInterfaceDescriptor {
class StoreDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kName, kValue, kSlot)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kName
+ MachineType::AnyTagged(), // kValue
+ MachineType::TaggedSigned()) // kSlot
+ DECLARE_DESCRIPTOR(StoreDescriptor, CallInterfaceDescriptor)
static const Register ReceiverRegister();
static const Register NameRegister();
@@ -402,8 +493,13 @@ class StoreDescriptor : public CallInterfaceDescriptor {
class StoreTransitionDescriptor : public StoreDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kName, kMap, kValue, kSlot, kVector)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreTransitionDescriptor,
- StoreDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kName
+ MachineType::AnyTagged(), // kMap
+ MachineType::AnyTagged(), // kValue
+ MachineType::TaggedSigned(), // kSlot
+ MachineType::AnyTagged()) // kVector
+ DECLARE_DESCRIPTOR(StoreTransitionDescriptor, StoreDescriptor)
static const Register MapRegister();
static const Register SlotRegister();
@@ -413,29 +509,15 @@ class StoreTransitionDescriptor : public StoreDescriptor {
static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
};
-class StoreNamedTransitionDescriptor : public StoreTransitionDescriptor {
- public:
- DEFINE_PARAMETERS(kReceiver, kFieldOffset, kMap, kValue, kSlot, kVector,
- kName)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreNamedTransitionDescriptor,
- StoreTransitionDescriptor)
-
- // Always pass name on the stack.
- static const bool kPassLastArgsOnStack = true;
- static const int kStackArgumentsCount =
- StoreTransitionDescriptor::kStackArgumentsCount + 1;
-
- static const Register NameRegister() { return no_reg; }
- static const Register FieldOffsetRegister() {
- return StoreTransitionDescriptor::NameRegister();
- }
-};
-
class StoreWithVectorDescriptor : public StoreDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kName, kValue, kSlot, kVector)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreWithVectorDescriptor,
- StoreDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kName
+ MachineType::AnyTagged(), // kValue
+ MachineType::TaggedSigned(), // kSlot
+ MachineType::AnyTagged()) // kVector
+ DECLARE_DESCRIPTOR(StoreWithVectorDescriptor, StoreDescriptor)
static const Register VectorRegister();
@@ -446,8 +528,10 @@ class StoreWithVectorDescriptor : public StoreDescriptor {
class StoreGlobalDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kName, kValue, kSlot)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreGlobalDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kName
+ MachineType::AnyTagged(), // kValue
+ MachineType::TaggedSigned()) // kSlot
+ DECLARE_DESCRIPTOR(StoreGlobalDescriptor, CallInterfaceDescriptor)
static const bool kPassLastArgsOnStack =
StoreDescriptor::kPassLastArgsOnStack;
@@ -470,8 +554,11 @@ class StoreGlobalDescriptor : public CallInterfaceDescriptor {
class StoreGlobalWithVectorDescriptor : public StoreGlobalDescriptor {
public:
DEFINE_PARAMETERS(kName, kValue, kSlot, kVector)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreGlobalWithVectorDescriptor,
- StoreGlobalDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kName
+ MachineType::AnyTagged(), // kValue
+ MachineType::TaggedSigned(), // kSlot
+ MachineType::AnyTagged()) // kVector
+ DECLARE_DESCRIPTOR(StoreGlobalWithVectorDescriptor, StoreGlobalDescriptor)
static const Register VectorRegister() {
return StoreWithVectorDescriptor::VectorRegister();
@@ -484,8 +571,11 @@ class StoreGlobalWithVectorDescriptor : public StoreGlobalDescriptor {
class LoadWithVectorDescriptor : public LoadDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kName, kSlot, kVector)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadWithVectorDescriptor,
- LoadDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kName
+ MachineType::TaggedSigned(), // kSlot
+ MachineType::AnyTagged()) // kVector
+ DECLARE_DESCRIPTOR(LoadWithVectorDescriptor, LoadDescriptor)
static const Register VectorRegister();
};
@@ -493,8 +583,10 @@ class LoadWithVectorDescriptor : public LoadDescriptor {
class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor {
public:
DEFINE_PARAMETERS(kName, kSlot, kVector)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalWithVectorDescriptor,
- LoadGlobalDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kName
+ MachineType::TaggedSigned(), // kSlot
+ MachineType::AnyTagged()) // kVector
+ DECLARE_DESCRIPTOR(LoadGlobalWithVectorDescriptor, LoadGlobalDescriptor)
static const Register VectorRegister() {
return LoadWithVectorDescriptor::VectorRegister();
@@ -504,8 +596,9 @@ class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor {
class FastNewFunctionContextDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kScopeInfo, kSlots)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastNewFunctionContextDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kScopeInfo
+ MachineType::Int32()) // kSlots
+ DECLARE_DESCRIPTOR(FastNewFunctionContextDescriptor, CallInterfaceDescriptor)
static const Register ScopeInfoRegister();
static const Register SlotsRegister();
@@ -514,28 +607,29 @@ class FastNewFunctionContextDescriptor : public CallInterfaceDescriptor {
class FastNewObjectDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kNewTarget)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
+ MachineType::AnyTagged()) // kNewTarget
DECLARE_DESCRIPTOR(FastNewObjectDescriptor, CallInterfaceDescriptor)
static const Register TargetRegister();
static const Register NewTargetRegister();
};
-class FastNewArgumentsDescriptor : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kFunction)
- DECLARE_DESCRIPTOR(FastNewArgumentsDescriptor, CallInterfaceDescriptor)
- static const Register TargetRegister();
-};
-
class RecordWriteDescriptor final : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kObject, kSlot, kIsolate, kRememberedSet, kFPMode)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(RecordWriteDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::TaggedPointer(), // kObject
+ MachineType::Pointer(), // kSlot
+ MachineType::Pointer(), // kIsolate
+ MachineType::TaggedSigned(), // kRememberedSet
+ MachineType::TaggedSigned()) // kFPMode
+
+ DECLARE_DESCRIPTOR(RecordWriteDescriptor, CallInterfaceDescriptor)
};
class TypeConversionDescriptor final : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kArgument)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
DECLARE_DESCRIPTOR(TypeConversionDescriptor, CallInterfaceDescriptor)
static const Register ArgumentRegister();
@@ -545,183 +639,185 @@ class TypeConversionStackParameterDescriptor final
: public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kArgument)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- TypeConversionStackParameterDescriptor, CallInterfaceDescriptor)
-};
-
-class ForInPrepareDescriptor final : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kObject)
- DECLARE_DEFAULT_DESCRIPTOR(ForInPrepareDescriptor, CallInterfaceDescriptor,
- kParameterCount)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
+ DECLARE_DESCRIPTOR(TypeConversionStackParameterDescriptor,
+ CallInterfaceDescriptor)
};
class GetPropertyDescriptor final : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kObject, kKey)
- DECLARE_DEFAULT_DESCRIPTOR(GetPropertyDescriptor, CallInterfaceDescriptor,
- kParameterCount)
+ DECLARE_DEFAULT_DESCRIPTOR(GetPropertyDescriptor, CallInterfaceDescriptor)
};
class TypeofDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kObject)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
DECLARE_DESCRIPTOR(TypeofDescriptor, CallInterfaceDescriptor)
};
class CallTrampolineDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kFunction, kActualArgumentsCount)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallTrampolineDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kFunction
+ MachineType::Int32()) // kActualArgumentsCount
+ DECLARE_DESCRIPTOR(CallTrampolineDescriptor, CallInterfaceDescriptor)
};
class CallVarargsDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kArgumentsList,
kArgumentsLength)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallVarargsDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
+ MachineType::Int32(), // kActualArgumentsCount
+ MachineType::AnyTagged(), // kArgumentsList
+ MachineType::Int32()) // kArgumentsLength
+ DECLARE_DESCRIPTOR(CallVarargsDescriptor, CallInterfaceDescriptor)
};
class CallForwardVarargsDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kStartIndex)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallForwardVarargsDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
+ MachineType::Int32(), // kActualArgumentsCount
+ MachineType::Int32()) // kStartIndex
+ DECLARE_DESCRIPTOR(CallForwardVarargsDescriptor, CallInterfaceDescriptor)
};
class CallWithSpreadDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kArgumentsCount, kSpread)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallWithSpreadDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
+ MachineType::Int32(), // kArgumentsCount
+ MachineType::AnyTagged()) // kSpread
+ DECLARE_DESCRIPTOR(CallWithSpreadDescriptor, CallInterfaceDescriptor)
};
class CallWithArrayLikeDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kArgumentsList)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallWithArrayLikeDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
+ MachineType::AnyTagged()) // kArgumentsList
+ DECLARE_DESCRIPTOR(CallWithArrayLikeDescriptor, CallInterfaceDescriptor)
};
class ConstructVarargsDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTarget, kNewTarget, kActualArgumentsCount, kArgumentsList,
- kArgumentsLength)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructVarargsDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_JS_PARAMETERS(kArgumentsList, kArgumentsLength)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged(), // kArgumentsList
+ MachineType::Int32()) // kArgumentsLength
+ DECLARE_DESCRIPTOR(ConstructVarargsDescriptor, CallInterfaceDescriptor)
};
class ConstructForwardVarargsDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTarget, kNewTarget, kActualArgumentsCount, kStartIndex)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- ConstructForwardVarargsDescriptor, CallInterfaceDescriptor)
+ DEFINE_JS_PARAMETERS(kStartIndex)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::Int32())
+ DECLARE_DESCRIPTOR(ConstructForwardVarargsDescriptor, CallInterfaceDescriptor)
};
class ConstructWithSpreadDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTarget, kNewTarget, kArgumentsCount, kSpread)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructWithSpreadDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_JS_PARAMETERS(kSpread)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged())
+ DECLARE_DESCRIPTOR(ConstructWithSpreadDescriptor, CallInterfaceDescriptor)
};
class ConstructWithArrayLikeDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kNewTarget, kArgumentsList)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructWithArrayLikeDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
+ MachineType::AnyTagged(), // kNewTarget
+ MachineType::AnyTagged()) // kArgumentsList
+ DECLARE_DESCRIPTOR(ConstructWithArrayLikeDescriptor, CallInterfaceDescriptor)
};
+// TODO(ishell): consider merging this with ArrayConstructorDescriptor
class ConstructStubDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kFunction, kNewTarget, kActualArgumentsCount,
- kAllocationSite)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructStubDescriptor,
- CallInterfaceDescriptor)
-};
+ DEFINE_JS_PARAMETERS(kAllocationSite)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged());
-// This descriptor is also used by DebugBreakTrampoline 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)
+ // TODO(ishell): Use DECLARE_JS_COMPATIBLE_DESCRIPTOR if registers match
+ DECLARE_DESCRIPTOR(ConstructStubDescriptor, CallInterfaceDescriptor)
};
-
class CallFunctionDescriptor : public CallInterfaceDescriptor {
public:
+ DEFINE_PARAMETERS(kTarget)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
DECLARE_DESCRIPTOR(CallFunctionDescriptor, CallInterfaceDescriptor)
};
-class TransitionElementsKindDescriptor : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kObject, kMap)
- DECLARE_DESCRIPTOR(TransitionElementsKindDescriptor, CallInterfaceDescriptor)
-};
-
-class AbortJSDescriptor : public CallInterfaceDescriptor {
+class AbortDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kObject)
- DECLARE_DESCRIPTOR(AbortJSDescriptor, CallInterfaceDescriptor)
+ DEFINE_PARAMETERS_NO_CONTEXT(kMessageOrMessageId)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
+ DECLARE_DESCRIPTOR(AbortDescriptor, CallInterfaceDescriptor)
};
class AllocateHeapNumberDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_EMPTY_PARAMETERS()
+ DEFINE_PARAMETERS_NO_CONTEXT()
+ DEFINE_PARAMETER_TYPES()
DECLARE_DESCRIPTOR(AllocateHeapNumberDescriptor, CallInterfaceDescriptor)
};
-class BuiltinDescriptor : public CallInterfaceDescriptor {
+class ArrayConstructorDescriptor : public CallInterfaceDescriptor {
public:
- // TODO(ishell): Where is kFunction??
- DEFINE_PARAMETERS(kNewTarget, kArgumentsCount)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(BuiltinDescriptor,
- CallInterfaceDescriptor)
- static const Register ArgumentsCountRegister();
- static const Register NewTargetRegister();
- static const Register TargetRegister();
-};
+ DEFINE_JS_PARAMETERS(kAllocationSite)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged());
-class IteratingArrayBuiltinDescriptor : public BuiltinDescriptor {
- public:
- DEFINE_BUILTIN_PARAMETERS(kCallback, kThisArg)
- DECLARE_BUILTIN_DESCRIPTOR(IteratingArrayBuiltinDescriptor)
+ DECLARE_JS_COMPATIBLE_DESCRIPTOR(ArrayConstructorDescriptor,
+ CallInterfaceDescriptor, 1)
};
-class ArrayConstructorDescriptor : public CallInterfaceDescriptor {
+class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArrayConstructorDescriptor,
- CallInterfaceDescriptor)
+ // This descriptor declares only register arguments while respective number
+ // of JS arguments stay on the expression stack.
+ // The ArrayNArgumentsConstructor builtin does not access stack arguments
+ // directly it just forwards them to the runtime function.
+ DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kFunction,
+ MachineType::AnyTagged(), // kAllocationSite
+ MachineType::Int32()) // kActualArgumentsCount
+ DECLARE_DESCRIPTOR(ArrayNArgumentsConstructorDescriptor,
+ CallInterfaceDescriptor)
};
-class ArrayNoArgumentConstructorDescriptor : public CallInterfaceDescriptor {
+class ArrayNoArgumentConstructorDescriptor
+ : public ArrayNArgumentsConstructorDescriptor {
public:
+ // This descriptor declares same register arguments as the parent
+ // ArrayNArgumentsConstructorDescriptor and it declares indices for
+ // JS arguments passed on the expression stack.
DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount,
kFunctionParameter)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- ArrayNoArgumentConstructorDescriptor, CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kFunction
+ MachineType::AnyTagged(), // kAllocationSite
+ MachineType::Int32(), // kActualArgumentsCount
+ MachineType::AnyTagged()) // kFunctionParameter
+ DECLARE_DESCRIPTOR(ArrayNoArgumentConstructorDescriptor,
+ ArrayNArgumentsConstructorDescriptor)
};
class ArraySingleArgumentConstructorDescriptor
- : public CallInterfaceDescriptor {
+ : public ArrayNArgumentsConstructorDescriptor {
public:
+ // This descriptor declares same register arguments as the parent
+ // ArrayNArgumentsConstructorDescriptor and it declares indices for
+ // JS arguments passed on the expression stack.
DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount,
kFunctionParameter, kArraySizeSmiParameter)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- ArraySingleArgumentConstructorDescriptor, CallInterfaceDescriptor)
-};
-
-class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- ArrayNArgumentsConstructorDescriptor, CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kFunction
+ MachineType::AnyTagged(), // kAllocationSite
+ MachineType::Int32(), // kActualArgumentsCount
+ MachineType::AnyTagged(), // kFunctionParameter
+ MachineType::AnyTagged()) // kArraySizeSmiParameter
+ DECLARE_DESCRIPTOR(ArraySingleArgumentConstructorDescriptor,
+ ArrayNArgumentsConstructorDescriptor)
};
class CompareDescriptor : public CallInterfaceDescriptor {
@@ -742,35 +838,73 @@ class BinaryOpDescriptor : public CallInterfaceDescriptor {
class StringAtDescriptor final : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kPosition)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StringAtDescriptor,
- CallInterfaceDescriptor)
+ // TODO(turbofan): Return untagged value here.
+ DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::TaggedSigned(), // result 1
+ MachineType::AnyTagged(), // kReceiver
+ MachineType::IntPtr()) // kPosition
+ DECLARE_DESCRIPTOR(StringAtDescriptor, CallInterfaceDescriptor)
};
class StringSubstringDescriptor final : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kString, kFrom, kTo)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StringSubstringDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kString
+ MachineType::IntPtr(), // kFrom
+ MachineType::IntPtr()) // kTo
+
+ // TODO(turbofan): Allow builtins to return untagged values.
+ DECLARE_DESCRIPTOR(StringSubstringDescriptor, CallInterfaceDescriptor)
};
class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kFunction, kNewTarget, kActualArgumentsCount,
- kExpectedArgumentsCount)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArgumentAdaptorDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_JS_PARAMETERS(kExpectedArgumentsCount)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::Int32())
+ DECLARE_DESCRIPTOR(ArgumentAdaptorDescriptor, CallInterfaceDescriptor)
+};
+
+class CppBuiltinAdaptorDescriptor : public CallInterfaceDescriptor {
+ public:
+ DEFINE_JS_PARAMETERS(kCFunction)
+ DEFINE_JS_PARAMETER_TYPES(MachineType::Pointer())
+ DECLARE_JS_COMPATIBLE_DESCRIPTOR(CppBuiltinAdaptorDescriptor,
+ CallInterfaceDescriptor, 1)
+};
+
+class CEntry1ArgvOnStackDescriptor : public CallInterfaceDescriptor {
+ public:
+ DEFINE_PARAMETERS(kArity, // register argument
+ kCFunction, // register argument
+ kPadding, // stack argument 1 (just padding)
+ kArgcSmi, // stack argument 2
+ kTargetCopy, // stack argument 3
+ kNewTargetCopy) // stack argument 4
+ DEFINE_PARAMETER_TYPES(MachineType::Int32(), // kArity
+ MachineType::Pointer(), // kCFunction
+ MachineType::AnyTagged(), // kPadding
+ MachineType::AnyTagged(), // kArgcSmi
+ MachineType::AnyTagged(), // kTargetCopy
+ MachineType::AnyTagged()) // kNewTargetCopy
+ DECLARE_DESCRIPTOR(CEntry1ArgvOnStackDescriptor, CallInterfaceDescriptor)
};
class ApiCallbackDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTargetContext, kCallData, kHolder, kApiFunctionAddress)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiCallbackDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETERS_NO_CONTEXT(kTargetContext, kCallData, kHolder,
+ kApiFunctionAddress)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTargetContext
+ MachineType::AnyTagged(), // kCallData
+ MachineType::AnyTagged(), // kHolder
+ MachineType::Pointer()) // kApiFunctionAddress
+ DECLARE_DESCRIPTOR(ApiCallbackDescriptor, CallInterfaceDescriptor)
};
class ApiGetterDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kReceiver, kHolder, kCallback)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kHolder
+ MachineType::AnyTagged()) // kCallback
DECLARE_DESCRIPTOR(ApiGetterDescriptor, CallInterfaceDescriptor)
static const Register ReceiverRegister();
@@ -778,26 +912,12 @@ class ApiGetterDescriptor : public CallInterfaceDescriptor {
static const Register CallbackRegister();
};
-class MathPowTaggedDescriptor : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kExponent)
- DECLARE_DESCRIPTOR(MathPowTaggedDescriptor, CallInterfaceDescriptor)
-
- static const Register exponent();
-};
-
-class MathPowIntegerDescriptor : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kExponent)
- DECLARE_DESCRIPTOR(MathPowIntegerDescriptor, CallInterfaceDescriptor)
-
- static const Register exponent();
-};
-
// TODO(turbofan): We should probably rename this to GrowFastElementsDescriptor.
class GrowArrayElementsDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kObject, kKey)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kObject
+ MachineType::AnyTagged()) // kKey
DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor)
static const Register ObjectRegister();
@@ -807,8 +927,10 @@ class GrowArrayElementsDescriptor : public CallInterfaceDescriptor {
class NewArgumentsElementsDescriptor final : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kFrame, kLength, kMappedCount)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(NewArgumentsElementsDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::Pointer(), // kFrame
+ MachineType::TaggedSigned(), // kLength
+ MachineType::TaggedSigned()) // kMappedCount
+ DECLARE_DESCRIPTOR(NewArgumentsElementsDescriptor, CallInterfaceDescriptor)
};
class V8_EXPORT_PRIVATE InterpreterDispatchDescriptor
@@ -816,15 +938,21 @@ class V8_EXPORT_PRIVATE InterpreterDispatchDescriptor
public:
DEFINE_PARAMETERS(kAccumulator, kBytecodeOffset, kBytecodeArray,
kDispatchTable)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kAccumulator
+ MachineType::IntPtr(), // kBytecodeOffset
+ MachineType::AnyTagged(), // kBytecodeArray
+ MachineType::IntPtr()) // kDispatchTable
+ DECLARE_DESCRIPTOR(InterpreterDispatchDescriptor, CallInterfaceDescriptor)
};
class InterpreterPushArgsThenCallDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunction)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- InterpreterPushArgsThenCallDescriptor, CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::Int32(), // kNumberOfArguments
+ MachineType::Pointer(), // kFirstArgument
+ MachineType::AnyTagged()) // kFunction
+ DECLARE_DESCRIPTOR(InterpreterPushArgsThenCallDescriptor,
+ CallInterfaceDescriptor)
};
class InterpreterPushArgsThenConstructDescriptor
@@ -832,47 +960,72 @@ class InterpreterPushArgsThenConstructDescriptor
public:
DEFINE_PARAMETERS(kNumberOfArguments, kNewTarget, kConstructor,
kFeedbackElement, kFirstArgument)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
- InterpreterPushArgsThenConstructDescriptor, CallInterfaceDescriptor)
+ DEFINE_PARAMETER_TYPES(MachineType::Int32(), // kNumberOfArguments
+ MachineType::AnyTagged(), // kNewTarget
+ MachineType::AnyTagged(), // kConstructor
+ MachineType::AnyTagged(), // kFeedbackElement
+ MachineType::Pointer()) // kFirstArgument
+ DECLARE_DESCRIPTOR(InterpreterPushArgsThenConstructDescriptor,
+ CallInterfaceDescriptor)
};
-class InterpreterCEntryDescriptor : public CallInterfaceDescriptor {
+class InterpreterCEntry1Descriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunctionEntry)
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterCEntryDescriptor,
- CallInterfaceDescriptor)
+ DEFINE_RESULT_AND_PARAMETERS(1, kNumberOfArguments, kFirstArgument,
+ kFunctionEntry)
+ DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged(), // result 1
+ MachineType::Int32(), // kNumberOfArguments
+ MachineType::Pointer(), // kFirstArgument
+ MachineType::Pointer()) // kFunctionEntry
+ DECLARE_DESCRIPTOR(InterpreterCEntry1Descriptor, CallInterfaceDescriptor)
+};
+
+class InterpreterCEntry2Descriptor : public CallInterfaceDescriptor {
+ public:
+ DEFINE_RESULT_AND_PARAMETERS(2, kNumberOfArguments, kFirstArgument,
+ kFunctionEntry)
+ DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged(), // result 1
+ MachineType::AnyTagged(), // result 2
+ MachineType::Int32(), // kNumberOfArguments
+ MachineType::Pointer(), // kFirstArgument
+ MachineType::Pointer()) // kFunctionEntry
+ DECLARE_DESCRIPTOR(InterpreterCEntry2Descriptor, CallInterfaceDescriptor)
};
class ResumeGeneratorDescriptor final : public CallInterfaceDescriptor {
public:
+ DEFINE_PARAMETERS(kValue, kGenerator)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kValue
+ MachineType::AnyTagged()) // kGenerator
DECLARE_DESCRIPTOR(ResumeGeneratorDescriptor, CallInterfaceDescriptor)
};
class FrameDropperTrampolineDescriptor final : public CallInterfaceDescriptor {
- DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FrameDropperTrampolineDescriptor,
- CallInterfaceDescriptor)
+ public:
+ DEFINE_PARAMETERS(kRestartFp)
+ DEFINE_PARAMETER_TYPES(MachineType::Pointer())
+ DECLARE_DESCRIPTOR(FrameDropperTrampolineDescriptor, CallInterfaceDescriptor)
};
-class WasmRuntimeCallDescriptor final : public CallInterfaceDescriptor {
+class RunMicrotasksDescriptor final : public CallInterfaceDescriptor {
public:
- DEFINE_EMPTY_PARAMETERS()
- DECLARE_DEFAULT_DESCRIPTOR(WasmRuntimeCallDescriptor, CallInterfaceDescriptor,
- 0)
+ DEFINE_PARAMETERS()
+ DECLARE_DEFAULT_DESCRIPTOR(RunMicrotasksDescriptor, CallInterfaceDescriptor)
};
-class RunMicrotasksDescriptor final : public CallInterfaceDescriptor {
+class WasmGrowMemoryDescriptor final : public CallInterfaceDescriptor {
public:
- DEFINE_EMPTY_PARAMETERS()
- DECLARE_DEFAULT_DESCRIPTOR(RunMicrotasksDescriptor, CallInterfaceDescriptor,
- 0)
+ DEFINE_PARAMETERS_NO_CONTEXT(kNumPages)
+ DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::Int32(), // result 1
+ MachineType::Int32()) // kNumPages
+ DECLARE_DESCRIPTOR(WasmGrowMemoryDescriptor, CallInterfaceDescriptor)
};
#define DEFINE_TFS_BUILTIN_DESCRIPTOR(Name, ...) \
class Name##Descriptor : public CallInterfaceDescriptor { \
public: \
DEFINE_PARAMETERS(__VA_ARGS__) \
- DECLARE_DEFAULT_DESCRIPTOR(Name##Descriptor, CallInterfaceDescriptor, \
- kParameterCount) \
+ DECLARE_DEFAULT_DESCRIPTOR(Name##Descriptor, CallInterfaceDescriptor) \
};
BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR)
#undef DEFINE_TFS_BUILTIN_DESCRIPTOR
@@ -880,9 +1033,15 @@ BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR)
#undef DECLARE_DEFAULT_DESCRIPTOR
#undef DECLARE_DESCRIPTOR_WITH_BASE
#undef DECLARE_DESCRIPTOR
-#undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE
-#undef DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG
+#undef DECLARE_JS_COMPATIBLE_DESCRIPTOR
+#undef DEFINE_RESULT_AND_PARAMETERS
+#undef DEFINE_RESULT_AND_PARAMETERS_NO_CONTEXT
#undef DEFINE_PARAMETERS
+#undef DEFINE_PARAMETERS_NO_CONTEXT
+#undef DEFINE_RESULT_AND_PARAMETER_TYPES
+#undef DEFINE_PARAMETER_TYPES
+#undef DEFINE_JS_PARAMETERS
+#undef DEFINE_JS_PARAMETER_TYPES
// We define the association between CallDescriptors::Key and the specialized
// descriptor here to reduce boilerplate and mistakes.
@@ -893,11 +1052,4 @@ INTERFACE_DESCRIPTOR_LIST(DEF_KEY)
} // namespace internal
} // namespace v8
-
-#if V8_TARGET_ARCH_ARM64
-#include "src/arm64/interface-descriptors-arm64.h"
-#elif V8_TARGET_ARCH_ARM
-#include "src/arm/interface-descriptors-arm.h"
-#endif
-
#endif // V8_INTERFACE_DESCRIPTORS_H_