interface-descriptors.h 32.4 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_CALL_INTERFACE_DESCRIPTOR_H_
#define V8_CALL_INTERFACE_DESCRIPTOR_H_

8 9
#include <memory>

10
#include "src/assembler.h"
11
#include "src/globals.h"
12 13 14 15 16 17 18
#include "src/macro-assembler.h"

namespace v8 {
namespace internal {

class PlatformInterfaceDescriptor;

19 20 21 22 23
#define INTERFACE_DESCRIPTOR_LIST(V)      \
  V(Void)                                 \
  V(ContextOnly)                          \
  V(Load)                                 \
  V(LoadWithVector)                       \
24
  V(LoadField)                            \
25
  V(LoadICProtoArray)                     \
26 27 28 29
  V(LoadGlobal)                           \
  V(LoadGlobalWithVector)                 \
  V(Store)                                \
  V(StoreWithVector)                      \
30
  V(StoreNamedTransition)                 \
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
  V(StoreTransition)                      \
  V(VarArgFunction)                       \
  V(FastNewClosure)                       \
  V(FastNewFunctionContext)               \
  V(FastNewObject)                        \
  V(FastNewRestParameter)                 \
  V(FastNewSloppyArguments)               \
  V(FastNewStrictArguments)               \
  V(TypeConversion)                       \
  V(Typeof)                               \
  V(FastCloneRegExp)                      \
  V(FastCloneShallowArray)                \
  V(FastCloneShallowObject)               \
  V(CreateAllocationSite)                 \
  V(CreateWeakCell)                       \
  V(CallFunction)                         \
  V(CallFunctionWithFeedback)             \
  V(CallFunctionWithFeedbackAndVector)    \
  V(CallConstruct)                        \
  V(CallTrampoline)                       \
  V(ConstructStub)                        \
  V(ConstructTrampoline)                  \
53
  V(RegExpExec)                           \
54 55 56 57 58 59 60 61 62 63 64 65 66
  V(CopyFastSmiOrObjectElements)          \
  V(TransitionElementsKind)               \
  V(AllocateHeapNumber)                   \
  V(AllocateFloat32x4)                    \
  V(AllocateInt32x4)                      \
  V(AllocateUint32x4)                     \
  V(AllocateBool32x4)                     \
  V(AllocateInt16x8)                      \
  V(AllocateUint16x8)                     \
  V(AllocateBool16x8)                     \
  V(AllocateInt8x16)                      \
  V(AllocateUint8x16)                     \
  V(AllocateBool8x16)                     \
67
  V(Builtin)                              \
68 69 70 71 72 73 74 75 76
  V(ArrayNoArgumentConstructor)           \
  V(ArraySingleArgumentConstructor)       \
  V(ArrayNArgumentsConstructor)           \
  V(Compare)                              \
  V(BinaryOp)                             \
  V(BinaryOpWithAllocationSite)           \
  V(BinaryOpWithVector)                   \
  V(CountOp)                              \
  V(StringAdd)                            \
77
  V(StringCharAt)                         \
78
  V(StringCharCodeAt)                     \
79
  V(StringCompare)                        \
80
  V(SubString)                            \
81 82
  V(Keyed)                                \
  V(Named)                                \
83
  V(CreateIterResultObject)               \
84 85 86 87 88
  V(HasProperty)                          \
  V(ForInFilter)                          \
  V(GetProperty)                          \
  V(CallHandler)                          \
  V(ArgumentAdaptor)                      \
89
  V(ApiCallback)                          \
90 91 92 93
  V(ApiGetter)                            \
  V(MathPowTagged)                        \
  V(MathPowInteger)                       \
  V(GrowArrayElements)                    \
94
  V(NewArgumentsElements)                 \
95 96 97 98 99
  V(InterpreterDispatch)                  \
  V(InterpreterPushArgsAndCall)           \
  V(InterpreterPushArgsAndConstruct)      \
  V(InterpreterPushArgsAndConstructArray) \
  V(InterpreterCEntry)                    \
gsathya's avatar
gsathya committed
100 101
  V(ResumeGenerator)                      \
  V(PromiseHandleReject)
102

103
class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
104
 public:
105
  CallInterfaceDescriptorData() : register_param_count_(-1), param_count_(-1) {}
106 107

