aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2014-12-17 21:07:05 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-12-19 16:30:16 +0100
commit45f77a6bfc05b97e6312a379c63840243b5815f3 (patch)
treec581f59d704c4af1a69a36f7c3bb404d36fc6e90 /src/qml/jit
parentb50278bda4df94550bfbe5663ddebcd4b0f9734f (diff)
Cleanup code that modifies the JS stack
Change-Id: Ic043e256c3df984bb06c9a16b86573b0173b19a1 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jit')
-rw-r--r--src/qml/jit/qv4isel_masm.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp
index e7771f53d2..3894cea0a1 100644
--- a/src/qml/jit/qv4isel_masm.cpp
+++ b/src/qml/jit/qv4isel_masm.cpp
@@ -245,9 +245,30 @@ void InstructionSelection::run(int functionIndex)
#endif
const int locals = _as->stackLayout().calculateJSStackFrameSize();
- _as->loadPtr(Address(Assembler::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop)), Assembler::LocalsRegister);
- _as->addPtr(Assembler::TrustedImm32(sizeof(QV4::Value)*locals), Assembler::LocalsRegister);
- _as->storePtr(Assembler::LocalsRegister, Address(Assembler::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop)));
+ if (locals > 0) {
+ _as->loadPtr(Address(Assembler::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop)), Assembler::LocalsRegister);
+#ifdef VALUE_FITS_IN_REGISTER
+ _as->move(Assembler::TrustedImm64(0), Assembler::ReturnValueRegister);
+ _as->move(Assembler::TrustedImm32(locals), Assembler::ScratchRegister);
+ Assembler::Label loop = _as->label();
+ _as->store64(Assembler::ReturnValueRegister, Assembler::Address(Assembler::LocalsRegister));
+ _as->add64(Assembler::TrustedImm32(8), Assembler::LocalsRegister);
+ Assembler::Jump jump = _as->branchSub32(Assembler::NonZero, Assembler::TrustedImm32(1), Assembler::ScratchRegister);
+ jump.linkTo(loop, _as);
+#else
+ _as->move(Assembler::TrustedImm32(0), Assembler::ReturnValueRegister);
+ _as->move(Assembler::TrustedImm32(locals), Assembler::ScratchRegister);
+ Assembler::Label loop = _as->label();
+ _as->store32(Assembler::ReturnValueRegister, Assembler::Address(Assembler::LocalsRegister));
+ _as->add32(Assembler::TrustedImm32(4), Assembler::LocalsRegister);
+ _as->store32(Assembler::ReturnValueRegister, Assembler::Address(Assembler::LocalsRegister));
+ _as->add32(Assembler::TrustedImm32(4), Assembler::LocalsRegister);
+ Assembler::Jump jump = _as->branchSub32(Assembler::NonZero, Assembler::TrustedImm32(1), Assembler::ScratchRegister);
+ jump.linkTo(loop, _as);
+#endif
+ _as->storePtr(Assembler::LocalsRegister, Address(Assembler::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop)));
+ }
+
int lastLine = 0;
for (int i = 0, ei = _function->basicBlockCount(); i != ei; ++i) {