diff options
Diffstat (limited to 'src/qml/jit/qv4baselinejit.cpp')
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 906cc30e67..fcaa87290e 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -74,6 +74,7 @@ void BaselineJIT::generate() #define STORE_IP() as->storeInstructionPointer(nextInstructionOffset()) #define STORE_ACC() as->saveAccumulatorInFrame() +#define LOAD_ACC() as->loadAccumulatorFromFrame() #define BASELINEJIT_GENERATE_RUNTIME_CALL(function, destination) { \ as->GENERATE_RUNTIME_CALL(function, destination); \ if (Runtime::function::throws) \ @@ -228,6 +229,7 @@ void BaselineJIT::generate_StoreNameSloppy(int name) as->passInt32AsArg(name, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(StoreNameSloppy, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_StoreNameStrict(int name) @@ -239,6 +241,7 @@ void BaselineJIT::generate_StoreNameStrict(int name) as->passInt32AsArg(name, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(StoreNameStrict, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_LoadElement(int base) @@ -262,6 +265,7 @@ void BaselineJIT::generate_StoreElement(int base, int index) as->passJSSlotAsArg(base, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(StoreElement, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_LoadProperty(int name) @@ -297,6 +301,7 @@ void BaselineJIT::generate_StoreProperty(int name, int base) as->passJSSlotAsArg(base, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(StoreProperty, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_SetLookup(int index, int base) @@ -317,7 +322,6 @@ void BaselineJIT::generate_SetLookup(int index, int base) void BaselineJIT::generate_LoadSuperProperty(int property) { STORE_IP(); - STORE_ACC(); as->prepareCallWithArgCount(2); as->passJSSlotAsArg(property, 1); as->passEngineAsArg(0); @@ -333,6 +337,7 @@ void BaselineJIT::generate_StoreSuperProperty(int property) as->passJSSlotAsArg(property, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(StoreSuperProperty, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_Yield() @@ -562,6 +567,7 @@ void BaselineJIT::generate_PushBlockContext(int index) as->passInt32AsArg(index, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(PushBlockContext, CallResultDestination::Ignore); + as->loadAccumulatorFromFrame(); } void BaselineJIT::generate_CloneBlockContext() @@ -570,6 +576,7 @@ void BaselineJIT::generate_CloneBlockContext() as->prepareCallWithArgCount(1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(CloneBlockContext, CallResultDestination::Ignore); + as->loadAccumulatorFromFrame(); } void BaselineJIT::generate_PushScriptContext(int index) @@ -579,6 +586,7 @@ void BaselineJIT::generate_PushScriptContext(int index) as->passInt32AsArg(index, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(PushScriptContext, CallResultDestination::Ignore); + as->loadAccumulatorFromFrame(); } void BaselineJIT::generate_PopScriptContext() @@ -587,6 +595,7 @@ void BaselineJIT::generate_PopScriptContext() as->prepareCallWithArgCount(1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(PopScriptContext, CallResultDestination::Ignore); + as->loadAccumulatorFromFrame(); } void BaselineJIT::generate_PopContext() { as->popContext(); } @@ -682,11 +691,13 @@ void BaselineJIT::generate_TypeofValue() void BaselineJIT::generate_DeclareVar(int varName, int isDeletable) { + STORE_ACC(); as->prepareCallWithArgCount(3); as->passInt32AsArg(varName, 2); as->passInt32AsArg(isDeletable, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(DeclareVar, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_DefineArray(int argc, int args) @@ -744,11 +755,13 @@ void BaselineJIT::generate_CreateRestParameter(int argIndex) void BaselineJIT::generate_ConvertThisToObject() { + STORE_ACC(); as->prepareCallWithArgCount(2); as->passJSSlotAsArg(CallData::This, 1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(ConvertThisToObject, CallResultDestination::InAccumulator); as->storeReg(CallData::This); + LOAD_ACC(); } void BaselineJIT::generate_LoadSuperConstructor() @@ -893,6 +906,7 @@ void BaselineJIT::generate_ThrowOnNullOrUndefined() as->passAccumulatorAsArg(1); as->passEngineAsArg(0); BASELINEJIT_GENERATE_RUNTIME_CALL(ThrowOnNullOrUndefined, CallResultDestination::Ignore); + LOAD_ACC(); } void BaselineJIT::generate_GetTemplateObject(int index) |