|
|
@ -11,7 +11,7 @@ |
|
|
|
|
|
|
|
|
namespace Common::X64 { |
|
|
namespace Common::X64 { |
|
|
|
|
|
|
|
|
int RegToIndex(const Xbyak::Reg& reg) { |
|
|
|
|
|
|
|
|
inline int RegToIndex(const Xbyak::Reg& reg) { |
|
|
using Kind = Xbyak::Reg::Kind; |
|
|
using Kind = Xbyak::Reg::Kind; |
|
|
ASSERT_MSG((reg.getKind() & (Kind::REG | Kind::XMM)) != 0, |
|
|
ASSERT_MSG((reg.getKind() & (Kind::REG | Kind::XMM)) != 0, |
|
|
"RegSet only support GPRs and XMM registers."); |
|
|
"RegSet only support GPRs and XMM registers."); |
|
|
@ -151,8 +151,8 @@ constexpr size_t ABI_SHADOW_SPACE = 0; |
|
|
|
|
|
|
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
void ABI_CalculateFrameSize(BitSet32 regs, size_t rsp_alignment, size_t needed_frame_size, |
|
|
|
|
|
s32* out_subtraction, s32* out_xmm_offset) { |
|
|
|
|
|
|
|
|
inline void ABI_CalculateFrameSize(BitSet32 regs, size_t rsp_alignment, size_t needed_frame_size, |
|
|
|
|
|
s32* out_subtraction, s32* out_xmm_offset) { |
|
|
int count = (regs & ABI_ALL_GPRS).Count(); |
|
|
int count = (regs & ABI_ALL_GPRS).Count(); |
|
|
rsp_alignment -= count * 8; |
|
|
rsp_alignment -= count * 8; |
|
|
size_t subtraction = 0; |
|
|
size_t subtraction = 0; |
|
|
@ -173,8 +173,8 @@ void ABI_CalculateFrameSize(BitSet32 regs, size_t rsp_alignment, size_t needed_f |
|
|
*out_xmm_offset = (s32)(subtraction - xmm_base_subtraction); |
|
|
*out_xmm_offset = (s32)(subtraction - xmm_base_subtraction); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, BitSet32 regs, |
|
|
|
|
|
size_t rsp_alignment, size_t needed_frame_size = 0) { |
|
|
|
|
|
|
|
|
inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, BitSet32 regs, |
|
|
|
|
|
size_t rsp_alignment, size_t needed_frame_size = 0) { |
|
|
s32 subtraction, xmm_offset; |
|
|
s32 subtraction, xmm_offset; |
|
|
ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size, &subtraction, &xmm_offset); |
|
|
ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size, &subtraction, &xmm_offset); |
|
|
|
|
|
|
|
|
@ -194,8 +194,8 @@ size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, BitSet32 regs |
|
|
return ABI_SHADOW_SPACE; |
|
|
return ABI_SHADOW_SPACE; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, BitSet32 regs, size_t rsp_alignment, |
|
|
|
|
|
size_t needed_frame_size = 0) { |
|
|
|
|
|
|
|
|
inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, BitSet32 regs, |
|
|
|
|
|
size_t rsp_alignment, size_t needed_frame_size = 0) { |
|
|
s32 subtraction, xmm_offset; |
|
|
s32 subtraction, xmm_offset; |
|
|
ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size, &subtraction, &xmm_offset); |
|
|
ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size, &subtraction, &xmm_offset); |
|
|
|
|
|
|
|
|
|