  // A copy of the passed in registers and param_representations is made
108
  // and owned by the CallInterfaceDescriptorData.
109

110
  void InitializePlatformSpecific(
111
      int register_parameter_count, const Register* registers,
112
      PlatformInterfaceDescriptor* platform_descriptor = NULL);
113

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
  // if machine_types is null, then an array of size
  // (register_parameter_count + extra_parameter_count) will be created
  // with MachineType::AnyTagged() for each member.
  //
  // if machine_types is not null, then it should be of the size
  // register_parameter_count. Those members of the parameter array
  // will be initialized from {machine_types}, and the rest initialized
  // to MachineType::AnyTagged().
  void InitializePlatformIndependent(int parameter_count,
                                     int extra_parameter_count,
                                     const MachineType* machine_types);

  bool IsInitialized() const {
    return register_param_count_ >= 0 && param_count_ >= 0;
  }
129

130
  int param_count() const { return param_count_; }
131 132 133
  int register_param_count() const { return register_param_count_; }
  Register register_param(int index) const { return register_params_[index]; }
  Register* register_params() const { return register_params_.get(); }
134
  MachineType param_type(int index) const { return machine_types_[index]; }
135 136 137 138 139 140
  PlatformInterfaceDescriptor* platform_specific_descriptor() const {
    return platform_specific_descriptor_;
  }

 private:
  int register_param_count_;
141
  int param_count_;
142 143 144 145 146

  // The Register params are allocated dynamically by the
  // InterfaceDescriptor, and freed on destruction. This is because static
  // arrays of Registers cause creation of runtime static initializers
  // which we don't want.
147
  std::unique_ptr<Register[]> register_params_;
148
  std::unique_ptr<MachineType[]> machine_types_;
149

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
  PlatformInterfaceDescriptor* platform_specific_descriptor_;

  DISALLOW_COPY_AND_ASSIGN(CallInterfaceDescriptorData);
};


class CallDescriptors {
 public:
  enum Key {
#define DEF_ENUM(name) name,
    INTERFACE_DESCRIPTOR_LIST(DEF_ENUM)
#undef DEF_ENUM
    NUMBER_OF_DESCRIPTORS
  };
};

166
class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
167 168
 public:
  CallInterfaceDescriptor() : data_(NULL) {}
169
  virtual ~CallInterfaceDescriptor() {}
170 171 172 173

  CallInterfaceDescriptor(Isolate* isolate, CallDescriptors::Key key)
      : data_(isolate->call_descriptor_data(key)) {}

174 175
  int GetParameterCount() const { return data()->param_count(); }

176 177 178
  int GetRegisterParameterCount() const {
    return data()->register_param_count();
  }
179

180
  int GetStackParameterCount() const {
181
    return data()->param_count() - data()->register_param_count();
182 183 184
  }

  Register GetRegisterParameter(int index) const {
185
    return data()->register_param(index);
186 187
  }

188
  MachineType GetParameterType(int index) const {
189 190
    DCHECK(index < data()->param_count());
    return data()->param_type(index);
191 192 193 194
  }

  // Some platforms have extra information to associate with the descriptor.
  PlatformInterfaceDescriptor* platform_specific_descriptor() const {
195
    return data()->platform_specific_descriptor();
196 197 198 199
  }

  static const Register ContextRegister();

200
  const char* DebugName(Isolate* isolate) const;
201

202 203 204
 protected:
  const CallInterfaceDescriptorData* data() const { return data_; }

205 206 207 208
  virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
    UNREACHABLE();
  }

209 210 211 212 213
  virtual void InitializePlatformIndependent(
      CallInterfaceDescriptorData* data) {
    data->InitializePlatformIndependent(data->register_param_count(), 0, NULL);
  }

214 215
  void Initialize(Isolate* isolate, CallDescriptors::Key key) {
    if (!data()->IsInitialized()) {
216 217
      // We should only initialize descriptors on the isolate's main thread.
      DCHECK(ThreadId::Current().Equals(isolate->thread_id()));
218
      CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key);
vogelheim's avatar
vogelheim committed
219
      DCHECK(d == data());  // d should be a modifiable pointer to data().
220
      InitializePlatformSpecific(d);
221
      InitializePlatformIndependent(d);
222 223 224
    }
  }

225 226 227 228 229 230
  // Initializes |data| using the platform dependent default set of registers.
  // It is intended to be used for TurboFan stubs when particular set of
  // registers does not matter.
  static void DefaultInitializePlatformSpecific(
      CallInterfaceDescriptorData* data, int register_parameter_count);

