From de73a1f9b4ad42e4b67d4d6045ff8ca9994e9a7d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 27 Nov 2017 14:33:36 +0100 Subject: Optimize JIT generated for for CreateCallContext Added a storeHeapObject() call to the assembler, to ensure we store the pointer returned by newCallContext() correctly on 32 and 64 bit platforms. Change-Id: I2141d5dd3cdd39a9b8886236100e0437159c6fb9 Reviewed-by: Simon Hausmann --- src/qml/jit/qv4assembler.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/qml/jit/qv4assembler.cpp') diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index b0470ed89d..5cdfbcee93 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -89,6 +89,7 @@ struct PlatformAssembler_X86_64_SysV : JSC::MacroAssembler static const RegisterID NoRegister = RegisterID(-1); static const RegisterID ReturnValueRegister = RegisterID::eax; + static const RegisterID ReturnValueRegisterValue = ReturnValueRegister; static const RegisterID AccumulatorRegister = RegisterID::eax; static const RegisterID AccumulatorRegisterValue = AccumulatorRegister; static const RegisterID ScratchRegister = RegisterID::r10; @@ -328,6 +330,7 @@ struct PlatformAssembler_ARM64 : JSC::MacroAssembler static const RegisterID NoRegister = RegisterID(-1); static const RegisterID ReturnValueRegister = JSC::ARM64Registers::x0; + static const RegisterID ReturnValueRegisterValue = ReturnValueRegister; static const RegisterID AccumulatorRegister = JSC::ARM64Registers::x9; static const RegisterID AccumulatorRegisterValue = AccumulatorRegister; static const RegisterID ScratchRegister = JSC::ARM64Registers::x10; @@ -689,6 +692,11 @@ struct PlatformAssembler64 : PlatformAssemblerCommon move(TrustedImm64(value), AccumulatorRegister); } + void storeHeapObject(RegisterID source, Address addr) + { + store64(source, addr); + } + void generateCatchTrampoline() { PlatformAssemblerCommon::generateCatchTrampoline([this](){loadUndefined();}); @@ -909,6 +917,14 @@ struct PlatformAssembler32 : PlatformAssemblerCommon move(TrustedImm32(Value::fromReturnedValue(value).tag()), AccumulatorRegisterTag); } + void storeHeapObject(RegisterID source, Address addr) + { + store32(source, addr); + addr.offset += 4; + store32(TrustedImm32(0), addr); + } + + void generateCatchTrampoline() { PlatformAssemblerCommon::generateCatchTrampoline([this](){loadUndefined();}); @@ -1321,6 +1337,11 @@ void Assembler::loadValue(ReturnedValue value) pasm()->loadValue(value); } +void JIT::Assembler::storeHeapObject(int reg) +{ + pasm()->storeHeapObject(PlatformAssembler::ReturnValueRegisterValue, regAddr(reg)); +} + void Assembler::toNumber() { pasm()->toNumber(); -- cgit v1.2.3