diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-08-11 13:15:34 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-08-12 10:46:17 +0200 |
commit | 109abdb061263c28ae97424729e979cd0ff8289a (patch) | |
tree | 9e224b11e4477a3798a37ad0903ffc97f0409047 /src/qml/jit/qv4isel_masm_p.h | |
parent | 70d73e8ee4cbe87d2980a9ec1208515ef212119b (diff) |
V4 JIT: fix LookupCall on ARM
To generate a LookupCall, the register r8 was used on ARM instead of the
ReturnValue register. The reason is that the ReturnValue register is
also the register for the first argument. However, now that we use
callee-saved registers (r8 among them), this would clobber any value
stored in r8. The fix is to actually use r0 to calculate the value,
because the first argument holds the lookup table, and the call is
relative to that. This leaves r8 free to be used by the register
allocator.
Change-Id: I5095bf69d27e16111ad32d9e5d5691c7bce14516
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jit/qv4isel_masm_p.h')
-rw-r--r-- | src/qml/jit/qv4isel_masm_p.h | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/src/qml/jit/qv4isel_masm_p.h b/src/qml/jit/qv4isel_masm_p.h index 9ed8be844b..1f1e71a284 100644 --- a/src/qml/jit/qv4isel_masm_p.h +++ b/src/qml/jit/qv4isel_masm_p.h @@ -229,19 +229,15 @@ private: template <typename Retval, typename Arg1, typename Arg2, typename Arg3> void generateLookupCall(Retval retval, uint index, uint getterSetterOffset, Arg1 arg1, Arg2 arg2, Arg3 arg3) { - Assembler::RegisterID lookupRegister; -#if CPU(ARM) - lookupRegister = JSC::ARMRegisters::r8; -#else - lookupRegister = Assembler::ReturnValueRegister; -#endif - Assembler::Pointer lookupAddr(lookupRegister, index * sizeof(QV4::Lookup)); - - Assembler::Address getterSetter = lookupAddr; - getterSetter.offset += getterSetterOffset; + // Note: using the return value register is intentional: for ABIs where the first parameter + // goes into the same register as the return value (currently only ARM), the prepareCall + // will combine loading the looupAddr into the register and calculating the indirect call + // address. + Assembler::Pointer lookupAddr(Assembler::ReturnValueRegister, index * sizeof(QV4::Lookup)); _as->generateFunctionCallImp(retval, "lookup getter/setter", - RelativeCall(getterSetter), lookupAddr, arg1, arg2, arg3); + LookupCall(lookupAddr, getterSetterOffset), lookupAddr, + arg1, arg2, arg3); } template <typename Retval, typename Arg1, typename Arg2> |