231
 private:
232 233
  const CallInterfaceDescriptorData* data_;
};
234

vogelheim's avatar
vogelheim committed
235 236 237 238 239 240
#define DECLARE_DESCRIPTOR_WITH_BASE(name, base)           \
 public:                                                   \
  explicit name(Isolate* isolate) : base(isolate, key()) { \
    Initialize(isolate, key());                            \
  }                                                        \
  static inline CallDescriptors::Key key();
241

242 243 244 245 246 247 248 249 250 251 252
#define DECLARE_DEFAULT_DESCRIPTOR(name, base, parameter_count)            \
  DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                 \
 protected:                                                                \
  void InitializePlatformSpecific(CallInterfaceDescriptorData* data)       \
      override {                                                           \
    DefaultInitializePlatformSpecific(data, parameter_count);              \
  }                                                                        \
  name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \
                                                                           \
 public:

253
#define DECLARE_DESCRIPTOR(name, base)                                         \
vogelheim's avatar
vogelheim committed
254
  DECLARE_DESCRIPTOR_WITH_BASE(name, base)                                     \
255 256 257 258
 protected:                                                                    \
  void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \
  name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {}     \
                                                                               \
vogelheim's avatar
vogelheim committed
259
 public:
260

261 262 263 264 265 266
#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base)        \
  DECLARE_DESCRIPTOR(name, base)                                        \
 protected:                                                             \
  void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
      override;                                                         \
                                                                        \
267
 public:
268

269 270 271 272 273 274 275 276 277 278 279 280
#define DECLARE_DESCRIPTOR_WITH_STACK_ARGS(name, base)                  \
  DECLARE_DESCRIPTOR_WITH_BASE(name, base)                              \
 protected:                                                             \
  void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
      override {                                                        \
    data->InitializePlatformIndependent(0, kParameterCount, NULL);      \
  }                                                                     \
  void InitializePlatformSpecific(CallInterfaceDescriptorData* data)    \
      override {                                                        \
    data->InitializePlatformSpecific(0, nullptr);                       \
  }                                                                     \
                                                                        \
vogelheim's avatar
vogelheim committed
281 282
 public:

283 284 285 286 287 288 289 290
#define DEFINE_PARAMETERS(...)                          \
  enum ParameterIndices {                               \
    __VA_ARGS__,                                        \
                                                        \
    kParameterCount,                                    \
    kContext = kParameterCount /* implicit parameter */ \
  };

291 292 293 294 295
class VoidDescriptor : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor)
};

296 297 298 299 300
class ContextOnlyDescriptor : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor)
};

301
// LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs.
302 303
class LoadDescriptor : public CallInterfaceDescriptor {
 public:
304
  DEFINE_PARAMETERS(kReceiver, kName, kSlot)
305 306
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadDescriptor,
                                               CallInterfaceDescriptor)
307 308 309

  static const Register ReceiverRegister();
  static const Register NameRegister();
310
  static const Register SlotRegister();
311 312
};

313 314 315 316 317 318 319 320 321 322 323 324
// LoadFieldDescriptor is used by the shared handler that loads a field from an
// object based on the smi-encoded field description.
class LoadFieldDescriptor : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kReceiver, kSmiHandler)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadFieldDescriptor,
                                               CallInterfaceDescriptor)

  static const Register ReceiverRegister();
  static const Register SmiHandlerRegister();
};

325 326
class LoadGlobalDescriptor : public CallInterfaceDescriptor {
 public:
327
  DEFINE_PARAMETERS(kName, kSlot)
328 329 330
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalDescriptor,
                                               CallInterfaceDescriptor)

331 332 333 334
  static const Register NameRegister() {
    return LoadDescriptor::NameRegister();
  }

335 336 337
  static const Register SlotRegister() {
    return LoadDescriptor::SlotRegister();
  }
338
};
339

340
class StoreDescriptor : public CallInterfaceDescriptor {
341
 public:
342
  DEFINE_PARAMETERS(kReceiver, kName, kValue, kSlot)
343 344 345
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreDescriptor,
                                               CallInterfaceDescriptor)

346 347 348
  static const Register ReceiverRegister();
  static const Register NameRegister();
  static const Register ValueRegister();
349
  static const Register SlotRegister();
350 351 352 353 354 355 356 357 358

#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87
  static const bool kPassLastArgsOnStack = true;
#else
  static const bool kPassLastArgsOnStack = false;
