diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-08-12 09:40:11 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-08-14 15:27:51 +0200 |
commit | d9f33ccdef985badc56fd8940373748626beffc7 (patch) | |
tree | ccacfa93345abba1d274dfb0bae178e855efb613 /src/qml/jit/qv4assembler_p.h | |
parent | 17743ea6e22535bd5c6c01436c40084f0c4053bc (diff) |
V4 JIT: parameterize the prologue and epilogue generation
... with the regular (non-FP) registers that need to be saved. This
patch shouldn't change any of the JIT generated code, because all
regular callee saved registers are passed in.
Change-Id: Id11b8f37f06d80e8015ac6f0d0ccefdfa3342cbe
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jit/qv4assembler_p.h')
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 5e868c3b11..7d774f93f7 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -135,9 +135,10 @@ struct ExceptionCheck<void (*)(QV4::NoThrowContext *, A, B, C)> { class Assembler : public JSC::MacroAssembler, public TargetPlatform { + Q_DISABLE_COPY(Assembler) + public: - Assembler(InstructionSelection *isel, IR::Function* function, QV4::ExecutableAllocator *executableAllocator, - int maxArgCountForBuiltins); + Assembler(InstructionSelection *isel, IR::Function* function, QV4::ExecutableAllocator *executableAllocator); // Explicit type to allow distinguishing between // pushing an address itself or the value it points @@ -181,8 +182,8 @@ public: class StackLayout { public: - StackLayout(IR::Function *function, int maxArgCountForBuiltins) - : calleeSavedRegCount(Assembler::calleeSavedRegisterCount() + 1) + StackLayout(IR::Function *function, int maxArgCountForBuiltins, int normalRegistersToSave) + : normalRegistersToSave(normalRegistersToSave) , maxOutgoingArgumentCount(function->maxNumberOfArguments) , localCount(function->tempCount) , savedRegCount(maxArgCountForBuiltins) @@ -215,7 +216,7 @@ public: + RegisterSize; // saved StackFrameRegister // space for the callee saved registers - int frameSize = RegisterSize * calleeSavedRegisterCount(); + int frameSize = RegisterSize * normalRegistersToSave; frameSize += savedRegCount * sizeof(QV4::Value); // these get written out as Values, not as native registers Q_ASSERT(frameSize + stackSpaceAllocatedOtherwise < INT_MAX); @@ -268,11 +269,11 @@ public: int calleeSavedRegisterSpace() const { // plus 1 for the old FP - return RegisterSize * (calleeSavedRegCount + 1); + return RegisterSize * (normalRegistersToSave + 1); } private: - int calleeSavedRegCount; + int normalRegistersToSave; /// arg count for calls to JS functions int maxOutgoingArgumentCount; @@ -384,7 +385,7 @@ public: { Q_ASSERT(t->kind == IR::Temp::StackSlot); - return Pointer(_stackLayout.stackSlotPointer(t->index)); + return Pointer(_stackLayout->stackSlotPointer(t->index)); } template <int argumentNumber> @@ -394,7 +395,7 @@ public: return; if (IR::Temp *t = arg.value->asTemp()) { if (t->kind == IR::Temp::PhysicalRegister) { - Pointer addr(_stackLayout.savedRegPointer(argumentNumber)); + Pointer addr(_stackLayout->savedRegPointer(argumentNumber)); switch (t->type) { case IR::BoolType: storeBool((RegisterID) t->index, addr); @@ -793,8 +794,8 @@ public: void storeValue(QV4::Primitive value, IR::Expr* temp); - void enterStandardStackFrame(); - void leaveStandardStackFrame(); + void enterStandardStackFrame(const RegisterInformation ®ularRegistersToSave); + void leaveStandardStackFrame(const RegisterInformation ®ularRegistersToSave); void checkException() { loadPtr(Address(ContextRegister, qOffsetOf(QV4::ExecutionContext::Data, engine)), ScratchRegister); @@ -941,7 +942,7 @@ public: Pointer toAddress(RegisterID tmpReg, IR::Expr *e, int offset) { if (IR::Const *c = e->asConst()) { - Address addr = _stackLayout.savedRegPointer(offset); + Address addr = _stackLayout->savedRegPointer(offset); Address tagAddr = addr; tagAddr.offset += 4; @@ -953,7 +954,7 @@ public: if (IR::Temp *t = e->asTemp()) if (t->kind == IR::Temp::PhysicalRegister) - return Pointer(_stackLayout.savedRegPointer(offset)); + return Pointer(_stackLayout->savedRegPointer(offset)); return loadAddress(tmpReg, e); } @@ -1145,14 +1146,15 @@ public: JSC::MacroAssemblerCodeRef link(int *codeSize); - const StackLayout stackLayout() const { return _stackLayout; } + void setStackLayout(int maxArgCountForBuiltins, int regularRegistersToSave); + const StackLayout &stackLayout() const { return *_stackLayout.data(); } ConstantTable &constantTable() { return _constTable; } Label exceptionReturnLabel; IR::BasicBlock * catchBlock; QVector<Jump> exceptionPropagationJumps; private: - const StackLayout _stackLayout; + QScopedPointer<const StackLayout> _stackLayout; ConstantTable _constTable; IR::Function *_function; QHash<IR::BasicBlock *, Label> _addrs; |