7#include <private/qv4lookup_p.h>
8#include <private/qv4generatorobject_p.h>
14using namespace QV4::JIT;
15using namespace QV4::Moth;
17BaselineJIT::BaselineJIT(Function *function)
19 , as(
new BaselineAssembler(&(function->compilationUnit->constants->asValue<Value>())))
22BaselineJIT::~BaselineJIT()
25void BaselineJIT::generate()
28 const char *code = function->codeData;
29 uint len = function->compiledFunction->codeSize;
31 for (
unsigned i = 0, ei = function->compiledFunction->nLabelInfos; i != ei; ++i)
32 labels.insert(
int(function->compiledFunction->labelInfoTable()[i]));
34 as->generatePrologue();
36 as->loadAccumulatorFromFrame();
38 as->generateEpilogue();
44#define STORE_IP() as->storeInstructionPointer(nextInstructionOffset())
45#define STORE_ACC() as->saveAccumulatorInFrame()
46#define LOAD_ACC() as->loadAccumulatorFromFrame()
47#define BASELINEJIT_GENERATE_RUNTIME_CALL(function, destination) {
48 as->GENERATE_RUNTIME_CALL(function, destination);
49 if (Runtime::function::throws)
53void BaselineJIT::generate_Ret()
58void BaselineJIT::generate_Debug() { Q_UNREACHABLE(); }
60void BaselineJIT::generate_LoadConst(
int index)
65void BaselineJIT::generate_LoadZero()
67 as->loadValue(Encode(
int(0)));
70void BaselineJIT::generate_LoadTrue()
72 as->loadValue(Encode(
true));
75void BaselineJIT::generate_LoadFalse()
77 as->loadValue(Encode(
false));
80void BaselineJIT::generate_LoadNull()
82 as->loadValue(Encode::null());
85void BaselineJIT::generate_LoadUndefined()
87 as->loadValue(Encode::undefined());
90void BaselineJIT::generate_LoadInt(
int value)
93 as->loadValue(Encode(value));
96void BaselineJIT::generate_MoveConst(
int constIndex,
int destTemp)
98 as->copyConst(constIndex, destTemp);
101void BaselineJIT::generate_LoadReg(
int reg)
106void BaselineJIT::generate_StoreReg(
int reg)
111void BaselineJIT::generate_MoveReg(
int srcReg,
int destReg)
114 as->moveReg(srcReg, destReg);
117void BaselineJIT::generate_LoadImport(
int index)
119 as->loadImport(index);
122void BaselineJIT::generate_LoadLocal(
int index)
124 as->loadLocal(index);
127void BaselineJIT::generate_StoreLocal(
int index)
129 as->checkException();
130 as->storeLocal(index);
133void BaselineJIT::generate_LoadScopedLocal(
int scope,
int index)
135 as->loadLocal(index, scope);
138void BaselineJIT::generate_StoreScopedLocal(
int scope,
int index)
140 as->checkException();
141 as->storeLocal(index, scope);
144void BaselineJIT::generate_LoadRuntimeString(
int stringId)
146 as->loadString(stringId);
149void BaselineJIT::generate_MoveRegExp(
int regExpId,
int destReg)
151 as->prepareCallWithArgCount(2);
152 as->passInt32AsArg(regExpId, 1);
153 as->passEngineAsArg(0);
154 BASELINEJIT_GENERATE_RUNTIME_CALL(RegexpLiteral, CallResultDestination::InAccumulator);
155 as->storeReg(destReg);
158void BaselineJIT::generate_LoadClosure(
int value)
160 as->prepareCallWithArgCount(2);
161 as->passInt32AsArg(value, 1);
162 as->passEngineAsArg(0);
163 BASELINEJIT_GENERATE_RUNTIME_CALL(Closure, CallResultDestination::InAccumulator);
166void BaselineJIT::generate_LoadName(
int name)
169 as->prepareCallWithArgCount(2);
170 as->passInt32AsArg(name, 1);
171 as->passEngineAsArg(0);
172 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadName, CallResultDestination::InAccumulator);
175void BaselineJIT::generate_LoadGlobalLookup(
int index)
178 as->prepareCallWithArgCount(3);
179 as->passInt32AsArg(index, 2);
180 as->passFunctionAsArg(1);
181 as->passEngineAsArg(0);
182 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadGlobalLookup, CallResultDestination::InAccumulator);
185void BaselineJIT::generate_LoadQmlContextPropertyLookup(
int index)
188 as->prepareCallWithArgCount(2);
189 as->passInt32AsArg(index, 1);
190 as->passEngineAsArg(0);
191 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlContextPropertyLookup, CallResultDestination::InAccumulator);
194void BaselineJIT::generate_StoreNameSloppy(
int name)
198 as->prepareCallWithArgCount(3);
199 as->passAccumulatorAsArg(2);
200 as->passInt32AsArg(name, 1);
201 as->passEngineAsArg(0);
202 BASELINEJIT_GENERATE_RUNTIME_CALL(StoreNameSloppy, CallResultDestination::Ignore);
206void BaselineJIT::generate_StoreNameStrict(
int name)
210 as->prepareCallWithArgCount(3);
211 as->passAccumulatorAsArg(2);
212 as->passInt32AsArg(name, 1);
213 as->passEngineAsArg(0);
214 BASELINEJIT_GENERATE_RUNTIME_CALL(StoreNameStrict, CallResultDestination::Ignore);
218void BaselineJIT::generate_LoadElement(
int base)
222 as->prepareCallWithArgCount(3);
223 as->passAccumulatorAsArg(2);
224 as->passJSSlotAsArg(base, 1);
225 as->passEngineAsArg(0);
226 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadElement, CallResultDestination::InAccumulator);
229void BaselineJIT::generate_StoreElement(
int base,
int index)
233 as->prepareCallWithArgCount(4);
234 as->passAccumulatorAsArg(3);
235 as->passJSSlotAsArg(index, 2);
236 as->passJSSlotAsArg(base, 1);
237 as->passEngineAsArg(0);
238 BASELINEJIT_GENERATE_RUNTIME_CALL(StoreElement, CallResultDestination::Ignore);
242void BaselineJIT::generate_LoadProperty(
int name)
246 as->prepareCallWithArgCount(3);
247 as->passInt32AsArg(name, 2);
248 as->passAccumulatorAsArg(1);
249 as->passEngineAsArg(0);
250 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadProperty, CallResultDestination::InAccumulator);
253void BaselineJIT::generate_LoadOptionalProperty(
int name,
int offset)
255 labels.insert(as->jumpEqNull(absoluteOffset(offset)));
257 generate_LoadProperty(name);
260void BaselineJIT::generate_GetLookup(
int index)
264 as->prepareCallWithArgCount(4);
265 as->passInt32AsArg(index, 3);
266 as->passAccumulatorAsArg(2);
267 as->passFunctionAsArg(1);
268 as->passEngineAsArg(0);
269 BASELINEJIT_GENERATE_RUNTIME_CALL(GetLookup, CallResultDestination::InAccumulator);
272void BaselineJIT::generate_GetOptionalLookup(
int index,
int offset)
274 labels.insert(as->jumpEqNull(absoluteOffset(offset)));
276 generate_GetLookup(index);
279void BaselineJIT::generate_StoreProperty(
int name,
int base)
283 as->prepareCallWithArgCount(4);
284 as->passAccumulatorAsArg(3);
285 as->passInt32AsArg(name, 2);
286 as->passJSSlotAsArg(base, 1);
287 as->passEngineAsArg(0);
288 BASELINEJIT_GENERATE_RUNTIME_CALL(StoreProperty, CallResultDestination::Ignore);
292void BaselineJIT::generate_SetLookup(
int index,
int base)
296 as->prepareCallWithArgCount(4);
297 as->passAccumulatorAsArg(3);
298 as->passInt32AsArg(index, 2);
299 as->passJSSlotAsArg(base, 1);
300 as->passFunctionAsArg(0);
301 if (function->isStrict())
302 BASELINEJIT_GENERATE_RUNTIME_CALL(SetLookupStrict, CallResultDestination::InAccumulator)
304 BASELINEJIT_GENERATE_RUNTIME_CALL(SetLookupSloppy, CallResultDestination::InAccumulator)
307void BaselineJIT::generate_LoadSuperProperty(
int property)
310 as->prepareCallWithArgCount(2);
311 as->passJSSlotAsArg(property, 1);
312 as->passEngineAsArg(0);
313 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadSuperProperty, CallResultDestination::InAccumulator);
316void BaselineJIT::generate_StoreSuperProperty(
int property)
320 as->prepareCallWithArgCount(3);
321 as->passAccumulatorAsArg(2);
322 as->passJSSlotAsArg(property, 1);
323 as->passEngineAsArg(0);
324 BASELINEJIT_GENERATE_RUNTIME_CALL(StoreSuperProperty, CallResultDestination::Ignore);
328void BaselineJIT::generate_Yield()
334void BaselineJIT::generate_YieldStar()
340void BaselineJIT::generate_Resume(
int)
346void BaselineJIT::generate_CallValue(
int name,
int argc,
int argv)
349 as->prepareCallWithArgCount(4);
350 as->passInt32AsArg(argc, 3);
351 as->passJSSlotAsArg(argv, 2);
352 as->passJSSlotAsArg(name, 1);
353 as->passEngineAsArg(0);
354 BASELINEJIT_GENERATE_RUNTIME_CALL(CallValue, CallResultDestination::InAccumulator);
357void BaselineJIT::generate_CallWithReceiver(
int name,
int thisObject,
int argc,
int argv)
360 as->prepareCallWithArgCount(5);
361 as->passInt32AsArg(argc, 4);
362 as->passJSSlotAsArg(argv, 3);
363 as->passJSSlotAsArg(thisObject, 2);
364 as->passJSSlotAsArg(name, 1);
365 as->passEngineAsArg(0);
366 BASELINEJIT_GENERATE_RUNTIME_CALL(CallWithReceiver, CallResultDestination::InAccumulator);
369void BaselineJIT::generate_CallProperty(
int name,
int base,
int argc,
int argv)
372 as->prepareCallWithArgCount(5);
373 as->passInt32AsArg(argc, 4);
374 as->passJSSlotAsArg(argv, 3);
375 as->passInt32AsArg(name, 2);
376 as->passJSSlotAsArg(base, 1);
377 as->passEngineAsArg(0);
378 BASELINEJIT_GENERATE_RUNTIME_CALL(CallProperty, CallResultDestination::InAccumulator);
381void BaselineJIT::generate_CallPropertyLookup(
int lookupIndex,
int base,
int argc,
int argv)
384 as->prepareCallWithArgCount(5);
385 as->passInt32AsArg(argc, 4);
386 as->passJSSlotAsArg(argv, 3);
387 as->passInt32AsArg(lookupIndex, 2);
388 as->passJSSlotAsArg(base, 1);
389 as->passEngineAsArg(0);
390 BASELINEJIT_GENERATE_RUNTIME_CALL(CallPropertyLookup, CallResultDestination::InAccumulator);
393void BaselineJIT::generate_CallName(
int name,
int argc,
int argv)
396 as->prepareCallWithArgCount(4);
397 as->passInt32AsArg(argc, 3);
398 as->passJSSlotAsArg(argv, 2);
399 as->passInt32AsArg(name, 1);
400 as->passEngineAsArg(0);
401 BASELINEJIT_GENERATE_RUNTIME_CALL(CallName, CallResultDestination::InAccumulator);
404void BaselineJIT::generate_CallPossiblyDirectEval(
int argc,
int argv)
407 as->prepareCallWithArgCount(3);
408 as->passInt32AsArg(argc, 2);
409 as->passJSSlotAsArg(argv, 1);
410 as->passEngineAsArg(0);
411 BASELINEJIT_GENERATE_RUNTIME_CALL(CallPossiblyDirectEval, CallResultDestination::InAccumulator);
414void BaselineJIT::generate_CallGlobalLookup(
int index,
int argc,
int argv)
417 as->prepareCallWithArgCount(4);
418 as->passInt32AsArg(argc, 3);
419 as->passJSSlotAsArg(argv, 2);
420 as->passInt32AsArg(index, 1);
421 as->passEngineAsArg(0);
422 BASELINEJIT_GENERATE_RUNTIME_CALL(CallGlobalLookup, CallResultDestination::InAccumulator);
425void BaselineJIT::generate_CallQmlContextPropertyLookup(
int index,
int argc,
int argv)
428 as->prepareCallWithArgCount(4);
429 as->passInt32AsArg(argc, 3);
430 as->passJSSlotAsArg(argv, 2);
431 as->passInt32AsArg(index, 1);
432 as->passEngineAsArg(0);
433 BASELINEJIT_GENERATE_RUNTIME_CALL(CallQmlContextPropertyLookup, CallResultDestination::InAccumulator);
436void BaselineJIT::generate_CallWithSpread(
int func,
int thisObject,
int argc,
int argv)
439 as->prepareCallWithArgCount(5);
440 as->passInt32AsArg(argc, 4);
441 as->passJSSlotAsArg(argv, 3);
442 as->passJSSlotAsArg(thisObject, 2);
443 as->passJSSlotAsArg(func, 1);
444 as->passEngineAsArg(0);
445 BASELINEJIT_GENERATE_RUNTIME_CALL(CallWithSpread, CallResultDestination::InAccumulator);
448void BaselineJIT::generate_TailCall(
int func,
int thisObject,
int argc,
int argv)
451 as->jsTailCall(func, thisObject, argc, argv);
454void BaselineJIT::generate_Construct(
int func,
int argc,
int argv)
458 as->prepareCallWithArgCount(5);
459 as->passInt32AsArg(argc, 4);
460 as->passJSSlotAsArg(argv, 3);
461 as->passAccumulatorAsArg(2);
462 as->passJSSlotAsArg(func, 1);
463 as->passEngineAsArg(0);
464 BASELINEJIT_GENERATE_RUNTIME_CALL(Construct, CallResultDestination::InAccumulator);
467void BaselineJIT::generate_ConstructWithSpread(
int func,
int argc,
int argv)
471 as->prepareCallWithArgCount(5);
472 as->passInt32AsArg(argc, 4);
473 as->passJSSlotAsArg(argv, 3);
474 as->passAccumulatorAsArg(2);
475 as->passJSSlotAsArg(func, 1);
476 as->passEngineAsArg(0);
477 BASELINEJIT_GENERATE_RUNTIME_CALL(ConstructWithSpread, CallResultDestination::InAccumulator);
480void BaselineJIT::generate_SetUnwindHandler(
int offset)
483 labels.insert(as->setUnwindHandler(absoluteOffset(offset)));
485 as->clearUnwindHandler();
488void BaselineJIT::generate_UnwindDispatch()
490 as->unwindDispatch();
493void BaselineJIT::generate_UnwindToLabel(
int level,
int offset)
495 labels.insert(as->unwindToLabel(level, absoluteOffset(offset)));
498void BaselineJIT::generate_DeadTemporalZoneCheck(
int name)
500 as->deadTemporalZoneCheck(nextInstructionOffset(), name);
503void BaselineJIT::generate_ThrowException()
507 as->prepareCallWithArgCount(2);
508 as->passAccumulatorAsArg(1);
509 as->passEngineAsArg(0);
510 BASELINEJIT_GENERATE_RUNTIME_CALL(ThrowException, CallResultDestination::Ignore);
511 as->gotoCatchException();
516void BaselineJIT::generate_GetException() { as->getException(); }
517void BaselineJIT::generate_SetException() { as->setException(); }
519void BaselineJIT::generate_CreateCallContext()
522 as->prepareCallWithArgCount(1);
523 as->passCppFrameAsArg(0);
524 BASELINEJIT_GENERATE_RUNTIME_CALL(PushCallContext, CallResultDestination::Ignore);
528void BaselineJIT::generate_PushCatchContext(
int index,
int name) { as->pushCatchContext(index, name); }
530void BaselineJIT::generate_PushWithContext()
533 as->saveAccumulatorInFrame();
534 as->prepareCallWithArgCount(2);
535 as->passJSSlotAsArg(CallData::Accumulator, 1);
536 as->passEngineAsArg(0);
537 BASELINEJIT_GENERATE_RUNTIME_CALL(PushWithContext, CallResultDestination::InAccumulator);
540void BaselineJIT::generate_PushBlockContext(
int index)
542 as->saveAccumulatorInFrame();
543 as->prepareCallWithArgCount(2);
544 as->passInt32AsArg(index, 1);
545 as->passEngineAsArg(0);
546 BASELINEJIT_GENERATE_RUNTIME_CALL(PushBlockContext, CallResultDestination::Ignore);
547 as->loadAccumulatorFromFrame();
550void BaselineJIT::generate_CloneBlockContext()
552 as->saveAccumulatorInFrame();
553 as->prepareCallWithArgCount(1);
554 as->passEngineAsArg(0);
555 BASELINEJIT_GENERATE_RUNTIME_CALL(CloneBlockContext, CallResultDestination::Ignore);
556 as->loadAccumulatorFromFrame();
559void BaselineJIT::generate_PushScriptContext(
int index)
561 as->saveAccumulatorInFrame();
562 as->prepareCallWithArgCount(2);
563 as->passInt32AsArg(index, 1);
564 as->passEngineAsArg(0);
565 BASELINEJIT_GENERATE_RUNTIME_CALL(PushScriptContext, CallResultDestination::Ignore);
566 as->loadAccumulatorFromFrame();
569void BaselineJIT::generate_PopScriptContext()
571 as->saveAccumulatorInFrame();
572 as->prepareCallWithArgCount(1);
573 as->passEngineAsArg(0);
574 BASELINEJIT_GENERATE_RUNTIME_CALL(PopScriptContext, CallResultDestination::Ignore);
575 as->loadAccumulatorFromFrame();
578void BaselineJIT::generate_PopContext() { as->popContext(); }
580void BaselineJIT::generate_GetIterator(
int iterator)
582 as->saveAccumulatorInFrame();
583 as->prepareCallWithArgCount(3);
584 as->passInt32AsArg(iterator, 2);
585 as->passAccumulatorAsArg(1);
586 as->passEngineAsArg(0);
587 BASELINEJIT_GENERATE_RUNTIME_CALL(GetIterator, CallResultDestination::InAccumulator);
590void BaselineJIT::generate_IteratorNext(
int value,
int offset)
592 as->saveAccumulatorInFrame();
593 as->prepareCallWithArgCount(3);
594 as->passJSSlotAsArg(value, 2);
595 as->passAccumulatorAsArg(1);
596 as->passEngineAsArg(0);
597 BASELINEJIT_GENERATE_RUNTIME_CALL(IteratorNext, CallResultDestination::InAccumulator);
598 labels.insert(as->jumpTrue(absoluteOffset(offset)));
601void BaselineJIT::generate_IteratorNextForYieldStar(
int iterator,
int object,
int offset)
603 as->saveAccumulatorInFrame();
604 as->prepareCallWithArgCount(4);
605 as->passJSSlotAsArg(object, 3);
606 as->passJSSlotAsArg(iterator, 2);
607 as->passAccumulatorAsArg(1);
608 as->passEngineAsArg(0);
609 BASELINEJIT_GENERATE_RUNTIME_CALL(IteratorNextForYieldStar, CallResultDestination::InAccumulator);
610 labels.insert(as->jumpTrue(absoluteOffset(offset)));
613void BaselineJIT::generate_IteratorClose()
615 as->saveAccumulatorInFrame();
616 as->prepareCallWithArgCount(2);
617 as->passAccumulatorAsArg(1);
618 as->passEngineAsArg(0);
619 BASELINEJIT_GENERATE_RUNTIME_CALL(IteratorClose, CallResultDestination::InAccumulator);
622void BaselineJIT::generate_DestructureRestElement()
624 as->saveAccumulatorInFrame();
625 as->prepareCallWithArgCount(2);
626 as->passAccumulatorAsArg(1);
627 as->passEngineAsArg(0);
628 BASELINEJIT_GENERATE_RUNTIME_CALL(DestructureRestElement, CallResultDestination::InAccumulator);
631void BaselineJIT::generate_DeleteProperty(
int base,
int index)
634 as->prepareCallWithArgCount(4);
635 as->passJSSlotAsArg(index, 3);
636 as->passJSSlotAsArg(base, 2);
637 as->passFunctionAsArg(1);
638 as->passEngineAsArg(0);
639 BASELINEJIT_GENERATE_RUNTIME_CALL(DeleteProperty, CallResultDestination::InAccumulator);
642void BaselineJIT::generate_DeleteName(
int name)
645 as->prepareCallWithArgCount(3);
646 as->passInt32AsArg(name, 2);
647 as->passFunctionAsArg(1);
648 as->passEngineAsArg(0);
649 BASELINEJIT_GENERATE_RUNTIME_CALL(DeleteName, CallResultDestination::InAccumulator);
652void BaselineJIT::generate_TypeofName(
int name)
654 as->prepareCallWithArgCount(2);
655 as->passInt32AsArg(name, 1);
656 as->passEngineAsArg(0);
657 BASELINEJIT_GENERATE_RUNTIME_CALL(TypeofName, CallResultDestination::InAccumulator);
660void BaselineJIT::generate_TypeofValue()
663 as->prepareCallWithArgCount(2);
664 as->passAccumulatorAsArg(1);
665 as->passEngineAsArg(0);
666 BASELINEJIT_GENERATE_RUNTIME_CALL(TypeofValue, CallResultDestination::InAccumulator);
669void BaselineJIT::generate_DeclareVar(
int varName,
int isDeletable)
672 as->prepareCallWithArgCount(3);
673 as->passInt32AsArg(varName, 2);
674 as->passInt32AsArg(isDeletable, 1);
675 as->passEngineAsArg(0);
676 BASELINEJIT_GENERATE_RUNTIME_CALL(DeclareVar, CallResultDestination::Ignore);
680void BaselineJIT::generate_DefineArray(
int argc,
int args)
682 as->prepareCallWithArgCount(3);
683 as->passInt32AsArg(argc, 2);
684 as->passJSSlotAsArg(args, 1);
685 as->passEngineAsArg(0);
686 BASELINEJIT_GENERATE_RUNTIME_CALL(ArrayLiteral, CallResultDestination::InAccumulator);
689void BaselineJIT::generate_DefineObjectLiteral(
int internalClassId,
int argc,
int args)
691 as->prepareCallWithArgCount(4);
692 as->passInt32AsArg(argc, 3);
693 as->passJSSlotAsArg(args, 2);
694 as->passInt32AsArg(internalClassId, 1);
695 as->passEngineAsArg(0);
696 BASELINEJIT_GENERATE_RUNTIME_CALL(ObjectLiteral, CallResultDestination::InAccumulator);
699void BaselineJIT::generate_CreateClass(
int classIndex,
int heritage,
int computedNames)
701 as->prepareCallWithArgCount(4);
702 as->passJSSlotAsArg(computedNames, 3);
703 as->passJSSlotAsArg(heritage, 2);
704 as->passInt32AsArg(classIndex, 1);
705 as->passEngineAsArg(0);
706 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateClass, CallResultDestination::InAccumulator);
709void BaselineJIT::generate_CreateMappedArgumentsObject()
711 as->prepareCallWithArgCount(1);
712 as->passEngineAsArg(0);
713 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateMappedArgumentsObject,
714 CallResultDestination::InAccumulator);
717void BaselineJIT::generate_CreateUnmappedArgumentsObject()
719 as->prepareCallWithArgCount(1);
720 as->passEngineAsArg(0);
721 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateUnmappedArgumentsObject,
722 CallResultDestination::InAccumulator);
725void BaselineJIT::generate_CreateRestParameter(
int argIndex)
727 as->prepareCallWithArgCount(2);
728 as->passInt32AsArg(argIndex, 1);
729 as->passEngineAsArg(0);
730 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateRestParameter, CallResultDestination::InAccumulator);
733void BaselineJIT::generate_ConvertThisToObject()
736 as->prepareCallWithArgCount(2);
737 as->passJSSlotAsArg(CallData::This, 1);
738 as->passEngineAsArg(0);
739 BASELINEJIT_GENERATE_RUNTIME_CALL(ConvertThisToObject, CallResultDestination::InAccumulator);
740 as->storeReg(CallData::This);
744void BaselineJIT::generate_LoadSuperConstructor()
746 as->prepareCallWithArgCount(2);
747 as->passJSSlotAsArg(CallData::Function, 1);
748 as->passEngineAsArg(0);
749 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadSuperConstructor, CallResultDestination::InAccumulator);
752void BaselineJIT::generate_ToObject()
755 as->prepareCallWithArgCount(2);
756 as->passAccumulatorAsArg(1);
757 as->passEngineAsArg(0);
758 BASELINEJIT_GENERATE_RUNTIME_CALL(ToObject, CallResultDestination::InAccumulator);
762void BaselineJIT::generate_Jump(
int offset)
764 labels.insert(as->jump(absoluteOffset(offset)));
767void BaselineJIT::generate_JumpTrue(
int offset)
769 labels.insert(as->jumpTrue(absoluteOffset(offset)));
772void BaselineJIT::generate_JumpFalse(
int offset)
774 labels.insert(as->jumpFalse(absoluteOffset(offset)));
777void BaselineJIT::generate_JumpNoException(
int offset)
779 labels.insert(as->jumpNoException(absoluteOffset(offset)));
782void BaselineJIT::generate_JumpNotUndefined(
int offset)
784 labels.insert(as->jumpNotUndefined(absoluteOffset(offset)));
787void BaselineJIT::generate_CheckException()
789 as->checkException();
792void BaselineJIT::generate_CmpEqNull() { as->cmpeqNull(); }
793void BaselineJIT::generate_CmpNeNull() { as->cmpneNull(); }
794void BaselineJIT::generate_CmpEqInt(
int lhs) { as->cmpeqInt(lhs); }
795void BaselineJIT::generate_CmpNeInt(
int lhs) { as->cmpneInt(lhs); }
796void BaselineJIT::generate_CmpEq(
int lhs) { as->cmpeq(lhs); }
797void BaselineJIT::generate_CmpNe(
int lhs) { as->cmpne(lhs); }
798void BaselineJIT::generate_CmpGt(
int lhs) { as->cmpgt(lhs); }
799void BaselineJIT::generate_CmpGe(
int lhs) { as->cmpge(lhs); }
800void BaselineJIT::generate_CmpLt(
int lhs) { as->cmplt(lhs); }
801void BaselineJIT::generate_CmpLe(
int lhs) { as->cmple(lhs); }
802void BaselineJIT::generate_CmpStrictEqual(
int lhs) { as->cmpStrictEqual(lhs); }
803void BaselineJIT::generate_CmpStrictNotEqual(
int lhs) { as->cmpStrictNotEqual(lhs); }
805void BaselineJIT::generate_CmpIn(
int lhs)
809 as->prepareCallWithArgCount(3);
810 as->passAccumulatorAsArg(2);
811 as->passJSSlotAsArg(lhs, 1);
812 as->passEngineAsArg(0);
813 BASELINEJIT_GENERATE_RUNTIME_CALL(In, CallResultDestination::InAccumulator);
816void BaselineJIT::generate_CmpInstanceOf(
int lhs)
819 as->prepareCallWithArgCount(3);
820 as->passAccumulatorAsArg(2);
821 as->passJSSlotAsArg(lhs, 1);
822 as->passEngineAsArg(0);
823 BASELINEJIT_GENERATE_RUNTIME_CALL(Instanceof, CallResultDestination::InAccumulator);
826void BaselineJIT::generate_As(
int lhs)
829 as->prepareCallWithArgCount(3);
830 as->passAccumulatorAsArg(2);
831 as->passJSSlotAsArg(lhs, 1);
832 as->passEngineAsArg(0);
833 BASELINEJIT_GENERATE_RUNTIME_CALL(As, CallResultDestination::InAccumulator);
836void BaselineJIT::generate_UNot() { as->unot(); }
837void BaselineJIT::generate_UPlus() { as->toNumber(); }
838void BaselineJIT::generate_UMinus() { as->uminus(); }
839void BaselineJIT::generate_UCompl() { as->ucompl(); }
840void BaselineJIT::generate_Increment() { as->inc(); }
841void BaselineJIT::generate_Decrement() { as->dec(); }
842void BaselineJIT::generate_Add(
int lhs) { as->add(lhs); }
844void BaselineJIT::generate_BitAnd(
int lhs) { as->bitAnd(lhs); }
845void BaselineJIT::generate_BitOr(
int lhs) { as->bitOr(lhs); }
846void BaselineJIT::generate_BitXor(
int lhs) { as->bitXor(lhs); }
847void BaselineJIT::generate_UShr(
int lhs) { as->ushr(lhs); }
848void BaselineJIT::generate_Shr(
int lhs) { as->shr(lhs); }
849void BaselineJIT::generate_Shl(
int lhs) { as->shl(lhs); }
851void BaselineJIT::generate_BitAndConst(
int rhs) { as->bitAndConst(rhs); }
852void BaselineJIT::generate_BitOrConst(
int rhs) { as->bitOrConst(rhs); }
853void BaselineJIT::generate_BitXorConst(
int rhs) { as->bitXorConst(rhs); }
854void BaselineJIT::generate_UShrConst(
int rhs) { as->ushrConst(rhs); }
855void BaselineJIT::generate_ShrConst(
int rhs) { as->shrConst(rhs); }
856void BaselineJIT::generate_ShlConst(
int rhs) { as->shlConst(rhs); }
858void BaselineJIT::generate_Exp(
int lhs) {
861 as->prepareCallWithArgCount(2);
862 as->passAccumulatorAsArg(1);
863 as->passJSSlotAsArg(lhs, 0);
864 BASELINEJIT_GENERATE_RUNTIME_CALL(Exp, CallResultDestination::InAccumulator);
866void BaselineJIT::generate_Mul(
int lhs) { as->mul(lhs); }
867void BaselineJIT::generate_Div(
int lhs) { as->div(lhs); }
868void BaselineJIT::generate_Mod(
int lhs) { as->mod(lhs); }
869void BaselineJIT::generate_Sub(
int lhs) { as->sub(lhs); }
883void BaselineJIT::generate_InitializeBlockDeadTemporalZone(
int firstReg,
int count)
885 as->loadValue(Value::emptyValue().rawValue());
886 for (
int i = firstReg, end = firstReg + count; i < end; ++i)
890void BaselineJIT::generate_ThrowOnNullOrUndefined()
893 as->prepareCallWithArgCount(2);
894 as->passAccumulatorAsArg(1);
895 as->passEngineAsArg(0);
896 BASELINEJIT_GENERATE_RUNTIME_CALL(ThrowOnNullOrUndefined, CallResultDestination::Ignore);
900void BaselineJIT::generate_GetTemplateObject(
int index)
902 as->prepareCallWithArgCount(2);
903 as->passInt32AsArg(index, 1);
904 as->passFunctionAsArg(0);
905 BASELINEJIT_GENERATE_RUNTIME_CALL(GetTemplateObject, CallResultDestination::InAccumulator);
908ByteCodeHandler::Verdict BaselineJIT::startInstruction(Instr::Type )
910 if (labels.contains(currentInstructionOffset()))
911 as->addLabel(currentInstructionOffset());
912 return ProcessInstruction;
915void BaselineJIT::endInstruction(Instr::Type instr)