#endif

  // Pass value and slot through the stack.
  static const int kStackArgumentsCount = kPassLastArgsOnStack ? 2 : 0;
359
};
360

361
class StoreTransitionDescriptor : public StoreDescriptor {
362
 public:
363
  DEFINE_PARAMETERS(kReceiver, kName, kMap, kValue, kSlot, kVector)
364 365
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreTransitionDescriptor,
                                               StoreDescriptor)
366

367
  static const Register MapRegister();
368 369
  static const Register SlotRegister();
  static const Register VectorRegister();
370

371 372
  // Pass value, slot and vector through the stack.
  static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
373 374
};

375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
class StoreNamedTransitionDescriptor : public StoreTransitionDescriptor {
 public:
  DEFINE_PARAMETERS(kReceiver, kFieldOffset, kMap, kValue, kSlot, kVector,
                    kName)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreNamedTransitionDescriptor,
                                               StoreTransitionDescriptor)

  // Always pass name on the stack.
  static const bool kPassLastArgsOnStack = true;
  static const int kStackArgumentsCount =
      StoreTransitionDescriptor::kStackArgumentsCount + 1;

  static const Register NameRegister() { return no_reg; }
  static const Register FieldOffsetRegister() {
    return StoreTransitionDescriptor::NameRegister();
  }
};

393
class StoreWithVectorDescriptor : public StoreDescriptor {
394
 public:
395
  DEFINE_PARAMETERS(kReceiver, kName, kValue, kSlot, kVector)
396 397
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreWithVectorDescriptor,
                                               StoreDescriptor)
398 399

  static const Register VectorRegister();
400 401 402

  // Pass value, slot and vector through the stack.
  static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0;
403 404
};

405
class LoadWithVectorDescriptor : public LoadDescriptor {
406
 public:
407
  DEFINE_PARAMETERS(kReceiver, kName, kSlot, kVector)
408 409
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadWithVectorDescriptor,
                                               LoadDescriptor)
410 411 412 413

  static const Register VectorRegister();
};

414 415 416 417 418 419 420 421 422
class LoadICProtoArrayDescriptor : public LoadWithVectorDescriptor {
 public:
  DEFINE_PARAMETERS(kReceiver, kName, kSlot, kVector, kHandler)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadICProtoArrayDescriptor,
                                               LoadWithVectorDescriptor)

  static const Register HandlerRegister();
};

423 424
class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor {
 public:
425
  DEFINE_PARAMETERS(kName, kSlot, kVector)
426 427 428 429 430 431 432
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadGlobalWithVectorDescriptor,
                                               LoadGlobalDescriptor)

  static const Register VectorRegister() {
    return LoadWithVectorDescriptor::VectorRegister();
  }
};
433 434 435

class FastNewClosureDescriptor : public CallInterfaceDescriptor {
 public:
436
  DEFINE_PARAMETERS(kSharedFunctionInfo, kVector, kSlot)
437
  DECLARE_DESCRIPTOR(FastNewClosureDescriptor, CallInterfaceDescriptor)
438 439
};

440
class FastNewFunctionContextDescriptor : public CallInterfaceDescriptor {
441
 public:
442 443 444 445 446 447
  DEFINE_PARAMETERS(kFunction, kSlots)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastNewFunctionContextDescriptor,
                                               CallInterfaceDescriptor)

  static const Register FunctionRegister();
  static const Register SlotsRegister();
448 449
};

450 451
class FastNewObjectDescriptor : public CallInterfaceDescriptor {
 public:
452
  DEFINE_PARAMETERS(kTarget, kNewTarget)
453
  DECLARE_DESCRIPTOR(FastNewObjectDescriptor, CallInterfaceDescriptor)
454 455
  static const Register TargetRegister();
  static const Register NewTargetRegister();
456 457
};

458 459 460 461 462
class FastNewRestParameterDescriptor : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(FastNewRestParameterDescriptor, CallInterfaceDescriptor)
};

463 464 465 466 467 468
class FastNewSloppyArgumentsDescriptor : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(FastNewSloppyArgumentsDescriptor,
                     CallInterfaceDescriptor)
};

469 470 471 472 473 474
class FastNewStrictArgumentsDescriptor : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(FastNewStrictArgumentsDescriptor,
                     CallInterfaceDescriptor)
};

