• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 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 #include "src/codegen/interface-descriptors.h"
6 
7 #include "src/codegen/macro-assembler.h"
8 
9 namespace v8 {
10 namespace internal {
11 
InitializePlatformSpecific(int register_parameter_count,const Register * registers)12 void CallInterfaceDescriptorData::InitializePlatformSpecific(
13     int register_parameter_count, const Register* registers) {
14   DCHECK(!IsInitializedPlatformIndependent());
15 
16   register_param_count_ = register_parameter_count;
17 
18   // UBSan doesn't like creating zero-length arrays.
19   if (register_parameter_count == 0) return;
20 
21   // InterfaceDescriptor owns a copy of the registers array.
22   register_params_ = NewArray<Register>(register_parameter_count, no_reg);
23   for (int i = 0; i < register_parameter_count; i++) {
24     // The value of the root register must be reserved, thus any uses
25     // within the calling convention are disallowed.
26     DCHECK_NE(registers[i], kRootRegister);
27     register_params_[i] = registers[i];
28   }
29 }
30 
InitializePlatformIndependent(Flags flags,int return_count,int parameter_count,const MachineType * machine_types,int machine_types_length,StackArgumentOrder stack_order)31 void CallInterfaceDescriptorData::InitializePlatformIndependent(
32     Flags flags, int return_count, int parameter_count,
33     const MachineType* machine_types, int machine_types_length,
34     StackArgumentOrder stack_order) {
35   DCHECK(IsInitializedPlatformSpecific());
36 
37   flags_ = flags;
38   stack_order_ = stack_order;
39   return_count_ = return_count;
40   param_count_ = parameter_count;
41   const int types_length = return_count_ + param_count_;
42 
43   // Machine types are either fully initialized or null.
44   if (machine_types == nullptr) {
45     machine_types_ =
46         NewArray<MachineType>(types_length, MachineType::AnyTagged());
47   } else {
48     DCHECK_EQ(machine_types_length, types_length);
49     machine_types_ = NewArray<MachineType>(types_length);
50     for (int i = 0; i < types_length; i++) machine_types_[i] = machine_types[i];
51   }
52 
53   if (!(flags_ & kNoStackScan)) DCHECK(AllStackParametersAreTagged());
54 }
55 
56 #ifdef DEBUG
AllStackParametersAreTagged() const57 bool CallInterfaceDescriptorData::AllStackParametersAreTagged() const {
58   DCHECK(IsInitialized());
59   const int types_length = return_count_ + param_count_;
60   const int first_stack_param = return_count_ + register_param_count_;
61   for (int i = first_stack_param; i < types_length; i++) {
62     if (!machine_types_[i].IsTagged()) return false;
63   }
64   return true;
65 }
66 #endif  // DEBUG
67 
Reset()68 void CallInterfaceDescriptorData::Reset() {
69   delete[] machine_types_;
70   machine_types_ = nullptr;
71   delete[] register_params_;
72   register_params_ = nullptr;
73 }
74 
75 // static
76 CallInterfaceDescriptorData
77     CallDescriptors::call_descriptor_data_[NUMBER_OF_DESCRIPTORS];
78 
InitializeOncePerProcess()79 void CallDescriptors::InitializeOncePerProcess() {
80 #define INTERFACE_DESCRIPTOR(name, ...) \
81   name##Descriptor().Initialize(&call_descriptor_data_[CallDescriptors::name]);
82   INTERFACE_DESCRIPTOR_LIST(INTERFACE_DESCRIPTOR)
83 #undef INTERFACE_DESCRIPTOR
84 
85   DCHECK(ContextOnlyDescriptor{}.HasContextParameter());
86   DCHECK(!NoContextDescriptor{}.HasContextParameter());
87   DCHECK(!AllocateDescriptor{}.HasContextParameter());
88   DCHECK(!AbortDescriptor{}.HasContextParameter());
89   DCHECK(!WasmFloat32ToNumberDescriptor{}.HasContextParameter());
90   DCHECK(!WasmFloat64ToNumberDescriptor{}.HasContextParameter());
91 }
92 
TearDown()93 void CallDescriptors::TearDown() {
94   for (CallInterfaceDescriptorData& data : call_descriptor_data_) {
95     data.Reset();
96   }
97 }
98 
JSDefaultInitializePlatformSpecific(CallInterfaceDescriptorData * data,int non_js_register_parameter_count)99 void CallInterfaceDescriptor::JSDefaultInitializePlatformSpecific(
100     CallInterfaceDescriptorData* data, int non_js_register_parameter_count) {
101   DCHECK_LE(static_cast<unsigned>(non_js_register_parameter_count), 1);
102 
103   // 3 is for kTarget, kNewTarget and kActualArgumentsCount
104   int register_parameter_count = 3 + non_js_register_parameter_count;
105 
106   DCHECK(!AreAliased(
107       kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
108       kJavaScriptCallArgCountRegister, kJavaScriptCallExtraArg1Register));
109 
110   const Register default_js_stub_registers[] = {
111       kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
112       kJavaScriptCallArgCountRegister, kJavaScriptCallExtraArg1Register};
113 
114   CHECK_LE(static_cast<size_t>(register_parameter_count),
115            arraysize(default_js_stub_registers));
116   data->InitializePlatformSpecific(register_parameter_count,
117                                    default_js_stub_registers);
118 }
119 
DebugName() const120 const char* CallInterfaceDescriptor::DebugName() const {
121   CallDescriptors::Key key = CallDescriptors::GetKey(data_);
122   switch (key) {
123 #define DEF_CASE(name, ...)   \
124   case CallDescriptors::name: \
125     return #name " Descriptor";
126     INTERFACE_DESCRIPTOR_LIST(DEF_CASE)
127 #undef DEF_CASE
128     case CallDescriptors::NUMBER_OF_DESCRIPTORS:
129       break;
130   }
131   return "";
132 }
133 
134 #if !defined(V8_TARGET_ARCH_MIPS) && !defined(V8_TARGET_ARCH_MIPS64)
IsValidFloatParameterRegister(Register reg)135 bool CallInterfaceDescriptor::IsValidFloatParameterRegister(Register reg) {
136   return true;
137 }
138 #endif
139 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)140 void VoidDescriptor::InitializePlatformSpecific(
141     CallInterfaceDescriptorData* data) {
142   data->InitializePlatformSpecific(0, nullptr);
143 }
144 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)145 void AllocateDescriptor::InitializePlatformSpecific(
146     CallInterfaceDescriptorData* data) {
147   Register registers[] = {kAllocateSizeRegister};
148   data->InitializePlatformSpecific(arraysize(registers), registers);
149 }
150 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)151 void CEntry1ArgvOnStackDescriptor::InitializePlatformSpecific(
152     CallInterfaceDescriptorData* data) {
153   Register registers[] = {kRuntimeCallArgCountRegister,
154                           kRuntimeCallFunctionRegister};
155   data->InitializePlatformSpecific(arraysize(registers), registers);
156 }
157 
158 namespace {
159 
InterpreterCEntryDescriptor_InitializePlatformSpecific(CallInterfaceDescriptorData * data)160 void InterpreterCEntryDescriptor_InitializePlatformSpecific(
161     CallInterfaceDescriptorData* data) {
162   Register registers[] = {kRuntimeCallArgCountRegister,
163                           kRuntimeCallArgvRegister,
164                           kRuntimeCallFunctionRegister};
165   data->InitializePlatformSpecific(arraysize(registers), registers);
166 }
167 
168 }  // namespace
169 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)170 void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
171     CallInterfaceDescriptorData* data) {
172   InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
173 }
174 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)175 void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
176     CallInterfaceDescriptorData* data) {
177   InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
178 }
179 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)180 void FastNewObjectDescriptor::InitializePlatformSpecific(
181     CallInterfaceDescriptorData* data) {
182   Register registers[] = {TargetRegister(), NewTargetRegister()};
183   data->InitializePlatformSpecific(arraysize(registers), registers);
184 }
185 
TargetRegister()186 const Register FastNewObjectDescriptor::TargetRegister() {
187   return kJSFunctionRegister;
188 }
189 
NewTargetRegister()190 const Register FastNewObjectDescriptor::NewTargetRegister() {
191   return kJavaScriptCallNewTargetRegister;
192 }
193 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)194 void LoadDescriptor::InitializePlatformSpecific(
195     CallInterfaceDescriptorData* data) {
196   Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()};
197   data->InitializePlatformSpecific(arraysize(registers), registers);
198 }
199 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)200 void LoadNoFeedbackDescriptor::InitializePlatformSpecific(
201     CallInterfaceDescriptorData* data) {
202   Register registers[] = {ReceiverRegister(), NameRegister(), ICKindRegister()};
203   data->InitializePlatformSpecific(arraysize(registers), registers);
204 }
205 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)206 void LoadGlobalDescriptor::InitializePlatformSpecific(
207     CallInterfaceDescriptorData* data) {
208   Register registers[] = {NameRegister(), SlotRegister()};
209   data->InitializePlatformSpecific(arraysize(registers), registers);
210 }
211 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)212 void LoadGlobalNoFeedbackDescriptor::InitializePlatformSpecific(
213     CallInterfaceDescriptorData* data) {
214   Register registers[] = {NameRegister(), ICKindRegister()};
215   data->InitializePlatformSpecific(arraysize(registers), registers);
216 }
217 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)218 void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific(
219     CallInterfaceDescriptorData* data) {
220   Register registers[] = {NameRegister(), SlotRegister(), VectorRegister()};
221   data->InitializePlatformSpecific(arraysize(registers), registers);
222 }
223 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)224 void LoadWithReceiverAndVectorDescriptor::InitializePlatformSpecific(
225     CallInterfaceDescriptorData* data) {
226   DCHECK(!AreAliased(ReceiverRegister(), LookupStartObjectRegister(),
227                      NameRegister(), SlotRegister(), VectorRegister()));
228   Register registers[] = {ReceiverRegister(), LookupStartObjectRegister(),
229                           NameRegister(), SlotRegister(), VectorRegister()};
230   int len = arraysize(registers) - kStackArgumentsCount;
231   data->InitializePlatformSpecific(len, registers);
232 }
233 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)234 void StoreGlobalDescriptor::InitializePlatformSpecific(
235     CallInterfaceDescriptorData* data) {
236   Register registers[] = {NameRegister(), ValueRegister(), SlotRegister()};
237 
238   int len = arraysize(registers) - kStackArgumentsCount;
239   data->InitializePlatformSpecific(len, registers);
240 }
241 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)242 void StoreGlobalWithVectorDescriptor::InitializePlatformSpecific(
243     CallInterfaceDescriptorData* data) {
244   Register registers[] = {NameRegister(), ValueRegister(), SlotRegister(),
245                           VectorRegister()};
246   int len = arraysize(registers) - kStackArgumentsCount;
247   data->InitializePlatformSpecific(len, registers);
248 }
249 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)250 void StoreDescriptor::InitializePlatformSpecific(
251     CallInterfaceDescriptorData* data) {
252   Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
253                           SlotRegister()};
254 
255   int len = arraysize(registers) - kStackArgumentsCount;
256   data->InitializePlatformSpecific(len, registers);
257 }
258 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)259 void StoreTransitionDescriptor::InitializePlatformSpecific(
260     CallInterfaceDescriptorData* data) {
261   Register registers[] = {
262       ReceiverRegister(), NameRegister(), MapRegister(),
263       ValueRegister(),    SlotRegister(), VectorRegister(),
264   };
265   int len = arraysize(registers) - kStackArgumentsCount;
266   data->InitializePlatformSpecific(len, registers);
267 }
268 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)269 void StringAtDescriptor::InitializePlatformSpecific(
270     CallInterfaceDescriptorData* data) {
271   DefaultInitializePlatformSpecific(data, kParameterCount);
272 }
273 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)274 void StringAtAsStringDescriptor::InitializePlatformSpecific(
275     CallInterfaceDescriptorData* data) {
276   DefaultInitializePlatformSpecific(data, kParameterCount);
277 }
278 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)279 void StringSubstringDescriptor::InitializePlatformSpecific(
280     CallInterfaceDescriptorData* data) {
281   DefaultInitializePlatformSpecific(data, kParameterCount);
282 }
283 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)284 void TypeConversionDescriptor::InitializePlatformSpecific(
285     CallInterfaceDescriptorData* data) {
286   Register registers[] = {ArgumentRegister()};
287   data->InitializePlatformSpecific(arraysize(registers), registers);
288 }
289 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)290 void TypeConversionNoContextDescriptor::InitializePlatformSpecific(
291     CallInterfaceDescriptorData* data) {
292   Register registers[] = {TypeConversionDescriptor::ArgumentRegister()};
293   data->InitializePlatformSpecific(arraysize(registers), registers);
294 }
295 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)296 void TypeConversionStackParameterDescriptor::InitializePlatformSpecific(
297     CallInterfaceDescriptorData* data) {
298   data->InitializePlatformSpecific(0, nullptr);
299 }
300 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)301 void AsyncFunctionStackParameterDescriptor::InitializePlatformSpecific(
302     CallInterfaceDescriptorData* data) {
303   data->InitializePlatformSpecific(0, nullptr);
304 }
305 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)306 void GetIteratorStackParameterDescriptor::InitializePlatformSpecific(
307     CallInterfaceDescriptorData* data) {
308   data->InitializePlatformSpecific(0, nullptr);
309 }
310 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)311 void LoadWithVectorDescriptor::InitializePlatformSpecific(
312     CallInterfaceDescriptorData* data) {
313   Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(),
314                           VectorRegister()};
315   // TODO(jgruber): This DCHECK could be enabled if RegisterBase::ListOf were
316   // to allow no_reg entries.
317   // DCHECK(!AreAliased(ReceiverRegister(), NameRegister(), SlotRegister(),
318   //                    VectorRegister(), kRootRegister));
319   int len = arraysize(registers) - kStackArgumentsCount;
320   data->InitializePlatformSpecific(len, registers);
321 }
322 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)323 void StoreWithVectorDescriptor::InitializePlatformSpecific(
324     CallInterfaceDescriptorData* data) {
325   Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
326                           SlotRegister(), VectorRegister()};
327   // TODO(jgruber): This DCHECK could be enabled if RegisterBase::ListOf were
328   // to allow no_reg entries.
329   // DCHECK(!AreAliased(ReceiverRegister(), NameRegister(), kRootRegister));
330   int len = arraysize(registers) - kStackArgumentsCount;
331   data->InitializePlatformSpecific(len, registers);
332 }
333 
ReceiverRegister()334 const Register ApiGetterDescriptor::ReceiverRegister() {
335   return LoadDescriptor::ReceiverRegister();
336 }
337 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)338 void ApiGetterDescriptor::InitializePlatformSpecific(
339     CallInterfaceDescriptorData* data) {
340   Register registers[] = {ReceiverRegister(), HolderRegister(),
341                           CallbackRegister()};
342   data->InitializePlatformSpecific(arraysize(registers), registers);
343 }
344 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)345 void ContextOnlyDescriptor::InitializePlatformSpecific(
346     CallInterfaceDescriptorData* data) {
347   data->InitializePlatformSpecific(0, nullptr);
348 }
349 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)350 void NoContextDescriptor::InitializePlatformSpecific(
351     CallInterfaceDescriptorData* data) {
352   data->InitializePlatformSpecific(0, nullptr);
353 }
354 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)355 void GrowArrayElementsDescriptor::InitializePlatformSpecific(
356     CallInterfaceDescriptorData* data) {
357   Register registers[] = {ObjectRegister(), KeyRegister()};
358   data->InitializePlatformSpecific(arraysize(registers), registers);
359 }
360 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)361 void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
362     CallInterfaceDescriptorData* data) {
363   // This descriptor must use the same set of registers as the
364   // ArrayNArgumentsConstructorDescriptor.
365   ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(data);
366 }
367 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)368 void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
369     CallInterfaceDescriptorData* data) {
370   // This descriptor must use the same set of registers as the
371   // ArrayNArgumentsConstructorDescriptor.
372   ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(data);
373 }
374 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)375 void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
376     CallInterfaceDescriptorData* data) {
377   // Keep the arguments on the same registers as they were in
378   // ArrayConstructorDescriptor to avoid unnecessary register moves.
379   // kFunction, kAllocationSite, kActualArgumentsCount
380   Register registers[] = {kJavaScriptCallTargetRegister,
381                           kJavaScriptCallExtraArg1Register,
382                           kJavaScriptCallArgCountRegister};
383   data->InitializePlatformSpecific(arraysize(registers), registers);
384 }
385 
386 #if !V8_TARGET_ARCH_IA32
387 // We need a custom descriptor on ia32 to avoid using xmm0.
InitializePlatformSpecific(CallInterfaceDescriptorData * data)388 void WasmFloat32ToNumberDescriptor::InitializePlatformSpecific(
389     CallInterfaceDescriptorData* data) {
390   DefaultInitializePlatformSpecific(data, kParameterCount);
391 }
392 
393 // We need a custom descriptor on ia32 to avoid using xmm0.
InitializePlatformSpecific(CallInterfaceDescriptorData * data)394 void WasmFloat64ToNumberDescriptor::InitializePlatformSpecific(
395     CallInterfaceDescriptorData* data) {
396   DefaultInitializePlatformSpecific(data, kParameterCount);
397 }
398 #endif  // !V8_TARGET_ARCH_IA32
399 
400 #if !defined(V8_TARGET_ARCH_MIPS) && !defined(V8_TARGET_ARCH_MIPS64)
InitializePlatformSpecific(CallInterfaceDescriptorData * data)401 void WasmI32AtomicWait32Descriptor::InitializePlatformSpecific(
402     CallInterfaceDescriptorData* data) {
403   DefaultInitializePlatformSpecific(data, kParameterCount);
404 }
405 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)406 void WasmI64AtomicWait32Descriptor::InitializePlatformSpecific(
407     CallInterfaceDescriptorData* data) {
408   DefaultInitializePlatformSpecific(data,
409                                     kParameterCount - kStackArgumentsCount);
410 }
411 #endif
412 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)413 void CloneObjectWithVectorDescriptor::InitializePlatformSpecific(
414     CallInterfaceDescriptorData* data) {
415   DefaultInitializePlatformSpecific(data, kParameterCount);
416 }
417 
418 // static
MicrotaskQueueRegister()419 Register RunMicrotasksDescriptor::MicrotaskQueueRegister() {
420   return CallDescriptors::call_descriptor_data(CallDescriptors::RunMicrotasks)
421       ->register_param(0);
422 }
423 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)424 void RunMicrotasksDescriptor::InitializePlatformSpecific(
425     CallInterfaceDescriptorData* data) {
426   DefaultInitializePlatformSpecific(data, kParameterCount);
427 }
428 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)429 void I64ToBigIntDescriptor::InitializePlatformSpecific(
430     CallInterfaceDescriptorData* data) {
431   DefaultInitializePlatformSpecific(data, kParameterCount);
432 }
433 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)434 void I32PairToBigIntDescriptor::InitializePlatformSpecific(
435     CallInterfaceDescriptorData* data) {
436   DefaultInitializePlatformSpecific(data, kParameterCount);
437 }
438 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)439 void BigIntToI64Descriptor::InitializePlatformSpecific(
440     CallInterfaceDescriptorData* data) {
441   DefaultInitializePlatformSpecific(data, kParameterCount);
442 }
443 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)444 void BigIntToI32PairDescriptor::InitializePlatformSpecific(
445     CallInterfaceDescriptorData* data) {
446   DefaultInitializePlatformSpecific(data, kParameterCount);
447 }
448 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)449 void BinaryOp_WithFeedbackDescriptor::InitializePlatformSpecific(
450     CallInterfaceDescriptorData* data) {
451   DefaultInitializePlatformSpecific(data, 4);
452 }
453 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)454 void CallTrampoline_WithFeedbackDescriptor::InitializePlatformSpecific(
455     CallInterfaceDescriptorData* data) {
456   DefaultInitializePlatformSpecific(data, 4);
457 }
458 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)459 void CallWithArrayLike_WithFeedbackDescriptor::InitializePlatformSpecific(
460     CallInterfaceDescriptorData* data) {
461   DefaultInitializePlatformSpecific(data, 4);
462 }
463 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)464 void CallWithSpread_WithFeedbackDescriptor::InitializePlatformSpecific(
465     CallInterfaceDescriptorData* data) {
466   DefaultInitializePlatformSpecific(data, 4);
467 }
468 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)469 void ConstructWithArrayLike_WithFeedbackDescriptor::InitializePlatformSpecific(
470     CallInterfaceDescriptorData* data) {
471   DefaultInitializePlatformSpecific(data, 4);
472 }
473 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)474 void ConstructWithSpread_WithFeedbackDescriptor::InitializePlatformSpecific(
475     CallInterfaceDescriptorData* data) {
476   DefaultInitializePlatformSpecific(data, 4);
477 }
478 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)479 void Compare_WithFeedbackDescriptor::InitializePlatformSpecific(
480     CallInterfaceDescriptorData* data) {
481   DefaultInitializePlatformSpecific(data, 4);
482 }
483 
InitializePlatformSpecific(CallInterfaceDescriptorData * data)484 void UnaryOp_WithFeedbackDescriptor::InitializePlatformSpecific(
485     CallInterfaceDescriptorData* data) {
486   DefaultInitializePlatformSpecific(data, 3);
487 }
488 
489 }  // namespace internal
490 }  // namespace v8
491