diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2018-06-22 13:27:28 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-06-22 18:39:34 +0000 |
commit | e56fdca238600f33acba98b5102ad8a18d5af8a7 (patch) | |
tree | 0350bd0106743c96a0592dc88600b341fcfc1ee0 /src/qml/jit/qv4assembler.cpp | |
parent | cb0e5faa05b63a3db6239a911edaccf75a4ad1af (diff) |
Fix remaining failues with qjstest --jit
The codegen generates code like this for the unwind handling:
GetException
MoveReg <somereg>, <return value reg>
SetException
In the interpreter, MoveReg doesn't clobber the accumulator, but in the
JIT it did.
Change-Id: I7a9c8200468115ca37403ec8a0d511210e2b25fd
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/jit/qv4assembler.cpp')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index c9a2b7c451..be6c03ab8f 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -680,6 +680,12 @@ struct PlatformAssembler64 : PlatformAssemblerCommon store64(AccumulatorRegister, addr); } + void moveReg(Address sourceRegAddress, Address destRegAddress) + { + load64(sourceRegAddress, ScratchRegister); + store64(ScratchRegister, destRegAddress); + } + void loadString(int stringId) { loadAccumulator(loadStringAddress(stringId)); @@ -951,6 +957,16 @@ struct PlatformAssembler32 : PlatformAssemblerCommon store32(AccumulatorRegisterTag, addr); } + void moveReg(Address sourceRegAddress, Address destRegAddress) + { + load32(sourceRegAddress, ReturnValueRegisterValue); + sourceRegAddress.offset += 4; + load32(sourceRegAddress, ReturnValueRegisterTag); + store32(ReturnValueRegisterValue, destRegAddress); + destRegAddress.offset += 4; + store32(ReturnValueRegisterTag, destRegAddress); + } + void loadString(int stringId) { load32(loadStringAddress(stringId), AccumulatorRegisterValue); @@ -1443,6 +1459,11 @@ void Assembler::loadReg(int reg) pasm()->loadAccumulator(regAddr(reg)); } +void JIT::Assembler::moveReg(int sourceReg, int destReg) +{ + pasm()->moveReg(regAddr(sourceReg), regAddr(destReg)); +} + void Assembler::storeReg(int reg) { pasm()->storeAccumulator(regAddr(reg)); |