475
class TypeConversionDescriptor final : public CallInterfaceDescriptor {
476
 public:
477
  DEFINE_PARAMETERS(kArgument)
478
  DECLARE_DESCRIPTOR(TypeConversionDescriptor, CallInterfaceDescriptor)
479

480
  static const Register ArgumentRegister();
481 482
};

483 484 485 486 487 488 489
class CreateIterResultObjectDescriptor final : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kValue, kDone)
  DECLARE_DEFAULT_DESCRIPTOR(CreateIterResultObjectDescriptor,
                             CallInterfaceDescriptor, kParameterCount)
};

490 491
class HasPropertyDescriptor final : public CallInterfaceDescriptor {
 public:
492 493 494
  DEFINE_PARAMETERS(kKey, kObject)
  DECLARE_DEFAULT_DESCRIPTOR(HasPropertyDescriptor, CallInterfaceDescriptor,
                             kParameterCount)
495
};
496

497 498
class ForInFilterDescriptor final : public CallInterfaceDescriptor {
 public:
499 500 501
  DEFINE_PARAMETERS(kKey, kObject)
  DECLARE_DEFAULT_DESCRIPTOR(ForInFilterDescriptor, CallInterfaceDescriptor,
                             kParameterCount)
502 503
};

504 505
class GetPropertyDescriptor final : public CallInterfaceDescriptor {
 public:
506 507 508
  DEFINE_PARAMETERS(kObject, kKey)
  DECLARE_DEFAULT_DESCRIPTOR(GetPropertyDescriptor, CallInterfaceDescriptor,
                             kParameterCount)
509 510
};

511 512
class TypeofDescriptor : public CallInterfaceDescriptor {
 public:
513
  DEFINE_PARAMETERS(kObject)
514 515 516
  DECLARE_DESCRIPTOR(TypeofDescriptor, CallInterfaceDescriptor)
};

517 518 519

class FastCloneRegExpDescriptor : public CallInterfaceDescriptor {
 public:
520
  DEFINE_PARAMETERS(kClosure, kLiteralIndex, kPattern, kFlags)
521 522 523 524
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastCloneRegExpDescriptor,
                                               CallInterfaceDescriptor)
};

525

526 527
class FastCloneShallowArrayDescriptor : public CallInterfaceDescriptor {
 public:
528
  DEFINE_PARAMETERS(kClosure, kLiteralIndex, kConstantElements)
529 530
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(FastCloneShallowArrayDescriptor,
                                               CallInterfaceDescriptor)
531 532 533 534 535
};


class FastCloneShallowObjectDescriptor : public CallInterfaceDescriptor {
 public:
536
  DECLARE_DESCRIPTOR(FastCloneShallowObjectDescriptor, CallInterfaceDescriptor)
537 538 539 540 541
};


class CreateAllocationSiteDescriptor : public CallInterfaceDescriptor {
 public:
542
  DEFINE_PARAMETERS(kVector, kSlot)
543 544
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CreateAllocationSiteDescriptor,
                                               CallInterfaceDescriptor)
545 546 547
};


548 549
class CreateWeakCellDescriptor : public CallInterfaceDescriptor {
 public:
550
  DEFINE_PARAMETERS(kVector, kSlot, kValue)
551 552
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CreateWeakCellDescriptor,
                                               CallInterfaceDescriptor)
553 554 555
};


556 557
class CallTrampolineDescriptor : public CallInterfaceDescriptor {
 public:
558
  DEFINE_PARAMETERS(kFunction, kActualArgumentsCount)
559 560 561 562 563
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(CallTrampolineDescriptor,
                                               CallInterfaceDescriptor)
};


564 565
class ConstructStubDescriptor : public CallInterfaceDescriptor {
 public:
566 567
  DEFINE_PARAMETERS(kFunction, kNewTarget, kActualArgumentsCount,
                    kAllocationSite)
568 569 570 571 572
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructStubDescriptor,
                                               CallInterfaceDescriptor)
};


573 574
class ConstructTrampolineDescriptor : public CallInterfaceDescriptor {
 public:
575
  DEFINE_PARAMETERS(kFunction, kNewTarget, kActualArgumentsCount)
576 577 578 579 580
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ConstructTrampolineDescriptor,
                                               CallInterfaceDescriptor)
};


581 582
class CallFunctionDescriptor : public CallInterfaceDescriptor {
 public:
583 584 585 586 587 588
  DECLARE_DESCRIPTOR(CallFunctionDescriptor, CallInterfaceDescriptor)
};


