diff options
Diffstat (limited to 'src/qml/jit/qv4baselinejit.cpp')
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 91 |
1 files changed, 56 insertions, 35 deletions
diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 098bbfc6c6..8de0259509 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -63,7 +63,9 @@ void BaselineJIT::generate() // qDebug()<<"jitting" << function->name()->toQString(); const char *code = function->codeData; uint len = function->compiledFunction->codeSize; - labels = collectLabelsInBytecode(code, len); + + for (unsigned i = 0, ei = function->compiledFunction->nLabelInfos; i != ei; ++i) + labels.insert(int(function->compiledFunction->labelInfoTable()[i])); as->generatePrologue(); decode(code, len); @@ -149,7 +151,7 @@ void BaselineJIT::generate_LoadImport(int index) as->loadImport(index); } -void BaselineJIT::generate_LoadLocal(int index) +void BaselineJIT::generate_LoadLocal(int index, int /*traceSlot*/) { as->loadLocal(index); } @@ -160,7 +162,7 @@ void BaselineJIT::generate_StoreLocal(int index) as->storeLocal(index); } -void BaselineJIT::generate_LoadScopedLocal(int scope, int index) +void BaselineJIT::generate_LoadScopedLocal(int scope, int index, int /*traceSlot*/) { as->loadLocal(index, scope); } @@ -193,7 +195,7 @@ void BaselineJIT::generate_LoadClosure(int value) BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_closure, CallResultDestination::InAccumulator); } -void BaselineJIT::generate_LoadName(int name) +void BaselineJIT::generate_LoadName(int name, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(2); @@ -203,7 +205,7 @@ void BaselineJIT::generate_LoadName(int name) as->checkException(); } -void BaselineJIT::generate_LoadGlobalLookup(int index) +void BaselineJIT::generate_LoadGlobalLookup(int index, int /*traceSlot*/) { as->prepareCallWithArgCount(3); as->passInt32AsArg(index, 2); @@ -237,7 +239,7 @@ void BaselineJIT::generate_StoreNameStrict(int name) as->checkException(); } -void BaselineJIT::generate_LoadElement(int base) +void BaselineJIT::generate_LoadElement(int base, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -249,7 +251,7 @@ void BaselineJIT::generate_LoadElement(int base) as->checkException(); } -void BaselineJIT::generate_StoreElement(int base, int index) +void BaselineJIT::generate_StoreElement(int base, int index, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -262,7 +264,7 @@ void BaselineJIT::generate_StoreElement(int base, int index) as->checkException(); } -void BaselineJIT::generate_LoadProperty(int name) +void BaselineJIT::generate_LoadProperty(int name, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -274,7 +276,7 @@ void BaselineJIT::generate_LoadProperty(int name) as->checkException(); } -void BaselineJIT::generate_GetLookup(int index) +void BaselineJIT::generate_GetLookup(int index, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -415,7 +417,7 @@ void BaselineJIT::generate_Resume(int) Q_UNREACHABLE(); } -void BaselineJIT::generate_CallValue(int name, int argc, int argv) +void BaselineJIT::generate_CallValue(int name, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -427,7 +429,7 @@ void BaselineJIT::generate_CallValue(int name, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallWithReceiver(int name, int thisObject, int argc, int argv) +void BaselineJIT::generate_CallWithReceiver(int name, int thisObject, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -440,7 +442,7 @@ void BaselineJIT::generate_CallWithReceiver(int name, int thisObject, int argc, as->checkException(); } -void BaselineJIT::generate_CallProperty(int name, int base, int argc, int argv) +void BaselineJIT::generate_CallProperty(int name, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -453,7 +455,7 @@ void BaselineJIT::generate_CallProperty(int name, int base, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallPropertyLookup(int lookupIndex, int base, int argc, int argv) +void BaselineJIT::generate_CallPropertyLookup(int lookupIndex, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -466,7 +468,7 @@ void BaselineJIT::generate_CallPropertyLookup(int lookupIndex, int base, int arg as->checkException(); } -void BaselineJIT::generate_CallElement(int base, int index, int argc, int argv) +void BaselineJIT::generate_CallElement(int base, int index, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -479,7 +481,7 @@ void BaselineJIT::generate_CallElement(int base, int index, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallName(int name, int argc, int argv) +void BaselineJIT::generate_CallName(int name, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -491,7 +493,7 @@ void BaselineJIT::generate_CallName(int name, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallPossiblyDirectEval(int argc, int argv) +void BaselineJIT::generate_CallPossiblyDirectEval(int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(3); @@ -502,7 +504,7 @@ void BaselineJIT::generate_CallPossiblyDirectEval(int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv) +void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -514,7 +516,7 @@ void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv) +void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -527,7 +529,7 @@ void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int ar as->checkException(); } -void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv) +void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -541,7 +543,7 @@ void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int } -void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, int argv) +void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -591,7 +593,7 @@ void BaselineJIT::generate_ConstructWithSpread(int func, int argc, int argv) void BaselineJIT::generate_SetUnwindHandler(int offset) { if (offset) - as->setUnwindHandler(absoluteOffsetForJump(offset)); + labels.insert(as->setUnwindHandler(absoluteOffset(offset))); else as->clearUnwindHandler(); } @@ -603,7 +605,7 @@ void BaselineJIT::generate_UnwindDispatch() void BaselineJIT::generate_UnwindToLabel(int level, int offset) { - as->unwindToLabel(level, absoluteOffsetForJump(offset)); + labels.insert(as->unwindToLabel(level, absoluteOffset(offset))); } void BaselineJIT::generate_DeadTemporalZoneCheck(int name) @@ -870,11 +872,30 @@ void BaselineJIT::generate_ToObject() } -void BaselineJIT::generate_Jump(int offset) { as->jump(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpTrue(int offset) { as->jumpTrue(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpFalse(int offset) { as->jumpFalse(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpNoException(int offset) { as->jumpNoException(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpNotUndefined(int offset) { as->jumpNotUndefined(absoluteOffsetForJump(offset)); } +void BaselineJIT::generate_Jump(int offset) +{ + labels.insert(as->jump(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpTrue(int /*traceSlot*/, int offset) +{ + labels.insert(as->jumpTrue(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpFalse(int /*traceSlot*/, int offset) +{ + labels.insert(as->jumpFalse(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpNoException(int offset) +{ + labels.insert(as->jumpNoException(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpNotUndefined(int offset) +{ + labels.insert(as->jumpNotUndefined(absoluteOffset(offset))); +} void BaselineJIT::generate_CmpEqNull() { as->cmpeqNull(); } void BaselineJIT::generate_CmpNeNull() { as->cmpneNull(); } @@ -913,11 +934,11 @@ void BaselineJIT::generate_CmpInstanceOf(int lhs) void BaselineJIT::generate_UNot() { as->unot(); } void BaselineJIT::generate_UPlus() { as->toNumber(); } -void BaselineJIT::generate_UMinus() { as->uminus(); } +void BaselineJIT::generate_UMinus(int /*traceSlot*/) { as->uminus(); } void BaselineJIT::generate_UCompl() { as->ucompl(); } -void BaselineJIT::generate_Increment() { as->inc(); } -void BaselineJIT::generate_Decrement() { as->dec(); } -void BaselineJIT::generate_Add(int lhs) { as->add(lhs); } +void BaselineJIT::generate_Increment(int /*traceSlot*/) { as->inc(); } +void BaselineJIT::generate_Decrement(int /*traceSlot*/) { as->dec(); } +void BaselineJIT::generate_Add(int lhs, int /*traceSlot*/) { as->add(lhs); } void BaselineJIT::generate_BitAnd(int lhs) { as->bitAnd(lhs); } void BaselineJIT::generate_BitOr(int lhs) { as->bitOr(lhs); } @@ -942,10 +963,10 @@ void BaselineJIT::generate_Exp(int lhs) { BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::exp, CallResultDestination::InAccumulator); as->checkException(); } -void BaselineJIT::generate_Mul(int lhs) { as->mul(lhs); } +void BaselineJIT::generate_Mul(int lhs, int /*traceSlot*/) { as->mul(lhs); } void BaselineJIT::generate_Div(int lhs) { as->div(lhs); } -void BaselineJIT::generate_Mod(int lhs) { as->mod(lhs); } -void BaselineJIT::generate_Sub(int lhs) { as->sub(lhs); } +void BaselineJIT::generate_Mod(int lhs, int /*traceSlot*/) { as->mod(lhs); } +void BaselineJIT::generate_Sub(int lhs, int /*traceSlot*/) { as->sub(lhs); } //void BaselineJIT::generate_BinopContext(int alu, int lhs) //{ @@ -1004,7 +1025,7 @@ void BaselineJIT::generate_GetTemplateObject(int index) void BaselineJIT::startInstruction(Instr::Type /*instr*/) { - if (hasLabel()) + if (labels.contains(currentInstructionOffset())) as->addLabel(currentInstructionOffset()); } |