static const Assembler::RegisterID calleeSavedRegisters[] = {
// Not used: JSC::X86Registers::rbx,
// Not used: JSC::X86Registers::r10,
+ JSC::X86Registers::r12, // LocalsRegister
// Not used: JSC::X86Registers::r13,
- JSC::X86Registers::r14
+ JSC::X86Registers::r14 // ContextRegister
// Not used: JSC::X86Registers::r15,
};
#endif
#if CPU(X86)
static const Assembler::RegisterID calleeSavedRegisters[] = {
// Not used: JSC::X86Registers::ebx,
- JSC::X86Registers::esi
- // Not used: JSC::X86Registers::edi,
+ JSC::X86Registers::esi, // ContextRegister
+ JSC::X86Registers::edi // LocalsRegister
};
#endif
};
#endif
-static const int calleeSavedRegisterCount = sizeof(calleeSavedRegisters) / sizeof(calleeSavedRegisters[0]);
+const int Assembler::calleeSavedRegisterCount = sizeof(calleeSavedRegisters) / sizeof(calleeSavedRegisters[0]);
/* End of platform/calling convention/architecture specific section */
} else {
assert(t->scope == 0);
const int arg = _function->maxNumberOfArguments + t->index - _function->locals.size() + 1;
- // StackFrameRegister points to its old value on the stack, so even for the first temp we need to
- // subtract at least sizeof(Value).
offset = - sizeof(Value) * (arg + 1);
- reg = StackFrameRegister;
+ offset -= sizeof(void*) * calleeSavedRegisterCount;
+ reg = LocalsRegister;
}
return Pointer(reg, offset);
}
subPtr(TrustedImm32(frameSize), StackPointerRegister);
for (int i = 0; i < calleeSavedRegisterCount; ++i)
- storePtr(calleeSavedRegisters[i], Address(StackPointerRegister, i * sizeof(void*)));
+ storePtr(calleeSavedRegisters[i], Address(StackFrameRegister, -(i + 1) * sizeof(void*)));
+
+ move(StackFrameRegister, LocalsRegister);
}
void Assembler::leaveStandardStackFrame(int locals)
{
// restore the callee saved registers
for (int i = calleeSavedRegisterCount - 1; i >= 0; --i)
- loadPtr(Address(StackPointerRegister, i * sizeof(void*)), calleeSavedRegisters[i]);
+ loadPtr(Address(StackFrameRegister, -(i + 1) * sizeof(void*)), calleeSavedRegisters[i]);
// space for the locals and the callee saved registers
int32_t frameSize = locals * sizeof(QQmlJS::VM::Value) + sizeof(void*) * calleeSavedRegisterCount;
static const RegisterID StackFrameRegister = JSC::X86Registers::ebp;
static const RegisterID StackPointerRegister = JSC::X86Registers::esp;
+ static const RegisterID LocalsRegister = JSC::X86Registers::edi;
static const RegisterID ContextRegister = JSC::X86Registers::esi;
static const RegisterID ReturnValueRegister = JSC::X86Registers::eax;
static const RegisterID ScratchRegister = JSC::X86Registers::ecx;
static const RegisterID StackFrameRegister = JSC::X86Registers::ebp;
static const RegisterID StackPointerRegister = JSC::X86Registers::esp;
+ static const RegisterID LocalsRegister = JSC::X86Registers::r12;
static const RegisterID ContextRegister = JSC::X86Registers::r14;
static const RegisterID ReturnValueRegister = JSC::X86Registers::eax;
static const RegisterID ScratchRegister = JSC::X86Registers::r10;
#else
#error Argh.
#endif
+ static const int calleeSavedRegisterCount;
// Explicit type to allow distinguishing between
// pushing an address itself or the value it points
Pointer argumentAddressForCall(int argument)
{
const int index = _function->maxNumberOfArguments - argument;
- return Pointer(Assembler::StackFrameRegister, sizeof(VM::Value) * (-index)
+ return Pointer(Assembler::LocalsRegister, sizeof(VM::Value) * (-index)
- sizeof(void*) // size of ebp
+ - sizeof(void*) * Assembler::calleeSavedRegisterCount
);
}
Pointer baseAddressForCallArguments()