blob: 50638f94c94d12a22941c9b9cc68c23b2cb596f5 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#include "src/interface-descriptors.h"
6
7namespace v8 {
8namespace internal {
9
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010namespace {
11// Constructors for common combined semantic and representation types.
12Type* SmiType(Zone* zone) {
13 return Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), zone);
14}
15
16
17Type* UntaggedIntegral32(Zone* zone) {
18 return Type::Intersect(Type::Signed32(), Type::UntaggedIntegral32(), zone);
19}
20
21
22Type* AnyTagged(Zone* zone) {
23 return Type::Intersect(
24 Type::Any(),
25 Type::Union(Type::TaggedPointer(), Type::TaggedSigned(), zone), zone);
26}
27
28
29Type* ExternalPointer(Zone* zone) {
30 return Type::Intersect(Type::Internal(), Type::UntaggedPointer(), zone);
31}
32} // namespace
33
Ben Murdoch097c5b22016-05-18 11:27:45 +010034FunctionType* CallInterfaceDescriptor::BuildDefaultFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035 Isolate* isolate, int parameter_count) {
36 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +010037 FunctionType* function =
38 Type::Function(AnyTagged(zone), Type::Undefined(), parameter_count, zone)
39 ->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040 while (parameter_count-- != 0) {
41 function->InitParameter(parameter_count, AnyTagged(zone));
42 }
43 return function;
44}
45
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046void CallInterfaceDescriptorData::InitializePlatformSpecific(
Ben Murdoch61f157c2016-09-16 13:49:30 +010047 int register_parameter_count, const Register* registers,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 PlatformInterfaceDescriptor* platform_descriptor) {
49 platform_specific_descriptor_ = platform_descriptor;
50 register_param_count_ = register_parameter_count;
51
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052 // InterfaceDescriptor owns a copy of the registers array.
53 register_params_.Reset(NewArray<Register>(register_parameter_count));
54 for (int i = 0; i < register_parameter_count; i++) {
55 register_params_[i] = registers[i];
56 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057}
58
Emily Bernierd0a1eb72015-03-24 16:35:39 -040059const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060 CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0);
61 size_t index = data_ - start;
62 DCHECK(index < CallDescriptors::NUMBER_OF_DESCRIPTORS);
63 CallDescriptors::Key key = static_cast<CallDescriptors::Key>(index);
64 switch (key) {
65#define DEF_CASE(NAME) \
66 case CallDescriptors::NAME: \
67 return #NAME " Descriptor";
68 INTERFACE_DESCRIPTOR_LIST(DEF_CASE)
69#undef DEF_CASE
70 case CallDescriptors::NUMBER_OF_DESCRIPTORS:
71 break;
72 }
73 return "";
74}
75
76
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000077void VoidDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000078 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079 data->InitializePlatformSpecific(0, nullptr);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000080}
81
Ben Murdoch097c5b22016-05-18 11:27:45 +010082FunctionType* LoadDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000083 Isolate* isolate, int paramater_count) {
84 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +010085 FunctionType* function =
86 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087 function->InitParameter(0, AnyTagged(zone));
88 function->InitParameter(1, AnyTagged(zone));
89 function->InitParameter(2, SmiType(zone));
90 return function;
91}
92
93
94void LoadDescriptor::InitializePlatformSpecific(
95 CallInterfaceDescriptorData* data) {
96 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()};
97 data->InitializePlatformSpecific(arraysize(registers), registers);
98}
99
Ben Murdoch61f157c2016-09-16 13:49:30 +0100100FunctionType* LoadGlobalDescriptor::BuildCallInterfaceDescriptorFunctionType(
101 Isolate* isolate, int paramater_count) {
102 Zone* zone = isolate->interface_descriptor_zone();
103 FunctionType* function =
104 Type::Function(AnyTagged(zone), Type::Undefined(), 1, zone)->AsFunction();
105 function->InitParameter(0, SmiType(zone));
106 return function;
107}
108
109void LoadGlobalDescriptor::InitializePlatformSpecific(
110 CallInterfaceDescriptorData* data) {
111 Register registers[] = {LoadWithVectorDescriptor::SlotRegister()};
112 data->InitializePlatformSpecific(arraysize(registers), registers);
113}
114
115FunctionType*
116LoadGlobalWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType(
117 Isolate* isolate, int paramater_count) {
118 Zone* zone = isolate->interface_descriptor_zone();
119 FunctionType* function =
120 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
121 function->InitParameter(0, SmiType(zone));
122 function->InitParameter(1, AnyTagged(zone));
123 return function;
124}
125
126void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific(
127 CallInterfaceDescriptorData* data) {
128 Register registers[] = {LoadWithVectorDescriptor::SlotRegister(),
129 LoadWithVectorDescriptor::VectorRegister()};
130 data->InitializePlatformSpecific(arraysize(registers), registers);
131}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000132
133void StoreDescriptor::InitializePlatformSpecific(
134 CallInterfaceDescriptorData* data) {
135 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister()};
136 data->InitializePlatformSpecific(arraysize(registers), registers);
137}
138
139
140void StoreTransitionDescriptor::InitializePlatformSpecific(
141 CallInterfaceDescriptorData* data) {
142 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
143 MapRegister()};
144
145 data->InitializePlatformSpecific(arraysize(registers), registers);
146}
147
148
149void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
150 CallInterfaceDescriptorData* data) {
151 if (SlotRegister().is(no_reg)) {
152 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
153 MapRegister(), VectorRegister()};
154 data->InitializePlatformSpecific(arraysize(registers), registers);
155 } else {
156 Register registers[] = {ReceiverRegister(), NameRegister(),
157 ValueRegister(), MapRegister(),
158 SlotRegister(), VectorRegister()};
159 data->InitializePlatformSpecific(arraysize(registers), registers);
160 }
161}
162
Ben Murdoch097c5b22016-05-18 11:27:45 +0100163FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000164StoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType(
165 Isolate* isolate, int paramater_count) {
166 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100167 FunctionType* function =
168 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000169 function->InitParameter(0, AnyTagged(zone)); // Receiver
170 function->InitParameter(1, AnyTagged(zone)); // Name
171 function->InitParameter(2, AnyTagged(zone)); // Value
172 function->InitParameter(3, AnyTagged(zone)); // Map
173 return function;
174}
175
Ben Murdoch097c5b22016-05-18 11:27:45 +0100176FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000177StoreGlobalViaContextDescriptor::BuildCallInterfaceDescriptorFunctionType(
178 Isolate* isolate, int paramater_count) {
179 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100180 FunctionType* function =
181 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 function->InitParameter(0, UntaggedIntegral32(zone));
183 function->InitParameter(1, AnyTagged(zone));
184 return function;
185}
186
187
188void StoreGlobalViaContextDescriptor::InitializePlatformSpecific(
189 CallInterfaceDescriptorData* data) {
190 Register registers[] = {SlotRegister(), ValueRegister()};
191 data->InitializePlatformSpecific(arraysize(registers), registers);
192}
193
194
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000195void StringCompareDescriptor::InitializePlatformSpecific(
196 CallInterfaceDescriptorData* data) {
197 Register registers[] = {LeftRegister(), RightRegister()};
198 data->InitializePlatformSpecific(arraysize(registers), registers);
199}
200
Ben Murdochda12d292016-06-02 14:46:10 +0100201void TypeConversionDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000202 CallInterfaceDescriptorData* data) {
Ben Murdochda12d292016-06-02 14:46:10 +0100203 Register registers[] = {ArgumentRegister()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000204 data->InitializePlatformSpecific(arraysize(registers), registers);
205}
206
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207void MathPowTaggedDescriptor::InitializePlatformSpecific(
208 CallInterfaceDescriptorData* data) {
209 Register registers[] = {exponent()};
210 data->InitializePlatformSpecific(arraysize(registers), registers);
211}
212
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213void MathPowIntegerDescriptor::InitializePlatformSpecific(
214 CallInterfaceDescriptorData* data) {
215 Register registers[] = {exponent()};
216 data->InitializePlatformSpecific(arraysize(registers), registers);
217}
218
Ben Murdoch097c5b22016-05-18 11:27:45 +0100219FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000220LoadWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType(
221 Isolate* isolate, int paramater_count) {
222 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100223 FunctionType* function =
224 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225 function->InitParameter(0, AnyTagged(zone));
226 function->InitParameter(1, AnyTagged(zone));
227 function->InitParameter(2, SmiType(zone));
228 function->InitParameter(3, AnyTagged(zone));
229 return function;
230}
231
232
233void LoadWithVectorDescriptor::InitializePlatformSpecific(
234 CallInterfaceDescriptorData* data) {
235 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(),
236 VectorRegister()};
237 data->InitializePlatformSpecific(arraysize(registers), registers);
238}
239
Ben Murdoch097c5b22016-05-18 11:27:45 +0100240FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000241VectorStoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType(
242 Isolate* isolate, int paramater_count) {
243 Zone* zone = isolate->interface_descriptor_zone();
244 bool has_slot = !VectorStoreTransitionDescriptor::SlotRegister().is(no_reg);
245 int arg_count = has_slot ? 6 : 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100246 FunctionType* function =
247 Type::Function(AnyTagged(zone), Type::Undefined(), arg_count, zone)
248 ->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000249 int index = 0;
250 function->InitParameter(index++, AnyTagged(zone)); // receiver
251 function->InitParameter(index++, AnyTagged(zone)); // name
252 function->InitParameter(index++, AnyTagged(zone)); // value
253 function->InitParameter(index++, AnyTagged(zone)); // map
254 if (has_slot) {
255 function->InitParameter(index++, SmiType(zone)); // slot
256 }
257 function->InitParameter(index++, AnyTagged(zone)); // vector
258 return function;
259}
260
Ben Murdoch097c5b22016-05-18 11:27:45 +0100261FunctionType* VectorStoreICDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000262 Isolate* isolate, int paramater_count) {
263 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100264 FunctionType* function =
265 Type::Function(AnyTagged(zone), Type::Undefined(), 5, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000266 function->InitParameter(0, AnyTagged(zone));
267 function->InitParameter(1, AnyTagged(zone));
268 function->InitParameter(2, AnyTagged(zone));
269 function->InitParameter(3, SmiType(zone));
270 function->InitParameter(4, AnyTagged(zone));
271 return function;
272}
273
274
275void VectorStoreICDescriptor::InitializePlatformSpecific(
276 CallInterfaceDescriptorData* data) {
277 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000278 SlotRegister(), VectorRegister()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000279 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280}
281
Ben Murdoch097c5b22016-05-18 11:27:45 +0100282FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283VectorStoreICTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType(
284 Isolate* isolate, int paramater_count) {
285 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100286 FunctionType* function =
287 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000288 function->InitParameter(0, AnyTagged(zone));
289 function->InitParameter(1, AnyTagged(zone));
290 function->InitParameter(2, AnyTagged(zone));
291 function->InitParameter(3, SmiType(zone));
292 return function;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293}
294
295
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000296void VectorStoreICTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000297 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
299 SlotRegister()};
300 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000301}
302
Ben Murdochc5610432016-08-08 18:44:38 +0100303const Register ApiGetterDescriptor::ReceiverRegister() {
304 return LoadDescriptor::ReceiverRegister();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000305}
306
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307void ApiGetterDescriptor::InitializePlatformSpecific(
308 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100309 Register registers[] = {ReceiverRegister(), HolderRegister(),
310 CallbackRegister()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000311 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000312}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000313
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314void ContextOnlyDescriptor::InitializePlatformSpecific(
315 CallInterfaceDescriptorData* data) {
316 data->InitializePlatformSpecific(0, nullptr);
317}
318
Ben Murdoch61f157c2016-09-16 13:49:30 +0100319CallInterfaceDescriptor OnStackArgsDescriptorBase::ForArgs(
320 Isolate* isolate, int parameter_count) {
321 switch (parameter_count) {
322 case 1:
323 return OnStackWith1ArgsDescriptor(isolate);
324 case 2:
325 return OnStackWith2ArgsDescriptor(isolate);
326 case 3:
327 return OnStackWith3ArgsDescriptor(isolate);
328 case 4:
329 return OnStackWith4ArgsDescriptor(isolate);
330 case 5:
331 return OnStackWith5ArgsDescriptor(isolate);
332 case 6:
333 return OnStackWith6ArgsDescriptor(isolate);
334 case 7:
335 return OnStackWith7ArgsDescriptor(isolate);
336 default:
337 UNREACHABLE();
338 return VoidDescriptor(isolate);
339 }
340}
341
342FunctionType*
343OnStackArgsDescriptorBase::BuildCallInterfaceDescriptorFunctionTypeWithArg(
344 Isolate* isolate, int register_parameter_count, int parameter_count) {
345 DCHECK_EQ(0, register_parameter_count);
346 DCHECK_GT(parameter_count, 0);
347 Zone* zone = isolate->interface_descriptor_zone();
348 FunctionType* function =
349 Type::Function(AnyTagged(zone), AnyTagged(zone), parameter_count, zone)
350 ->AsFunction();
351 for (int i = 0; i < parameter_count; i++) {
352 function->InitParameter(i, AnyTagged(zone));
353 }
354 return function;
355}
356
357void OnStackArgsDescriptorBase::InitializePlatformSpecific(
358 CallInterfaceDescriptorData* data) {
359 data->InitializePlatformSpecific(0, nullptr);
360}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361
362void GrowArrayElementsDescriptor::InitializePlatformSpecific(
363 CallInterfaceDescriptorData* data) {
364 Register registers[] = {ObjectRegister(), KeyRegister()};
365 data->InitializePlatformSpecific(arraysize(registers), registers);
366}
367
Ben Murdoch61f157c2016-09-16 13:49:30 +0100368FunctionType*
369VarArgFunctionDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdochda12d292016-06-02 14:46:10 +0100370 Isolate* isolate, int paramater_count) {
371 Zone* zone = isolate->interface_descriptor_zone();
372 FunctionType* function =
373 Type::Function(AnyTagged(zone), AnyTagged(zone), 1, zone)->AsFunction();
374 function->InitParameter(0, UntaggedIntegral32(zone)); // actual #arguments
375 return function;
376}
377
Ben Murdoch097c5b22016-05-18 11:27:45 +0100378FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379FastCloneRegExpDescriptor::BuildCallInterfaceDescriptorFunctionType(
380 Isolate* isolate, int paramater_count) {
381 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100382 FunctionType* function =
383 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384 function->InitParameter(0, AnyTagged(zone)); // closure
385 function->InitParameter(1, SmiType(zone)); // literal_index
386 function->InitParameter(2, AnyTagged(zone)); // pattern
387 function->InitParameter(3, AnyTagged(zone)); // flags
388 return function;
389}
390
Ben Murdoch097c5b22016-05-18 11:27:45 +0100391FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392FastCloneShallowArrayDescriptor::BuildCallInterfaceDescriptorFunctionType(
393 Isolate* isolate, int paramater_count) {
394 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100395 FunctionType* function =
396 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000397 function->InitParameter(0, AnyTagged(zone));
398 function->InitParameter(1, SmiType(zone));
399 function->InitParameter(2, AnyTagged(zone));
400 return function;
401}
402
Ben Murdoch097c5b22016-05-18 11:27:45 +0100403FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000404CreateAllocationSiteDescriptor::BuildCallInterfaceDescriptorFunctionType(
405 Isolate* isolate, int paramater_count) {
406 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100407 FunctionType* function =
408 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000409 function->InitParameter(0, AnyTagged(zone));
410 function->InitParameter(1, SmiType(zone));
411 return function;
412}
413
Ben Murdoch097c5b22016-05-18 11:27:45 +0100414FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000415CreateWeakCellDescriptor::BuildCallInterfaceDescriptorFunctionType(
416 Isolate* isolate, int paramater_count) {
417 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100418 FunctionType* function =
419 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000420 function->InitParameter(0, AnyTagged(zone));
421 function->InitParameter(1, SmiType(zone));
422 function->InitParameter(2, AnyTagged(zone));
423 return function;
424}
425
Ben Murdoch097c5b22016-05-18 11:27:45 +0100426FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000427CallTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType(
428 Isolate* isolate, int paramater_count) {
429 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100430 FunctionType* function =
431 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000432 function->InitParameter(0, AnyTagged(zone)); // target
433 function->InitParameter(1, UntaggedIntegral32(zone)); // actual #arguments
434 return function;
435}
436
Ben Murdoch097c5b22016-05-18 11:27:45 +0100437FunctionType* ConstructStubDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000438 Isolate* isolate, int paramater_count) {
439 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100440 FunctionType* function =
441 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000442 function->InitParameter(0, AnyTagged(zone)); // target
443 function->InitParameter(1, AnyTagged(zone)); // new.target
444 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments
445 function->InitParameter(3, AnyTagged(zone)); // opt. allocation site
446 return function;
447}
448
Ben Murdoch097c5b22016-05-18 11:27:45 +0100449FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000450ConstructTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType(
451 Isolate* isolate, int paramater_count) {
452 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100453 FunctionType* function =
454 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000455 function->InitParameter(0, AnyTagged(zone)); // target
456 function->InitParameter(1, AnyTagged(zone)); // new.target
457 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments
458 return function;
459}
460
Ben Murdoch097c5b22016-05-18 11:27:45 +0100461FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000462CallFunctionWithFeedbackDescriptor::BuildCallInterfaceDescriptorFunctionType(
463 Isolate* isolate, int paramater_count) {
464 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100465 FunctionType* function =
466 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000467 function->InitParameter(0, Type::Receiver()); // JSFunction
468 function->InitParameter(1, SmiType(zone));
469 return function;
470}
471
Ben Murdoch097c5b22016-05-18 11:27:45 +0100472FunctionType* CallFunctionWithFeedbackAndVectorDescriptor::
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000473 BuildCallInterfaceDescriptorFunctionType(Isolate* isolate,
474 int paramater_count) {
475 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100476 FunctionType* function =
477 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000478 function->InitParameter(0, Type::Receiver()); // JSFunction
479 function->InitParameter(1, SmiType(zone));
480 function->InitParameter(2, AnyTagged(zone));
481 return function;
482}
483
Ben Murdoch097c5b22016-05-18 11:27:45 +0100484FunctionType*
Ben Murdochc5610432016-08-08 18:44:38 +0100485ArrayNoArgumentConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType(
486 Isolate* isolate, int paramater_count) {
487 Zone* zone = isolate->interface_descriptor_zone();
488 FunctionType* function =
489 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
490 function->InitParameter(0, Type::Receiver()); // JSFunction
491 function->InitParameter(1, AnyTagged(zone));
492 function->InitParameter(2, UntaggedIntegral32(zone));
493 function->InitParameter(3, AnyTagged(zone));
494 return function;
495}
496
Ben Murdoch61f157c2016-09-16 13:49:30 +0100497FunctionType* ArraySingleArgumentConstructorDescriptor::
498 BuildCallInterfaceDescriptorFunctionType(Isolate* isolate,
499 int paramater_count) {
500 Zone* zone = isolate->interface_descriptor_zone();
501 FunctionType* function =
502 Type::Function(AnyTagged(zone), Type::Undefined(), 5, zone)->AsFunction();
503 function->InitParameter(0, Type::Receiver()); // JSFunction
504 function->InitParameter(1, AnyTagged(zone));
505 function->InitParameter(2, UntaggedIntegral32(zone));
506 function->InitParameter(3, AnyTagged(zone));
507 function->InitParameter(4, AnyTagged(zone));
508 return function;
509}
510
Ben Murdochc5610432016-08-08 18:44:38 +0100511FunctionType*
Ben Murdoch61f157c2016-09-16 13:49:30 +0100512ArrayNArgumentsConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000513 Isolate* isolate, int paramater_count) {
514 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100515 FunctionType* function =
516 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000517 function->InitParameter(0, Type::Receiver()); // JSFunction
Ben Murdoch61f157c2016-09-16 13:49:30 +0100518 function->InitParameter(1, AnyTagged(zone)); // Allocation site or undefined
519 function->InitParameter(2, UntaggedIntegral32(zone)); // Arg count
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000520 return function;
521}
522
Ben Murdoch097c5b22016-05-18 11:27:45 +0100523FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000524ArgumentAdaptorDescriptor::BuildCallInterfaceDescriptorFunctionType(
525 Isolate* isolate, int paramater_count) {
526 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100527 FunctionType* function =
528 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000529 function->InitParameter(0, Type::Receiver()); // JSFunction
530 function->InitParameter(1, AnyTagged(zone)); // the new target
531 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments
532 function->InitParameter(3, UntaggedIntegral32(zone)); // expected #arguments
533 return function;
534}
535
Ben Murdochda12d292016-06-02 14:46:10 +0100536CallInterfaceDescriptor ApiCallbackDescriptorBase::ForArgs(Isolate* isolate,
537 int argc) {
538 switch (argc) {
539 case 0:
540 return ApiCallbackWith0ArgsDescriptor(isolate);
541 case 1:
542 return ApiCallbackWith1ArgsDescriptor(isolate);
543 case 2:
544 return ApiCallbackWith2ArgsDescriptor(isolate);
545 case 3:
546 return ApiCallbackWith3ArgsDescriptor(isolate);
547 case 4:
548 return ApiCallbackWith4ArgsDescriptor(isolate);
549 case 5:
550 return ApiCallbackWith5ArgsDescriptor(isolate);
551 case 6:
552 return ApiCallbackWith6ArgsDescriptor(isolate);
553 case 7:
554 return ApiCallbackWith7ArgsDescriptor(isolate);
555 default:
556 UNREACHABLE();
557 return VoidDescriptor(isolate);
558 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000559}
560
Ben Murdochda12d292016-06-02 14:46:10 +0100561FunctionType*
562ApiCallbackDescriptorBase::BuildCallInterfaceDescriptorFunctionTypeWithArg(
563 Isolate* isolate, int parameter_count, int argc) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000564 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100565 FunctionType* function =
Ben Murdochda12d292016-06-02 14:46:10 +0100566 Type::Function(AnyTagged(zone), Type::Undefined(), 4 + argc, zone)
567 ->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000568 function->InitParameter(0, AnyTagged(zone)); // callee
569 function->InitParameter(1, AnyTagged(zone)); // call_data
570 function->InitParameter(2, AnyTagged(zone)); // holder
571 function->InitParameter(3, ExternalPointer(zone)); // api_function_address
Ben Murdochda12d292016-06-02 14:46:10 +0100572 for (int i = 0; i < argc; i++) {
573 function->InitParameter(i, AnyTagged(zone));
574 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000575 return function;
576}
577
Ben Murdoch097c5b22016-05-18 11:27:45 +0100578FunctionType*
579InterpreterDispatchDescriptor::BuildCallInterfaceDescriptorFunctionType(
580 Isolate* isolate, int parameter_count) {
581 Zone* zone = isolate->interface_descriptor_zone();
582 FunctionType* function =
Ben Murdochc5610432016-08-08 18:44:38 +0100583 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100584 function->InitParameter(kAccumulatorParameter, AnyTagged(zone));
Ben Murdoch097c5b22016-05-18 11:27:45 +0100585 function->InitParameter(kBytecodeOffsetParameter, UntaggedIntegral32(zone));
586 function->InitParameter(kBytecodeArrayParameter, AnyTagged(zone));
587 function->InitParameter(kDispatchTableParameter, AnyTagged(zone));
588 return function;
589}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000590
591} // namespace internal
592} // namespace v8