From e56fdca238600f33acba98b5102ad8a18d5af8a7 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 22 Jun 2018 13:27:28 +0200 Subject: Fix remaining failues with qjstest --jit The codegen generates code like this for the unwind handling: GetException MoveReg , SetException In the interpreter, MoveReg doesn't clobber the accumulator, but in the JIT it did. Change-Id: I7a9c8200468115ca37403ec8a0d511210e2b25fd Reviewed-by: Lars Knoll --- src/qml/jit/qv4assembler.cpp | 21 +++++++++++++++++++++ src/qml/jit/qv4assembler_p.h | 1 + src/qml/jit/qv4baselinejit.cpp | 4 ++-- 3 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src/qml/jit') 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)); diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index ac30a534df..2cf59f53ee 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -90,6 +90,7 @@ public: void loadConst(int constIndex); void copyConst(int constIndex, int destReg); void loadReg(int reg); + void moveReg(int sourceReg, int destReg); void storeReg(int reg); void loadLocal(int index, int level = 0); void storeLocal(int index, int level = 0); diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index c813ff7f2d..3e8991122f 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -135,8 +135,8 @@ void BaselineJIT::generate_StoreReg(int reg) void BaselineJIT::generate_MoveReg(int srcReg, int destReg) { - as->loadReg(srcReg); - as->storeReg(destReg); + // Don't clobber the accumulator. + as->moveReg(srcReg, destReg); } void BaselineJIT::generate_LoadLocal(int index) -- cgit v1.2.3