aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit/qv4assemblercommon_p.h
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2018-09-04 12:19:10 +0200
committerErik Verbruggen <erik.verbruggen@qt.io>2018-10-05 11:18:16 +0000
commit052d22e116957a170e290a49d077d3e9f290a237 (patch)
tree8d63f1b622a7c93d8b845c3d77f796f5ad18493b /src/qml/jit/qv4assemblercommon_p.h
parent08342d761369c3755778f6d69fa6f5907ae1aead (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.h61
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;