class CallFunctionWithFeedbackDescriptor : public CallInterfaceDescriptor {
 public:
589
  DEFINE_PARAMETERS(kFunction, kSlot)
590 591
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      CallFunctionWithFeedbackDescriptor, CallInterfaceDescriptor)
592 593 594
};


595 596 597
class CallFunctionWithFeedbackAndVectorDescriptor
    : public CallInterfaceDescriptor {
 public:
598
  DEFINE_PARAMETERS(kFunction, kActualArgumentsCount, kSlot, kVector)
599 600
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      CallFunctionWithFeedbackAndVectorDescriptor, CallInterfaceDescriptor)
601 602 603
};


604
class CallConstructDescriptor : public CallInterfaceDescriptor {
605
 public:
606
  DECLARE_DESCRIPTOR(CallConstructDescriptor, CallInterfaceDescriptor)
607 608
};

609 610 611 612 613 614
class RegExpExecDescriptor : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kRegExpObject, kString, kPreviousIndex, kLastMatchInfo)
  DECLARE_DESCRIPTOR_WITH_STACK_ARGS(RegExpExecDescriptor,
                                     CallInterfaceDescriptor)
};
615

616
class CopyFastSmiOrObjectElementsDescriptor : public CallInterfaceDescriptor {
617
 public:
618 619 620
  DEFINE_PARAMETERS(kObject)
  DECLARE_DEFAULT_DESCRIPTOR(CopyFastSmiOrObjectElementsDescriptor,
                             CallInterfaceDescriptor, kParameterCount)
621
};
622

623 624
class TransitionElementsKindDescriptor : public CallInterfaceDescriptor {
 public:
625
  DEFINE_PARAMETERS(kObject, kMap)
626
  DECLARE_DESCRIPTOR(TransitionElementsKindDescriptor, CallInterfaceDescriptor)
627 628 629
};


630 631 632 633 634
class AllocateHeapNumberDescriptor : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(AllocateHeapNumberDescriptor, CallInterfaceDescriptor)
};

bbudge's avatar
bbudge committed
635 636 637 638 639 640 641
#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type)         \
  class Allocate##Type##Descriptor : public CallInterfaceDescriptor {       \
   public:                                                                  \
    DECLARE_DESCRIPTOR(Allocate##Type##Descriptor, CallInterfaceDescriptor) \
  };
SIMD128_TYPES(SIMD128_ALLOC_DESC)
#undef SIMD128_ALLOC_DESC
642

643 644
class BuiltinDescriptor : public CallInterfaceDescriptor {
 public:
645
  // TODO(ishell): Where is kFunction??
646 647 648 649 650
  DEFINE_PARAMETERS(kNewTarget, kArgumentsCount)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(BuiltinDescriptor,
                                               CallInterfaceDescriptor)
  static const Register ArgumentsCountRegister();
  static const Register NewTargetRegister();
651
  static const Register TargetRegister();
652 653
};

654 655
class ArrayNoArgumentConstructorDescriptor : public CallInterfaceDescriptor {
 public:
656 657
  DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount,
                    kFunctionParameter)
658 659 660
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      ArrayNoArgumentConstructorDescriptor, CallInterfaceDescriptor)
};
661

662
class ArraySingleArgumentConstructorDescriptor
663 664
    : public CallInterfaceDescriptor {
 public:
665 666
  DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount,
                    kFunctionParameter, kArraySizeSmiParameter)
667 668
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      ArraySingleArgumentConstructorDescriptor, CallInterfaceDescriptor)
669 670
};

671
class ArrayNArgumentsConstructorDescriptor : public CallInterfaceDescriptor {
672
 public:
673
  DEFINE_PARAMETERS(kFunction, kAllocationSite, kActualArgumentsCount)
674
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
675
      ArrayNArgumentsConstructorDescriptor, CallInterfaceDescriptor)
676 677 678
};


679 680
class CompareDescriptor : public CallInterfaceDescriptor {
 public:
681
  DEFINE_PARAMETERS(kLeft, kRight)
682 683 684 685
  DECLARE_DESCRIPTOR(CompareDescriptor, CallInterfaceDescriptor)
};


686 687
class BinaryOpDescriptor : public CallInterfaceDescriptor {
 public:
688
  DEFINE_PARAMETERS(kLeft, kRight)
689
  DECLARE_DESCRIPTOR(BinaryOpDescriptor, CallInterfaceDescriptor)
690 691 692 693 694
};


