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