#ifndef jit_x64_SharedICHelpers_x64_inl_h
#define jit_x64_SharedICHelpers_x64_inl_h
#include "jit/SharedICHelpers.h"
#include "jit/MacroAssembler-inl.h"
namespace js {
namespace jit {
inline void EmitBaselineTailCallVM(TrampolinePtr target, MacroAssembler& masm,
uint32_t argSize) {
ScratchRegisterScope scratch(masm);
masm.movq(BaselineFrameReg, scratch);
masm.addq(Imm32(BaselineFrame::FramePointerOffset), scratch);
masm.subq(BaselineStackReg, scratch);
masm.movq(scratch, rdx);
masm.subq(Imm32(argSize), rdx);
masm.store32(rdx, Address(BaselineFrameReg,
BaselineFrame::reverseOffsetOfFrameSize()));
masm.makeFrameDescriptor(scratch, FrameType::BaselineJS,
ExitFrameLayout::Size());
masm.push(scratch);
masm.push(ICTailCallReg);
masm.jump(target);
}
inline void EmitBaselineCreateStubFrameDescriptor(MacroAssembler& masm,
Register reg,
uint32_t headerSize) {
masm.movq(BaselineFrameReg, reg);
masm.addq(Imm32(sizeof(void*) * 2), reg);
masm.subq(BaselineStackReg, reg);
masm.makeFrameDescriptor(reg, FrameType::BaselineStub, headerSize);
}
inline void EmitBaselineCallVM(TrampolinePtr target, MacroAssembler& masm) {
ScratchRegisterScope scratch(masm);
EmitBaselineCreateStubFrameDescriptor(masm, scratch, ExitFrameLayout::Size());
masm.push(scratch);
masm.call(target);
}
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);
inline void EmitBaselineEnterStubFrame(MacroAssembler& masm, Register) {
ScratchRegisterScope scratch(masm);
static_assert(
BaselineFrame::FramePointerOffset == sizeof(void*),
"FramePointerOffset must be the same as the return address size");
masm.movq(BaselineFrameReg, scratch);
masm.subq(BaselineStackReg, scratch);
masm.store32(scratch, Address(BaselineFrameReg,
BaselineFrame::reverseOffsetOfFrameSize()));
masm.Push(Operand(BaselineStackReg, 0));
masm.makeFrameDescriptor(scratch, FrameType::BaselineJS,
BaselineStubFrameLayout::Size());
masm.storePtr(scratch, Address(BaselineStackReg, sizeof(uintptr_t)));
masm.Push(ICStubReg);
masm.Push(BaselineFrameReg);
masm.mov(BaselineStackReg, BaselineFrameReg);
}
} }
#endif