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