diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-08-05 10:51:57 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-08-14 09:08:58 +0200 |
commit | bd6f3aa14685060f468e7e372f1044394f806a04 (patch) | |
tree | 435e43b3f6f411df7e92621a00161ebf86a34803 /src | |
parent | e05ba6967edfe288044d6c397fbb541c67eddead (diff) |
V4 JIT: fix stack use below stack pointer
When storing a double value returned from a function call on platforms
where the value wouldn't fit in a register, we used to store it on the
stack and then load it into a FP register. This stack use was done
without first lowering the stack pointer.
For x86 and ARM, the value is loaded directly into the FP register, and
for other non-64-bit platforms it correctly allocates the stack slot.
Change-Id: Idbc260038958a036ac2a7383d845199626decc8e
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 9d2d6c5ca0..32f709c5d2 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -551,9 +551,11 @@ public: void storeUInt32ReturnValue(RegisterID dest) { - Pointer tmp(StackPointerRegister, -int(sizeof(QV4::Value))); + subPtr(TrustedImm32(sizeof(QV4::Value)), StackPointerRegister); + Pointer tmp(StackPointerRegister, 0); storeReturnValue(tmp); toUInt32Register(tmp, dest); + addPtr(TrustedImm32(sizeof(QV4::Value)), StackPointerRegister); } void storeReturnValue(FPRegisterID dest) @@ -562,10 +564,16 @@ public: move(TrustedImm64(QV4::Value::NaNEncodeMask), ScratchRegister); xor64(ScratchRegister, ReturnValueRegister); move64ToDouble(ReturnValueRegister, dest); +#elif defined(Q_PROCESSOR_ARM) + moveIntsToDouble(JSC::ARMRegisters::r0, JSC::ARMRegisters::r1, dest, FPGpr0); +#elif defined(Q_PROCESSOR_X86) + moveIntsToDouble(JSC::X86Registers::eax, JSC::X86Registers::edx, dest, FPGpr0); #else - Pointer tmp(StackPointerRegister, -int(sizeof(QV4::Value))); + subPtr(TrustedImm32(sizeof(QV4::Value)), StackPointerRegister); + Pointer tmp(StackPointerRegister, 0); storeReturnValue(tmp); loadDouble(tmp, dest); + addPtr(TrustedImm32(sizeof(QV4::Value)), StackPointerRegister); #endif } |