1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/code-factory.h"
6
7 #include "src/bootstrapper.h"
8 #include "src/ic/ic.h"
9
10 namespace v8 {
11 namespace internal {
12
13
14 // static
LoadIC(Isolate * isolate)15 Callable CodeFactory::LoadIC(Isolate* isolate) {
16 if (FLAG_tf_load_ic_stub) {
17 LoadICTrampolineTFStub stub(isolate);
18 return Callable(stub.GetCode(), LoadDescriptor(isolate));
19 }
20 LoadICTrampolineStub stub(isolate);
21 return Callable(stub.GetCode(), LoadDescriptor(isolate));
22 }
23
24 // static
ApiGetter(Isolate * isolate)25 Callable CodeFactory::ApiGetter(Isolate* isolate) {
26 CallApiGetterStub stub(isolate);
27 return Callable(stub.GetCode(), ApiGetterDescriptor(isolate));
28 }
29
30 // static
LoadICInOptimizedCode(Isolate * isolate)31 Callable CodeFactory::LoadICInOptimizedCode(Isolate* isolate) {
32 auto code = LoadIC::initialize_stub_in_optimized_code(isolate);
33 return Callable(code, LoadWithVectorDescriptor(isolate));
34 }
35
36 // static
LoadGlobalIC(Isolate * isolate,TypeofMode typeof_mode)37 Callable CodeFactory::LoadGlobalIC(Isolate* isolate, TypeofMode typeof_mode) {
38 LoadGlobalICTrampolineStub stub(isolate, LoadGlobalICState(typeof_mode));
39 return Callable(stub.GetCode(), LoadGlobalDescriptor(isolate));
40 }
41
42 // static
LoadGlobalICInOptimizedCode(Isolate * isolate,TypeofMode typeof_mode)43 Callable CodeFactory::LoadGlobalICInOptimizedCode(Isolate* isolate,
44 TypeofMode typeof_mode) {
45 auto code = LoadGlobalIC::initialize_stub_in_optimized_code(
46 isolate, LoadGlobalICState(typeof_mode).GetExtraICState());
47 return Callable(code, LoadGlobalWithVectorDescriptor(isolate));
48 }
49
50 // static
KeyedLoadIC(Isolate * isolate)51 Callable CodeFactory::KeyedLoadIC(Isolate* isolate) {
52 KeyedLoadICTrampolineStub stub(isolate);
53 return Callable(stub.GetCode(), LoadDescriptor(isolate));
54 }
55
56
57 // static
KeyedLoadICInOptimizedCode(Isolate * isolate)58 Callable CodeFactory::KeyedLoadICInOptimizedCode(Isolate* isolate) {
59 auto code =
60 KeyedLoadIC::initialize_stub_in_optimized_code(isolate, kNoExtraICState);
61 return Callable(code, LoadWithVectorDescriptor(isolate));
62 }
63
64
65 // static
CallIC(Isolate * isolate,int argc,ConvertReceiverMode mode,TailCallMode tail_call_mode)66 Callable CodeFactory::CallIC(Isolate* isolate, int argc,
67 ConvertReceiverMode mode,
68 TailCallMode tail_call_mode) {
69 CallICTrampolineStub stub(isolate, CallICState(argc, mode, tail_call_mode));
70 return Callable(stub.GetCode(), CallFunctionWithFeedbackDescriptor(isolate));
71 }
72
73
74 // static
CallICInOptimizedCode(Isolate * isolate,int argc,ConvertReceiverMode mode,TailCallMode tail_call_mode)75 Callable CodeFactory::CallICInOptimizedCode(Isolate* isolate, int argc,
76 ConvertReceiverMode mode,
77 TailCallMode tail_call_mode) {
78 return Callable(CallIC::initialize_stub_in_optimized_code(isolate, argc, mode,
79 tail_call_mode),
80 CallFunctionWithFeedbackAndVectorDescriptor(isolate));
81 }
82
83
84 // static
StoreIC(Isolate * isolate,LanguageMode language_mode)85 Callable CodeFactory::StoreIC(Isolate* isolate, LanguageMode language_mode) {
86 VectorStoreICTrampolineStub stub(isolate, StoreICState(language_mode));
87 return Callable(stub.GetCode(), VectorStoreICTrampolineDescriptor(isolate));
88 }
89
90
91 // static
StoreICInOptimizedCode(Isolate * isolate,LanguageMode language_mode)92 Callable CodeFactory::StoreICInOptimizedCode(Isolate* isolate,
93 LanguageMode language_mode) {
94 CallInterfaceDescriptor descriptor = VectorStoreICDescriptor(isolate);
95 return Callable(
96 StoreIC::initialize_stub_in_optimized_code(isolate, language_mode),
97 descriptor);
98 }
99
100
101 // static
KeyedStoreIC(Isolate * isolate,LanguageMode language_mode)102 Callable CodeFactory::KeyedStoreIC(Isolate* isolate,
103 LanguageMode language_mode) {
104 VectorKeyedStoreICTrampolineStub stub(isolate, StoreICState(language_mode));
105 return Callable(stub.GetCode(), VectorStoreICTrampolineDescriptor(isolate));
106 }
107
108
109 // static
KeyedStoreICInOptimizedCode(Isolate * isolate,LanguageMode language_mode)110 Callable CodeFactory::KeyedStoreICInOptimizedCode(Isolate* isolate,
111 LanguageMode language_mode) {
112 CallInterfaceDescriptor descriptor = VectorStoreICDescriptor(isolate);
113 return Callable(
114 KeyedStoreIC::initialize_stub_in_optimized_code(isolate, language_mode),
115 descriptor);
116 }
117
118
119 // static
CompareIC(Isolate * isolate,Token::Value op)120 Callable CodeFactory::CompareIC(Isolate* isolate, Token::Value op) {
121 Handle<Code> code = CompareIC::GetUninitialized(isolate, op);
122 return Callable(code, CompareDescriptor(isolate));
123 }
124
125
126 // static
BinaryOpIC(Isolate * isolate,Token::Value op)127 Callable CodeFactory::BinaryOpIC(Isolate* isolate, Token::Value op) {
128 BinaryOpICStub stub(isolate, op);
129 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
130 }
131
132
133 // static
InstanceOf(Isolate * isolate)134 Callable CodeFactory::InstanceOf(Isolate* isolate) {
135 InstanceOfStub stub(isolate);
136 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
137 }
138
139
140 // static
ToBoolean(Isolate * isolate)141 Callable CodeFactory::ToBoolean(Isolate* isolate) {
142 ToBooleanStub stub(isolate);
143 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
144 }
145
146
147 // static
ToNumber(Isolate * isolate)148 Callable CodeFactory::ToNumber(Isolate* isolate) {
149 return Callable(isolate->builtins()->ToNumber(),
150 TypeConversionDescriptor(isolate));
151 }
152
153
154 // static
NonNumberToNumber(Isolate * isolate)155 Callable CodeFactory::NonNumberToNumber(Isolate* isolate) {
156 return Callable(isolate->builtins()->NonNumberToNumber(),
157 TypeConversionDescriptor(isolate));
158 }
159
160 // static
StringToNumber(Isolate * isolate)161 Callable CodeFactory::StringToNumber(Isolate* isolate) {
162 return Callable(isolate->builtins()->StringToNumber(),
163 TypeConversionDescriptor(isolate));
164 }
165
166 // static
ToString(Isolate * isolate)167 Callable CodeFactory::ToString(Isolate* isolate) {
168 ToStringStub stub(isolate);
169 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
170 }
171
172
173 // static
ToName(Isolate * isolate)174 Callable CodeFactory::ToName(Isolate* isolate) {
175 ToNameStub stub(isolate);
176 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
177 }
178
179
180 // static
ToInteger(Isolate * isolate)181 Callable CodeFactory::ToInteger(Isolate* isolate) {
182 ToIntegerStub stub(isolate);
183 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
184 }
185
186 // static
ToLength(Isolate * isolate)187 Callable CodeFactory::ToLength(Isolate* isolate) {
188 ToLengthStub stub(isolate);
189 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
190 }
191
192
193 // static
ToObject(Isolate * isolate)194 Callable CodeFactory::ToObject(Isolate* isolate) {
195 ToObjectStub stub(isolate);
196 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
197 }
198
199
200 // static
NumberToString(Isolate * isolate)201 Callable CodeFactory::NumberToString(Isolate* isolate) {
202 NumberToStringStub stub(isolate);
203 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
204 }
205
206
207 // static
RegExpConstructResult(Isolate * isolate)208 Callable CodeFactory::RegExpConstructResult(Isolate* isolate) {
209 RegExpConstructResultStub stub(isolate);
210 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
211 }
212
213
214 // static
RegExpExec(Isolate * isolate)215 Callable CodeFactory::RegExpExec(Isolate* isolate) {
216 RegExpExecStub stub(isolate);
217 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
218 }
219
220 // static
Add(Isolate * isolate)221 Callable CodeFactory::Add(Isolate* isolate) {
222 AddStub stub(isolate);
223 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
224 }
225
226 // static
Subtract(Isolate * isolate)227 Callable CodeFactory::Subtract(Isolate* isolate) {
228 SubtractStub stub(isolate);
229 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
230 }
231
232 // static
Multiply(Isolate * isolate)233 Callable CodeFactory::Multiply(Isolate* isolate) {
234 MultiplyStub stub(isolate);
235 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
236 }
237
238 // static
Divide(Isolate * isolate)239 Callable CodeFactory::Divide(Isolate* isolate) {
240 DivideStub stub(isolate);
241 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
242 }
243
244 // static
Modulus(Isolate * isolate)245 Callable CodeFactory::Modulus(Isolate* isolate) {
246 ModulusStub stub(isolate);
247 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
248 }
249
250 // static
ShiftRight(Isolate * isolate)251 Callable CodeFactory::ShiftRight(Isolate* isolate) {
252 ShiftRightStub stub(isolate);
253 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
254 }
255
256 // static
ShiftRightLogical(Isolate * isolate)257 Callable CodeFactory::ShiftRightLogical(Isolate* isolate) {
258 ShiftRightLogicalStub stub(isolate);
259 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
260 }
261
262 // static
ShiftLeft(Isolate * isolate)263 Callable CodeFactory::ShiftLeft(Isolate* isolate) {
264 ShiftLeftStub stub(isolate);
265 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
266 }
267
268 // static
BitwiseAnd(Isolate * isolate)269 Callable CodeFactory::BitwiseAnd(Isolate* isolate) {
270 BitwiseAndStub stub(isolate);
271 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
272 }
273
274 // static
BitwiseOr(Isolate * isolate)275 Callable CodeFactory::BitwiseOr(Isolate* isolate) {
276 BitwiseOrStub stub(isolate);
277 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
278 }
279
280 // static
BitwiseXor(Isolate * isolate)281 Callable CodeFactory::BitwiseXor(Isolate* isolate) {
282 BitwiseXorStub stub(isolate);
283 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
284 }
285
286 // static
Inc(Isolate * isolate)287 Callable CodeFactory::Inc(Isolate* isolate) {
288 IncStub stub(isolate);
289 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
290 }
291
292 // static
Dec(Isolate * isolate)293 Callable CodeFactory::Dec(Isolate* isolate) {
294 DecStub stub(isolate);
295 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
296 }
297
298 // static
LessThan(Isolate * isolate)299 Callable CodeFactory::LessThan(Isolate* isolate) {
300 LessThanStub stub(isolate);
301 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
302 }
303
304 // static
LessThanOrEqual(Isolate * isolate)305 Callable CodeFactory::LessThanOrEqual(Isolate* isolate) {
306 LessThanOrEqualStub stub(isolate);
307 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
308 }
309
310 // static
GreaterThan(Isolate * isolate)311 Callable CodeFactory::GreaterThan(Isolate* isolate) {
312 GreaterThanStub stub(isolate);
313 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
314 }
315
316 // static
GreaterThanOrEqual(Isolate * isolate)317 Callable CodeFactory::GreaterThanOrEqual(Isolate* isolate) {
318 GreaterThanOrEqualStub stub(isolate);
319 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
320 }
321
322 // static
Equal(Isolate * isolate)323 Callable CodeFactory::Equal(Isolate* isolate) {
324 EqualStub stub(isolate);
325 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
326 }
327
328 // static
NotEqual(Isolate * isolate)329 Callable CodeFactory::NotEqual(Isolate* isolate) {
330 NotEqualStub stub(isolate);
331 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
332 }
333
334 // static
StrictEqual(Isolate * isolate)335 Callable CodeFactory::StrictEqual(Isolate* isolate) {
336 StrictEqualStub stub(isolate);
337 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
338 }
339
340 // static
StrictNotEqual(Isolate * isolate)341 Callable CodeFactory::StrictNotEqual(Isolate* isolate) {
342 StrictNotEqualStub stub(isolate);
343 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
344 }
345
346 // static
StringAdd(Isolate * isolate,StringAddFlags flags,PretenureFlag pretenure_flag)347 Callable CodeFactory::StringAdd(Isolate* isolate, StringAddFlags flags,
348 PretenureFlag pretenure_flag) {
349 StringAddStub stub(isolate, flags, pretenure_flag);
350 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
351 }
352
353 // static
StringCompare(Isolate * isolate,Token::Value token)354 Callable CodeFactory::StringCompare(Isolate* isolate, Token::Value token) {
355 switch (token) {
356 case Token::EQ:
357 case Token::EQ_STRICT:
358 return StringEqual(isolate);
359 case Token::NE:
360 case Token::NE_STRICT:
361 return StringNotEqual(isolate);
362 case Token::LT:
363 return StringLessThan(isolate);
364 case Token::GT:
365 return StringGreaterThan(isolate);
366 case Token::LTE:
367 return StringLessThanOrEqual(isolate);
368 case Token::GTE:
369 return StringGreaterThanOrEqual(isolate);
370 default:
371 break;
372 }
373 UNREACHABLE();
374 return StringEqual(isolate);
375 }
376
377 // static
StringEqual(Isolate * isolate)378 Callable CodeFactory::StringEqual(Isolate* isolate) {
379 StringEqualStub stub(isolate);
380 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
381 }
382
383 // static
StringNotEqual(Isolate * isolate)384 Callable CodeFactory::StringNotEqual(Isolate* isolate) {
385 StringNotEqualStub stub(isolate);
386 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
387 }
388
389 // static
StringLessThan(Isolate * isolate)390 Callable CodeFactory::StringLessThan(Isolate* isolate) {
391 StringLessThanStub stub(isolate);
392 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
393 }
394
395 // static
StringLessThanOrEqual(Isolate * isolate)396 Callable CodeFactory::StringLessThanOrEqual(Isolate* isolate) {
397 StringLessThanOrEqualStub stub(isolate);
398 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
399 }
400
401 // static
StringGreaterThan(Isolate * isolate)402 Callable CodeFactory::StringGreaterThan(Isolate* isolate) {
403 StringGreaterThanStub stub(isolate);
404 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
405 }
406
407 // static
StringGreaterThanOrEqual(Isolate * isolate)408 Callable CodeFactory::StringGreaterThanOrEqual(Isolate* isolate) {
409 StringGreaterThanOrEqualStub stub(isolate);
410 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
411 }
412
413 // static
SubString(Isolate * isolate)414 Callable CodeFactory::SubString(Isolate* isolate) {
415 SubStringStub stub(isolate);
416 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
417 }
418
419
420 // static
ResumeGenerator(Isolate * isolate)421 Callable CodeFactory::ResumeGenerator(Isolate* isolate) {
422 return Callable(isolate->builtins()->ResumeGeneratorTrampoline(),
423 ResumeGeneratorDescriptor(isolate));
424 }
425
426 // static
Typeof(Isolate * isolate)427 Callable CodeFactory::Typeof(Isolate* isolate) {
428 TypeofStub stub(isolate);
429 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
430 }
431
432
433 // static
FastCloneRegExp(Isolate * isolate)434 Callable CodeFactory::FastCloneRegExp(Isolate* isolate) {
435 FastCloneRegExpStub stub(isolate);
436 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
437 }
438
439
440 // static
FastCloneShallowArray(Isolate * isolate)441 Callable CodeFactory::FastCloneShallowArray(Isolate* isolate) {
442 // TODO(mstarzinger): Thread through AllocationSiteMode at some point.
443 FastCloneShallowArrayStub stub(isolate, DONT_TRACK_ALLOCATION_SITE);
444 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
445 }
446
447
448 // static
FastCloneShallowObject(Isolate * isolate,int length)449 Callable CodeFactory::FastCloneShallowObject(Isolate* isolate, int length) {
450 FastCloneShallowObjectStub stub(isolate, length);
451 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
452 }
453
454
455 // static
FastNewContext(Isolate * isolate,int slot_count)456 Callable CodeFactory::FastNewContext(Isolate* isolate, int slot_count) {
457 FastNewContextStub stub(isolate, slot_count);
458 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
459 }
460
461
462 // static
FastNewClosure(Isolate * isolate,LanguageMode language_mode,FunctionKind kind)463 Callable CodeFactory::FastNewClosure(Isolate* isolate,
464 LanguageMode language_mode,
465 FunctionKind kind) {
466 FastNewClosureStub stub(isolate, language_mode, kind);
467 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
468 }
469
470
471 // static
FastNewObject(Isolate * isolate)472 Callable CodeFactory::FastNewObject(Isolate* isolate) {
473 FastNewObjectStub stub(isolate);
474 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
475 }
476
477
478 // static
FastNewRestParameter(Isolate * isolate,bool skip_stub_frame)479 Callable CodeFactory::FastNewRestParameter(Isolate* isolate,
480 bool skip_stub_frame) {
481 FastNewRestParameterStub stub(isolate, skip_stub_frame);
482 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
483 }
484
485
486 // static
FastNewSloppyArguments(Isolate * isolate,bool skip_stub_frame)487 Callable CodeFactory::FastNewSloppyArguments(Isolate* isolate,
488 bool skip_stub_frame) {
489 FastNewSloppyArgumentsStub stub(isolate, skip_stub_frame);
490 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
491 }
492
493
494 // static
FastNewStrictArguments(Isolate * isolate,bool skip_stub_frame)495 Callable CodeFactory::FastNewStrictArguments(Isolate* isolate,
496 bool skip_stub_frame) {
497 FastNewStrictArgumentsStub stub(isolate, skip_stub_frame);
498 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
499 }
500
501
502 // static
AllocateHeapNumber(Isolate * isolate)503 Callable CodeFactory::AllocateHeapNumber(Isolate* isolate) {
504 AllocateHeapNumberStub stub(isolate);
505 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
506 }
507
508 #define SIMD128_ALLOC(TYPE, Type, type, lane_count, lane_type) \
509 Callable CodeFactory::Allocate##Type(Isolate* isolate) { \
510 Allocate##Type##Stub stub(isolate); \
511 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor()); \
512 }
SIMD128_TYPES(SIMD128_ALLOC)513 SIMD128_TYPES(SIMD128_ALLOC)
514 #undef SIMD128_ALLOC
515
516 // static
517 Callable CodeFactory::ArgumentAdaptor(Isolate* isolate) {
518 return Callable(isolate->builtins()->ArgumentsAdaptorTrampoline(),
519 ArgumentAdaptorDescriptor(isolate));
520 }
521
522
523 // static
Call(Isolate * isolate,ConvertReceiverMode mode,TailCallMode tail_call_mode)524 Callable CodeFactory::Call(Isolate* isolate, ConvertReceiverMode mode,
525 TailCallMode tail_call_mode) {
526 return Callable(isolate->builtins()->Call(mode, tail_call_mode),
527 CallTrampolineDescriptor(isolate));
528 }
529
530
531 // static
CallFunction(Isolate * isolate,ConvertReceiverMode mode)532 Callable CodeFactory::CallFunction(Isolate* isolate, ConvertReceiverMode mode) {
533 return Callable(isolate->builtins()->CallFunction(mode),
534 CallTrampolineDescriptor(isolate));
535 }
536
537
538 // static
Construct(Isolate * isolate)539 Callable CodeFactory::Construct(Isolate* isolate) {
540 return Callable(isolate->builtins()->Construct(),
541 ConstructTrampolineDescriptor(isolate));
542 }
543
544
545 // static
ConstructFunction(Isolate * isolate)546 Callable CodeFactory::ConstructFunction(Isolate* isolate) {
547 return Callable(isolate->builtins()->ConstructFunction(),
548 ConstructTrampolineDescriptor(isolate));
549 }
550
551 // static
HasProperty(Isolate * isolate)552 Callable CodeFactory::HasProperty(Isolate* isolate) {
553 HasPropertyStub stub(isolate);
554 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
555 }
556
557 // static
MathPow(Isolate * isolate)558 Callable CodeFactory::MathPow(Isolate* isolate) {
559 MathPowStub stub(isolate, MathPowStub::ON_STACK);
560 return Callable(stub.GetCode(), stub.GetCallInterfaceDescriptor());
561 }
562
563 // static
InterpreterPushArgsAndCall(Isolate * isolate,TailCallMode tail_call_mode)564 Callable CodeFactory::InterpreterPushArgsAndCall(Isolate* isolate,
565 TailCallMode tail_call_mode) {
566 return Callable(
567 isolate->builtins()->InterpreterPushArgsAndCall(tail_call_mode),
568 InterpreterPushArgsAndCallDescriptor(isolate));
569 }
570
571
572 // static
InterpreterPushArgsAndConstruct(Isolate * isolate)573 Callable CodeFactory::InterpreterPushArgsAndConstruct(Isolate* isolate) {
574 return Callable(isolate->builtins()->InterpreterPushArgsAndConstruct(),
575 InterpreterPushArgsAndConstructDescriptor(isolate));
576 }
577
578
579 // static
InterpreterCEntry(Isolate * isolate,int result_size)580 Callable CodeFactory::InterpreterCEntry(Isolate* isolate, int result_size) {
581 // Note: If we ever use fpregs in the interpreter then we will need to
582 // save fpregs too.
583 CEntryStub stub(isolate, result_size, kDontSaveFPRegs, kArgvInRegister);
584 return Callable(stub.GetCode(), InterpreterCEntryDescriptor(isolate));
585 }
586
587 } // namespace internal
588 } // namespace v8
589