aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2016-01-14 15:25:21 +0100
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>2016-01-15 11:19:04 +0000
commit6b4710669a2fbeb2c5a3f703e7597cfd1e80c709 (patch)
treeaa64d00e843b87a8924a483f66ca7871f575f220
parenta29c62165949977943d9e2e40ba7531aced4762f (diff)
JIT: move FP save/restore to platform pro-/epilogue.
This is in preparation for Aarch64, which saves/restores it as part of the fp+lr pair. Change-Id: Ia924017948aa2b257bd6bb61e488454e3944abeb Reviewed-by: Julien Brianceau <jbriance@cisco.com> Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
-rw-r--r--src/qml/jit/qv4assembler.cpp2
-rw-r--r--src/qml/jit/qv4targetplatform_p.h40
2 files changed, 30 insertions, 12 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp
index 929726f4b7..09bfb01247 100644
--- a/src/qml/jit/qv4assembler.cpp
+++ b/src/qml/jit/qv4assembler.cpp
@@ -234,7 +234,6 @@ void Assembler::enterStandardStackFrame(const RegisterInformation &regularRegist
{
platformEnterStandardStackFrame(this);
- push(StackFrameRegister);
move(StackPointerRegister, StackFrameRegister);
const int frameSize = _stackLayout->calculateStackFrameSize();
@@ -282,7 +281,6 @@ void Assembler::leaveStandardStackFrame(const RegisterInformation &regularRegist
addPtr(TrustedImm32(frameSize), StackPointerRegister);
#endif
- pop(StackFrameRegister);
platformLeaveStandardStackFrame(this);
}
diff --git a/src/qml/jit/qv4targetplatform_p.h b/src/qml/jit/qv4targetplatform_p.h
index 1e62b23fe4..3c93aa12b0 100644
--- a/src/qml/jit/qv4targetplatform_p.h
+++ b/src/qml/jit/qv4targetplatform_p.h
@@ -116,8 +116,8 @@ public:
static const int StackAlignment = 16;
static const int StackShadowSpace = 0;
static const int StackSpaceAllocatedUponFunctionEntry = RegisterSize; // Return address is pushed onto stack by the CPU.
- static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { Q_UNUSED(as); }
- static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { Q_UNUSED(as); }
+ static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { as->push(StackFrameRegister); }
+ static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { as->pop(StackFrameRegister); }
#if OS(WINDOWS) || OS(QNX) || \
((OS(LINUX) || OS(FREEBSD)) && (defined(__PIC__) || defined(__PIE__)))
@@ -203,8 +203,8 @@ public:
static const int StackAlignment = 16;
static const int StackShadowSpace = 0;
static const int StackSpaceAllocatedUponFunctionEntry = RegisterSize; // Return address is pushed onto stack by the CPU.
- static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { Q_UNUSED(as); }
- static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { Q_UNUSED(as); }
+ static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { as->push(StackFrameRegister); }
+ static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { as->pop(StackFrameRegister); }
#endif // Linux/MacOS on x86_64
#if CPU(X86_64) && OS(WINDOWS)
@@ -260,8 +260,8 @@ public:
static const int StackAlignment = 16;
static const int StackShadowSpace = 32;
static const int StackSpaceAllocatedUponFunctionEntry = RegisterSize; // Return address is pushed onto stack by the CPU.
- static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { Q_UNUSED(as); }
- static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { Q_UNUSED(as); }
+ static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { as->push(StackFrameRegister); }
+ static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { as->pop(StackFrameRegister); }
#endif // Windows on x86_64
#if CPU(ARM)
@@ -353,8 +353,18 @@ public:
static const int StackAlignment = 8; // Per AAPCS
static const int StackShadowSpace = 0;
static const int StackSpaceAllocatedUponFunctionEntry = 1 * RegisterSize; // Registers saved in platformEnterStandardStackFrame below.
- static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { as->push(JSC::ARMRegisters::lr); }
- static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { as->pop(JSC::ARMRegisters::lr); }
+
+ static void platformEnterStandardStackFrame(JSC::MacroAssembler *as)
+ {
+ as->push(JSC::ARMRegisters::lr);
+ as->push(StackFrameRegister);
+ }
+
+ static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as)
+ {
+ as->pop(StackFrameRegister);
+ as->pop(JSC::ARMRegisters::lr);
+ }
#endif // Linux on ARM (32 bit)
#if defined(Q_PROCESSOR_MIPS_32) && defined(Q_OS_LINUX)
@@ -418,8 +428,18 @@ public:
static const int StackAlignment = 8;
static const int StackShadowSpace = 4 * RegisterSize; // Stack space for 4 argument registers.
static const int StackSpaceAllocatedUponFunctionEntry = 1 * RegisterSize; // Registers saved in platformEnterStandardStackFrame below.
- static void platformEnterStandardStackFrame(JSC::MacroAssembler *as) { as->push(JSC::MIPSRegisters::ra); }
- static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as) { as->pop(JSC::MIPSRegisters::ra); }
+
+ static void platformEnterStandardStackFrame(JSC::MacroAssembler *as)
+ {
+ as->push(JSC::MIPSRegisters::ra);
+ as->push(StackFrameRegister);
+ }
+
+ static void platformLeaveStandardStackFrame(JSC::MacroAssembler *as)
+ {
+ as->pop(StackFrameRegister);
+ as->pop(JSC::MIPSRegisters::ra);
+ }
#endif // Linux on MIPS (32 bit)
public: // utility functions