class BinaryOpWithAllocationSiteDescriptor : public CallInterfaceDescriptor {
 public:
695
  DEFINE_PARAMETERS(kAllocationSite, kLeft, kRight)
696 697
  DECLARE_DESCRIPTOR(BinaryOpWithAllocationSiteDescriptor,
                     CallInterfaceDescriptor)
698 699
};

700 701 702 703 704 705 706
class BinaryOpWithVectorDescriptor : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kLeft, kRight, kSlot, kVector)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(BinaryOpWithVectorDescriptor,
                                               CallInterfaceDescriptor)
};

707 708 709 710
class CountOpDescriptor final : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(CountOpDescriptor, CallInterfaceDescriptor)
};
711 712 713

class StringAddDescriptor : public CallInterfaceDescriptor {
 public:
714
  DEFINE_PARAMETERS(kLeft, kRight)
715
  DECLARE_DESCRIPTOR(StringAddDescriptor, CallInterfaceDescriptor)
716 717
};

718 719 720 721 722
class StringCharAtDescriptor final : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kReceiver, kPosition)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StringCharAtDescriptor,
                                               CallInterfaceDescriptor)
723 724 725 726 727 728 729
};

class StringCharCodeAtDescriptor final : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kReceiver, kPosition)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StringCharCodeAtDescriptor,
                                               CallInterfaceDescriptor)
730
};
731

732 733
class StringCompareDescriptor : public CallInterfaceDescriptor {
 public:
734
  DEFINE_PARAMETERS(kLeft, kRight)
735 736 737 738 739 740
  DECLARE_DESCRIPTOR(StringCompareDescriptor, CallInterfaceDescriptor)

  static const Register LeftRegister();
  static const Register RightRegister();
};

741 742 743 744 745 746 747
class SubStringDescriptor : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kString, kFrom, kTo)
  DECLARE_DESCRIPTOR_WITH_STACK_ARGS(SubStringDescriptor,
                                     CallInterfaceDescriptor)
};

748
// TODO(ishell): not used, remove.
749 750
class KeyedDescriptor : public CallInterfaceDescriptor {
 public:
751
  DECLARE_DESCRIPTOR(KeyedDescriptor, CallInterfaceDescriptor)
752 753
};

754
// TODO(ishell): not used, remove
755 756
class NamedDescriptor : public CallInterfaceDescriptor {
 public:
757
  DECLARE_DESCRIPTOR(NamedDescriptor, CallInterfaceDescriptor)
758 759
};

760
// TODO(ishell): not used, remove.
761 762
class CallHandlerDescriptor : public CallInterfaceDescriptor {
 public:
763
  DECLARE_DESCRIPTOR(CallHandlerDescriptor, CallInterfaceDescriptor)
764 765 766 767 768
};


class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor {
 public:
769 770
  DEFINE_PARAMETERS(kFunction, kNewTarget, kActualArgumentsCount,
                    kExpectedArgumentsCount)
771 772
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArgumentAdaptorDescriptor,
                                               CallInterfaceDescriptor)
773 774
};

775
class ApiCallbackDescriptor : public CallInterfaceDescriptor {
vogelheim's avatar
vogelheim committed
776
 public:
777
  DEFINE_PARAMETERS(kFunction, kCallData, kHolder, kApiFunctionAddress)
778 779
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiCallbackDescriptor,
                                               CallInterfaceDescriptor)
780 781
};

782 783
class ApiGetterDescriptor : public CallInterfaceDescriptor {
 public:
784
  DEFINE_PARAMETERS(kReceiver, kHolder, kCallback)
785
  DECLARE_DESCRIPTOR(ApiGetterDescriptor, CallInterfaceDescriptor)
786

787 788 789
  static const Register ReceiverRegister();
  static const Register HolderRegister();
  static const Register CallbackRegister();
790 791 792 793
};

class MathPowTaggedDescriptor : public CallInterfaceDescriptor {
 public:
794
  DEFINE_PARAMETERS(kExponent)
795 796 797 798 799 800 801
  DECLARE_DESCRIPTOR(MathPowTaggedDescriptor, CallInterfaceDescriptor)

  static const Register exponent();
};

class MathPowIntegerDescriptor : public CallInterfaceDescriptor {
 public:
802
  DEFINE_PARAMETERS(kExponent)
803 804 805 806 807
  DECLARE_DESCRIPTOR(MathPowIntegerDescriptor, CallInterfaceDescriptor)

