diff options
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4baselineassembler.cpp | 32 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 106 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit_p.h | 15 | ||||
-rw-r--r-- | src/qml/jit/qv4graphbuilder.cpp | 70 | ||||
-rw-r--r-- | src/qml/jit/qv4graphbuilder_p.h | 17 | ||||
-rw-r--r-- | src/qml/jit/qv4operation.cpp | 16 | ||||
-rw-r--r-- | src/qml/jit/qv4operation_p.h | 15 |
7 files changed, 48 insertions, 223 deletions
diff --git a/src/qml/jit/qv4baselineassembler.cpp b/src/qml/jit/qv4baselineassembler.cpp index 1b60e96f2c..238c11f478 100644 --- a/src/qml/jit/qv4baselineassembler.cpp +++ b/src/qml/jit/qv4baselineassembler.cpp @@ -208,17 +208,20 @@ public: isNumber.link(this); } + // this converts both the lhs and the accumulator to int32 void toInt32LhsAcc(Address lhs, RegisterID lhsTarget) { load64(lhs, lhsTarget); urshift64(lhsTarget, TrustedImm32(Value::QuickType_Shift), ScratchRegister2); auto lhsIsInt = branch32(Equal, TrustedImm32(Value::QT_Int), ScratchRegister2); - pushAligned(AccumulatorRegister); + const Address accumulatorStackAddress(JSStackFrameRegister, + offsetof(CallData, accumulator)); + storeAccumulator(accumulatorStackAddress); move(lhsTarget, registerForArg(0)); callHelper(toInt32Helper); move(ReturnValueRegister, lhsTarget); - popAligned(AccumulatorRegister); + loadAccumulator(accumulatorStackAddress); lhsIsInt.link(this); urshift64(AccumulatorRegister, TrustedImm32(Value::QuickType_Shift), ScratchRegister2); @@ -498,6 +501,7 @@ public: isNumber.link(this); } + // this converts both the lhs and the accumulator to int32 void toInt32LhsAcc(Address lhs, RegisterID lhsTarget) { bool accumulatorNeedsSaving = AccumulatorRegisterValue == ReturnValueRegisterValue @@ -510,32 +514,28 @@ public: auto lhsIsInt = jump(); lhsIsNotInt.link(this); - if (accumulatorNeedsSaving) { - push(AccumulatorRegisterTag); - push(AccumulatorRegisterValue); - } + + // Save accumulator from being garbage collected, no matter if we will reuse the register. + const Address accumulatorStackAddress(JSStackFrameRegister, + offsetof(CallData, accumulator)); + storeAccumulator(accumulatorStackAddress); if (ArgInRegCount < 2) { - if (!accumulatorNeedsSaving) - subPtr(TrustedImm32(2 * PointerSize), StackPointerRegister); + subPtr(TrustedImm32(2 * PointerSize), StackPointerRegister); push(lhsTarget); load32(lhs, lhsTarget); push(lhsTarget); } else { - if (accumulatorNeedsSaving) - subPtr(TrustedImm32(2 * PointerSize), StackPointerRegister); move(lhsTarget, registerForArg(1)); load32(lhs, registerForArg(0)); } callHelper(toInt32Helper); move(ReturnValueRegisterValue, lhsTarget); - if (accumulatorNeedsSaving) { - addPtr(TrustedImm32(2 * PointerSize), StackPointerRegister); - pop(AccumulatorRegisterValue); - pop(AccumulatorRegisterTag); - } else if (ArgInRegCount < 2) { + if (ArgInRegCount < 2) addPtr(TrustedImm32(4 * PointerSize), StackPointerRegister); - } + + if (accumulatorNeedsSaving) // otherwise it's still the same + loadAccumulator(accumulatorStackAddress); lhsIsInt.link(this); diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 6635ee7530..80155d7b20 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -213,6 +213,14 @@ void BaselineJIT::generate_LoadGlobalLookup(int index, int /*traceSlot*/) BASELINEJIT_GENERATE_RUNTIME_CALL(LoadGlobalLookup, CallResultDestination::InAccumulator); } +void BaselineJIT::generate_LoadQmlContextPropertyLookup(int index, int /*traceSlot*/) +{ + as->prepareCallWithArgCount(2); + as->passInt32AsArg(index, 1); + as->passEngineAsArg(0); + BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlContextPropertyLookup, CallResultDestination::InAccumulator); +} + void BaselineJIT::generate_StoreNameSloppy(int name) { STORE_IP(); @@ -329,61 +337,6 @@ void BaselineJIT::generate_StoreSuperProperty(int property) BASELINEJIT_GENERATE_RUNTIME_CALL(StoreSuperProperty, CallResultDestination::Ignore); } - -void BaselineJIT::generate_StoreScopeObjectProperty(int base, int propertyIndex) -{ - STORE_ACC(); - as->prepareCallWithArgCount(4); - as->passAccumulatorAsArg(3); - as->passInt32AsArg(propertyIndex, 2); - as->passJSSlotAsArg(base, 1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(StoreQmlScopeObjectProperty, CallResultDestination::Ignore); -} - -void BaselineJIT::generate_StoreContextObjectProperty(int base, int propertyIndex) -{ - STORE_ACC(); - as->prepareCallWithArgCount(4); - as->passAccumulatorAsArg(3); - as->passInt32AsArg(propertyIndex, 2); - as->passJSSlotAsArg(base, 1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(StoreQmlContextObjectProperty, CallResultDestination::Ignore); -} - -void BaselineJIT::generate_LoadScopeObjectProperty(int propertyIndex, int base, int captureRequired) -{ - STORE_IP(); - as->prepareCallWithArgCount(4); - as->passInt32AsArg(captureRequired, 3); - as->passInt32AsArg(propertyIndex, 2); - as->passJSSlotAsArg(base, 1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlScopeObjectProperty, CallResultDestination::InAccumulator); -} - -void BaselineJIT::generate_LoadContextObjectProperty(int propertyIndex, int base, int captureRequired) -{ - STORE_IP(); - as->prepareCallWithArgCount(4); - as->passInt32AsArg(captureRequired, 3); - as->passInt32AsArg(propertyIndex, 2); - as->passJSSlotAsArg(base, 1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlContextObjectProperty, CallResultDestination::InAccumulator); -} - -void BaselineJIT::generate_LoadIdObject(int index, int base) -{ - STORE_IP(); - as->prepareCallWithArgCount(3); - as->passInt32AsArg(index, 2); - as->passJSSlotAsArg(base, 1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlIdObject, CallResultDestination::InAccumulator); -} - void BaselineJIT::generate_Yield() { // ##### @@ -493,31 +446,18 @@ void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv, int / BASELINEJIT_GENERATE_RUNTIME_CALL(CallGlobalLookup, CallResultDestination::InAccumulator); } -void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, int /*traceSlot*/) -{ - STORE_IP(); - as->prepareCallWithArgCount(5); - as->passInt32AsArg(argc, 4); - as->passJSSlotAsArg(argv, 3); - as->passInt32AsArg(propIdx, 2); - as->passJSSlotAsArg(base, 1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(CallQmlScopeObjectProperty, CallResultDestination::InAccumulator); -} - -void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, int /*traceSlot*/) +void BaselineJIT::generate_CallQmlContextPropertyLookup(int index, int argc, int argv, + int /*traceSlot*/) { STORE_IP(); - as->prepareCallWithArgCount(5); - as->passInt32AsArg(argc, 4); - as->passJSSlotAsArg(argv, 3); - as->passInt32AsArg(propIdx, 2); - as->passJSSlotAsArg(base, 1); + as->prepareCallWithArgCount(4); + as->passInt32AsArg(argc, 3); + as->passJSSlotAsArg(argv, 2); + as->passInt32AsArg(index, 1); as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(CallQmlContextObjectProperty, CallResultDestination::InAccumulator); + BASELINEJIT_GENERATE_RUNTIME_CALL(CallQmlContextPropertyLookup, CallResultDestination::InAccumulator); } - void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, int argv, int /*traceSlot*/) { STORE_IP(); @@ -937,22 +877,6 @@ void BaselineJIT::generate_Sub(int lhs, int /*traceSlot*/) { as->sub(lhs); } // as->checkException(); //} -void BaselineJIT::generate_LoadQmlContext(int result) -{ - as->prepareCallWithArgCount(1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlContext, CallResultDestination::InAccumulator); - as->storeReg(result); -} - -void BaselineJIT::generate_LoadQmlImportedScripts(int result) -{ - as->prepareCallWithArgCount(1); - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(LoadQmlImportedScripts, CallResultDestination::InAccumulator); - as->storeReg(result); -} - void BaselineJIT::generate_InitializeBlockDeadTemporalZone(int firstReg, int count) { as->loadValue(Value::emptyValue().rawValue()); diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h index df263b066b..37ab37eac2 100644 --- a/src/qml/jit/qv4baselinejit_p.h +++ b/src/qml/jit/qv4baselinejit_p.h @@ -97,6 +97,7 @@ public: void generate_LoadClosure(int value) override; void generate_LoadName(int name, int traceSlot) override; void generate_LoadGlobalLookup(int index, int traceSlot) override; + void generate_LoadQmlContextPropertyLookup(int index, int traceSlot) override; void generate_StoreNameSloppy(int name) override; void generate_StoreNameStrict(int name) override; void generate_LoadElement(int base, int traceSlot) override; @@ -107,15 +108,6 @@ public: void generate_SetLookup(int index, int base) override; void generate_LoadSuperProperty(int property) override; void generate_StoreSuperProperty(int property) override; - void generate_StoreScopeObjectProperty(int base, - int propertyIndex) override; - void generate_StoreContextObjectProperty(int base, - int propertyIndex) override; - void generate_LoadScopeObjectProperty(int propertyIndex, int base, - int captureRequired) override; - void generate_LoadContextObjectProperty(int propertyIndex, int base, - int captureRequired) override; - void generate_LoadIdObject(int index, int base) override; void generate_Yield() override; void generate_YieldStar() override; void generate_Resume(int) override; @@ -128,8 +120,7 @@ public: void generate_CallName(int name, int argc, int argv, int traceSlot) override; void generate_CallPossiblyDirectEval(int argc, int argv, int traceSlot) override; void generate_CallGlobalLookup(int index, int argc, int argv, int traceSlot) override; - void generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, int traceSlot) override; - void generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, int traceSlot) override; + void generate_CallQmlContextPropertyLookup(int index, int argc, int argv, int traceSlot) override; void generate_CallWithSpread(int func, int thisObject, int argc, int argv, int traceSlot) override; void generate_TailCall(int func, int thisObject, int argc, int argv) override; void generate_Construct(int func, int argc, int argv) override; @@ -211,8 +202,6 @@ public: void generate_Div(int lhs) override; void generate_Mod(int lhs, int traceSlot) override; void generate_Sub(int lhs, int traceSlot) override; - void generate_LoadQmlContext(int result) override; - void generate_LoadQmlImportedScripts(int result) override; void generate_InitializeBlockDeadTemporalZone(int firstReg, int count) override; void generate_ThrowOnNullOrUndefined() override; void generate_GetTemplateObject(int index) override; diff --git a/src/qml/jit/qv4graphbuilder.cpp b/src/qml/jit/qv4graphbuilder.cpp index 19f83ad0ec..2c073701ee 100644 --- a/src/qml/jit/qv4graphbuilder.cpp +++ b/src/qml/jit/qv4graphbuilder.cpp @@ -800,45 +800,10 @@ void GraphBuilder::generate_StoreSuperProperty(int property) env()->accumulator()); } -void GraphBuilder::generate_StoreScopeObjectProperty(int base, int propertyIndex) +void GraphBuilder::generate_LoadQmlContextPropertyLookup(int propertyIndex, int /*traceSlot*/) { - createNode(opBuilder()->get<Meta::QMLStoreScopeObjectProperty>(), - env()->slot(base), - createConstant(propertyIndex), - env()->accumulator()); -} - -void GraphBuilder::generate_StoreContextObjectProperty(int base, int propertyIndex) -{ - createNode(opBuilder()->get<Meta::QMLStoreContextObjectProperty>(), - env()->slot(base), - createConstant(propertyIndex), - env()->accumulator()); -} - -void GraphBuilder::generate_LoadScopeObjectProperty(int propertyIndex, int base, - int captureRequired) -{ - bindAcc(createNode(opBuilder()->get<Meta::QMLLoadScopeObjectProperty>(), - env()->slot(base), - createConstant(propertyIndex), - createConstant(captureRequired))); -} - -void GraphBuilder::generate_LoadContextObjectProperty(int propertyIndex, int base, - int captureRequired) -{ - bindAcc(createNode(opBuilder()->get<Meta::QMLLoadContextObjectProperty>(), - env()->slot(base), - createConstant(propertyIndex), - createConstant(captureRequired))); -} - -void GraphBuilder::generate_LoadIdObject(int index, int base) -{ - bindAcc(createNode(opBuilder()->get<Meta::QMLLoadIdObject>(), - env()->slot(base), - createConstant(index))); + bindAcc(createNode(opBuilder()->get<Meta::QMLLoadQmlContextPropertyLookup>(), + createConstant(propertyIndex))); } void GraphBuilder::generate_Yield() { Q_UNREACHABLE(); } @@ -913,22 +878,12 @@ void GraphBuilder::generate_CallGlobalLookup(int index, int argc, int argv, int finalizeCall(Meta::JSCallGlobalLookup, args, argc, argv); } -void GraphBuilder::generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, - int /*traceSlot*/) -{ - VarArgNodes args; - args.append(env()->slot(base)); - args.append(createConstant(propIdx)); - finalizeCall(Meta::QMLCallScopeObjectProperty, args, argc, argv); -} - -void GraphBuilder::generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, - int /*traceSlot*/) +void GraphBuilder::generate_CallQmlContextPropertyLookup(int index, int argc, int argv, + int /*traceSlot*/) { VarArgNodes args; - args.append(env()->slot(base)); - args.append(createConstant(propIdx)); - finalizeCall(Meta::QMLCallContextObjectProperty, args, argc, argv); + args.append(createConstant(index)); + finalizeCall(Meta::QMLCallQmlContextPropertyLookup, args, argc, argv); } void GraphBuilder::generate_SetUnwindHandler(int offset) @@ -1636,17 +1591,6 @@ void GraphBuilder::generate_Sub(int lhs, int /*traceSlot*/) env()->accumulator())); } -void GraphBuilder::generate_LoadQmlContext(int result) -{ - env()->bindNodeToSlot(createNode(opBuilder()->get<Meta::QMLLoadContext>()), result); -} - -void GraphBuilder::generate_LoadQmlImportedScripts(int result) -{ - env()->bindNodeToSlot(createNode(opBuilder()->get<Meta::QMLLoadImportedScripts>()), - result); -} - void GraphBuilder::generate_InitializeBlockDeadTemporalZone(int firstReg, int count) { for (int reg = firstReg; reg < firstReg + count; ++reg) diff --git a/src/qml/jit/qv4graphbuilder_p.h b/src/qml/jit/qv4graphbuilder_p.h index b6b2931ff0..450d8640b7 100644 --- a/src/qml/jit/qv4graphbuilder_p.h +++ b/src/qml/jit/qv4graphbuilder_p.h @@ -173,15 +173,7 @@ protected: // ByteCodeHandler void generate_SetLookup(int index, int base) override; void generate_LoadSuperProperty(int property) override; void generate_StoreSuperProperty(int property) override; - void generate_StoreScopeObjectProperty(int base, - int propertyIndex) override; - void generate_StoreContextObjectProperty(int base, - int propertyIndex) override; - void generate_LoadScopeObjectProperty(int propertyIndex, int base, - int captureRequired) override; - void generate_LoadContextObjectProperty(int propertyIndex, int base, - int captureRequired) override; - void generate_LoadIdObject(int index, int base) override; + void generate_LoadQmlContextPropertyLookup(int property, int traceSlot) override; void generate_Yield() override; void generate_YieldStar() override; void generate_Resume(int offset) override; @@ -196,10 +188,7 @@ protected: // ByteCodeHandler void generate_CallName(int name, int argc, int argv, int traceSlot) override; void generate_CallPossiblyDirectEval(int argc, int argv, int traceSlot) override; void generate_CallGlobalLookup(int index, int argc, int argv, int traceSlot) override; - void generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, - int traceSlot) override; - void generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, - int traceSlot) override; + void generate_CallQmlContextPropertyLookup(int index, int argc, int argv, int traceSlot) override; void generate_SetUnwindHandler(int offset) override; void generate_UnwindDispatch() override; void generate_UnwindToLabel(int level, int offset) override; @@ -284,8 +273,6 @@ protected: // ByteCodeHandler void generate_Div(int lhs) override; void generate_Mod(int lhs, int traceSlot) override; void generate_Sub(int lhs, int traceSlot) override; - void generate_LoadQmlContext(int result) override; - void generate_LoadQmlImportedScripts(int result) override; void generate_InitializeBlockDeadTemporalZone(int firstReg, int count) override; void generate_ThrowOnNullOrUndefined() override; void generate_GetTemplateObject(int index) override; diff --git a/src/qml/jit/qv4operation.cpp b/src/qml/jit/qv4operation.cpp index 8356a35098..d10f8f19ac 100644 --- a/src/qml/jit/qv4operation.cpp +++ b/src/qml/jit/qv4operation.cpp @@ -223,11 +223,7 @@ inline Operation *createOperation(Operation::Kind kind, QQmlJS::MemoryPool *stat case K::JSDeleteName: return get(1, 1, 1, 1, 1, 2, any, F::CanThrow); case K::JSIn: return get(2, 1, 1, 1, 1, 2, any, F::CanThrow); case K::JSInstanceOf: return get(2, 1, 1, 1, 1, 2, any, F::CanThrow); - case K::QMLLoadScopeObjectProperty: return get(3, 1, 1, 1, 1, 2, any, F::CanThrow); - case K::QMLStoreScopeObjectProperty: return get(3, 1, 1, 0, 1, 2, none, F::CanThrow); - case K::QMLLoadContextObjectProperty: return get(3, 1, 1, 1, 1, 2, any, F::CanThrow); - case K::QMLStoreContextObjectProperty: return get(3, 1, 1, 1, 1, 2, none, F::CanThrow); - case K::QMLLoadIdObject: return get(2, 1, 1, 1, 1, 2, any, F::CanThrow); + case K::QMLLoadQmlContextPropertyLookup: return get(1, 1, 1, 1, 1, 2, any, F::CanThrow); case K::JSEqual: return get(2, 1, 1, 1, 1, 2, boolean, F::CanThrow); case K::JSGreaterThan: return get(2, 1, 1, 1, 1, 2, boolean, F::CanThrow); @@ -263,8 +259,6 @@ inline Operation *createOperation(Operation::Kind kind, QQmlJS::MemoryPool *stat case K::JSTypeofValue: return get(1, 0, 0, 1, 0, 0, any, F::Pure); case K::JSDeclareVar: return get(2, 1, 1, 1, 1, 2, any, F::CanThrow); case K::JSDestructureRestElement: return get(1, 1, 1, 1, 1, 2, any, F::CanThrow); - case K::QMLLoadContext: return get(0, 0, 0, 1, 0, 0, any, F::NoFlags); - case K::QMLLoadImportedScripts: return get(0, 0, 0, 1, 0, 0, any, F::NoFlags); case K::JSCreateCallContext: return get(0, 1, 1, 0, 1, 1, none, F::NoFlags); case K::JSCreateCatchContext: return get(2, 1, 1, 1, 1, 1, none, F::NoFlags); @@ -518,18 +512,12 @@ static ReturnValue operateOnRuntimeCall(Operation::Kind kind, bool abortOnMissin case K::JSDeleteName: return M<R::DeleteName>::doIt(); case K::JSIn: return M<R::In>::doIt(); case K::JSInstanceOf: return M<R::Instanceof>::doIt(); - case K::QMLLoadScopeObjectProperty: return M<R::LoadQmlScopeObjectProperty>::doIt(); - case K::QMLStoreScopeObjectProperty: return M<R::StoreQmlScopeObjectProperty>::doIt(); - case K::QMLLoadContextObjectProperty: return M<R::LoadQmlContextObjectProperty>::doIt(); - case K::QMLStoreContextObjectProperty: return M<R::StoreQmlContextObjectProperty>::doIt(); - case K::QMLLoadIdObject: return M<R::LoadQmlIdObject>::doIt(); + case K::QMLLoadQmlContextPropertyLookup: return M<R::LoadQmlContextPropertyLookup>::doIt(); case K::JSTypeofName: return M<R::TypeofName>::doIt(); case K::JSTypeofValue: return M<R::TypeofValue>::doIt(); case K::JSDeclareVar: return M<R::DeclareVar>::doIt(); case K::JSDestructureRestElement: return M<R::DestructureRestElement>::doIt(); - case K::QMLLoadContext: return M<R::LoadQmlContext>::doIt(); - case K::QMLLoadImportedScripts: return M<R::LoadQmlImportedScripts>::doIt(); case K::JSThisToObject: return M<R::ConvertThisToObject>::doIt(); case K::JSCreateMappedArgumentsObject: return M<R::CreateMappedArgumentsObject>::doIt(); case K::JSCreateUnmappedArgumentsObject: return M<R::CreateUnmappedArgumentsObject>::doIt(); diff --git a/src/qml/jit/qv4operation_p.h b/src/qml/jit/qv4operation_p.h index 8b66e58d4b..43214023e8 100644 --- a/src/qml/jit/qv4operation_p.h +++ b/src/qml/jit/qv4operation_p.h @@ -123,12 +123,10 @@ enum OpKind: uint16_t { JSDeleteName, JSIn, JSInstanceOf, - /* ok, these are qml object ops, but we don't care for now and treat them a s JS */ - QMLLoadScopeObjectProperty, - QMLStoreScopeObjectProperty, - QMLLoadContextObjectProperty, - QMLStoreContextObjectProperty, - QMLLoadIdObject, + + /* ok, these are qml object ops, but we don't care for now and treat them as JS */ + QMLLoadQmlContextPropertyLookup, + QMLCallQmlContextPropertyLookup, JSEqual, JSGreaterThan, @@ -168,16 +166,11 @@ enum OpKind: uint16_t { JSCreateClass, JSConstruct, JSConstructWithSpread, - /* ok, these are qml vararg calls, but we don't care for now and treat them as JS */ - QMLCallScopeObjectProperty, - QMLCallContextObjectProperty, JSTypeofName, JSTypeofValue, JSDeclareVar, JSDestructureRestElement, - QMLLoadContext, - QMLLoadImportedScripts, JSThisToObject, JSCreateMappedArgumentsObject, JSCreateUnmappedArgumentsObject, |