aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit/qv4isel_masm_p.h
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-08-11 13:15:34 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2014-08-12 10:46:17 +0200
commit109abdb061263c28ae97424729e979cd0ff8289a (patch)
tree9e224b11e4477a3798a37ad0903ffc97f0409047 /src/qml/jit/qv4isel_masm_p.h
parent70d73e8ee4cbe87d2980a9ec1208515ef212119b (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.h18
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>