blob: fb1969d8ef7d27979557581339145dd28371c197 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
11namespace v8 {
12namespace internal {
13
14class PlatformInterfaceDescriptor;
15
16#define INTERFACE_DESCRIPTOR_LIST(V) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017 V(Void) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018 V(Load) \
19 V(Store) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -040020 V(StoreTransition) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000021 V(VectorStoreTransition) \
22 V(VectorStoreICTrampoline) \
23 V(VectorStoreIC) \
24 V(InstanceOf) \
25 V(LoadWithVector) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026 V(FastNewClosure) \
27 V(FastNewContext) \
Ben Murdoch097c5b22016-05-18 11:27:45 +010028 V(FastNewObject) \
29 V(FastNewRestParameter) \
30 V(FastNewSloppyArguments) \
31 V(FastNewStrictArguments) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000032 V(ToNumber) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000033 V(ToLength) \
34 V(ToString) \
Ben Murdoch097c5b22016-05-18 11:27:45 +010035 V(ToName) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036 V(ToObject) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037 V(NumberToString) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038 V(Typeof) \
39 V(FastCloneRegExp) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000040 V(FastCloneShallowArray) \
41 V(FastCloneShallowObject) \
42 V(CreateAllocationSite) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043 V(CreateWeakCell) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000044 V(CallFunction) \
45 V(CallFunctionWithFeedback) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 V(CallFunctionWithFeedbackAndVector) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000047 V(CallConstruct) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000048 V(CallTrampoline) \
49 V(ConstructStub) \
50 V(ConstructTrampoline) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000051 V(RegExpConstructResult) \
52 V(TransitionElementsKind) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -040053 V(AllocateHeapNumber) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054 V(AllocateMutableHeapNumber) \
55 V(AllocateInNewSpace) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000056 V(ArrayConstructorConstantArgCount) \
57 V(ArrayConstructor) \
58 V(InternalArrayConstructorConstantArgCount) \
59 V(InternalArrayConstructor) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000060 V(Compare) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061 V(CompareNil) \
62 V(ToBoolean) \
63 V(BinaryOp) \
64 V(BinaryOpWithAllocationSite) \
65 V(StringAdd) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000066 V(StringCompare) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000067 V(Keyed) \
68 V(Named) \
69 V(CallHandler) \
70 V(ArgumentAdaptor) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000071 V(ApiFunction) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000072 V(ApiAccessor) \
73 V(ApiGetter) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 V(LoadGlobalViaContext) \
75 V(StoreGlobalViaContext) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000076 V(MathPowTagged) \
77 V(MathPowInteger) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078 V(ContextOnly) \
79 V(GrowArrayElements) \
Ben Murdoch097c5b22016-05-18 11:27:45 +010080 V(InterpreterDispatch) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000081 V(InterpreterPushArgsAndCall) \
82 V(InterpreterPushArgsAndConstruct) \
83 V(InterpreterCEntry)
Ben Murdochb8a8cc12014-11-26 15:28:44 +000084
Ben Murdochb8a8cc12014-11-26 15:28:44 +000085class CallInterfaceDescriptorData {
86 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087 CallInterfaceDescriptorData()
88 : register_param_count_(-1), function_type_(nullptr) {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000089
90 // A copy of the passed in registers and param_representations is made
91 // and owned by the CallInterfaceDescriptorData.
92
Ben Murdoch097c5b22016-05-18 11:27:45 +010093 void InitializePlatformIndependent(FunctionType* function_type) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000094 function_type_ = function_type;
95 }
96
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097 // TODO(mvstanton): Instead of taking parallel arrays register and
98 // param_representations, how about a struct that puts the representation
99 // and register side by side (eg, RegRep(r1, Representation::Tagged()).
100 // The same should go for the CodeStubDescriptor class.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000101 void InitializePlatformSpecific(
102 int register_parameter_count, Register* registers,
103 PlatformInterfaceDescriptor* platform_descriptor = NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000104
105 bool IsInitialized() const { return register_param_count_ >= 0; }
106
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000107 int param_count() const { return function_type_->Arity(); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000108 int register_param_count() const { return register_param_count_; }
109 Register register_param(int index) const { return register_params_[index]; }
110 Register* register_params() const { return register_params_.get(); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000111 Type* param_type(int index) const { return function_type_->Parameter(index); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000112 PlatformInterfaceDescriptor* platform_specific_descriptor() const {
113 return platform_specific_descriptor_;
114 }
115
Ben Murdoch097c5b22016-05-18 11:27:45 +0100116 FunctionType* function_type() const { return function_type_; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000118 private:
119 int register_param_count_;
120
121 // The Register params are allocated dynamically by the
122 // InterfaceDescriptor, and freed on destruction. This is because static
123 // arrays of Registers cause creation of runtime static initializers
124 // which we don't want.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000125 base::SmartArrayPointer<Register> register_params_;
126
127 // Specifies types for parameters and return
Ben Murdoch097c5b22016-05-18 11:27:45 +0100128 FunctionType* function_type_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129
130 PlatformInterfaceDescriptor* platform_specific_descriptor_;
131
132 DISALLOW_COPY_AND_ASSIGN(CallInterfaceDescriptorData);
133};
134
135
136class CallDescriptors {
137 public:
138 enum Key {
139#define DEF_ENUM(name) name,
140 INTERFACE_DESCRIPTOR_LIST(DEF_ENUM)
141#undef DEF_ENUM
142 NUMBER_OF_DESCRIPTORS
143 };
144};
145
146
147class CallInterfaceDescriptor {
148 public:
149 CallInterfaceDescriptor() : data_(NULL) {}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000150 virtual ~CallInterfaceDescriptor() {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000151
152 CallInterfaceDescriptor(Isolate* isolate, CallDescriptors::Key key)
153 : data_(isolate->call_descriptor_data(key)) {}
154
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155 int GetParameterCount() const { return data()->param_count(); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156
157 int GetRegisterParameterCount() const {
158 return data()->register_param_count();
159 }
160
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000161 int GetStackParameterCount() const {
162 return data()->function_type()->Arity() - data()->register_param_count();
163 }
164
165 Register GetRegisterParameter(int index) const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000166 return data()->register_param(index);
167 }
168
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000169 Type* GetParameterType(int index) const {
170 DCHECK(index < data()->param_count());
171 return data()->param_type(index);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000172 }
173
174 // Some platforms have extra information to associate with the descriptor.
175 PlatformInterfaceDescriptor* platform_specific_descriptor() const {
176 return data()->platform_specific_descriptor();
177 }
178
Ben Murdoch097c5b22016-05-18 11:27:45 +0100179 FunctionType* GetFunctionType() const { return data()->function_type(); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000180
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000181 static const Register ContextRegister();
182
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400183 const char* DebugName(Isolate* isolate) const;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184
Ben Murdoch097c5b22016-05-18 11:27:45 +0100185 static FunctionType* BuildDefaultFunctionType(Isolate* isolate,
186 int paramater_count);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000187
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000188 protected:
189 const CallInterfaceDescriptorData* data() const { return data_; }
190
Ben Murdoch097c5b22016-05-18 11:27:45 +0100191 virtual FunctionType* BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192 Isolate* isolate, int register_param_count) {
193 return BuildDefaultFunctionType(isolate, register_param_count);
194 }
195
196 virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
197 UNREACHABLE();
198 }
199
200 void Initialize(Isolate* isolate, CallDescriptors::Key key) {
201 if (!data()->IsInitialized()) {
202 CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key);
203 InitializePlatformSpecific(d);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100204 FunctionType* function_type = BuildCallInterfaceDescriptorFunctionType(
205 isolate, d->register_param_count());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000206 d->InitializePlatformIndependent(function_type);
207 }
208 }
209
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000210 private:
211 const CallInterfaceDescriptorData* data_;
212};
213
214
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000215#define DECLARE_DESCRIPTOR(name, base) \
216 explicit name(Isolate* isolate) : base(isolate, key()) { \
217 Initialize(isolate, key()); \
218 } \
219 \
220 protected: \
221 void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \
222 name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \
223 \
224 public: \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000225 static inline CallDescriptors::Key key();
226
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000227#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \
228 DECLARE_DESCRIPTOR(name, base) \
229 protected: \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100230 FunctionType* BuildCallInterfaceDescriptorFunctionType( \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000231 Isolate* isolate, int register_param_count) override; \
232 \
233 public:
234
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000235class VoidDescriptor : public CallInterfaceDescriptor {
236 public:
237 DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor)
238};
239
240
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000241// LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs.
242class LoadDescriptor : public CallInterfaceDescriptor {
243 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000244 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadDescriptor,
245 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000246
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000247 enum ParameterIndices { kReceiverIndex, kNameIndex, kSlotIndex };
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000248 static const Register ReceiverRegister();
249 static const Register NameRegister();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000250 static const Register SlotRegister();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000251};
252
253
254class StoreDescriptor : public CallInterfaceDescriptor {
255 public:
256 DECLARE_DESCRIPTOR(StoreDescriptor, CallInterfaceDescriptor)
257
258 enum ParameterIndices {
259 kReceiverIndex,
260 kNameIndex,
261 kValueIndex,
262 kParameterCount
263 };
264 static const Register ReceiverRegister();
265 static const Register NameRegister();
266 static const Register ValueRegister();
267};
268
269
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400270class StoreTransitionDescriptor : public StoreDescriptor {
271 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreTransitionDescriptor,
273 StoreDescriptor)
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400274
275 // Extends StoreDescriptor with Map parameter.
276 enum ParameterIndices {
277 kReceiverIndex,
278 kNameIndex,
279 kValueIndex,
280 kMapIndex,
281 kParameterCount
282 };
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000283
284 static const Register MapRegister();
285};
286
287
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000288class VectorStoreTransitionDescriptor : public StoreDescriptor {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(VectorStoreTransitionDescriptor,
291 StoreDescriptor)
292
293 // Extends StoreDescriptor with Map parameter.
294 enum ParameterIndices {
295 kReceiverIndex = 0,
296 kNameIndex = 1,
297 kValueIndex = 2,
298
299 kMapIndex = 3,
300
301 kSlotIndex = 4, // not present on ia32.
302 kVirtualSlotVectorIndex = 4,
303
304 kVectorIndex = 5
305 };
306
307 static const Register MapRegister();
308 static const Register SlotRegister();
309 static const Register VectorRegister();
310};
311
312
313class InstanceOfDescriptor final : public CallInterfaceDescriptor {
314 public:
315 DECLARE_DESCRIPTOR(InstanceOfDescriptor, CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000316
317 enum ParameterIndices { kLeftIndex, kRightIndex, kParameterCount };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318 static const Register LeftRegister();
319 static const Register RightRegister();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000320};
321
322
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000323class VectorStoreICTrampolineDescriptor : public StoreDescriptor {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000324 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000325 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
326 VectorStoreICTrampolineDescriptor, StoreDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000328 enum ParameterIndices { kReceiverIndex, kNameIndex, kValueIndex, kSlotIndex };
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000329
330 static const Register SlotRegister();
331};
332
333
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334class VectorStoreICDescriptor : public VectorStoreICTrampolineDescriptor {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000335 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000336 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
337 VectorStoreICDescriptor, VectorStoreICTrampolineDescriptor)
338
339 enum ParameterIndices {
340 kReceiverIndex,
341 kNameIndex,
342 kValueIndex,
343 kSlotIndex,
344 kVectorIndex
345 };
346
347 static const Register VectorRegister();
348};
349
350
351class LoadWithVectorDescriptor : public LoadDescriptor {
352 public:
353 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadWithVectorDescriptor,
354 LoadDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355
356 enum ParameterIndices {
357 kReceiverIndex,
358 kNameIndex,
359 kSlotIndex,
360 kVectorIndex
361 };
362
363 static const Register VectorRegister();
364};
365
366
367class FastNewClosureDescriptor : public CallInterfaceDescriptor {
368 public:
369 DECLARE_DESCRIPTOR(FastNewClosureDescriptor, CallInterfaceDescriptor)
370};
371
372
373class FastNewContextDescriptor : public CallInterfaceDescriptor {
374 public:
375 DECLARE_DESCRIPTOR(FastNewContextDescriptor, CallInterfaceDescriptor)
376};
377
Ben Murdoch097c5b22016-05-18 11:27:45 +0100378class FastNewObjectDescriptor : public CallInterfaceDescriptor {
379 public:
380 DECLARE_DESCRIPTOR(FastNewObjectDescriptor, CallInterfaceDescriptor)
381};
382
383class FastNewRestParameterDescriptor : public CallInterfaceDescriptor {
384 public:
385 DECLARE_DESCRIPTOR(FastNewRestParameterDescriptor, CallInterfaceDescriptor)
386};
387
388class FastNewSloppyArgumentsDescriptor : public CallInterfaceDescriptor {
389 public:
390 DECLARE_DESCRIPTOR(FastNewSloppyArgumentsDescriptor,
391 CallInterfaceDescriptor)
392};
393
394class FastNewStrictArgumentsDescriptor : public CallInterfaceDescriptor {
395 public:
396 DECLARE_DESCRIPTOR(FastNewStrictArgumentsDescriptor,
397 CallInterfaceDescriptor)
398};
399
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000400
401class ToNumberDescriptor : public CallInterfaceDescriptor {
402 public:
403 DECLARE_DESCRIPTOR(ToNumberDescriptor, CallInterfaceDescriptor)
404};
405
406
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000407class ToLengthDescriptor : public CallInterfaceDescriptor {
408 public:
409 enum ParameterIndices { kReceiverIndex };
410
411 DECLARE_DESCRIPTOR(ToLengthDescriptor, CallInterfaceDescriptor)
412
413 static const Register ReceiverRegister();
414};
415
416
417class ToStringDescriptor : public CallInterfaceDescriptor {
418 public:
419 enum ParameterIndices { kReceiverIndex };
420
421 DECLARE_DESCRIPTOR(ToStringDescriptor, CallInterfaceDescriptor)
422
423 static const Register ReceiverRegister();
424};
425
426
Ben Murdoch097c5b22016-05-18 11:27:45 +0100427class ToNameDescriptor : public CallInterfaceDescriptor {
428 public:
429 enum ParameterIndices { kReceiverIndex };
430
431 DECLARE_DESCRIPTOR(ToNameDescriptor, CallInterfaceDescriptor)
432
433 static const Register ReceiverRegister();
434};
435
436
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000437class ToObjectDescriptor : public CallInterfaceDescriptor {
438 public:
439 enum ParameterIndices { kReceiverIndex };
440
441 DECLARE_DESCRIPTOR(ToObjectDescriptor, CallInterfaceDescriptor)
442
443 static const Register ReceiverRegister();
444};
445
446
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000447class NumberToStringDescriptor : public CallInterfaceDescriptor {
448 public:
449 DECLARE_DESCRIPTOR(NumberToStringDescriptor, CallInterfaceDescriptor)
450};
451
452
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000453class TypeofDescriptor : public CallInterfaceDescriptor {
454 public:
455 DECLARE_DESCRIPTOR(TypeofDescriptor, CallInterfaceDescriptor)
456};
457
458
459class FastCloneRegExpDescriptor : public CallInterfaceDescriptor {
460 public:
461 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastCloneRegExpDescriptor,
462 CallInterfaceDescriptor)
463};
464
465
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000466class FastCloneShallowArrayDescriptor : public CallInterfaceDescriptor {
467 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000468 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastCloneShallowArrayDescriptor,
469 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000470};
471
472
473class FastCloneShallowObjectDescriptor : public CallInterfaceDescriptor {
474 public:
475 DECLARE_DESCRIPTOR(FastCloneShallowObjectDescriptor, CallInterfaceDescriptor)
476};
477
478
479class CreateAllocationSiteDescriptor : public CallInterfaceDescriptor {
480 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000481 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CreateAllocationSiteDescriptor,
482 CallInterfaceDescriptor)
483};
484
485
486class CreateWeakCellDescriptor : public CallInterfaceDescriptor {
487 public:
488 enum ParameterIndices {
489 kVectorIndex,
490 kSlotIndex,
491 kValueIndex,
492 kParameterCount
493 };
494
495 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CreateWeakCellDescriptor,
496 CallInterfaceDescriptor)
497};
498
499
500class CallTrampolineDescriptor : public CallInterfaceDescriptor {
501 public:
502 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallTrampolineDescriptor,
503 CallInterfaceDescriptor)
504};
505
506
507class ConstructStubDescriptor : public CallInterfaceDescriptor {
508 public:
509 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructStubDescriptor,
510 CallInterfaceDescriptor)
511};
512
513
514class ConstructTrampolineDescriptor : public CallInterfaceDescriptor {
515 public:
516 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructTrampolineDescriptor,
517 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000518};
519
520
521class CallFunctionDescriptor : public CallInterfaceDescriptor {
522 public:
523 DECLARE_DESCRIPTOR(CallFunctionDescriptor, CallInterfaceDescriptor)
524};
525
526
527class CallFunctionWithFeedbackDescriptor : public CallInterfaceDescriptor {
528 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000529 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
530 CallFunctionWithFeedbackDescriptor, CallInterfaceDescriptor)
531};
532
533
534class CallFunctionWithFeedbackAndVectorDescriptor
535 : public CallInterfaceDescriptor {
536 public:
537 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
538 CallFunctionWithFeedbackAndVectorDescriptor, CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000539};
540
541
542class CallConstructDescriptor : public CallInterfaceDescriptor {
543 public:
544 DECLARE_DESCRIPTOR(CallConstructDescriptor, CallInterfaceDescriptor)
545};
546
547
548class RegExpConstructResultDescriptor : public CallInterfaceDescriptor {
549 public:
550 DECLARE_DESCRIPTOR(RegExpConstructResultDescriptor, CallInterfaceDescriptor)
551};
552
553
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000554class LoadGlobalViaContextDescriptor : public CallInterfaceDescriptor {
555 public:
556 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalViaContextDescriptor,
557 CallInterfaceDescriptor)
558
559 static const Register SlotRegister();
560};
561
562
563class StoreGlobalViaContextDescriptor : public CallInterfaceDescriptor {
564 public:
565 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreGlobalViaContextDescriptor,
566 CallInterfaceDescriptor)
567
568 static const Register SlotRegister();
569 static const Register ValueRegister();
570};
571
572
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000573class TransitionElementsKindDescriptor : public CallInterfaceDescriptor {
574 public:
575 DECLARE_DESCRIPTOR(TransitionElementsKindDescriptor, CallInterfaceDescriptor)
576};
577
578
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400579class AllocateHeapNumberDescriptor : public CallInterfaceDescriptor {
580 public:
581 DECLARE_DESCRIPTOR(AllocateHeapNumberDescriptor, CallInterfaceDescriptor)
582};
583
584
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000585class AllocateMutableHeapNumberDescriptor : public CallInterfaceDescriptor {
586 public:
587 DECLARE_DESCRIPTOR(AllocateMutableHeapNumberDescriptor,
588 CallInterfaceDescriptor)
589};
590
591
592class AllocateInNewSpaceDescriptor : public CallInterfaceDescriptor {
593 public:
594 DECLARE_DESCRIPTOR(AllocateInNewSpaceDescriptor, CallInterfaceDescriptor)
595};
596
597
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000598class ArrayConstructorConstantArgCountDescriptor
599 : public CallInterfaceDescriptor {
600 public:
601 DECLARE_DESCRIPTOR(ArrayConstructorConstantArgCountDescriptor,
602 CallInterfaceDescriptor)
603};
604
605
606class ArrayConstructorDescriptor : public CallInterfaceDescriptor {
607 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000608 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArrayConstructorDescriptor,
609 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000610};
611
612
613class InternalArrayConstructorConstantArgCountDescriptor
614 : public CallInterfaceDescriptor {
615 public:
616 DECLARE_DESCRIPTOR(InternalArrayConstructorConstantArgCountDescriptor,
617 CallInterfaceDescriptor)
618};
619
620
621class InternalArrayConstructorDescriptor : public CallInterfaceDescriptor {
622 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000623 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
624 InternalArrayConstructorDescriptor, CallInterfaceDescriptor)
625};
626
627
628class CompareDescriptor : public CallInterfaceDescriptor {
629 public:
630 DECLARE_DESCRIPTOR(CompareDescriptor, CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000631};
632
633
634class CompareNilDescriptor : public CallInterfaceDescriptor {
635 public:
636 DECLARE_DESCRIPTOR(CompareNilDescriptor, CallInterfaceDescriptor)
637};
638
639
640class ToBooleanDescriptor : public CallInterfaceDescriptor {
641 public:
642 DECLARE_DESCRIPTOR(ToBooleanDescriptor, CallInterfaceDescriptor)
643};
644
645
646class BinaryOpDescriptor : public CallInterfaceDescriptor {
647 public:
648 DECLARE_DESCRIPTOR(BinaryOpDescriptor, CallInterfaceDescriptor)
649};
650
651
652class BinaryOpWithAllocationSiteDescriptor : public CallInterfaceDescriptor {
653 public:
654 DECLARE_DESCRIPTOR(BinaryOpWithAllocationSiteDescriptor,
655 CallInterfaceDescriptor)
656};
657
658
659class StringAddDescriptor : public CallInterfaceDescriptor {
660 public:
661 DECLARE_DESCRIPTOR(StringAddDescriptor, CallInterfaceDescriptor)
662};
663
664
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000665class StringCompareDescriptor : public CallInterfaceDescriptor {
666 public:
667 DECLARE_DESCRIPTOR(StringCompareDescriptor, CallInterfaceDescriptor)
668
669 enum ParameterIndices { kLeftIndex, kRightIndex, kParameterCount };
670 static const Register LeftRegister();
671 static const Register RightRegister();
672};
673
674
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000675class KeyedDescriptor : public CallInterfaceDescriptor {
676 public:
677 DECLARE_DESCRIPTOR(KeyedDescriptor, CallInterfaceDescriptor)
678};
679
680
681class NamedDescriptor : public CallInterfaceDescriptor {
682 public:
683 DECLARE_DESCRIPTOR(NamedDescriptor, CallInterfaceDescriptor)
684};
685
686
687class CallHandlerDescriptor : public CallInterfaceDescriptor {
688 public:
689 DECLARE_DESCRIPTOR(CallHandlerDescriptor, CallInterfaceDescriptor)
690};
691
692
693class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor {
694 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000695 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArgumentAdaptorDescriptor,
696 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000697};
698
699
700class ApiFunctionDescriptor : public CallInterfaceDescriptor {
701 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000702 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiFunctionDescriptor,
703 CallInterfaceDescriptor)
704};
705
706
707class ApiAccessorDescriptor : public CallInterfaceDescriptor {
708 public:
709 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiAccessorDescriptor,
710 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000711};
712
713
714class ApiGetterDescriptor : public CallInterfaceDescriptor {
715 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000716 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiGetterDescriptor,
717 CallInterfaceDescriptor)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000718
719 static const Register function_address();
720};
721
722
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000723class MathPowTaggedDescriptor : public CallInterfaceDescriptor {
724 public:
725 DECLARE_DESCRIPTOR(MathPowTaggedDescriptor, CallInterfaceDescriptor)
726
727 static const Register exponent();
728};
729
730
731class MathPowIntegerDescriptor : public CallInterfaceDescriptor {
732 public:
733 DECLARE_DESCRIPTOR(MathPowIntegerDescriptor, CallInterfaceDescriptor)
734
735 static const Register exponent();
736};
737
738
739class ContextOnlyDescriptor : public CallInterfaceDescriptor {
740 public:
741 DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor)
742};
743
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000744
745class GrowArrayElementsDescriptor : public CallInterfaceDescriptor {
746 public:
747 DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor)
748
749 enum RegisterInfo { kObjectIndex, kKeyIndex };
750 static const Register ObjectRegister();
751 static const Register KeyRegister();
752};
753
Ben Murdoch097c5b22016-05-18 11:27:45 +0100754class InterpreterDispatchDescriptor : public CallInterfaceDescriptor {
755 public:
756 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor,
757 CallInterfaceDescriptor)
758
759 static const int kAccumulatorParameter = 0;
760 static const int kRegisterFileParameter = 1;
761 static const int kBytecodeOffsetParameter = 2;
762 static const int kBytecodeArrayParameter = 3;
763 static const int kDispatchTableParameter = 4;
764 static const int kContextParameter = 5;
765};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000766
767class InterpreterPushArgsAndCallDescriptor : public CallInterfaceDescriptor {
768 public:
769 DECLARE_DESCRIPTOR(InterpreterPushArgsAndCallDescriptor,
770 CallInterfaceDescriptor)
771};
772
773
774class InterpreterPushArgsAndConstructDescriptor
775 : public CallInterfaceDescriptor {
776 public:
777 DECLARE_DESCRIPTOR(InterpreterPushArgsAndConstructDescriptor,
778 CallInterfaceDescriptor)
779};
780
781
782class InterpreterCEntryDescriptor : public CallInterfaceDescriptor {
783 public:
784 DECLARE_DESCRIPTOR(InterpreterCEntryDescriptor, CallInterfaceDescriptor)
785};
786
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000787#undef DECLARE_DESCRIPTOR
788
789
790// We define the association between CallDescriptors::Key and the specialized
791// descriptor here to reduce boilerplate and mistakes.
792#define DEF_KEY(name) \
793 CallDescriptors::Key name##Descriptor::key() { return CallDescriptors::name; }
794INTERFACE_DESCRIPTOR_LIST(DEF_KEY)
795#undef DEF_KEY
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000796} // namespace internal
797} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000798
799
800#if V8_TARGET_ARCH_ARM64
801#include "src/arm64/interface-descriptors-arm64.h"
802#elif V8_TARGET_ARCH_ARM
803#include "src/arm/interface-descriptors-arm.h"
804#endif
805
806#endif // V8_CALL_INTERFACE_DESCRIPTOR_H_