aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit/qv4baselinejit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jit/qv4baselinejit.cpp')
-rw-r--r--src/qml/jit/qv4baselinejit.cpp91
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());
}