LCOV - code coverage report
Current view: top level - src - interface-descriptors.h (source / functions) Hit Total Coverage
Test: app.info Lines: 237 239 99.2 %
Date: 2019-01-20 Functions: 426 917 46.5 %

          Line data    Source code
       1             : // Copyright 2014 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_INTERFACE_DESCRIPTORS_H_
       6             : #define V8_INTERFACE_DESCRIPTORS_H_
       7             : 
       8             : #include <memory>
       9             : 
      10             : #include "src/globals.h"
      11             : #include "src/isolate.h"
      12             : #include "src/machine-type.h"
      13             : #include "src/register-arch.h"
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : 
      18             : #define INTERFACE_DESCRIPTOR_LIST(V)  \
      19             :   V(Abort)                            \
      20             :   V(Allocate)                         \
      21             :   V(AllocateHeapNumber)               \
      22             :   V(ApiCallback)                      \
      23             :   V(ApiGetter)                        \
      24             :   V(ArgumentsAdaptor)                 \
      25             :   V(ArrayConstructor)                 \
      26             :   V(ArrayNArgumentsConstructor)       \
      27             :   V(ArrayNoArgumentConstructor)       \
      28             :   V(ArraySingleArgumentConstructor)   \
      29             :   V(AsyncFunctionStackParameter)      \
      30             :   V(BigIntToI64)                      \
      31             :   V(BigIntToWasmI64)                  \
      32             :   V(BinaryOp)                         \
      33             :   V(CallForwardVarargs)               \
      34             :   V(CallTrampoline)                   \
      35             :   V(CallVarargs)                      \
      36             :   V(CallWithArrayLike)                \
      37             :   V(CallWithSpread)                   \
      38             :   V(CEntry1ArgvOnStack)               \
      39             :   V(CloneObjectWithVector)            \
      40             :   V(Compare)                          \
      41             :   V(ConstructForwardVarargs)          \
      42             :   V(ConstructStub)                    \
      43             :   V(ConstructVarargs)                 \
      44             :   V(ConstructWithArrayLike)           \
      45             :   V(ConstructWithSpread)              \
      46             :   V(ContextOnly)                      \
      47             :   V(CppBuiltinAdaptor)                \
      48             :   V(FastNewFunctionContext)           \
      49             :   V(FastNewObject)                    \
      50             :   V(FrameDropperTrampoline)           \
      51             :   V(GetProperty)                      \
      52             :   V(GrowArrayElements)                \
      53             :   V(InterpreterCEntry1)               \
      54             :   V(InterpreterCEntry2)               \
      55             :   V(InterpreterDispatch)              \
      56             :   V(InterpreterPushArgsThenCall)      \
      57             :   V(InterpreterPushArgsThenConstruct) \
      58             :   V(JSTrampoline)                     \
      59             :   V(Load)                             \
      60             :   V(LoadGlobal)                       \
      61             :   V(LoadGlobalWithVector)             \
      62             :   V(LoadWithVector)                   \
      63             :   V(NewArgumentsElements)             \
      64             :   V(NoContext)                        \
      65             :   V(RecordWrite)                      \
      66             :   V(ResumeGenerator)                  \
      67             :   V(RunMicrotasksEntry)               \
      68             :   V(RunMicrotasks)                    \
      69             :   V(Store)                            \
      70             :   V(StoreGlobal)                      \
      71             :   V(StoreGlobalWithVector)            \
      72             :   V(StoreTransition)                  \
      73             :   V(StoreWithVector)                  \
      74             :   V(StringAt)                         \
      75             :   V(StringSubstring)                  \
      76             :   V(TypeConversion)                   \
      77             :   V(TypeConversionStackParameter)     \
      78             :   V(Typeof)                           \
      79             :   V(Void)                             \
      80             :   V(WasmAtomicWake)                   \
      81             :   V(WasmI32AtomicWait)                \
      82             :   V(WasmI64AtomicWait)                \
      83             :   V(WasmMemoryGrow)                   \
      84             :   V(WasmThrow)                        \
      85             :   BUILTIN_LIST_TFS(V)
      86             : 
      87             : class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
      88             :  public:
      89             :   enum Flag {
      90             :     kNoFlags = 0u,
      91             :     kNoContext = 1u << 0,
      92             : 
      93             :     // This indicates that the code uses a special frame that does not scan the
      94             :     // stack arguments, e.g. EntryFrame. And this allows the code to use
      95             :     // untagged stack arguments.
      96             :     kNoStackScan = 1u << 1,
      97             :   };
      98             :   typedef base::Flags<Flag> Flags;
      99             : 
     100    29909032 :   CallInterfaceDescriptorData() = default;
     101             : 
     102             :   // A copy of the passed in registers and param_representations is made
     103             :   // and owned by the CallInterfaceDescriptorData.
     104             : 
     105             :   void InitializePlatformSpecific(int register_parameter_count,
     106             :                                   const Register* registers);
     107             : 
     108             :   // if machine_types is null, then an array of size
     109             :   // (return_count + parameter_count) will be created with
     110             :   // MachineType::AnyTagged() for each member.
     111             :   //
     112             :   // if machine_types is not null, then it should be of the size
     113             :   // (return_count + parameter_count). Those members of the parameter array will
     114             :   // be initialized from {machine_types}, and the rest initialized to
     115             :   // MachineType::AnyTagged().
     116             :   void InitializePlatformIndependent(Flags flags, int return_count,
     117             :                                      int parameter_count,
     118             :                                      const MachineType* machine_types,
     119             :                                      int machine_types_length);
     120             : 
     121             :   void Reset();
     122             : 
     123             :   bool IsInitialized() const {
     124             :     return IsInitializedPlatformSpecific() &&
     125             :            IsInitializedPlatformIndependent();
     126             :   }
     127             : 
     128             :   Flags flags() const { return flags_; }
     129             :   int return_count() const { return return_count_; }
     130             :   int param_count() const { return param_count_; }
     131             :   int register_param_count() const { return register_param_count_; }
     132     6880993 :   Register register_param(int index) const { return register_params_[index]; }
     133             :   Register* register_params() const { return register_params_; }
     134             :   MachineType return_type(int index) const {
     135             :     DCHECK_LT(index, return_count_);
     136     2757558 :     return machine_types_[index];
     137             :   }
     138             :   MachineType param_type(int index) const {
     139             :     DCHECK_LT(index, param_count_);
     140     6408559 :     return machine_types_[return_count_ + index];
     141             :   }
     142             : 
     143             :   void RestrictAllocatableRegisters(const Register* registers, int num) {
     144             :     DCHECK_EQ(allocatable_registers_, 0);
     145      306405 :     for (int i = 0; i < num; ++i) {
     146      612810 :       allocatable_registers_ |= registers[i].bit();
     147             :     }
     148             :     DCHECK_GT(NumRegs(allocatable_registers_), 0);
     149             :   }
     150             : 
     151             :   RegList allocatable_registers() const { return allocatable_registers_; }
     152             : 
     153             :  private:
     154             :   bool IsInitializedPlatformSpecific() const {
     155             :     const bool initialized =
     156             :         (register_param_count_ == 0 && register_params_ == nullptr) ||
     157             :         (register_param_count_ > 0 && register_params_ != nullptr);
     158             :     // Platform-specific initialization happens before platform-independent.
     159             :     return initialized;
     160             :   }
     161             :   bool IsInitializedPlatformIndependent() const {
     162             :     const bool initialized =
     163             :         return_count_ >= 0 && param_count_ >= 0 && machine_types_ != nullptr;
     164             :     // Platform-specific initialization happens before platform-independent.
     165             :     return initialized;
     166             :   }
     167             : 
     168             : #ifdef DEBUG
     169             :   bool AllStackParametersAreTagged() const;
     170             : #endif  // DEBUG
     171             : 
     172             :   int register_param_count_ = -1;
     173             :   int return_count_ = -1;
     174             :   int param_count_ = -1;
     175             :   Flags flags_ = kNoFlags;
     176             : 
     177             :   // Specifying the set of registers that could be used by the register
     178             :   // allocator. Currently, it's only used by RecordWrite code stub.
     179             :   RegList allocatable_registers_ = 0;
     180             : 
     181             :   // |registers_params_| defines registers that are used for parameter passing.
     182             :   // |machine_types_| defines machine types for resulting values and incomping
     183             :   // parameters.
     184             :   // Both arrays are allocated dynamically by the InterfaceDescriptor and
     185             :   // freed on destruction. This is because static arrays cause creation of
     186             :   // runtime static initializers which we don't want.
     187             :   Register* register_params_ = nullptr;
     188             :   MachineType* machine_types_ = nullptr;
     189             : 
     190             :   DISALLOW_COPY_AND_ASSIGN(CallInterfaceDescriptorData);
     191             : };
     192             : 
     193             : class V8_EXPORT_PRIVATE CallDescriptors : public AllStatic {
     194             :  public:
     195             :   enum Key {
     196             : #define DEF_ENUM(name, ...) name,
     197             :     INTERFACE_DESCRIPTOR_LIST(DEF_ENUM)
     198             : #undef DEF_ENUM
     199             :         NUMBER_OF_DESCRIPTORS
     200             :   };
     201             : 
     202             :   static void InitializeOncePerProcess();
     203             :   static void TearDown();
     204             : 
     205             :   static CallInterfaceDescriptorData* call_descriptor_data(
     206             :       CallDescriptors::Key key) {
     207     2336745 :     return &call_descriptor_data_[key];
     208             :   }
     209             : 
     210             :   static Key GetKey(const CallInterfaceDescriptorData* data) {
     211     2757382 :     ptrdiff_t index = data - call_descriptor_data_;
     212             :     DCHECK_LE(0, index);
     213             :     DCHECK_LT(index, CallDescriptors::NUMBER_OF_DESCRIPTORS);
     214     2757382 :     return static_cast<CallDescriptors::Key>(index);
     215             :   }
     216             : 
     217             :  private:
     218             :   static CallInterfaceDescriptorData
     219             :       call_descriptor_data_[NUMBER_OF_DESCRIPTORS];
     220             : };
     221             : 
     222     8949124 : class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
     223             :  public:
     224             :   typedef CallInterfaceDescriptorData::Flags Flags;
     225             : 
     226             :   CallInterfaceDescriptor() : data_(nullptr) {}
     227    15840285 :   virtual ~CallInterfaceDescriptor() = default;
     228             : 
     229             :   explicit CallInterfaceDescriptor(CallDescriptors::Key key)
     230    17647432 :       : data_(CallDescriptors::call_descriptor_data(key)) {}
     231             : 
     232      247940 :   Flags flags() const { return data()->flags(); }
     233             : 
     234             :   bool HasContextParameter() const {
     235             :     return (flags() & CallInterfaceDescriptorData::kNoContext) == 0;
     236             :   }
     237             : 
     238     2713027 :   int GetReturnCount() const { return data()->return_count(); }
     239             : 
     240     2757558 :   MachineType GetReturnType(int index) const {
     241             :     DCHECK_LT(index, data()->return_count());
     242     2757558 :     return data()->return_type(index);
     243             :   }
     244             : 
     245       51125 :   int GetParameterCount() const { return data()->param_count(); }
     246             : 
     247     2759563 :   int GetRegisterParameterCount() const {
     248     3100332 :     return data()->register_param_count();
     249             :   }
     250             : 
     251       98907 :   int GetStackParameterCount() const {
     252     2102454 :     return data()->param_count() - data()->register_param_count();
     253             :   }
     254             : 
     255     6406531 :   Register GetRegisterParameter(int index) const {
     256     6880937 :     return data()->register_param(index);
     257             :   }
     258             : 
     259             :   MachineType GetParameterType(int index) const {
     260             :     DCHECK_LT(index, data()->param_count());
     261     6408559 :     return data()->param_type(index);
     262             :   }
     263             : 
     264     2713004 :   RegList allocatable_registers() const {
     265     3026666 :     return data()->allocatable_registers();
     266             :   }
     267             : 
     268             :   static const Register ContextRegister();
     269             : 
     270             :   const char* DebugName() const;
     271             : 
     272             :  protected:
     273             :   const CallInterfaceDescriptorData* data() const { return data_; }
     274             : 
     275           0 :   virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
     276           0 :     UNREACHABLE();
     277             :   }
     278             : 
     279      122562 :   virtual void InitializePlatformIndependent(
     280      122562 :       CallInterfaceDescriptorData* data) {
     281             :     // Default descriptor configuration: one result, all parameters are passed
     282             :     // in registers and all parameters have MachineType::AnyTagged() type.
     283             :     data->InitializePlatformIndependent(CallInterfaceDescriptorData::kNoFlags,
     284             :                                         1, data->register_param_count(),
     285      122562 :                                         nullptr, 0);
     286      122562 :   }
     287             : 
     288             :   // Initializes |data| using the platform dependent default set of registers.
     289             :   // It is intended to be used for TurboFan stubs when particular set of
     290             :   // registers does not matter.
     291             :   static void DefaultInitializePlatformSpecific(
     292             :       CallInterfaceDescriptorData* data, int register_parameter_count);
     293             : 
     294             :   // Initializes |data| using the platform dependent default set of registers
     295             :   // for JavaScript-compatible calling convention.
     296             :   // It is intended to be used for TurboFan stubs being called with JavaScript
     297             :   // linkage + additional parameters on registers and stack.
     298             :   static void JSDefaultInitializePlatformSpecific(
     299             :       CallInterfaceDescriptorData* data, int non_js_register_parameter_count);
     300             : 
     301             :   // Checks if float parameters are not assigned invalid registers.
     302             :   bool CheckFloatingPointParameters(CallInterfaceDescriptorData* data) {
     303             :     for (int i = 0; i < data->register_param_count(); i++) {
     304             :       if (IsFloatingPoint(data->param_type(i).representation())) {
     305             :         if (!IsValidFloatParameterRegister(data->register_param(i))) {
     306             :           return false;
     307             :         }
     308             :       }
     309             :     }
     310             :     return true;
     311             :   }
     312             : 
     313             :   bool IsValidFloatParameterRegister(Register reg);
     314             : 
     315             :  private:
     316             :   // {CallDescriptors} is allowed to call the private {Initialize} method.
     317             :   friend class CallDescriptors;
     318             : 
     319             :   const CallInterfaceDescriptorData* data_;
     320             : 
     321     2328678 :   void Initialize(CallInterfaceDescriptorData* data) {
     322             :     // The passed pointer should be a modifiable pointer to our own data.
     323             :     DCHECK_EQ(data, data_);
     324             :     DCHECK(!data->IsInitialized());
     325    14952564 :     InitializePlatformSpecific(data);
     326    14952564 :     InitializePlatformIndependent(data);
     327             :     DCHECK(data->IsInitialized());
     328             :     DCHECK(CheckFloatingPointParameters(data));
     329     2328678 :   }
     330             : };
     331             : 
     332             : #define DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
     333             :  public:                                         \
     334             :   explicit name() : base(key()) {}               \
     335             :   static inline CallDescriptors::Key key();
     336             : 
     337             : #if defined(V8_TARGET_ARCH_IA32)
     338             : // To support all possible cases, we must limit the number of register args for
     339             : // TFS builtins on ia32 to 3. Out of the 6 allocatable registers, esi is taken
     340             : // as the context register and ebx is the root register. One register must
     341             : // remain available to store the jump/call target. Thus 3 registers remain for
     342             : // arguments. The reason this applies to TFS builtins specifically is because
     343             : // this becomes relevant for builtins used as targets of Torque function
     344             : // pointers (which must have a register available to store the target).
     345             : // TODO(jgruber): Ideally we should just decrement kMaxBuiltinRegisterParams but
     346             : // that comes with its own set of complications. It's possible, but requires
     347             : // refactoring the calling convention of other existing stubs.
     348             : constexpr int kMaxBuiltinRegisterParams = 4;
     349             : constexpr int kMaxTFSBuiltinRegisterParams = 3;
     350             : #else
     351             : constexpr int kMaxBuiltinRegisterParams = 5;
     352             : constexpr int kMaxTFSBuiltinRegisterParams = kMaxBuiltinRegisterParams;
     353             : #endif
     354             : STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
     355             : 
     356             : #define DECLARE_DEFAULT_DESCRIPTOR(name, base)                                 \
     357             :   DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                     \
     358             :  protected:                                                                    \
     359             :   static const int kRegisterParams =                                           \
     360             :       kParameterCount > kMaxTFSBuiltinRegisterParams                           \
     361             :           ? kMaxTFSBuiltinRegisterParams                                       \
     362             :           : kParameterCount;                                                   \
     363             :   static const int kStackParams = kParameterCount - kRegisterParams;           \
     364             :   void InitializePlatformSpecific(CallInterfaceDescriptorData* data)           \
     365             :       override {                                                               \
     366             :     DefaultInitializePlatformSpecific(data, kRegisterParams);                  \
     367             :   }                                                                            \
     368             :   void InitializePlatformIndependent(CallInterfaceDescriptorData* data)        \
     369             :       override {                                                               \
     370             :     data->InitializePlatformIndependent(Flags(kDescriptorFlags), kReturnCount, \
     371             :                                         kParameterCount, nullptr, 0);          \
     372             :   }                                                                            \
     373             :   name(CallDescriptors::Key key) : base(key) {}                                \
     374             :                                                                                \
     375             :  public:
     376             : 
     377             : #define DECLARE_JS_COMPATIBLE_DESCRIPTOR(name, base,                        \
     378             :                                          non_js_reg_parameters_count)       \
     379             :   DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                  \
     380             :  protected:                                                                 \
     381             :   void InitializePlatformSpecific(CallInterfaceDescriptorData* data)        \
     382             :       override {                                                            \
     383             :     JSDefaultInitializePlatformSpecific(data, non_js_reg_parameters_count); \
     384             :   }                                                                         \
     385             :   name(CallDescriptors::Key key) : base(key) {}                             \
     386             :                                                                             \
     387             :  public:
     388             : 
     389             : #define DEFINE_RESULT_AND_PARAMETERS(return_count, ...)   \
     390             :   static constexpr int kDescriptorFlags =                 \
     391             :       CallInterfaceDescriptorData::kNoFlags;              \
     392             :   static constexpr int kReturnCount = return_count;       \
     393             :   enum ParameterIndices {                                 \
     394             :     __dummy = -1, /* to be able to pass zero arguments */ \
     395             :     ##__VA_ARGS__,                                        \
     396             :                                                           \
     397             :     kParameterCount,                                      \
     398             :     kContext = kParameterCount /* implicit parameter */   \
     399             :   };
     400             : 
     401             : #define DEFINE_RESULT_AND_PARAMETERS_NO_CONTEXT(return_count, ...) \
     402             :   static constexpr int kDescriptorFlags =                          \
     403             :       CallInterfaceDescriptorData::kNoContext;                     \
     404             :   static constexpr int kReturnCount = return_count;                \
     405             :   enum ParameterIndices {                                          \
     406             :     __dummy = -1, /* to be able to pass zero arguments */          \
     407             :     ##__VA_ARGS__,                                                 \
     408             :                                                                    \
     409             :     kParameterCount                                                \
     410             :   };
     411             : 
     412             : // This is valid only for builtins that use EntryFrame, which does not scan
     413             : // stack arguments on GC.
     414             : #define DEFINE_PARAMETERS_ENTRY(...)                      \
     415             :   static constexpr int kDescriptorFlags =                 \
     416             :       CallInterfaceDescriptorData::kNoContext |           \
     417             :       CallInterfaceDescriptorData::kNoStackScan;          \
     418             :   static constexpr int kReturnCount = 1;                  \
     419             :   enum ParameterIndices {                                 \
     420             :     __dummy = -1, /* to be able to pass zero arguments */ \
     421             :     ##__VA_ARGS__,                                        \
     422             :                                                           \
     423             :     kParameterCount                                       \
     424             :   };
     425             : 
     426             : #define DEFINE_PARAMETERS(...) DEFINE_RESULT_AND_PARAMETERS(1, ##__VA_ARGS__)
     427             : 
     428             : #define DEFINE_PARAMETERS_NO_CONTEXT(...) \
     429             :   DEFINE_RESULT_AND_PARAMETERS_NO_CONTEXT(1, ##__VA_ARGS__)
     430             : 
     431             : #define DEFINE_RESULT_AND_PARAMETER_TYPES(...)                                 \
     432             :   void InitializePlatformIndependent(CallInterfaceDescriptorData* data)        \
     433             :       override {                                                               \
     434             :     MachineType machine_types[] = {__VA_ARGS__};                               \
     435             :     static_assert(                                                             \
     436             :         kReturnCount + kParameterCount == arraysize(machine_types),            \
     437             :         "Parameter names definition is not consistent with parameter types");  \
     438             :     data->InitializePlatformIndependent(Flags(kDescriptorFlags), kReturnCount, \
     439             :                                         kParameterCount, machine_types,        \
     440             :                                         arraysize(machine_types));             \
     441             :   }
     442             : 
     443             : #define DEFINE_PARAMETER_TYPES(...)                                        \
     444             :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged() /* result */, \
     445             :                                     ##__VA_ARGS__)
     446             : 
     447             : #define DEFINE_JS_PARAMETERS(...)                       \
     448             :   static constexpr int kDescriptorFlags =               \
     449             :       CallInterfaceDescriptorData::kNoFlags;            \
     450             :   static constexpr int kReturnCount = 1;                \
     451             :   enum ParameterIndices {                               \
     452             :     kTarget,                                            \
     453             :     kNewTarget,                                         \
     454             :     kActualArgumentsCount,                              \
     455             :     ##__VA_ARGS__,                                      \
     456             :                                                         \
     457             :     kParameterCount,                                    \
     458             :     kContext = kParameterCount /* implicit parameter */ \
     459             :   };
     460             : 
     461             : #define DEFINE_JS_PARAMETER_TYPES(...)                                         \
     462             :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), /* kTarget */               \
     463             :                          MachineType::AnyTagged(), /* kNewTarget */            \
     464             :                          MachineType::Int32(),     /* kActualArgumentsCount */ \
     465             :                          ##__VA_ARGS__)
     466             : 
     467             : #define DECLARE_DESCRIPTOR(name, base)                                         \
     468             :   DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                     \
     469             :  protected:                                                                    \
     470             :   void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \
     471             :   name(CallDescriptors::Key key) : base(key) {}                                \
     472             :                                                                                \
     473             :  public:
     474             : 
     475       61281 : class V8_EXPORT_PRIVATE VoidDescriptor : public CallInterfaceDescriptor {
     476             :  public:
     477             :   DEFINE_PARAMETERS()
     478      122562 :   DEFINE_PARAMETER_TYPES()
     479       61414 :   DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor)
     480             : };
     481             : 
     482             : // Dummy descriptor used to mark builtins that don't yet have their proper
     483             : // descriptor associated.
     484             : typedef VoidDescriptor DummyDescriptor;
     485             : 
     486             : // Dummy descriptor that marks builtins with C calling convention.
     487             : typedef VoidDescriptor CCallDescriptor;
     488             : 
     489      173300 : class AllocateDescriptor : public CallInterfaceDescriptor {
     490             :  public:
     491             :   DEFINE_PARAMETERS_NO_CONTEXT(kRequestedSize)
     492      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::TaggedPointer(),  // result 1
     493             :                                     MachineType::IntPtr())  // kRequestedSize
     494      173298 :   DECLARE_DESCRIPTOR(AllocateDescriptor, CallInterfaceDescriptor)
     495             : };
     496             : 
     497             : // This descriptor defines the JavaScript calling convention that can be used
     498             : // by stubs: target, new.target, argc (not including the receiver) and context
     499             : // are passed in registers while receiver and the rest of the JS arguments are
     500             : // passed on the stack.
     501       61281 : class JSTrampolineDescriptor : public CallInterfaceDescriptor {
     502             :  public:
     503             :   DEFINE_JS_PARAMETERS()
     504      122562 :   DEFINE_JS_PARAMETER_TYPES()
     505             : 
     506      123066 :   DECLARE_JS_COMPATIBLE_DESCRIPTOR(JSTrampolineDescriptor,
     507             :                                    CallInterfaceDescriptor, 0)
     508             : };
     509             : 
     510       61281 : class ContextOnlyDescriptor : public CallInterfaceDescriptor {
     511             :  public:
     512             :   DEFINE_PARAMETERS()
     513      122562 :   DEFINE_PARAMETER_TYPES()
     514       61281 :   DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor)
     515             : };
     516             : 
     517       74710 : class NoContextDescriptor : public CallInterfaceDescriptor {
     518             :  public:
     519             :   DEFINE_PARAMETERS_NO_CONTEXT()
     520      122562 :   DEFINE_PARAMETER_TYPES()
     521       74723 :   DECLARE_DESCRIPTOR(NoContextDescriptor, CallInterfaceDescriptor)
     522             : };
     523             : 
     524             : // LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs.
     525      123850 : class LoadDescriptor : public CallInterfaceDescriptor {
     526             :  public:
     527             :   DEFINE_PARAMETERS(kReceiver, kName, kSlot)
     528      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kReceiver
     529             :                          MachineType::AnyTagged(),     // kName
     530             :                          MachineType::TaggedSigned())  // kSlot
     531      123850 :   DECLARE_DESCRIPTOR(LoadDescriptor, CallInterfaceDescriptor)
     532             : 
     533             :   static const Register ReceiverRegister();
     534             :   static const Register NameRegister();
     535             :   static const Register SlotRegister();
     536             : };
     537             : 
     538      122562 : class LoadGlobalDescriptor : public CallInterfaceDescriptor {
     539             :  public:
     540             :   DEFINE_PARAMETERS(kName, kSlot)
     541      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kName
     542             :                          MachineType::TaggedSigned())  // kSlot
     543      122562 :   DECLARE_DESCRIPTOR(LoadGlobalDescriptor, CallInterfaceDescriptor)
     544             : 
     545             :   static const Register NameRegister() {
     546      122562 :     return LoadDescriptor::NameRegister();
     547             :   }
     548             : 
     549             :   static const Register SlotRegister() {
     550      122562 :     return LoadDescriptor::SlotRegister();
     551             :   }
     552             : };
     553             : 
     554      184235 : class StoreDescriptor : public CallInterfaceDescriptor {
     555             :  public:
     556             :   DEFINE_PARAMETERS(kReceiver, kName, kValue, kSlot)
     557      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kReceiver
     558             :                          MachineType::AnyTagged(),     // kName
     559             :                          MachineType::AnyTagged(),     // kValue
     560             :                          MachineType::TaggedSigned())  // kSlot
     561      184235 :   DECLARE_DESCRIPTOR(StoreDescriptor, CallInterfaceDescriptor)
     562             : 
     563             :   static const Register ReceiverRegister();
     564             :   static const Register NameRegister();
     565             :   static const Register ValueRegister();
     566             :   static const Register SlotRegister();
     567             : 
     568             : #if V8_TARGET_ARCH_IA32
     569             :   static const bool kPassLastArgsOnStack = true;
     570             : #else
     571             :   static const bool kPassLastArgsOnStack = false;
     572             : #endif
     573             : 
     574             :   // Pass value and slot through the stack.
     575             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 2 : 0;
     576             : };
     577             : 
     578       61393 : class StoreTransitionDescriptor : public StoreDescriptor {
     579             :  public:
     580             :   DEFINE_PARAMETERS(kReceiver, kName, kMap, kValue, kSlot, kVector)
     581      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kReceiver
     582             :                          MachineType::AnyTagged(),     // kName
     583             :                          MachineType::AnyTagged(),     // kMap
     584             :                          MachineType::AnyTagged(),     // kValue
     585             :                          MachineType::TaggedSigned(),  // kSlot
     586             :                          MachineType::AnyTagged())     // kVector
     587       61393 :   DECLARE_DESCRIPTOR(StoreTransitionDescriptor, StoreDescriptor)
     588             : 
     589             :   static const Register MapRegister();
     590             :   static const Register SlotRegister();
     591             :   static const Register VectorRegister();
     592             : 
     593             :   // Pass value, slot and vector through the stack.
     594             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
     595             : };
     596             : 
     597       61561 : class StoreWithVectorDescriptor : public StoreDescriptor {
     598             :  public:
     599             :   DEFINE_PARAMETERS(kReceiver, kName, kValue, kSlot, kVector)
     600      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kReceiver
     601             :                          MachineType::AnyTagged(),     // kName
     602             :                          MachineType::AnyTagged(),     // kValue
     603             :                          MachineType::TaggedSigned(),  // kSlot
     604             :                          MachineType::AnyTagged())     // kVector
     605       61561 :   DECLARE_DESCRIPTOR(StoreWithVectorDescriptor, StoreDescriptor)
     606             : 
     607             :   static const Register VectorRegister();
     608             : 
     609             :   // Pass value, slot and vector through the stack.
     610             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
     611             : };
     612             : 
     613      122562 : class StoreGlobalDescriptor : public CallInterfaceDescriptor {
     614             :  public:
     615             :   DEFINE_PARAMETERS(kName, kValue, kSlot)
     616      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kName
     617             :                          MachineType::AnyTagged(),     // kValue
     618             :                          MachineType::TaggedSigned())  // kSlot
     619      122562 :   DECLARE_DESCRIPTOR(StoreGlobalDescriptor, CallInterfaceDescriptor)
     620             : 
     621             :   static const bool kPassLastArgsOnStack =
     622             :       StoreDescriptor::kPassLastArgsOnStack;
     623             :   // Pass value and slot through the stack.
     624             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 2 : 0;
     625             : 
     626             :   static const Register NameRegister() {
     627      122562 :     return StoreDescriptor::NameRegister();
     628             :   }
     629             : 
     630             :   static const Register ValueRegister() {
     631      122562 :     return StoreDescriptor::ValueRegister();
     632             :   }
     633             : 
     634             :   static const Register SlotRegister() {
     635      122562 :     return StoreDescriptor::SlotRegister();
     636             :   }
     637             : };
     638             : 
     639       61281 : class StoreGlobalWithVectorDescriptor : public StoreGlobalDescriptor {
     640             :  public:
     641             :   DEFINE_PARAMETERS(kName, kValue, kSlot, kVector)
     642      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kName
     643             :                          MachineType::AnyTagged(),     // kValue
     644             :                          MachineType::TaggedSigned(),  // kSlot
     645             :                          MachineType::AnyTagged())     // kVector
     646       61281 :   DECLARE_DESCRIPTOR(StoreGlobalWithVectorDescriptor, StoreGlobalDescriptor)
     647             : 
     648             :   static const Register VectorRegister() {
     649       61281 :     return StoreWithVectorDescriptor::VectorRegister();
     650             :   }
     651             : 
     652             :   // Pass value, slot and vector through the stack.
     653             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
     654             : };
     655             : 
     656       62569 : class LoadWithVectorDescriptor : public LoadDescriptor {
     657             :  public:
     658             :   DEFINE_PARAMETERS(kReceiver, kName, kSlot, kVector)
     659      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kReceiver
     660             :                          MachineType::AnyTagged(),     // kName
     661             :                          MachineType::TaggedSigned(),  // kSlot
     662             :                          MachineType::AnyTagged())     // kVector
     663       62569 :   DECLARE_DESCRIPTOR(LoadWithVectorDescriptor, LoadDescriptor)
     664             : 
     665             :   static const Register VectorRegister();
     666             : 
     667             : #if V8_TARGET_ARCH_IA32
     668             :   static const bool kPassLastArgsOnStack = true;
     669             : #else
     670             :   static const bool kPassLastArgsOnStack = false;
     671             : #endif
     672             : 
     673             :   // Pass vector through the stack.
     674             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 1 : 0;
     675             : };
     676             : 
     677       61281 : class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor {
     678             :  public:
     679             :   DEFINE_PARAMETERS(kName, kSlot, kVector)
     680      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),     // kName
     681             :                          MachineType::TaggedSigned(),  // kSlot
     682             :                          MachineType::AnyTagged())     // kVector
     683       61281 :   DECLARE_DESCRIPTOR(LoadGlobalWithVectorDescriptor, LoadGlobalDescriptor)
     684             : 
     685             : #if V8_TARGET_ARCH_IA32
     686             :   // On ia32, LoadWithVectorDescriptor passes vector on the stack and thus we
     687             :   // need to choose a new register here.
     688             :   static const Register VectorRegister() { return edx; }
     689             : #else
     690             :   static const Register VectorRegister() {
     691       61281 :     return LoadWithVectorDescriptor::VectorRegister();
     692             :   }
     693             : #endif
     694             : };
     695             : 
     696       61281 : class FastNewFunctionContextDescriptor : public CallInterfaceDescriptor {
     697             :  public:
     698             :   DEFINE_PARAMETERS(kScopeInfo, kSlots)
     699      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kScopeInfo
     700             :                          MachineType::Int32())      // kSlots
     701       61281 :   DECLARE_DESCRIPTOR(FastNewFunctionContextDescriptor, CallInterfaceDescriptor)
     702             : 
     703             :   static const Register ScopeInfoRegister();
     704             :   static const Register SlotsRegister();
     705             : };
     706             : 
     707       61281 : class FastNewObjectDescriptor : public CallInterfaceDescriptor {
     708             :  public:
     709             :   DEFINE_PARAMETERS(kTarget, kNewTarget)
     710      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTarget
     711             :                          MachineType::AnyTagged())  // kNewTarget
     712       61281 :   DECLARE_DESCRIPTOR(FastNewObjectDescriptor, CallInterfaceDescriptor)
     713             :   static const Register TargetRegister();
     714             :   static const Register NewTargetRegister();
     715             : };
     716             : 
     717       61281 : class RecordWriteDescriptor final : public CallInterfaceDescriptor {
     718             :  public:
     719             :   DEFINE_PARAMETERS_NO_CONTEXT(kObject, kSlot, kRememberedSet, kFPMode)
     720      122562 :   DEFINE_PARAMETER_TYPES(MachineType::TaggedPointer(),  // kObject
     721             :                          MachineType::Pointer(),        // kSlot
     722             :                          MachineType::TaggedSigned(),   // kRememberedSet
     723             :                          MachineType::TaggedSigned())   // kFPMode
     724             : 
     725       61337 :   DECLARE_DESCRIPTOR(RecordWriteDescriptor, CallInterfaceDescriptor)
     726             : };
     727             : 
     728      156228 : class TypeConversionDescriptor final : public CallInterfaceDescriptor {
     729             :  public:
     730             :   DEFINE_PARAMETERS(kArgument)
     731      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
     732      156282 :   DECLARE_DESCRIPTOR(TypeConversionDescriptor, CallInterfaceDescriptor)
     733             : 
     734             :   static const Register ArgumentRegister();
     735             : };
     736             : 
     737       61281 : class TypeConversionStackParameterDescriptor final
     738             :     : public CallInterfaceDescriptor {
     739             :  public:
     740             :   DEFINE_PARAMETERS(kArgument)
     741      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
     742       61281 :   DECLARE_DESCRIPTOR(TypeConversionStackParameterDescriptor,
     743             :                      CallInterfaceDescriptor)
     744             : };
     745             : 
     746       61281 : class AsyncFunctionStackParameterDescriptor final
     747             :     : public CallInterfaceDescriptor {
     748             :  public:
     749             :   DEFINE_PARAMETERS(kPromise, kResult)
     750      122562 :   DEFINE_PARAMETER_TYPES(MachineType::TaggedPointer(), MachineType::AnyTagged())
     751       61281 :   DECLARE_DESCRIPTOR(AsyncFunctionStackParameterDescriptor,
     752             :                      CallInterfaceDescriptor)
     753             : };
     754             : 
     755       61281 : class GetPropertyDescriptor final : public CallInterfaceDescriptor {
     756             :  public:
     757             :   DEFINE_PARAMETERS(kObject, kKey)
     758      245124 :   DECLARE_DEFAULT_DESCRIPTOR(GetPropertyDescriptor, CallInterfaceDescriptor)
     759             : };
     760             : 
     761       61281 : class TypeofDescriptor : public CallInterfaceDescriptor {
     762             :  public:
     763             :   DEFINE_PARAMETERS(kObject)
     764      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
     765       61281 :   DECLARE_DESCRIPTOR(TypeofDescriptor, CallInterfaceDescriptor)
     766             : };
     767             : 
     768       63162 : class CallTrampolineDescriptor : public CallInterfaceDescriptor {
     769             :  public:
     770             :   DEFINE_PARAMETERS(kFunction, kActualArgumentsCount)
     771      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kFunction
     772             :                          MachineType::Int32())      // kActualArgumentsCount
     773       63218 :   DECLARE_DESCRIPTOR(CallTrampolineDescriptor, CallInterfaceDescriptor)
     774             : };
     775             : 
     776       61281 : class CallVarargsDescriptor : public CallInterfaceDescriptor {
     777             :  public:
     778             :   DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kArgumentsLength,
     779             :                     kArgumentsList)
     780      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTarget
     781             :                          MachineType::Int32(),      // kActualArgumentsCount
     782             :                          MachineType::Int32(),      // kArgumentsLength
     783             :                          MachineType::AnyTagged())  // kArgumentsList
     784       61281 :   DECLARE_DESCRIPTOR(CallVarargsDescriptor, CallInterfaceDescriptor)
     785             : };
     786             : 
     787       61281 : class CallForwardVarargsDescriptor : public CallInterfaceDescriptor {
     788             :  public:
     789             :   DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kStartIndex)
     790      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTarget
     791             :                          MachineType::Int32(),      // kActualArgumentsCount
     792             :                          MachineType::Int32())      // kStartIndex
     793       61281 :   DECLARE_DESCRIPTOR(CallForwardVarargsDescriptor, CallInterfaceDescriptor)
     794             : };
     795             : 
     796       61281 : class CallWithSpreadDescriptor : public CallInterfaceDescriptor {
     797             :  public:
     798             :   DEFINE_PARAMETERS(kTarget, kArgumentsCount, kSpread)
     799      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTarget
     800             :                          MachineType::Int32(),      // kArgumentsCount
     801             :                          MachineType::AnyTagged())  // kSpread
     802       61281 :   DECLARE_DESCRIPTOR(CallWithSpreadDescriptor, CallInterfaceDescriptor)
     803             : };
     804             : 
     805       61281 : class CallWithArrayLikeDescriptor : public CallInterfaceDescriptor {
     806             :  public:
     807             :   DEFINE_PARAMETERS(kTarget, kArgumentsList)
     808      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTarget
     809             :                          MachineType::AnyTagged())  // kArgumentsList
     810       61281 :   DECLARE_DESCRIPTOR(CallWithArrayLikeDescriptor, CallInterfaceDescriptor)
     811             : };
     812             : 
     813       61281 : class ConstructVarargsDescriptor : public CallInterfaceDescriptor {
     814             :  public:
     815             :   DEFINE_JS_PARAMETERS(kArgumentsLength, kArgumentsList)
     816      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::Int32(),      // kArgumentsLength
     817             :                             MachineType::AnyTagged())  // kArgumentsList
     818             : 
     819       61281 :   DECLARE_DESCRIPTOR(ConstructVarargsDescriptor, CallInterfaceDescriptor)
     820             : };
     821             : 
     822       61281 : class ConstructForwardVarargsDescriptor : public CallInterfaceDescriptor {
     823             :  public:
     824             :   DEFINE_JS_PARAMETERS(kStartIndex)
     825      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::Int32())
     826       61281 :   DECLARE_DESCRIPTOR(ConstructForwardVarargsDescriptor, CallInterfaceDescriptor)
     827             : };
     828             : 
     829       61281 : class ConstructWithSpreadDescriptor : public CallInterfaceDescriptor {
     830             :  public:
     831             :   DEFINE_JS_PARAMETERS(kSpread)
     832      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged())
     833       61281 :   DECLARE_DESCRIPTOR(ConstructWithSpreadDescriptor, CallInterfaceDescriptor)
     834             : };
     835             : 
     836       61281 : class ConstructWithArrayLikeDescriptor : public CallInterfaceDescriptor {
     837             :  public:
     838             :   DEFINE_PARAMETERS(kTarget, kNewTarget, kArgumentsList)
     839      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTarget
     840             :                          MachineType::AnyTagged(),  // kNewTarget
     841             :                          MachineType::AnyTagged())  // kArgumentsList
     842       61281 :   DECLARE_DESCRIPTOR(ConstructWithArrayLikeDescriptor, CallInterfaceDescriptor)
     843             : };
     844             : 
     845             : // TODO(ishell): consider merging this with ArrayConstructorDescriptor
     846       61281 : class ConstructStubDescriptor : public CallInterfaceDescriptor {
     847             :  public:
     848             :   // TODO(jgruber): Remove the unused allocation site parameter.
     849             :   DEFINE_JS_PARAMETERS(kAllocationSite)
     850      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged());
     851             : 
     852             :   // TODO(ishell): Use DECLARE_JS_COMPATIBLE_DESCRIPTOR if registers match
     853       84300 :   DECLARE_DESCRIPTOR(ConstructStubDescriptor, CallInterfaceDescriptor)
     854             : };
     855             : 
     856       61281 : class AbortDescriptor : public CallInterfaceDescriptor {
     857             :  public:
     858             :   DEFINE_PARAMETERS_NO_CONTEXT(kMessageOrMessageId)
     859      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
     860       61281 :   DECLARE_DESCRIPTOR(AbortDescriptor, CallInterfaceDescriptor)
     861             : };
     862             : 
     863       74993 : class AllocateHeapNumberDescriptor : public CallInterfaceDescriptor {
     864             :  public:
     865             :   DEFINE_PARAMETERS_NO_CONTEXT()
     866      122562 :   DEFINE_PARAMETER_TYPES()
     867       75049 :   DECLARE_DESCRIPTOR(AllocateHeapNumberDescriptor, CallInterfaceDescriptor)
     868             : };
     869             : 
     870       61418 : class ArrayConstructorDescriptor : public CallInterfaceDescriptor {
     871             :  public:
     872             :   DEFINE_JS_PARAMETERS(kAllocationSite)
     873      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged());
     874             : 
     875      122699 :   DECLARE_JS_COMPATIBLE_DESCRIPTOR(ArrayConstructorDescriptor,
     876             :                                    CallInterfaceDescriptor, 1)
     877             : };
     878             : 
     879      183843 : class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor {
     880             :  public:
     881             :   // This descriptor declares only register arguments while respective number
     882             :   // of JS arguments stay on the expression stack.
     883             :   // The ArrayNArgumentsConstructor builtin does not access stack arguments
     884             :   // directly it just forwards them to the runtime function.
     885             :   DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount)
     886      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kFunction,
     887             :                          MachineType::AnyTagged(),  // kAllocationSite
     888             :                          MachineType::Int32())      // kActualArgumentsCount
     889      184627 :   DECLARE_DESCRIPTOR(ArrayNArgumentsConstructorDescriptor,
     890             :                      CallInterfaceDescriptor)
     891             : };
     892             : 
     893       61281 : class ArrayNoArgumentConstructorDescriptor
     894             :     : public ArrayNArgumentsConstructorDescriptor {
     895             :  public:
     896             :   // This descriptor declares same register arguments as the parent
     897             :   // ArrayNArgumentsConstructorDescriptor and it declares indices for
     898             :   // JS arguments passed on the expression stack.
     899             :   DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount,
     900             :                     kFunctionParameter)
     901      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kFunction
     902             :                          MachineType::AnyTagged(),  // kAllocationSite
     903             :                          MachineType::Int32(),      // kActualArgumentsCount
     904             :                          MachineType::AnyTagged())  // kFunctionParameter
     905       61281 :   DECLARE_DESCRIPTOR(ArrayNoArgumentConstructorDescriptor,
     906             :                      ArrayNArgumentsConstructorDescriptor)
     907             : };
     908             : 
     909       61281 : class ArraySingleArgumentConstructorDescriptor
     910             :     : public ArrayNArgumentsConstructorDescriptor {
     911             :  public:
     912             :   // This descriptor declares same register arguments as the parent
     913             :   // ArrayNArgumentsConstructorDescriptor and it declares indices for
     914             :   // JS arguments passed on the expression stack.
     915             :   DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount,
     916             :                     kFunctionParameter, kArraySizeSmiParameter)
     917      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kFunction
     918             :                          MachineType::AnyTagged(),  // kAllocationSite
     919             :                          MachineType::Int32(),      // kActualArgumentsCount
     920             :                          MachineType::AnyTagged(),  // kFunctionParameter
     921             :                          MachineType::AnyTagged())  // kArraySizeSmiParameter
     922       61281 :   DECLARE_DESCRIPTOR(ArraySingleArgumentConstructorDescriptor,
     923             :                      ArrayNArgumentsConstructorDescriptor)
     924             : };
     925             : 
     926       61281 : class CompareDescriptor : public CallInterfaceDescriptor {
     927             :  public:
     928             :   DEFINE_PARAMETERS(kLeft, kRight)
     929       61281 :   DECLARE_DESCRIPTOR(CompareDescriptor, CallInterfaceDescriptor)
     930             : };
     931             : 
     932             : 
     933       61281 : class BinaryOpDescriptor : public CallInterfaceDescriptor {
     934             :  public:
     935             :   DEFINE_PARAMETERS(kLeft, kRight)
     936       61281 :   DECLARE_DESCRIPTOR(BinaryOpDescriptor, CallInterfaceDescriptor)
     937             : };
     938             : 
     939             : // This desciptor is shared among String.p.charAt/charCodeAt/codePointAt
     940             : // as they all have the same interface.
     941       61281 : class StringAtDescriptor final : public CallInterfaceDescriptor {
     942             :  public:
     943             :   DEFINE_PARAMETERS(kReceiver, kPosition)
     944             :   // TODO(turbofan): Return untagged value here.
     945      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::TaggedSigned(),  // result 1
     946             :                                     MachineType::AnyTagged(),     // kReceiver
     947             :                                     MachineType::IntPtr())        // kPosition
     948       61281 :   DECLARE_DESCRIPTOR(StringAtDescriptor, CallInterfaceDescriptor)
     949             : };
     950             : 
     951       61281 : class StringSubstringDescriptor final : public CallInterfaceDescriptor {
     952             :  public:
     953             :   DEFINE_PARAMETERS(kString, kFrom, kTo)
     954      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kString
     955             :                          MachineType::IntPtr(),     // kFrom
     956             :                          MachineType::IntPtr())     // kTo
     957             : 
     958             :   // TODO(turbofan): Allow builtins to return untagged values.
     959       61281 :   DECLARE_DESCRIPTOR(StringSubstringDescriptor, CallInterfaceDescriptor)
     960             : };
     961             : 
     962       61822 : class ArgumentsAdaptorDescriptor : public CallInterfaceDescriptor {
     963             :  public:
     964             :   DEFINE_JS_PARAMETERS(kExpectedArgumentsCount)
     965      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::Int32())
     966       61822 :   DECLARE_DESCRIPTOR(ArgumentsAdaptorDescriptor, CallInterfaceDescriptor)
     967             : };
     968             : 
     969       61281 : class CppBuiltinAdaptorDescriptor : public CallInterfaceDescriptor {
     970             :  public:
     971             :   DEFINE_JS_PARAMETERS(kCFunction)
     972      122562 :   DEFINE_JS_PARAMETER_TYPES(MachineType::Pointer())
     973      122562 :   DECLARE_JS_COMPATIBLE_DESCRIPTOR(CppBuiltinAdaptorDescriptor,
     974             :                                    CallInterfaceDescriptor, 1)
     975             : };
     976             : 
     977       61281 : class CEntry1ArgvOnStackDescriptor : public CallInterfaceDescriptor {
     978             :  public:
     979             :   DEFINE_PARAMETERS(kArity,          // register argument
     980             :                     kCFunction,      // register argument
     981             :                     kPadding,        // stack argument 1 (just padding)
     982             :                     kArgcSmi,        // stack argument 2
     983             :                     kTargetCopy,     // stack argument 3
     984             :                     kNewTargetCopy)  // stack argument 4
     985      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Int32(),      // kArity
     986             :                          MachineType::Pointer(),    // kCFunction
     987             :                          MachineType::AnyTagged(),  // kPadding
     988             :                          MachineType::AnyTagged(),  // kArgcSmi
     989             :                          MachineType::AnyTagged(),  // kTargetCopy
     990             :                          MachineType::AnyTagged())  // kNewTargetCopy
     991       61393 :   DECLARE_DESCRIPTOR(CEntry1ArgvOnStackDescriptor, CallInterfaceDescriptor)
     992             : };
     993             : 
     994       61281 : class ApiCallbackDescriptor : public CallInterfaceDescriptor {
     995             :  public:
     996             :   DEFINE_PARAMETERS_NO_CONTEXT(kTargetContext,       // register argument
     997             :                                kApiFunctionAddress,  // register argument
     998             :                                kArgc,                // register argument
     999             :                                kCallData,            // stack argument 1
    1000             :                                kHolder)              // stack argument 2
    1001             :   //                           receiver is implicit stack argument 3
    1002             :   //                           argv are implicit stack arguments [4, 4 + kArgc[
    1003      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kTargetContext
    1004             :                          MachineType::Pointer(),    // kApiFunctionAddress
    1005             :                          MachineType::IntPtr(),     // kArgc
    1006             :                          MachineType::AnyTagged(),  // kCallData
    1007             :                          MachineType::AnyTagged())  // kHolder
    1008       61281 :   DECLARE_DESCRIPTOR(ApiCallbackDescriptor, CallInterfaceDescriptor)
    1009             : };
    1010             : 
    1011       61281 : class ApiGetterDescriptor : public CallInterfaceDescriptor {
    1012             :  public:
    1013             :   DEFINE_PARAMETERS(kReceiver, kHolder, kCallback)
    1014      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kReceiver
    1015             :                          MachineType::AnyTagged(),  // kHolder
    1016             :                          MachineType::AnyTagged())  // kCallback
    1017       61281 :   DECLARE_DESCRIPTOR(ApiGetterDescriptor, CallInterfaceDescriptor)
    1018             : 
    1019             :   static const Register ReceiverRegister();
    1020             :   static const Register HolderRegister();
    1021             :   static const Register CallbackRegister();
    1022             : };
    1023             : 
    1024             : // TODO(turbofan): We should probably rename this to GrowFastElementsDescriptor.
    1025       61281 : class GrowArrayElementsDescriptor : public CallInterfaceDescriptor {
    1026             :  public:
    1027             :   DEFINE_PARAMETERS(kObject, kKey)
    1028      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kObject
    1029             :                          MachineType::AnyTagged())  // kKey
    1030       61281 :   DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor)
    1031             : 
    1032             :   static const Register ObjectRegister();
    1033             :   static const Register KeyRegister();
    1034             : };
    1035             : 
    1036       61281 : class NewArgumentsElementsDescriptor final : public CallInterfaceDescriptor {
    1037             :  public:
    1038             :   DEFINE_PARAMETERS(kFrame, kLength, kMappedCount)
    1039      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Pointer(),       // kFrame
    1040             :                          MachineType::TaggedSigned(),  // kLength
    1041             :                          MachineType::TaggedSigned())  // kMappedCount
    1042       61281 :   DECLARE_DESCRIPTOR(NewArgumentsElementsDescriptor, CallInterfaceDescriptor)
    1043             : };
    1044             : 
    1045       87825 : class V8_EXPORT_PRIVATE InterpreterDispatchDescriptor
    1046             :     : public CallInterfaceDescriptor {
    1047             :  public:
    1048             :   DEFINE_PARAMETERS(kAccumulator, kBytecodeOffset, kBytecodeArray,
    1049             :                     kDispatchTable)
    1050      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kAccumulator
    1051             :                          MachineType::IntPtr(),     // kBytecodeOffset
    1052             :                          MachineType::AnyTagged(),  // kBytecodeArray
    1053             :                          MachineType::IntPtr())     // kDispatchTable
    1054      133623 :   DECLARE_DESCRIPTOR(InterpreterDispatchDescriptor, CallInterfaceDescriptor)
    1055             : };
    1056             : 
    1057       61281 : class InterpreterPushArgsThenCallDescriptor : public CallInterfaceDescriptor {
    1058             :  public:
    1059             :   DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunction)
    1060      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Int32(),      // kNumberOfArguments
    1061             :                          MachineType::Pointer(),    // kFirstArgument
    1062             :                          MachineType::AnyTagged())  // kFunction
    1063       61281 :   DECLARE_DESCRIPTOR(InterpreterPushArgsThenCallDescriptor,
    1064             :                      CallInterfaceDescriptor)
    1065             : };
    1066             : 
    1067       61281 : class InterpreterPushArgsThenConstructDescriptor
    1068             :     : public CallInterfaceDescriptor {
    1069             :  public:
    1070             :   DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kConstructor,
    1071             :                     kNewTarget, kFeedbackElement)
    1072      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Int32(),      // kNumberOfArguments
    1073             :                          MachineType::Pointer(),    // kFirstArgument
    1074             :                          MachineType::AnyTagged(),  // kConstructor
    1075             :                          MachineType::AnyTagged(),  // kNewTarget
    1076             :                          MachineType::AnyTagged())  // kFeedbackElement
    1077       61281 :   DECLARE_DESCRIPTOR(InterpreterPushArgsThenConstructDescriptor,
    1078             :                      CallInterfaceDescriptor)
    1079             : 
    1080             : #if V8_TARGET_ARCH_IA32
    1081             :   static const bool kPassLastArgsOnStack = true;
    1082             : #else
    1083             :   static const bool kPassLastArgsOnStack = false;
    1084             : #endif
    1085             : 
    1086             :   // Pass constructor, new target and feedback element through the stack.
    1087             :   static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
    1088             : };
    1089             : 
    1090       61281 : class InterpreterCEntry1Descriptor : public CallInterfaceDescriptor {
    1091             :  public:
    1092             :   DEFINE_RESULT_AND_PARAMETERS(1, kNumberOfArguments, kFirstArgument,
    1093             :                                kFunctionEntry)
    1094      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged(),  // result 1
    1095             :                                     MachineType::Int32(),  // kNumberOfArguments
    1096             :                                     MachineType::Pointer(),  // kFirstArgument
    1097             :                                     MachineType::Pointer())  // kFunctionEntry
    1098       61281 :   DECLARE_DESCRIPTOR(InterpreterCEntry1Descriptor, CallInterfaceDescriptor)
    1099             : };
    1100             : 
    1101       61281 : class InterpreterCEntry2Descriptor : public CallInterfaceDescriptor {
    1102             :  public:
    1103             :   DEFINE_RESULT_AND_PARAMETERS(2, kNumberOfArguments, kFirstArgument,
    1104             :                                kFunctionEntry)
    1105      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged(),  // result 1
    1106             :                                     MachineType::AnyTagged(),  // result 2
    1107             :                                     MachineType::Int32(),  // kNumberOfArguments
    1108             :                                     MachineType::Pointer(),  // kFirstArgument
    1109             :                                     MachineType::Pointer())  // kFunctionEntry
    1110       61281 :   DECLARE_DESCRIPTOR(InterpreterCEntry2Descriptor, CallInterfaceDescriptor)
    1111             : };
    1112             : 
    1113       61281 : class ResumeGeneratorDescriptor final : public CallInterfaceDescriptor {
    1114             :  public:
    1115             :   DEFINE_PARAMETERS(kValue, kGenerator)
    1116      122562 :   DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(),  // kValue
    1117             :                          MachineType::AnyTagged())  // kGenerator
    1118       61281 :   DECLARE_DESCRIPTOR(ResumeGeneratorDescriptor, CallInterfaceDescriptor)
    1119             : };
    1120             : 
    1121       61281 : class FrameDropperTrampolineDescriptor final : public CallInterfaceDescriptor {
    1122             :  public:
    1123             :   DEFINE_PARAMETERS(kRestartFp)
    1124      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Pointer())
    1125       61281 :   DECLARE_DESCRIPTOR(FrameDropperTrampolineDescriptor, CallInterfaceDescriptor)
    1126             : };
    1127             : 
    1128       61281 : class RunMicrotasksEntryDescriptor final : public CallInterfaceDescriptor {
    1129             :  public:
    1130             :   DEFINE_PARAMETERS_ENTRY(kRootRegisterValue, kMicrotaskQueue)
    1131      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Pointer(),  // kRootRegisterValue
    1132             :                          MachineType::Pointer())  // kMicrotaskQueue
    1133       61281 :   DECLARE_DESCRIPTOR(RunMicrotasksEntryDescriptor, CallInterfaceDescriptor)
    1134             : };
    1135             : 
    1136       61281 : class RunMicrotasksDescriptor final : public CallInterfaceDescriptor {
    1137             :  public:
    1138             :   DEFINE_PARAMETERS(kMicrotaskQueue)
    1139      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Pointer())
    1140       61281 :   DECLARE_DESCRIPTOR(RunMicrotasksDescriptor, CallInterfaceDescriptor)
    1141             : 
    1142             :   static Register MicrotaskQueueRegister();
    1143             : };
    1144             : 
    1145       61281 : class WasmMemoryGrowDescriptor final : public CallInterfaceDescriptor {
    1146             :  public:
    1147             :   DEFINE_PARAMETERS_NO_CONTEXT(kNumPages)
    1148      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::Int32(),  // result 1
    1149             :                                     MachineType::Int32())  // kNumPages
    1150       62561 :   DECLARE_DESCRIPTOR(WasmMemoryGrowDescriptor, CallInterfaceDescriptor)
    1151             : };
    1152             : 
    1153       61281 : class WasmThrowDescriptor final : public CallInterfaceDescriptor {
    1154             :  public:
    1155             :   DEFINE_PARAMETERS_NO_CONTEXT(kException)
    1156      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged(),  // result 1
    1157             :                                     MachineType::AnyTagged())  // kException
    1158       62297 :   DECLARE_DESCRIPTOR(WasmThrowDescriptor, CallInterfaceDescriptor)
    1159             : };
    1160             : 
    1161       61281 : class BigIntToWasmI64Descriptor final : public CallInterfaceDescriptor {
    1162             :  public:
    1163             :   DEFINE_PARAMETERS_NO_CONTEXT(kArgument)
    1164      122562 :   DEFINE_PARAMETER_TYPES(MachineType::Int64())  // kArgument
    1165       61373 :   DECLARE_DESCRIPTOR(BigIntToWasmI64Descriptor, CallInterfaceDescriptor)
    1166             : };
    1167             : 
    1168       61281 : class BigIntToI64Descriptor final : public CallInterfaceDescriptor {
    1169             :  public:
    1170             :   DEFINE_PARAMETERS(kArgument)
    1171      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::Int64(),      // result 1
    1172             :                                     MachineType::AnyTagged())  // kArgument
    1173       61355 :   DECLARE_DESCRIPTOR(BigIntToI64Descriptor, CallInterfaceDescriptor)
    1174             : };
    1175             : 
    1176       61461 : class WasmAtomicWakeDescriptor final : public CallInterfaceDescriptor {
    1177             :  public:
    1178             :   DEFINE_PARAMETERS_NO_CONTEXT(kAddress, kCount)
    1179      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::Uint32(),  // result 1
    1180             :                                     MachineType::Uint32(),  // kAddress
    1181             :                                     MachineType::Uint32())  // kCount
    1182       61461 :   DECLARE_DESCRIPTOR(WasmAtomicWakeDescriptor, CallInterfaceDescriptor)
    1183             : };
    1184             : 
    1185       61569 : class WasmI32AtomicWaitDescriptor final : public CallInterfaceDescriptor {
    1186             :  public:
    1187             :   DEFINE_PARAMETERS_NO_CONTEXT(kAddress, kExpectedValue, kTimeout)
    1188      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::Uint32(),   // result 1
    1189             :                                     MachineType::Uint32(),   // kAddress
    1190             :                                     MachineType::Int32(),    // kExpectedValue
    1191             :                                     MachineType::Float64())  // kTimeout
    1192       61569 :   DECLARE_DESCRIPTOR(WasmI32AtomicWaitDescriptor, CallInterfaceDescriptor)
    1193             : };
    1194             : 
    1195       61568 : class WasmI64AtomicWaitDescriptor final : public CallInterfaceDescriptor {
    1196             :  public:
    1197             :   DEFINE_PARAMETERS_NO_CONTEXT(kAddress, kExpectedValueHigh, kExpectedValueLow,
    1198             :                                kTimeout)
    1199      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(
    1200             :       MachineType::Uint32(),   // result 1
    1201             :       MachineType::Uint32(),   // kAddress
    1202             :       MachineType::Uint32(),   // kExpectedValueHigh
    1203             :       MachineType::Uint32(),   // kExpectedValueLow
    1204             :       MachineType::Float64())  // kTimeout
    1205       61569 :   DECLARE_DESCRIPTOR(WasmI64AtomicWaitDescriptor, CallInterfaceDescriptor)
    1206             : };
    1207             : 
    1208       61281 : class CloneObjectWithVectorDescriptor final : public CallInterfaceDescriptor {
    1209             :  public:
    1210             :   DEFINE_PARAMETERS(kSource, kFlags, kSlot, kVector)
    1211      122562 :   DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::TaggedPointer(),  // result 1
    1212             :                                     MachineType::AnyTagged(),      // kSource
    1213             :                                     MachineType::TaggedSigned(),   // kFlags
    1214             :                                     MachineType::TaggedSigned(),   // kSlot
    1215             :                                     MachineType::AnyTagged())      // kVector
    1216       61281 :   DECLARE_DESCRIPTOR(CloneObjectWithVectorDescriptor, CallInterfaceDescriptor)
    1217             : };
    1218             : 
    1219             : #define DEFINE_TFS_BUILTIN_DESCRIPTOR(Name, ...)                          \
    1220             :   class Name##Descriptor : public CallInterfaceDescriptor {               \
    1221             :    public:                                                                \
    1222             :     DEFINE_PARAMETERS(__VA_ARGS__)                                        \
    1223             :     DECLARE_DEFAULT_DESCRIPTOR(Name##Descriptor, CallInterfaceDescriptor) \
    1224             :   };
    1225    54478809 : BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR)
    1226             : #undef DEFINE_TFS_BUILTIN_DESCRIPTOR
    1227             : 
    1228             : #undef DECLARE_DEFAULT_DESCRIPTOR
    1229             : #undef DECLARE_DESCRIPTOR_WITH_BASE
    1230             : #undef DECLARE_DESCRIPTOR
    1231             : #undef DECLARE_JS_COMPATIBLE_DESCRIPTOR
    1232             : #undef DEFINE_RESULT_AND_PARAMETERS
    1233             : #undef DEFINE_RESULT_AND_PARAMETERS_NO_CONTEXT
    1234             : #undef DEFINE_PARAMETERS
    1235             : #undef DEFINE_PARAMETERS_NO_CONTEXT
    1236             : #undef DEFINE_RESULT_AND_PARAMETER_TYPES
    1237             : #undef DEFINE_PARAMETER_TYPES
    1238             : #undef DEFINE_JS_PARAMETERS
    1239             : #undef DEFINE_JS_PARAMETER_TYPES
    1240             : 
    1241             : // We define the association between CallDescriptors::Key and the specialized
    1242             : // descriptor here to reduce boilerplate and mistakes.
    1243             : #define DEF_KEY(name, ...) \
    1244             :   CallDescriptors::Key name##Descriptor::key() { return CallDescriptors::name; }
    1245             : INTERFACE_DESCRIPTOR_LIST(DEF_KEY)
    1246             : #undef DEF_KEY
    1247             : }  // namespace internal
    1248             : }  // namespace v8
    1249             : 
    1250             : #endif  // V8_INTERFACE_DESCRIPTORS_H_

Generated by: LCOV version 1.10