diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-11-27 14:33:36 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-01-02 14:25:30 +0000 |
commit | de73a1f9b4ad42e4b67d4d6045ff8ca9994e9a7d (patch) | |
tree | bdaaf23abdfad1f3237279448320523bd06a9285 /src/qml/jit | |
parent | 5f8410750bebb31c1b61f3baca947e962afc1890 (diff) |
Optimize JIT generated for for CreateCallContext
Added a storeHeapObject() call to the assembler, to
ensure we store the pointer returned by newCallContext()
correctly on 32 and 64 bit platforms.
Change-Id: I2141d5dd3cdd39a9b8886236100e0437159c6fb9
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 21 | ||||
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 1 | ||||
-rw-r--r-- | src/qml/jit/qv4jit.cpp | 13 |
3 files changed, 26 insertions, 9 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index b0470ed89d..5cdfbcee93 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -89,6 +89,7 @@ struct PlatformAssembler_X86_64_SysV : JSC::MacroAssembler<JSC::MacroAssemblerX8 static const RegisterID NoRegister = RegisterID(-1); static const RegisterID ReturnValueRegister = RegisterID::eax; + static const RegisterID ReturnValueRegisterValue = ReturnValueRegister; static const RegisterID AccumulatorRegister = RegisterID::eax; static const RegisterID AccumulatorRegisterValue = AccumulatorRegister; static const RegisterID ScratchRegister = RegisterID::r10; @@ -167,6 +168,7 @@ struct PlatformAssembler_Win64 : JSC::MacroAssembler<JSC::MacroAssemblerX86_64> static const RegisterID NoRegister = RegisterID(-1); static const RegisterID ReturnValueRegister = RegisterID::eax; + static const RegisterID ReturnValueRegisterValue = ReturnValueRegister; static const RegisterID AccumulatorRegister = RegisterID::eax; static const RegisterID AccumulatorRegisterValue = AccumulatorRegister; static const RegisterID ScratchRegister = RegisterID::r10; @@ -328,6 +330,7 @@ struct PlatformAssembler_ARM64 : JSC::MacroAssembler<JSC::MacroAssemblerARM64> static const RegisterID NoRegister = RegisterID(-1); static const RegisterID ReturnValueRegister = JSC::ARM64Registers::x0; + static const RegisterID ReturnValueRegisterValue = ReturnValueRegister; static const RegisterID AccumulatorRegister = JSC::ARM64Registers::x9; static const RegisterID AccumulatorRegisterValue = AccumulatorRegister; static const RegisterID ScratchRegister = JSC::ARM64Registers::x10; @@ -689,6 +692,11 @@ struct PlatformAssembler64 : PlatformAssemblerCommon move(TrustedImm64(value), AccumulatorRegister); } + void storeHeapObject(RegisterID source, Address addr) + { + store64(source, addr); + } + void generateCatchTrampoline() { PlatformAssemblerCommon::generateCatchTrampoline([this](){loadUndefined();}); @@ -909,6 +917,14 @@ struct PlatformAssembler32 : PlatformAssemblerCommon move(TrustedImm32(Value::fromReturnedValue(value).tag()), AccumulatorRegisterTag); } + void storeHeapObject(RegisterID source, Address addr) + { + store32(source, addr); + addr.offset += 4; + store32(TrustedImm32(0), addr); + } + + void generateCatchTrampoline() { PlatformAssemblerCommon::generateCatchTrampoline([this](){loadUndefined();}); @@ -1321,6 +1337,11 @@ void Assembler::loadValue(ReturnedValue value) pasm()->loadValue(value); } +void JIT::Assembler::storeHeapObject(int reg) +{ + pasm()->storeHeapObject(PlatformAssembler::ReturnValueRegisterValue, regAddr(reg)); +} + void Assembler::toNumber() { pasm()->toNumber(); diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 5cd64096b1..37d4232a17 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -95,6 +95,7 @@ public: void storeLocal(int index, int level = 0); void loadString(int stringId); void loadValue(ReturnedValue value); + void storeHeapObject(int reg); // numeric ops void unot(); diff --git a/src/qml/jit/qv4jit.cpp b/src/qml/jit/qv4jit.cpp index 42ee1ff5df..4922e60747 100644 --- a/src/qml/jit/qv4jit.cpp +++ b/src/qml/jit/qv4jit.cpp @@ -570,17 +570,12 @@ void BaselineJIT::generate_ThrowException() void BaselineJIT::generate_GetException() { as->getException(); } void BaselineJIT::generate_SetException() { as->setException(); } -static void createCallContextHelper(Value *stack, CppStackFrame *frame) -{ - stack[CallData::Context] = ExecutionContext::newCallContext(frame); -} - void BaselineJIT::generate_CreateCallContext() { - as->prepareCallWithArgCount(2); - as->passCppFrameAsArg(1); - as->passRegAsArg(0, 0); - JIT_GENERATE_RUNTIME_CALL(createCallContextHelper, Assembler::IgnoreResult); + as->prepareCallWithArgCount(1); + as->passCppFrameAsArg(0); + JIT_GENERATE_RUNTIME_CALL(ExecutionContext::newCallContext, Assembler::IgnoreResult); // keeps result in return value register + as->storeHeapObject(CallData::Context); } void BaselineJIT::generate_PushCatchContext(int name, int reg) { as->pushCatchContext(name, reg); } |