  static const Register exponent();
};

808
class VarArgFunctionDescriptor : public CallInterfaceDescriptor {
809
 public:
810
  DEFINE_PARAMETERS(kActualArgumentsCount)
811
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(VarArgFunctionDescriptor,
812 813
                                               CallInterfaceDescriptor)
};
814

815
// TODO(turbofan): We should probably rename this to GrowFastElementsDescriptor.
816 817
class GrowArrayElementsDescriptor : public CallInterfaceDescriptor {
 public:
818
  DEFINE_PARAMETERS(kObject, kKey)
819 820 821 822 823 824
  DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor)

  static const Register ObjectRegister();
  static const Register KeyRegister();
};

825 826 827 828 829 830 831
class NewArgumentsElementsDescriptor final : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kFormalParameterCount)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(NewArgumentsElementsDescriptor,
                                               CallInterfaceDescriptor)
};

832 833
class V8_EXPORT_PRIVATE InterpreterDispatchDescriptor
    : public CallInterfaceDescriptor {
834
 public:
835 836
  DEFINE_PARAMETERS(kAccumulator, kBytecodeOffset, kBytecodeArray,
                    kDispatchTable)
837 838 839
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor,
                                               CallInterfaceDescriptor)
};
840

841
class InterpreterPushArgsAndCallDescriptor : public CallInterfaceDescriptor {
842
 public:
843 844 845
  DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunction)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      InterpreterPushArgsAndCallDescriptor, CallInterfaceDescriptor)
846 847
};

848

849 850 851
class InterpreterPushArgsAndConstructDescriptor
    : public CallInterfaceDescriptor {
 public:
852 853 854 855
  DEFINE_PARAMETERS(kNumberOfArguments, kNewTarget, kConstructor,
                    kFeedbackElement, kFirstArgument)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      InterpreterPushArgsAndConstructDescriptor, CallInterfaceDescriptor)
856 857
};

858 859 860
class InterpreterPushArgsAndConstructArrayDescriptor
    : public CallInterfaceDescriptor {
 public:
861 862 863 864
  DEFINE_PARAMETERS(kNumberOfArguments, kFunction, kFeedbackElement,
                    kFirstArgument)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(
      InterpreterPushArgsAndConstructArrayDescriptor, CallInterfaceDescriptor)
865
};
866

867 868
class InterpreterCEntryDescriptor : public CallInterfaceDescriptor {
 public:
869 870 871
  DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunctionEntry)
  DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterCEntryDescriptor,
                                               CallInterfaceDescriptor)
872 873
};

874 875 876 877 878
class ResumeGeneratorDescriptor final : public CallInterfaceDescriptor {
 public:
  DECLARE_DESCRIPTOR(ResumeGeneratorDescriptor, CallInterfaceDescriptor)
};

gsathya's avatar
gsathya committed
879 880 881 882 883 884 885
class PromiseHandleRejectDescriptor final : public CallInterfaceDescriptor {
 public:
  DEFINE_PARAMETERS(kPromise, kOnReject, kException)
  DECLARE_DEFAULT_DESCRIPTOR(PromiseHandleRejectDescriptor,
                             CallInterfaceDescriptor, kParameterCount)
};

vogelheim's avatar
vogelheim committed
886
#undef DECLARE_DESCRIPTOR_WITH_BASE
887
#undef DECLARE_DESCRIPTOR
vogelheim's avatar
vogelheim committed
888 889
#undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE
#undef DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG
890
#undef DEFINE_PARAMETERS
891 892 893 894 895 896 897

// We define the association between CallDescriptors::Key and the specialized
// descriptor here to reduce boilerplate and mistakes.
#define DEF_KEY(name) \
  CallDescriptors::Key name##Descriptor::key() { return CallDescriptors::name; }
INTERFACE_DESCRIPTOR_LIST(DEF_KEY)
#undef DEF_KEY
898 899
}  // namespace internal
}  // namespace v8
900

901

902 903 904 905 906 907 908
#if V8_TARGET_ARCH_ARM64
#include "src/arm64/interface-descriptors-arm64.h"
#elif V8_TARGET_ARCH_ARM
#include "src/arm/interface-descriptors-arm.h"
#endif

#endif  // V8_CALL_INTERFACE_DESCRIPTOR_H_