diff options
Diffstat (limited to 'src/qml/jit/qv4assembler.cpp')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index e76d498409..130a673484 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -239,37 +239,50 @@ void Assembler::storeValue(QV4::Primitive value, IR::Expr *destination) storeValue(value, addr); } -void Assembler::enterStandardStackFrame(const RegisterInformation ®ularRegistersToSave) +void Assembler::enterStandardStackFrame(const RegisterInformation ®ularRegistersToSave, + const RegisterInformation &fpRegistersToSave) { platformEnterStandardStackFrame(this); - // ### FIXME: Handle through calleeSavedRegisters mechanism - // or eliminate StackFrameRegister altogether. push(StackFrameRegister); move(StackPointerRegister, StackFrameRegister); - int frameSize = _stackLayout->calculateStackFrameSize(); - + const int frameSize = _stackLayout->calculateStackFrameSize(); subPtr(TrustedImm32(frameSize), StackPointerRegister); - Address slotAddr(StackFrameRegister, -RegisterSize); + Address slotAddr(StackFrameRegister, 0); for (int i = 0, ei = regularRegistersToSave.size(); i < ei; ++i) { - storePtr(regularRegistersToSave.at(i).reg<RegisterID>(), slotAddr); + Q_ASSERT(regularRegistersToSave.at(i).isRegularRegister()); slotAddr.offset -= RegisterSize; + storePtr(regularRegistersToSave.at(i).reg<RegisterID>(), slotAddr); + } + for (int i = 0, ei = fpRegistersToSave.size(); i < ei; ++i) { + Q_ASSERT(fpRegistersToSave.at(i).isFloatingPoint()); + slotAddr.offset -= sizeof(double); + JSC::MacroAssembler::storeDouble(fpRegistersToSave.at(i).reg<FPRegisterID>(), slotAddr); } } -void Assembler::leaveStandardStackFrame(const RegisterInformation ®ularRegistersToSave) +void Assembler::leaveStandardStackFrame(const RegisterInformation ®ularRegistersToSave, + const RegisterInformation &fpRegistersToSave) { - Address slotAddr(StackFrameRegister, -regularRegistersToSave.size() * RegisterSize); + Address slotAddr(StackFrameRegister, -regularRegistersToSave.size() * RegisterSize - fpRegistersToSave.size() * sizeof(double)); // restore the callee saved registers + for (int i = fpRegistersToSave.size() - 1; i >= 0; --i) { + Q_ASSERT(fpRegistersToSave.at(i).isFloatingPoint()); + JSC::MacroAssembler::loadDouble(slotAddr, fpRegistersToSave.at(i).reg<FPRegisterID>()); + slotAddr.offset += sizeof(double); + } for (int i = regularRegistersToSave.size() - 1; i >= 0; --i) { + Q_ASSERT(regularRegistersToSave.at(i).isRegularRegister()); loadPtr(slotAddr, regularRegistersToSave.at(i).reg<RegisterID>()); slotAddr.offset += RegisterSize; } - int frameSize = _stackLayout->calculateStackFrameSize(); + Q_ASSERT(slotAddr.offset == 0); + + const int frameSize = _stackLayout->calculateStackFrameSize(); // Work around bug in ARMv7Assembler.h where add32(imm, sp, sp) doesn't // work well for large immediates. #if CPU(ARM_THUMB2) @@ -390,9 +403,9 @@ Assembler::Jump Assembler::branchInt32(bool invertCondition, IR::AluOp op, IR::E toInt32Register(right, Assembler::ReturnValueRegister)); } -void Assembler::setStackLayout(int maxArgCountForBuiltins, int regularRegistersToSave) +void Assembler::setStackLayout(int maxArgCountForBuiltins, int regularRegistersToSave, int fpRegistersToSave) { - _stackLayout.reset(new StackLayout(_function, maxArgCountForBuiltins, regularRegistersToSave)); + _stackLayout.reset(new StackLayout(_function, maxArgCountForBuiltins, regularRegistersToSave, fpRegistersToSave)); } #endif |