• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_CALL_INTERFACE_DESCRIPTOR_H_
6 #define V8_CALL_INTERFACE_DESCRIPTOR_H_
7 
8 #include "src/assembler.h"
9 #include "src/macro-assembler.h"
10 
11 namespace v8 {
12 namespace internal {
13 
14 class PlatformInterfaceDescriptor;
15 
16 #define INTERFACE_DESCRIPTOR_LIST(V)   \
17   V(Void)                              \
18   V(ContextOnly)                       \
19   V(OnStackWith1Args)                  \
20   V(OnStackWith2Args)                  \
21   V(OnStackWith3Args)                  \
22   V(OnStackWith4Args)                  \
23   V(OnStackWith5Args)                  \
24   V(OnStackWith6Args)                  \
25   V(OnStackWith7Args)                  \
26   V(Load)                              \
27   V(LoadGlobal)                        \
28   V(LoadGlobalWithVector)              \
29   V(Store)                             \
30   V(StoreTransition)                   \
31   V(VectorStoreTransition)             \
32   V(VectorStoreICTrampoline)           \
33   V(VectorStoreIC)                     \
34   V(LoadWithVector)                    \
35   V(VarArgFunction)                    \
36   V(FastNewClosure)                    \
37   V(FastNewContext)                    \
38   V(FastNewObject)                     \
39   V(FastNewRestParameter)              \
40   V(FastNewSloppyArguments)            \
41   V(FastNewStrictArguments)            \
42   V(TypeConversion)                    \
43   V(Typeof)                            \
44   V(FastCloneRegExp)                   \
45   V(FastCloneShallowArray)             \
46   V(FastCloneShallowObject)            \
47   V(CreateAllocationSite)              \
48   V(CreateWeakCell)                    \
49   V(CallFunction)                      \
50   V(CallFunctionWithFeedback)          \
51   V(CallFunctionWithFeedbackAndVector) \
52   V(CallConstruct)                     \
53   V(CallTrampoline)                    \
54   V(ConstructStub)                     \
55   V(ConstructTrampoline)               \
56   V(RegExpConstructResult)             \
57   V(TransitionElementsKind)            \
58   V(AllocateHeapNumber)                \
59   V(AllocateFloat32x4)                 \
60   V(AllocateInt32x4)                   \
61   V(AllocateUint32x4)                  \
62   V(AllocateBool32x4)                  \
63   V(AllocateInt16x8)                   \
64   V(AllocateUint16x8)                  \
65   V(AllocateBool16x8)                  \
66   V(AllocateInt8x16)                   \
67   V(AllocateUint8x16)                  \
68   V(AllocateBool8x16)                  \
69   V(ArrayNoArgumentConstructor)        \
70   V(ArraySingleArgumentConstructor)    \
71   V(ArrayNArgumentsConstructor)        \
72   V(Compare)                           \
73   V(BinaryOp)                          \
74   V(BinaryOpWithAllocationSite)        \
75   V(CountOp)                           \
76   V(StringAdd)                         \
77   V(StringCompare)                     \
78   V(Keyed)                             \
79   V(Named)                             \
80   V(HasProperty)                       \
81   V(CallHandler)                       \
82   V(ArgumentAdaptor)                   \
83   V(ApiCallbackWith0Args)              \
84   V(ApiCallbackWith1Args)              \
85   V(ApiCallbackWith2Args)              \
86   V(ApiCallbackWith3Args)              \
87   V(ApiCallbackWith4Args)              \
88   V(ApiCallbackWith5Args)              \
89   V(ApiCallbackWith6Args)              \
90   V(ApiCallbackWith7Args)              \
91   V(ApiGetter)                         \
92   V(StoreGlobalViaContext)             \
93   V(MathPowTagged)                     \
94   V(MathPowInteger)                    \
95   V(GrowArrayElements)                 \
96   V(InterpreterDispatch)               \
97   V(InterpreterPushArgsAndCall)        \
98   V(InterpreterPushArgsAndConstruct)   \
99   V(InterpreterCEntry)                 \
100   V(ResumeGenerator)
101 
102 class CallInterfaceDescriptorData {
103  public:
CallInterfaceDescriptorData()104   CallInterfaceDescriptorData()
105       : register_param_count_(-1), function_type_(nullptr) {}
106 
107   // A copy of the passed in registers and param_representations is made
108   // and owned by the CallInterfaceDescriptorData.
109 
InitializePlatformIndependent(FunctionType * function_type)110   void InitializePlatformIndependent(FunctionType* function_type) {
111     function_type_ = function_type;
112   }
113 
114   // TODO(mvstanton): Instead of taking parallel arrays register and
115   // param_representations, how about a struct that puts the representation
116   // and register side by side (eg, RegRep(r1, Representation::Tagged()).
117   // The same should go for the CodeStubDescriptor class.
118   void InitializePlatformSpecific(
119       int register_parameter_count, const Register* registers,
120       PlatformInterfaceDescriptor* platform_descriptor = NULL);
121 
IsInitialized()122   bool IsInitialized() const { return register_param_count_ >= 0; }
123 
param_count()124   int param_count() const { return function_type_->Arity(); }
register_param_count()125   int register_param_count() const { return register_param_count_; }
register_param(int index)126   Register register_param(int index) const { return register_params_[index]; }
register_params()127   Register* register_params() const { return register_params_.get(); }
param_type(int index)128   Type* param_type(int index) const { return function_type_->Parameter(index); }
platform_specific_descriptor()129   PlatformInterfaceDescriptor* platform_specific_descriptor() const {
130     return platform_specific_descriptor_;
131   }
132 
function_type()133   FunctionType* function_type() const { return function_type_; }
134 
135  private:
136   int register_param_count_;
137 
138   // The Register params are allocated dynamically by the
139   // InterfaceDescriptor, and freed on destruction. This is because static
140   // arrays of Registers cause creation of runtime static initializers
141   // which we don't want.
142   base::SmartArrayPointer<Register> register_params_;
143 
144   // Specifies types for parameters and return
145   FunctionType* function_type_;
146 
147   PlatformInterfaceDescriptor* platform_specific_descriptor_;
148 
149   DISALLOW_COPY_AND_ASSIGN(CallInterfaceDescriptorData);
150 };
151 
152 
153 class CallDescriptors {
154  public:
155   enum Key {
156 #define DEF_ENUM(name) name,
157     INTERFACE_DESCRIPTOR_LIST(DEF_ENUM)
158 #undef DEF_ENUM
159     NUMBER_OF_DESCRIPTORS
160   };
161 };
162 
163 
164 class CallInterfaceDescriptor {
165  public:
CallInterfaceDescriptor()166   CallInterfaceDescriptor() : data_(NULL) {}
~CallInterfaceDescriptor()167   virtual ~CallInterfaceDescriptor() {}
168 
CallInterfaceDescriptor(Isolate * isolate,CallDescriptors::Key key)169   CallInterfaceDescriptor(Isolate* isolate, CallDescriptors::Key key)
170       : data_(isolate->call_descriptor_data(key)) {}
171 
GetParameterCount()172   int GetParameterCount() const { return data()->param_count(); }
173 
GetRegisterParameterCount()174   int GetRegisterParameterCount() const {
175     return data()->register_param_count();
176   }
177 
GetStackParameterCount()178   int GetStackParameterCount() const {
179     return data()->function_type()->Arity() - data()->register_param_count();
180   }
181 
GetRegisterParameter(int index)182   Register GetRegisterParameter(int index) const {
183     return data()->register_param(index);
184   }
185 
GetParameterType(int index)186   Type* GetParameterType(int index) const {
187     DCHECK(index < data()->param_count());
188     return data()->param_type(index);
189   }
190 
191   // Some platforms have extra information to associate with the descriptor.
platform_specific_descriptor()192   PlatformInterfaceDescriptor* platform_specific_descriptor() const {
193     return data()->platform_specific_descriptor();
194   }
195 
GetFunctionType()196   FunctionType* GetFunctionType() const { return data()->function_type(); }
197 
198   static const Register ContextRegister();
199 
200   const char* DebugName(Isolate* isolate) const;
201 
202   static FunctionType* BuildDefaultFunctionType(Isolate* isolate,
203                                                 int paramater_count);
204 
205  protected:
data()206   const CallInterfaceDescriptorData* data() const { return data_; }
207 
BuildCallInterfaceDescriptorFunctionType(Isolate * isolate,int register_param_count)208   virtual FunctionType* BuildCallInterfaceDescriptorFunctionType(
209       Isolate* isolate, int register_param_count) {
210     return BuildDefaultFunctionType(isolate, register_param_count);
211   }
212 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)213   virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
214     UNREACHABLE();
215   }
216 
Initialize(Isolate * isolate,CallDescriptors::Key key)217   void Initialize(Isolate* isolate, CallDescriptors::Key key) {
218     if (!data()->IsInitialized()) {
219       CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key);
220       DCHECK(d == data());  // d should be a modifiable pointer to data().
221       InitializePlatformSpecific(d);
222       FunctionType* function_type = BuildCallInterfaceDescriptorFunctionType(
223           isolate, d->register_param_count());
224       d->InitializePlatformIndependent(function_type);
225     }
226   }
227 
228   // Initializes |data| using the platform dependent default set of registers.
229   // It is intended to be used for TurboFan stubs when particular set of
230   // registers does not matter.
231   static void DefaultInitializePlatformSpecific(
232       CallInterfaceDescriptorData* data, int register_parameter_count);
233 
234  private:
235   const CallInterfaceDescriptorData* data_;
236 };
237 
238 #define DECLARE_DESCRIPTOR_WITH_BASE(name, base)           \
239  public:                                                   \
240   explicit name(Isolate* isolate) : base(isolate, key()) { \
241     Initialize(isolate, key());                            \
242   }                                                        \
243   static inline CallDescriptors::Key key();
244 
245 #define DECLARE_DEFAULT_DESCRIPTOR(name, base, parameter_count)            \
246   DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                 \
247  protected:                                                                \
248   void InitializePlatformSpecific(CallInterfaceDescriptorData* data)       \
249       override {                                                           \
250     DefaultInitializePlatformSpecific(data, parameter_count);              \
251   }                                                                        \
252   name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \
253                                                                            \
254  public:
255 
256 #define DECLARE_DESCRIPTOR(name, base)                                         \
257   DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                     \
258  protected:                                                                    \
259   void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \
260   name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {}     \
261                                                                                \
262  public:
263 
264 #define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \
265   DECLARE_DESCRIPTOR(name, base)                                 \
266  protected:                                                      \
267   FunctionType* BuildCallInterfaceDescriptorFunctionType(        \
268       Isolate* isolate, int register_param_count) override;      \
269                                                                  \
270  public:
271 
272 #define DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(name, base, arg) \
273   DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                  \
274  protected:                                                                 \
275   FunctionType* BuildCallInterfaceDescriptorFunctionType(                   \
276       Isolate* isolate, int register_param_count) override {                \
277     return BuildCallInterfaceDescriptorFunctionTypeWithArg(                 \
278         isolate, register_param_count, arg);                                \
279   }                                                                         \
280                                                                             \
281  public:
282 
283 class VoidDescriptor : public CallInterfaceDescriptor {
284  public:
285   DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor)
286 };
287 
288 class ContextOnlyDescriptor : public CallInterfaceDescriptor {
289  public:
290   DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor)
291 };
292 
293 // The OnStackWith*ArgsDescriptors have a lot of boilerplate. The superclass
294 // OnStackArgsDescriptorBase is not meant to be instantiated directly and has no
295 // public constructors to ensure this is so.contains all the logic, and the
296 //
297 // Use OnStackArgsDescriptorBase::ForArgs(isolate, parameter_count) to
298 // instantiate a descriptor with the number of args.
299 class OnStackArgsDescriptorBase : public CallInterfaceDescriptor {
300  public:
301   static CallInterfaceDescriptor ForArgs(Isolate* isolate, int parameter_count);
302 
303  protected:
OnStackArgsDescriptorBase(Isolate * isolate,CallDescriptors::Key key)304   OnStackArgsDescriptorBase(Isolate* isolate, CallDescriptors::Key key)
305       : CallInterfaceDescriptor(isolate, key) {}
306   void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override;
307   FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg(
308       Isolate* isolate, int register_parameter_count, int parameter_count);
309 };
310 
311 class OnStackWith1ArgsDescriptor : public OnStackArgsDescriptorBase {
312  public:
313   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith1ArgsDescriptor,
314                                                      OnStackArgsDescriptorBase,
315                                                      1)
316 };
317 
318 class OnStackWith2ArgsDescriptor : public OnStackArgsDescriptorBase {
319  public:
320   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith2ArgsDescriptor,
321                                                      OnStackArgsDescriptorBase,
322                                                      2)
323 };
324 
325 class OnStackWith3ArgsDescriptor : public OnStackArgsDescriptorBase {
326  public:
327   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith3ArgsDescriptor,
328                                                      OnStackArgsDescriptorBase,
329                                                      3)
330 };
331 
332 class OnStackWith4ArgsDescriptor : public OnStackArgsDescriptorBase {
333  public:
334   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith4ArgsDescriptor,
335                                                      OnStackArgsDescriptorBase,
336                                                      4)
337 };
338 
339 class OnStackWith5ArgsDescriptor : public OnStackArgsDescriptorBase {
340  public:
341   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith5ArgsDescriptor,
342                                                      OnStackArgsDescriptorBase,
343                                                      5)
344 };
345 
346 class OnStackWith6ArgsDescriptor : public OnStackArgsDescriptorBase {
347  public:
348   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith6ArgsDescriptor,
349                                                      OnStackArgsDescriptorBase,
350                                                      6)
351 };
352 
353 class OnStackWith7ArgsDescriptor : public OnStackArgsDescriptorBase {
354  public:
355   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith7ArgsDescriptor,
356                                                      OnStackArgsDescriptorBase,
357                                                      7)
358 };
359 
360 // LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs.
361 class LoadDescriptor : public CallInterfaceDescriptor {
362  public:
363   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadDescriptor,
364                                                CallInterfaceDescriptor)
365 
366   enum ParameterIndices { kReceiverIndex, kNameIndex, kSlotIndex };
367   static const Register ReceiverRegister();
368   static const Register NameRegister();
369   static const Register SlotRegister();
370 };
371 
372 class LoadGlobalDescriptor : public CallInterfaceDescriptor {
373  public:
374   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalDescriptor,
375                                                CallInterfaceDescriptor)
376 
377   enum ParameterIndices { kSlotIndex };
378 
SlotRegister()379   static const Register SlotRegister() {
380     return LoadDescriptor::SlotRegister();
381   }
382 };
383 
384 class StoreDescriptor : public CallInterfaceDescriptor {
385  public:
386   DECLARE_DESCRIPTOR(StoreDescriptor, CallInterfaceDescriptor)
387 
388   enum ParameterIndices {
389     kReceiverIndex,
390     kNameIndex,
391     kValueIndex,
392     kParameterCount
393   };
394   static const Register ReceiverRegister();
395   static const Register NameRegister();
396   static const Register ValueRegister();
397 };
398 
399 
400 class StoreTransitionDescriptor : public StoreDescriptor {
401  public:
402   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreTransitionDescriptor,
403                                                StoreDescriptor)
404 
405   // Extends StoreDescriptor with Map parameter.
406   enum ParameterIndices {
407     kReceiverIndex,
408     kNameIndex,
409     kValueIndex,
410     kMapIndex,
411     kParameterCount
412   };
413 
414   static const Register MapRegister();
415 };
416 
417 
418 class VectorStoreTransitionDescriptor : public StoreDescriptor {
419  public:
420   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(VectorStoreTransitionDescriptor,
421                                                StoreDescriptor)
422 
423   // Extends StoreDescriptor with Map parameter.
424   enum ParameterIndices {
425     kReceiverIndex = 0,
426     kNameIndex = 1,
427     kValueIndex = 2,
428 
429     kMapIndex = 3,
430 
431     kSlotIndex = 4,  // not present on ia32.
432     kVirtualSlotVectorIndex = 4,
433 
434     kVectorIndex = 5
435   };
436 
437   static const Register MapRegister();
438   static const Register SlotRegister();
439   static const Register VectorRegister();
440 };
441 
442 
443 class VectorStoreICTrampolineDescriptor : public StoreDescriptor {
444  public:
445   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
446       VectorStoreICTrampolineDescriptor, StoreDescriptor)
447 
448   enum ParameterIndices { kReceiverIndex, kNameIndex, kValueIndex, kSlotIndex };
449 
450   static const Register SlotRegister();
451 };
452 
453 
454 class VectorStoreICDescriptor : public VectorStoreICTrampolineDescriptor {
455  public:
456   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
457       VectorStoreICDescriptor, VectorStoreICTrampolineDescriptor)
458 
459   enum ParameterIndices {
460     kReceiverIndex,
461     kNameIndex,
462     kValueIndex,
463     kSlotIndex,
464     kVectorIndex
465   };
466 
467   static const Register VectorRegister();
468 };
469 
470 
471 class LoadWithVectorDescriptor : public LoadDescriptor {
472  public:
473   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadWithVectorDescriptor,
474                                                LoadDescriptor)
475 
476   enum ParameterIndices {
477     kReceiverIndex,
478     kNameIndex,
479     kSlotIndex,
480     kVectorIndex
481   };
482 
483   static const Register VectorRegister();
484 };
485 
486 class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor {
487  public:
488   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalWithVectorDescriptor,
489                                                LoadGlobalDescriptor)
490 
491   enum ParameterIndices { kSlotIndex, kVectorIndex };
492 
VectorRegister()493   static const Register VectorRegister() {
494     return LoadWithVectorDescriptor::VectorRegister();
495   }
496 };
497 
498 class FastNewClosureDescriptor : public CallInterfaceDescriptor {
499  public:
500   DECLARE_DESCRIPTOR(FastNewClosureDescriptor, CallInterfaceDescriptor)
501 };
502 
503 
504 class FastNewContextDescriptor : public CallInterfaceDescriptor {
505  public:
506   DECLARE_DESCRIPTOR(FastNewContextDescriptor, CallInterfaceDescriptor)
507 };
508 
509 class FastNewObjectDescriptor : public CallInterfaceDescriptor {
510  public:
511   DECLARE_DESCRIPTOR(FastNewObjectDescriptor, CallInterfaceDescriptor)
512 };
513 
514 class FastNewRestParameterDescriptor : public CallInterfaceDescriptor {
515  public:
516   DECLARE_DESCRIPTOR(FastNewRestParameterDescriptor, CallInterfaceDescriptor)
517 };
518 
519 class FastNewSloppyArgumentsDescriptor : public CallInterfaceDescriptor {
520  public:
521   DECLARE_DESCRIPTOR(FastNewSloppyArgumentsDescriptor,
522                      CallInterfaceDescriptor)
523 };
524 
525 class FastNewStrictArgumentsDescriptor : public CallInterfaceDescriptor {
526  public:
527   DECLARE_DESCRIPTOR(FastNewStrictArgumentsDescriptor,
528                      CallInterfaceDescriptor)
529 };
530 
531 class TypeConversionDescriptor final : public CallInterfaceDescriptor {
532  public:
533   enum ParameterIndices { kArgumentIndex };
534 
535   DECLARE_DESCRIPTOR(TypeConversionDescriptor, CallInterfaceDescriptor)
536 
537   static const Register ArgumentRegister();
538 };
539 
540 class HasPropertyDescriptor final : public CallInterfaceDescriptor {
541  public:
542   enum ParameterIndices { kKeyIndex, kObjectIndex };
543 
544   DECLARE_DEFAULT_DESCRIPTOR(HasPropertyDescriptor, CallInterfaceDescriptor, 2)
545 };
546 
547 class TypeofDescriptor : public CallInterfaceDescriptor {
548  public:
549   DECLARE_DESCRIPTOR(TypeofDescriptor, CallInterfaceDescriptor)
550 };
551 
552 
553 class FastCloneRegExpDescriptor : public CallInterfaceDescriptor {
554  public:
555   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastCloneRegExpDescriptor,
556                                                CallInterfaceDescriptor)
557 };
558 
559 
560 class FastCloneShallowArrayDescriptor : public CallInterfaceDescriptor {
561  public:
562   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastCloneShallowArrayDescriptor,
563                                                CallInterfaceDescriptor)
564 };
565 
566 
567 class FastCloneShallowObjectDescriptor : public CallInterfaceDescriptor {
568  public:
569   DECLARE_DESCRIPTOR(FastCloneShallowObjectDescriptor, CallInterfaceDescriptor)
570 };
571 
572 
573 class CreateAllocationSiteDescriptor : public CallInterfaceDescriptor {
574  public:
575   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CreateAllocationSiteDescriptor,
576                                                CallInterfaceDescriptor)
577 };
578 
579 
580 class CreateWeakCellDescriptor : public CallInterfaceDescriptor {
581  public:
582   enum ParameterIndices {
583     kVectorIndex,
584     kSlotIndex,
585     kValueIndex,
586     kParameterCount
587   };
588 
589   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CreateWeakCellDescriptor,
590                                                CallInterfaceDescriptor)
591 };
592 
593 
594 class CallTrampolineDescriptor : public CallInterfaceDescriptor {
595  public:
596   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallTrampolineDescriptor,
597                                                CallInterfaceDescriptor)
598 };
599 
600 
601 class ConstructStubDescriptor : public CallInterfaceDescriptor {
602  public:
603   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructStubDescriptor,
604                                                CallInterfaceDescriptor)
605 };
606 
607 
608 class ConstructTrampolineDescriptor : public CallInterfaceDescriptor {
609  public:
610   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructTrampolineDescriptor,
611                                                CallInterfaceDescriptor)
612 };
613 
614 
615 class CallFunctionDescriptor : public CallInterfaceDescriptor {
616  public:
617   DECLARE_DESCRIPTOR(CallFunctionDescriptor, CallInterfaceDescriptor)
618 };
619 
620 
621 class CallFunctionWithFeedbackDescriptor : public CallInterfaceDescriptor {
622  public:
623   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
624       CallFunctionWithFeedbackDescriptor, CallInterfaceDescriptor)
625 };
626 
627 
628 class CallFunctionWithFeedbackAndVectorDescriptor
629     : public CallInterfaceDescriptor {
630  public:
631   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
632       CallFunctionWithFeedbackAndVectorDescriptor, CallInterfaceDescriptor)
633 };
634 
635 
636 class CallConstructDescriptor : public CallInterfaceDescriptor {
637  public:
638   DECLARE_DESCRIPTOR(CallConstructDescriptor, CallInterfaceDescriptor)
639 };
640 
641 
642 class RegExpConstructResultDescriptor : public CallInterfaceDescriptor {
643  public:
644   DECLARE_DESCRIPTOR(RegExpConstructResultDescriptor, CallInterfaceDescriptor)
645 };
646 
647 
648 class StoreGlobalViaContextDescriptor : public CallInterfaceDescriptor {
649  public:
650   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreGlobalViaContextDescriptor,
651                                                CallInterfaceDescriptor)
652 
653   static const Register SlotRegister();
654   static const Register ValueRegister();
655 };
656 
657 
658 class TransitionElementsKindDescriptor : public CallInterfaceDescriptor {
659  public:
660   DECLARE_DESCRIPTOR(TransitionElementsKindDescriptor, CallInterfaceDescriptor)
661 };
662 
663 
664 class AllocateHeapNumberDescriptor : public CallInterfaceDescriptor {
665  public:
666   DECLARE_DESCRIPTOR(AllocateHeapNumberDescriptor, CallInterfaceDescriptor)
667 };
668 
669 #define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type)         \
670   class Allocate##Type##Descriptor : public CallInterfaceDescriptor {       \
671    public:                                                                  \
672     DECLARE_DESCRIPTOR(Allocate##Type##Descriptor, CallInterfaceDescriptor) \
673   };
SIMD128_TYPES(SIMD128_ALLOC_DESC)674 SIMD128_TYPES(SIMD128_ALLOC_DESC)
675 #undef SIMD128_ALLOC_DESC
676 
677 class ArrayNoArgumentConstructorDescriptor : public CallInterfaceDescriptor {
678  public:
679   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
680       ArrayNoArgumentConstructorDescriptor, CallInterfaceDescriptor)
681   enum ParameterIndices {
682     kFunctionIndex,
683     kAllocationSiteIndex,
684     kArgumentCountIndex,
685     kFunctionParameterIndex,
686     kContextIndex
687   };
688 };
689 
690 class ArraySingleArgumentConstructorDescriptor
691     : public CallInterfaceDescriptor {
692  public:
693   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
694       ArraySingleArgumentConstructorDescriptor, CallInterfaceDescriptor)
695   enum ParameterIndices {
696     kFunctionIndex,
697     kAllocationSiteIndex,
698     kArgumentCountIndex,
699     kFunctionParameterIndex,
700     kArraySizeSmiParameterIndex,
701     kContextIndex
702   };
703 };
704 
705 class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor {
706  public:
707   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
708       ArrayNArgumentsConstructorDescriptor, CallInterfaceDescriptor)
709   enum ParameterIndices {
710     kFunctionIndex,
711     kAllocationSiteIndex,
712     kArgumentCountIndex,
713     kContextIndex
714   };
715 };
716 
717 
718 class CompareDescriptor : public CallInterfaceDescriptor {
719  public:
720   DECLARE_DESCRIPTOR(CompareDescriptor, CallInterfaceDescriptor)
721 };
722 
723 
724 class BinaryOpDescriptor : public CallInterfaceDescriptor {
725  public:
726   DECLARE_DESCRIPTOR(BinaryOpDescriptor, CallInterfaceDescriptor)
727 };
728 
729 
730 class BinaryOpWithAllocationSiteDescriptor : public CallInterfaceDescriptor {
731  public:
732   DECLARE_DESCRIPTOR(BinaryOpWithAllocationSiteDescriptor,
733                      CallInterfaceDescriptor)
734 };
735 
736 class CountOpDescriptor final : public CallInterfaceDescriptor {
737  public:
738   DECLARE_DESCRIPTOR(CountOpDescriptor, CallInterfaceDescriptor)
739 };
740 
741 class StringAddDescriptor : public CallInterfaceDescriptor {
742  public:
743   DECLARE_DESCRIPTOR(StringAddDescriptor, CallInterfaceDescriptor)
744 };
745 
746 
747 class StringCompareDescriptor : public CallInterfaceDescriptor {
748  public:
749   DECLARE_DESCRIPTOR(StringCompareDescriptor, CallInterfaceDescriptor)
750 
751   enum ParameterIndices { kLeftIndex, kRightIndex, kParameterCount };
752   static const Register LeftRegister();
753   static const Register RightRegister();
754 };
755 
756 
757 class KeyedDescriptor : public CallInterfaceDescriptor {
758  public:
759   DECLARE_DESCRIPTOR(KeyedDescriptor, CallInterfaceDescriptor)
760 };
761 
762 
763 class NamedDescriptor : public CallInterfaceDescriptor {
764  public:
765   DECLARE_DESCRIPTOR(NamedDescriptor, CallInterfaceDescriptor)
766 };
767 
768 
769 class CallHandlerDescriptor : public CallInterfaceDescriptor {
770  public:
771   DECLARE_DESCRIPTOR(CallHandlerDescriptor, CallInterfaceDescriptor)
772 };
773 
774 
775 class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor {
776  public:
777   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArgumentAdaptorDescriptor,
778                                                CallInterfaceDescriptor)
779 };
780 
781 // The ApiCallback*Descriptors have a lot of boilerplate. The superclass
782 // ApiCallbackDescriptorBase contains all the logic, and the
783 // ApiCallbackWith*ArgsDescriptor merely instantiate these with a
784 // parameter for the number of args.
785 //
786 // The base class is not meant to be instantiated directly and has no
787 // public constructors to ensure this is so.
788 //
789 // The simplest usage for all the ApiCallback*Descriptors is probably
790 //   ApiCallbackDescriptorBase::ForArgs(isolate, argc)
791 //
792 class ApiCallbackDescriptorBase : public CallInterfaceDescriptor {
793  public:
794   static CallInterfaceDescriptor ForArgs(Isolate* isolate, int argc);
795 
796  protected:
ApiCallbackDescriptorBase(Isolate * isolate,CallDescriptors::Key key)797   ApiCallbackDescriptorBase(Isolate* isolate, CallDescriptors::Key key)
798       : CallInterfaceDescriptor(isolate, key) {}
799   void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override;
800   FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg(
801       Isolate* isolate, int parameter_count, int argc);
802 };
803 
804 class ApiCallbackWith0ArgsDescriptor : public ApiCallbackDescriptorBase {
805  public:
806   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
807       ApiCallbackWith0ArgsDescriptor, ApiCallbackDescriptorBase, 0)
808 };
809 
810 class ApiCallbackWith1ArgsDescriptor : public ApiCallbackDescriptorBase {
811  public:
812   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
813       ApiCallbackWith1ArgsDescriptor, ApiCallbackDescriptorBase, 1)
814 };
815 
816 class ApiCallbackWith2ArgsDescriptor : public ApiCallbackDescriptorBase {
817  public:
818   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
819       ApiCallbackWith2ArgsDescriptor, ApiCallbackDescriptorBase, 2)
820 };
821 
822 class ApiCallbackWith3ArgsDescriptor : public ApiCallbackDescriptorBase {
823  public:
824   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
825       ApiCallbackWith3ArgsDescriptor, ApiCallbackDescriptorBase, 3)
826 };
827 
828 class ApiCallbackWith4ArgsDescriptor : public ApiCallbackDescriptorBase {
829  public:
830   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
831       ApiCallbackWith4ArgsDescriptor, ApiCallbackDescriptorBase, 4)
832 };
833 
834 class ApiCallbackWith5ArgsDescriptor : public ApiCallbackDescriptorBase {
835  public:
836   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
837       ApiCallbackWith5ArgsDescriptor, ApiCallbackDescriptorBase, 5)
838 };
839 
840 class ApiCallbackWith6ArgsDescriptor : public ApiCallbackDescriptorBase {
841  public:
842   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
843       ApiCallbackWith6ArgsDescriptor, ApiCallbackDescriptorBase, 6)
844 };
845 
846 class ApiCallbackWith7ArgsDescriptor : public ApiCallbackDescriptorBase {
847  public:
848   DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(
849       ApiCallbackWith7ArgsDescriptor, ApiCallbackDescriptorBase, 7)
850 };
851 
852 
853 class ApiGetterDescriptor : public CallInterfaceDescriptor {
854  public:
855   DECLARE_DESCRIPTOR(ApiGetterDescriptor, CallInterfaceDescriptor)
856 
857   static const Register ReceiverRegister();
858   static const Register HolderRegister();
859   static const Register CallbackRegister();
860 };
861 
862 class MathPowTaggedDescriptor : public CallInterfaceDescriptor {
863  public:
864   DECLARE_DESCRIPTOR(MathPowTaggedDescriptor, CallInterfaceDescriptor)
865 
866   static const Register exponent();
867 };
868 
869 class MathPowIntegerDescriptor : public CallInterfaceDescriptor {
870  public:
871   DECLARE_DESCRIPTOR(MathPowIntegerDescriptor, CallInterfaceDescriptor)
872 
873   static const Register exponent();
874 };
875 
876 class VarArgFunctionDescriptor : public CallInterfaceDescriptor {
877  public:
878   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(VarArgFunctionDescriptor,
879                                                CallInterfaceDescriptor)
880 };
881 
882 class GrowArrayElementsDescriptor : public CallInterfaceDescriptor {
883  public:
884   DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor)
885 
886   enum RegisterInfo { kObjectIndex, kKeyIndex };
887   static const Register ObjectRegister();
888   static const Register KeyRegister();
889 };
890 
891 class InterpreterDispatchDescriptor : public CallInterfaceDescriptor {
892  public:
893   DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor,
894                                                CallInterfaceDescriptor)
895 
896   static const int kAccumulatorParameter = 0;
897   static const int kBytecodeOffsetParameter = 1;
898   static const int kBytecodeArrayParameter = 2;
899   static const int kDispatchTableParameter = 3;
900 };
901 
902 class InterpreterPushArgsAndCallDescriptor : public CallInterfaceDescriptor {
903  public:
904   DECLARE_DESCRIPTOR(InterpreterPushArgsAndCallDescriptor,
905                      CallInterfaceDescriptor)
906 };
907 
908 
909 class InterpreterPushArgsAndConstructDescriptor
910     : public CallInterfaceDescriptor {
911  public:
912   DECLARE_DESCRIPTOR(InterpreterPushArgsAndConstructDescriptor,
913                      CallInterfaceDescriptor)
914 };
915 
916 
917 class InterpreterCEntryDescriptor : public CallInterfaceDescriptor {
918  public:
919   DECLARE_DESCRIPTOR(InterpreterCEntryDescriptor, CallInterfaceDescriptor)
920 };
921 
922 class ResumeGeneratorDescriptor final : public CallInterfaceDescriptor {
923  public:
924   DECLARE_DESCRIPTOR(ResumeGeneratorDescriptor, CallInterfaceDescriptor)
925 };
926 
927 #undef DECLARE_DESCRIPTOR_WITH_BASE
928 #undef DECLARE_DESCRIPTOR
929 #undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE
930 #undef DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG
931 
932 // We define the association between CallDescriptors::Key and the specialized
933 // descriptor here to reduce boilerplate and mistakes.
934 #define DEF_KEY(name) \
935   CallDescriptors::Key name##Descriptor::key() { return CallDescriptors::name; }
936 INTERFACE_DESCRIPTOR_LIST(DEF_KEY)
937 #undef DEF_KEY
938 }  // namespace internal
939 }  // namespace v8
940 
941 
942 #if V8_TARGET_ARCH_ARM64
943 #include "src/arm64/interface-descriptors-arm64.h"
944 #elif V8_TARGET_ARCH_ARM
945 #include "src/arm/interface-descriptors-arm.h"
946 #endif
947 
948 #endif  // V8_CALL_INTERFACE_DESCRIPTOR_H_
949