diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2014-12-17 21:07:05 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-12-19 16:30:16 +0100 |
commit | 45f77a6bfc05b97e6312a379c63840243b5815f3 (patch) | |
tree | c581f59d704c4af1a69a36f7c3bb404d36fc6e90 /src/qml/jit | |
parent | b50278bda4df94550bfbe5663ddebcd4b0f9734f (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.cpp | 27 |
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) { |