diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-09-04 12:19:10 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-10-05 11:18:16 +0000 |
commit | 052d22e116957a170e290a49d077d3e9f290a237 (patch) | |
tree | 8d63f1b622a7c93d8b845c3d77f796f5ad18493b /src/qml/jit/qv4assemblercommon_p.h | |
parent | 08342d761369c3755778f6d69fa6f5907ae1aead (diff) |
ES7: Implement Tail Position Calls in the runtime
Change-Id: If1629109722496b3fd10b36b2376548440f2fee9
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit/qv4assemblercommon_p.h')
-rw-r--r-- | src/qml/jit/qv4assemblercommon_p.h | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/src/qml/jit/qv4assemblercommon_p.h b/src/qml/jit/qv4assemblercommon_p.h index d64b9d0e5d..cbbd6464d9 100644 --- a/src/qml/jit/qv4assemblercommon_p.h +++ b/src/qml/jit/qv4assemblercommon_p.h @@ -116,14 +116,15 @@ public: move(Arg1Reg, EngineRegister); } - void generatePlatformFunctionExit() + void generatePlatformFunctionExit(bool tailCall = false) { pop(EngineRegister); pop(CppStackFrameRegister); pop(JSStackFrameRegister); pop(); // exceptionHandler pop(FramePointerRegister); - ret(); + if (!tailCall) + ret(); } void callAbsolute(const void *funcPtr) @@ -132,6 +133,12 @@ public: call(ScratchRegister); } + void jumpAbsolute(const void *funcPtr) + { + move(TrustedImmPtr(funcPtr), ScratchRegister); + jump(ScratchRegister); + } + void pushAligned(RegisterID reg) { subPtr(TrustedImm32(PointerSize), StackPointerRegister); @@ -195,14 +202,15 @@ public: move(Arg1Reg, EngineRegister); } - void generatePlatformFunctionExit() + void generatePlatformFunctionExit(bool tailCall = false) { pop(EngineRegister); pop(CppStackFrameRegister); pop(JSStackFrameRegister); pop(); // exceptionHandler pop(FramePointerRegister); - ret(); + if (!tailCall) + ret(); } void callAbsolute(const void *funcPtr) @@ -213,6 +221,12 @@ public: addPtr(TrustedImm32(4 * PointerSize), StackPointerRegister); } + void jumpAbsolute(const void *funcPtr) + { + move(TrustedImmPtr(funcPtr), ScratchRegister); + jump(ScratchRegister); + } + void pushAligned(RegisterID reg) { subPtr(TrustedImm32(PointerSize), StackPointerRegister); @@ -280,7 +294,7 @@ public: loadPtr(Address(FramePointerRegister, 3 * PointerSize), EngineRegister); } - void generatePlatformFunctionExit() + void generatePlatformFunctionExit(bool tailCall = false) { addPtr(TrustedImm32(8), StackPointerRegister); pop(EngineRegister); @@ -288,7 +302,8 @@ public: pop(JSStackFrameRegister); pop(); // exceptionHandler pop(RegisterID::ebp); - ret(); + if (!tailCall) + ret(); } void callAbsolute(const void *funcPtr) @@ -297,6 +312,12 @@ public: call(ScratchRegister); } + void jumpAbsolute(const void *funcPtr) + { + move(TrustedImmPtr(funcPtr), ScratchRegister); + jump(ScratchRegister); + } + void pushAligned(RegisterID reg) { subPtr(TrustedImm32(PointerSize), StackPointerRegister); @@ -375,13 +396,14 @@ public: move(Arg1Reg, EngineRegister); } - void generatePlatformFunctionExit() + void generatePlatformFunctionExit(bool tailCall = false) { move(AccumulatorRegister, ReturnValueRegister); popPair(EngineRegister, CppStackFrameRegister); popPair(JSStackFrameRegister, AccumulatorRegister); popPair(JSC::ARM64Registers::fp, JSC::ARM64Registers::lr); - ret(); + if (!tailCall) + ret(); } void callAbsolute(const void *funcPtr) @@ -390,6 +412,12 @@ public: call(ScratchRegister); } + void jumpAbsolute(const void *funcPtr) + { + move(TrustedImmPtr(funcPtr), ScratchRegister); + jump(ScratchRegister); + } + void pushAligned(RegisterID reg) { pushToSave(reg); @@ -462,7 +490,7 @@ public: move(Arg1Reg, EngineRegister); } - void generatePlatformFunctionExit() + void generatePlatformFunctionExit(bool tailCall = false) { move(AccumulatorRegisterValue, ReturnValueRegisterValue); move(AccumulatorRegisterTag, ReturnValueRegisterTag); @@ -476,7 +504,8 @@ public: pop(); // exceptionHandler pop(FramePointerRegister); pop(JSC::ARMRegisters::lr); - ret(); + if (!tailCall) + ret(); } void callAbsolute(const void *funcPtr) @@ -485,6 +514,12 @@ public: call(dataTempRegister); } + void jumpAbsolute(const void *funcPtr) + { + move(TrustedImmPtr(funcPtr), dataTempRegister); + jump(dataTempRegister); + } + void pushAligned(RegisterID reg) { subPtr(TrustedImm32(PointerSize), StackPointerRegister); @@ -663,11 +698,15 @@ public: void passInt32AsArg(int value, int arg); void callRuntime(const char *functionName, const void *funcPtr); void callRuntimeUnchecked(const char *functionName, const void *funcPtr); - + void tailCallRuntime(const char *functionName, const void *funcPtr); + void setTailCallArg(RegisterID src, int arg); + Address jsAlloca(int slotCount); + void storeInt32AsValue(int srcInt, Address destAddr); private: void passAccumulatorAsArg_internal(int arg, bool doPush); static Address argStackAddress(int arg); + static Address inArgStackAddress(int arg); private: const Value* constantTable; |