diff options
Diffstat (limited to 'src')
-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/qv4baselinejit.cpp | 4 |
3 files changed, 24 insertions, 2 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)); 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) |