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::Ignore)
304 BASELINEJIT_GENERATE_RUNTIME_CALL(SetLookupSloppy, CallResultDestination::Ignore)
308void BaselineJIT::generate_LoadSuperProperty(
int property)
311 as->prepareCallWithArgCount(2);
312 as->passJSSlotAsArg(property, 1);
313 as->passEngineAsArg(0);
314 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadSuperProperty, CallResultDestination::InAccumulator);
317void BaselineJIT::generate_StoreSuperProperty(
int property)
321 as->prepareCallWithArgCount(3);
322 as->passAccumulatorAsArg(2);
323 as->passJSSlotAsArg(property, 1);
324 as->passEngineAsArg(0);
325 BASELINEJIT_GENERATE_RUNTIME_CALL(StoreSuperProperty, CallResultDestination::Ignore);
329void BaselineJIT::generate_Yield()
335void BaselineJIT::generate_YieldStar()
341void BaselineJIT::generate_Resume(
int)
347void BaselineJIT::generate_CallValue(
int name,
int argc,
int argv)
350 as->prepareCallWithArgCount(4);
351 as->passInt32AsArg(argc, 3);
352 as->passJSSlotAsArg(argv, 2);
353 as->passJSSlotAsArg(name, 1);
354 as->passEngineAsArg(0);
355 BASELINEJIT_GENERATE_RUNTIME_CALL(CallValue, CallResultDestination::InAccumulator);
358void BaselineJIT::generate_CallWithReceiver(
int name,
int thisObject,
int argc,
int argv)
361 as->prepareCallWithArgCount(5);
362 as->passInt32AsArg(argc, 4);
363 as->passJSSlotAsArg(argv, 3);
364 as->passJSSlotAsArg(thisObject, 2);
365 as->passJSSlotAsArg(name, 1);
366 as->passEngineAsArg(0);
367 BASELINEJIT_GENERATE_RUNTIME_CALL(CallWithReceiver, CallResultDestination::InAccumulator);
370void BaselineJIT::generate_CallProperty(
int name,
int base,
int argc,
int argv)
373 as->prepareCallWithArgCount(5);
374 as->passInt32AsArg(argc, 4);
375 as->passJSSlotAsArg(argv, 3);
376 as->passInt32AsArg(name, 2);
377 as->passJSSlotAsArg(base, 1);
378 as->passEngineAsArg(0);
379 BASELINEJIT_GENERATE_RUNTIME_CALL(CallProperty, CallResultDestination::InAccumulator);
382void BaselineJIT::generate_CallPropertyLookup(
int lookupIndex,
int base,
int argc,
int argv)
385 as->prepareCallWithArgCount(5);
386 as->passInt32AsArg(argc, 4);
387 as->passJSSlotAsArg(argv, 3);
388 as->passInt32AsArg(lookupIndex, 2);
389 as->passJSSlotAsArg(base, 1);
390 as->passEngineAsArg(0);
391 BASELINEJIT_GENERATE_RUNTIME_CALL(CallPropertyLookup, CallResultDestination::InAccumulator);
394void BaselineJIT::generate_CallName(
int name,
int argc,
int argv)
397 as->prepareCallWithArgCount(4);
398 as->passInt32AsArg(argc, 3);
399 as->passJSSlotAsArg(argv, 2);
400 as->passInt32AsArg(name, 1);
401 as->passEngineAsArg(0);
402 BASELINEJIT_GENERATE_RUNTIME_CALL(CallName, CallResultDestination::InAccumulator);
405void BaselineJIT::generate_CallPossiblyDirectEval(
int argc,
int argv)
408 as->prepareCallWithArgCount(3);
409 as->passInt32AsArg(argc, 2);
410 as->passJSSlotAsArg(argv, 1);
411 as->passEngineAsArg(0);
412 BASELINEJIT_GENERATE_RUNTIME_CALL(CallPossiblyDirectEval, CallResultDestination::InAccumulator);
415void BaselineJIT::generate_CallGlobalLookup(
int index,
int argc,
int argv)
418 as->prepareCallWithArgCount(4);
419 as->passInt32AsArg(argc, 3);
420 as->passJSSlotAsArg(argv, 2);
421 as->passInt32AsArg(index, 1);
422 as->passEngineAsArg(0);
423 BASELINEJIT_GENERATE_RUNTIME_CALL(CallGlobalLookup, CallResultDestination::InAccumulator);
426void BaselineJIT::generate_CallQmlContextPropertyLookup(
int index,
int argc,
int argv)
429 as->prepareCallWithArgCount(4);
430 as->passInt32AsArg(argc, 3);
431 as->passJSSlotAsArg(argv, 2);
432 as->passInt32AsArg(index, 1);
433 as->passEngineAsArg(0);
434 BASELINEJIT_GENERATE_RUNTIME_CALL(CallQmlContextPropertyLookup, CallResultDestination::InAccumulator);
437void BaselineJIT::generate_CallWithSpread(
int func,
int thisObject,
int argc,
int argv)
440 as->prepareCallWithArgCount(5);
441 as->passInt32AsArg(argc, 4);
442 as->passJSSlotAsArg(argv, 3);
443 as->passJSSlotAsArg(thisObject, 2);
444 as->passJSSlotAsArg(func, 1);
445 as->passEngineAsArg(0);
446 BASELINEJIT_GENERATE_RUNTIME_CALL(CallWithSpread, CallResultDestination::InAccumulator);
449void BaselineJIT::generate_TailCall(
int func,
int thisObject,
int argc,
int argv)
452 as->jsTailCall(func, thisObject, argc, argv);
455void BaselineJIT::generate_Construct(
int func,
int argc,
int argv)
459 as->prepareCallWithArgCount(5);
460 as->passInt32AsArg(argc, 4);
461 as->passJSSlotAsArg(argv, 3);
462 as->passAccumulatorAsArg(2);
463 as->passJSSlotAsArg(func, 1);
464 as->passEngineAsArg(0);
465 BASELINEJIT_GENERATE_RUNTIME_CALL(Construct, CallResultDestination::InAccumulator);
468void BaselineJIT::generate_ConstructWithSpread(
int func,
int argc,
int argv)
472 as->prepareCallWithArgCount(5);
473 as->passInt32AsArg(argc, 4);
474 as->passJSSlotAsArg(argv, 3);
475 as->passAccumulatorAsArg(2);
476 as->passJSSlotAsArg(func, 1);
477 as->passEngineAsArg(0);
478 BASELINEJIT_GENERATE_RUNTIME_CALL(ConstructWithSpread, CallResultDestination::InAccumulator);
481void BaselineJIT::generate_SetUnwindHandler(
int offset)
484 labels.insert(as->setUnwindHandler(absoluteOffset(offset)));
486 as->clearUnwindHandler();
489void BaselineJIT::generate_UnwindDispatch()
491 as->unwindDispatch();
494void BaselineJIT::generate_UnwindToLabel(
int level,
int offset)
496 labels.insert(as->unwindToLabel(level, absoluteOffset(offset)));
499void BaselineJIT::generate_DeadTemporalZoneCheck(
int name)
501 as->deadTemporalZoneCheck(nextInstructionOffset(), name);
504void BaselineJIT::generate_ThrowException()
508 as->prepareCallWithArgCount(2);
509 as->passAccumulatorAsArg(1);
510 as->passEngineAsArg(0);
511 BASELINEJIT_GENERATE_RUNTIME_CALL(ThrowException, CallResultDestination::Ignore);
512 as->gotoCatchException();
517void BaselineJIT::generate_GetException() { as->getException(); }
518void BaselineJIT::generate_SetException() { as->setException(); }
520void BaselineJIT::generate_CreateCallContext()
523 as->prepareCallWithArgCount(1);
524 as->passCppFrameAsArg(0);
525 BASELINEJIT_GENERATE_RUNTIME_CALL(PushCallContext, CallResultDestination::Ignore);
529void BaselineJIT::generate_PushCatchContext(
int index,
int name) { as->pushCatchContext(index, name); }
531void BaselineJIT::generate_PushWithContext()
534 as->saveAccumulatorInFrame();
535 as->prepareCallWithArgCount(2);
536 as->passJSSlotAsArg(CallData::Accumulator, 1);
537 as->passEngineAsArg(0);
538 BASELINEJIT_GENERATE_RUNTIME_CALL(PushWithContext, CallResultDestination::InAccumulator);
541void BaselineJIT::generate_PushBlockContext(
int index)
543 as->saveAccumulatorInFrame();
544 as->prepareCallWithArgCount(2);
545 as->passInt32AsArg(index, 1);
546 as->passEngineAsArg(0);
547 BASELINEJIT_GENERATE_RUNTIME_CALL(PushBlockContext, CallResultDestination::Ignore);
548 as->loadAccumulatorFromFrame();
551void BaselineJIT::generate_CloneBlockContext()
553 as->saveAccumulatorInFrame();
554 as->prepareCallWithArgCount(1);
555 as->passEngineAsArg(0);
556 BASELINEJIT_GENERATE_RUNTIME_CALL(CloneBlockContext, CallResultDestination::Ignore);
557 as->loadAccumulatorFromFrame();
560void BaselineJIT::generate_PushScriptContext(
int index)
562 as->saveAccumulatorInFrame();
563 as->prepareCallWithArgCount(2);
564 as->passInt32AsArg(index, 1);
565 as->passEngineAsArg(0);
566 BASELINEJIT_GENERATE_RUNTIME_CALL(PushScriptContext, CallResultDestination::Ignore);
567 as->loadAccumulatorFromFrame();
570void BaselineJIT::generate_PopScriptContext()
572 as->saveAccumulatorInFrame();
573 as->prepareCallWithArgCount(1);
574 as->passEngineAsArg(0);
575 BASELINEJIT_GENERATE_RUNTIME_CALL(PopScriptContext, CallResultDestination::Ignore);
576 as->loadAccumulatorFromFrame();
579void BaselineJIT::generate_PopContext() { as->popContext(); }
581void BaselineJIT::generate_GetIterator(
int iterator)
583 as->saveAccumulatorInFrame();
584 as->prepareCallWithArgCount(3);
585 as->passInt32AsArg(iterator, 2);
586 as->passAccumulatorAsArg(1);
587 as->passEngineAsArg(0);
588 BASELINEJIT_GENERATE_RUNTIME_CALL(GetIterator, CallResultDestination::InAccumulator);
591void BaselineJIT::generate_IteratorNext(
int value,
int offset)
593 as->saveAccumulatorInFrame();
594 as->prepareCallWithArgCount(3);
595 as->passJSSlotAsArg(value, 2);
596 as->passAccumulatorAsArg(1);
597 as->passEngineAsArg(0);
598 BASELINEJIT_GENERATE_RUNTIME_CALL(IteratorNext, CallResultDestination::InAccumulator);
599 labels.insert(as->jumpTrue(absoluteOffset(offset)));
602void BaselineJIT::generate_IteratorNextForYieldStar(
int iterator,
int object,
int offset)
604 as->saveAccumulatorInFrame();
605 as->prepareCallWithArgCount(4);
606 as->passJSSlotAsArg(object, 3);
607 as->passJSSlotAsArg(iterator, 2);
608 as->passAccumulatorAsArg(1);
609 as->passEngineAsArg(0);
610 BASELINEJIT_GENERATE_RUNTIME_CALL(IteratorNextForYieldStar, CallResultDestination::InAccumulator);
611 labels.insert(as->jumpTrue(absoluteOffset(offset)));
614void BaselineJIT::generate_IteratorClose()
616 as->saveAccumulatorInFrame();
617 as->prepareCallWithArgCount(2);
618 as->passAccumulatorAsArg(1);
619 as->passEngineAsArg(0);
620 BASELINEJIT_GENERATE_RUNTIME_CALL(IteratorClose, CallResultDestination::InAccumulator);
623void BaselineJIT::generate_DestructureRestElement()
625 as->saveAccumulatorInFrame();
626 as->prepareCallWithArgCount(2);
627 as->passAccumulatorAsArg(1);
628 as->passEngineAsArg(0);
629 BASELINEJIT_GENERATE_RUNTIME_CALL(DestructureRestElement, CallResultDestination::InAccumulator);
632void BaselineJIT::generate_DeleteProperty(
int base,
int index)
635 as->prepareCallWithArgCount(4);
636 as->passJSSlotAsArg(index, 3);
637 as->passJSSlotAsArg(base, 2);
638 as->passFunctionAsArg(1);
639 as->passEngineAsArg(0);
640 BASELINEJIT_GENERATE_RUNTIME_CALL(DeleteProperty, CallResultDestination::InAccumulator);
643void BaselineJIT::generate_DeleteName(
int name)
646 as->prepareCallWithArgCount(3);
647 as->passInt32AsArg(name, 2);
648 as->passFunctionAsArg(1);
649 as->passEngineAsArg(0);
650 BASELINEJIT_GENERATE_RUNTIME_CALL(DeleteName, CallResultDestination::InAccumulator);
653void BaselineJIT::generate_TypeofName(
int name)
655 as->prepareCallWithArgCount(2);
656 as->passInt32AsArg(name, 1);
657 as->passEngineAsArg(0);
658 BASELINEJIT_GENERATE_RUNTIME_CALL(TypeofName, CallResultDestination::InAccumulator);
661void BaselineJIT::generate_TypeofValue()
664 as->prepareCallWithArgCount(2);
665 as->passAccumulatorAsArg(1);
666 as->passEngineAsArg(0);
667 BASELINEJIT_GENERATE_RUNTIME_CALL(TypeofValue, CallResultDestination::InAccumulator);
670void BaselineJIT::generate_DeclareVar(
int varName,
int isDeletable)
673 as->prepareCallWithArgCount(3);
674 as->passInt32AsArg(varName, 2);
675 as->passInt32AsArg(isDeletable, 1);
676 as->passEngineAsArg(0);
677 BASELINEJIT_GENERATE_RUNTIME_CALL(DeclareVar, CallResultDestination::Ignore);
681void BaselineJIT::generate_DefineArray(
int argc,
int args)
683 as->prepareCallWithArgCount(3);
684 as->passInt32AsArg(argc, 2);
685 as->passJSSlotAsArg(args, 1);
686 as->passEngineAsArg(0);
687 BASELINEJIT_GENERATE_RUNTIME_CALL(ArrayLiteral, CallResultDestination::InAccumulator);
690void BaselineJIT::generate_DefineObjectLiteral(
int internalClassId,
int argc,
int args)
692 as->prepareCallWithArgCount(4);
693 as->passInt32AsArg(argc, 3);
694 as->passJSSlotAsArg(args, 2);
695 as->passInt32AsArg(internalClassId, 1);
696 as->passEngineAsArg(0);
697 BASELINEJIT_GENERATE_RUNTIME_CALL(ObjectLiteral, CallResultDestination::InAccumulator);
700void BaselineJIT::generate_CreateClass(
int classIndex,
int heritage,
int computedNames)
702 as->prepareCallWithArgCount(4);
703 as->passJSSlotAsArg(computedNames, 3);
704 as->passJSSlotAsArg(heritage, 2);
705 as->passInt32AsArg(classIndex, 1);
706 as->passEngineAsArg(0);
707 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateClass, CallResultDestination::InAccumulator);
710void BaselineJIT::generate_CreateMappedArgumentsObject()
712 as->prepareCallWithArgCount(1);
713 as->passEngineAsArg(0);
714 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateMappedArgumentsObject,
715 CallResultDestination::InAccumulator);
718void BaselineJIT::generate_CreateUnmappedArgumentsObject()
720 as->prepareCallWithArgCount(1);
721 as->passEngineAsArg(0);
722 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateUnmappedArgumentsObject,
723 CallResultDestination::InAccumulator);
726void BaselineJIT::generate_CreateRestParameter(
int argIndex)
728 as->prepareCallWithArgCount(2);
729 as->passInt32AsArg(argIndex, 1);
730 as->passEngineAsArg(0);
731 BASELINEJIT_GENERATE_RUNTIME_CALL(CreateRestParameter, CallResultDestination::InAccumulator);
734void BaselineJIT::generate_ConvertThisToObject()
737 as->prepareCallWithArgCount(2);
738 as->passJSSlotAsArg(CallData::This, 1);
739 as->passEngineAsArg(0);
740 BASELINEJIT_GENERATE_RUNTIME_CALL(ConvertThisToObject, CallResultDestination::InAccumulator);
741 as->storeReg(CallData::This);
745void BaselineJIT::generate_LoadSuperConstructor()
747 as->prepareCallWithArgCount(2);
748 as->passJSSlotAsArg(CallData::Function, 1);
749 as->passEngineAsArg(0);
750 BASELINEJIT_GENERATE_RUNTIME_CALL(LoadSuperConstructor, CallResultDestination::InAccumulator);
753void BaselineJIT::generate_ToObject()
756 as->prepareCallWithArgCount(2);
757 as->passAccumulatorAsArg(1);
758 as->passEngineAsArg(0);
759 BASELINEJIT_GENERATE_RUNTIME_CALL(ToObject, CallResultDestination::InAccumulator);
763void BaselineJIT::generate_Jump(
int offset)
765 labels.insert(as->jump(absoluteOffset(offset)));
768void BaselineJIT::generate_JumpTrue(
int offset)
770 labels.insert(as->jumpTrue(absoluteOffset(offset)));
773void BaselineJIT::generate_JumpFalse(
int offset)
775 labels.insert(as->jumpFalse(absoluteOffset(offset)));
778void BaselineJIT::generate_JumpNoException(
int offset)
780 labels.insert(as->jumpNoException(absoluteOffset(offset)));
783void BaselineJIT::generate_JumpNotUndefined(
int offset)
785 labels.insert(as->jumpNotUndefined(absoluteOffset(offset)));
788void BaselineJIT::generate_CheckException()
790 as->checkException();
793void BaselineJIT::generate_CmpEqNull() { as->cmpeqNull(); }
794void BaselineJIT::generate_CmpNeNull() { as->cmpneNull(); }
795void BaselineJIT::generate_CmpEqInt(
int lhs) { as->cmpeqInt(lhs); }
796void BaselineJIT::generate_CmpNeInt(
int lhs) { as->cmpneInt(lhs); }
797void BaselineJIT::generate_CmpEq(
int lhs) { as->cmpeq(lhs); }
798void BaselineJIT::generate_CmpNe(
int lhs) { as->cmpne(lhs); }
799void BaselineJIT::generate_CmpGt(
int lhs) { as->cmpgt(lhs); }
800void BaselineJIT::generate_CmpGe(
int lhs) { as->cmpge(lhs); }
801void BaselineJIT::generate_CmpLt(
int lhs) { as->cmplt(lhs); }
802void BaselineJIT::generate_CmpLe(
int lhs) { as->cmple(lhs); }
803void BaselineJIT::generate_CmpStrictEqual(
int lhs) { as->cmpStrictEqual(lhs); }
804void BaselineJIT::generate_CmpStrictNotEqual(
int lhs) { as->cmpStrictNotEqual(lhs); }
806void BaselineJIT::generate_CmpIn(
int lhs)
810 as->prepareCallWithArgCount(3);
811 as->passAccumulatorAsArg(2);
812 as->passJSSlotAsArg(lhs, 1);
813 as->passEngineAsArg(0);
814 BASELINEJIT_GENERATE_RUNTIME_CALL(In, CallResultDestination::InAccumulator);
817void BaselineJIT::generate_CmpInstanceOf(
int lhs)
820 as->prepareCallWithArgCount(3);
821 as->passAccumulatorAsArg(2);
822 as->passJSSlotAsArg(lhs, 1);
823 as->passEngineAsArg(0);
824 BASELINEJIT_GENERATE_RUNTIME_CALL(Instanceof, CallResultDestination::InAccumulator);
827void BaselineJIT::generate_As(
int lhs)
830 as->prepareCallWithArgCount(3);
831 as->passAccumulatorAsArg(2);
832 as->passJSSlotAsArg(lhs, 1);
833 as->passEngineAsArg(0);
834 BASELINEJIT_GENERATE_RUNTIME_CALL(As, CallResultDestination::InAccumulator);
837void BaselineJIT::generate_UNot() { as->unot(); }
838void BaselineJIT::generate_UPlus() { as->toNumber(); }
839void BaselineJIT::generate_UMinus() { as->uminus(); }
840void BaselineJIT::generate_UCompl() { as->ucompl(); }
841void BaselineJIT::generate_Increment() { as->inc(); }
842void BaselineJIT::generate_Decrement() { as->dec(); }
843void BaselineJIT::generate_Add(
int lhs) { as->add(lhs); }
845void BaselineJIT::generate_BitAnd(
int lhs) { as->bitAnd(lhs); }
846void BaselineJIT::generate_BitOr(
int lhs) { as->bitOr(lhs); }
847void BaselineJIT::generate_BitXor(
int lhs) { as->bitXor(lhs); }
848void BaselineJIT::generate_UShr(
int lhs) { as->ushr(lhs); }
849void BaselineJIT::generate_Shr(
int lhs) { as->shr(lhs); }
850void BaselineJIT::generate_Shl(
int lhs) { as->shl(lhs); }
852void BaselineJIT::generate_BitAndConst(
int rhs) { as->bitAndConst(rhs); }
853void BaselineJIT::generate_BitOrConst(
int rhs) { as->bitOrConst(rhs); }
854void BaselineJIT::generate_BitXorConst(
int rhs) { as->bitXorConst(rhs); }
855void BaselineJIT::generate_UShrConst(
int rhs) { as->ushrConst(rhs); }
856void BaselineJIT::generate_ShrConst(
int rhs) { as->shrConst(rhs); }
857void BaselineJIT::generate_ShlConst(
int rhs) { as->shlConst(rhs); }
859void BaselineJIT::generate_Exp(
int lhs) {
862 as->prepareCallWithArgCount(2);
863 as->passAccumulatorAsArg(1);
864 as->passJSSlotAsArg(lhs, 0);
865 BASELINEJIT_GENERATE_RUNTIME_CALL(Exp, CallResultDestination::InAccumulator);
867void BaselineJIT::generate_Mul(
int lhs) { as->mul(lhs); }
868void BaselineJIT::generate_Div(
int lhs) { as->div(lhs); }
869void BaselineJIT::generate_Mod(
int lhs) { as->mod(lhs); }
870void BaselineJIT::generate_Sub(
int lhs) { as->sub(lhs); }
884void BaselineJIT::generate_InitializeBlockDeadTemporalZone(
int firstReg,
int count)
886 as->loadValue(Value::emptyValue().rawValue());
887 for (
int i = firstReg, end = firstReg + count; i < end; ++i)
891void BaselineJIT::generate_ThrowOnNullOrUndefined()
894 as->prepareCallWithArgCount(2);
895 as->passAccumulatorAsArg(1);
896 as->passEngineAsArg(0);
897 BASELINEJIT_GENERATE_RUNTIME_CALL(ThrowOnNullOrUndefined, CallResultDestination::Ignore);
901void BaselineJIT::generate_GetTemplateObject(
int index)
903 as->prepareCallWithArgCount(2);
904 as->passInt32AsArg(index, 1);
905 as->passFunctionAsArg(0);
906 BASELINEJIT_GENERATE_RUNTIME_CALL(GetTemplateObject, CallResultDestination::InAccumulator);
909ByteCodeHandler::Verdict BaselineJIT::startInstruction(Instr::Type )
911 if (labels.contains(currentInstructionOffset()))
912 as->addLabel(currentInstructionOffset());
913 return ProcessInstruction;
916void BaselineJIT::endInstruction(Instr::Type instr)