xbyak_abi: Prefer returning a struct to using out parameters in ABI_CalculateFrameSize

This commit is contained in:
MerryMage 2020-06-15 19:04:29 +01:00
parent 36362e9695
commit 7c6203dc5e

View File

@ -151,9 +151,13 @@ constexpr size_t ABI_SHADOW_SPACE = 0;
#endif #endif
inline void ABI_CalculateFrameSize(std::bitset<32> regs, size_t rsp_alignment, struct ABIFrameInfo {
size_t needed_frame_size, s32* out_subtraction, s32 subtraction;
s32* out_xmm_offset) { s32 xmm_offset;
};
inline ABIFrameInfo ABI_CalculateFrameSize(std::bitset<32> regs, size_t rsp_alignment,
size_t needed_frame_size) {
const auto count = (regs & ABI_ALL_GPRS).count(); const auto count = (regs & ABI_ALL_GPRS).count();
rsp_alignment -= count * 8; rsp_alignment -= count * 8;
size_t subtraction = 0; size_t subtraction = 0;
@ -170,14 +174,13 @@ inline void ABI_CalculateFrameSize(std::bitset<32> regs, size_t rsp_alignment,
rsp_alignment -= subtraction; rsp_alignment -= subtraction;
subtraction += rsp_alignment & 0xF; subtraction += rsp_alignment & 0xF;
*out_subtraction = (s32)subtraction; return ABIFrameInfo{static_cast<s32>(subtraction),
*out_xmm_offset = (s32)(subtraction - xmm_base_subtraction); static_cast<s32>(subtraction - xmm_base_subtraction)};
} }
inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bitset<32> regs, inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bitset<32> regs,
size_t rsp_alignment, size_t needed_frame_size = 0) { size_t rsp_alignment, size_t needed_frame_size = 0) {
s32 subtraction, xmm_offset; auto frame_info = ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size);
ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size, &subtraction, &xmm_offset);
for (std::size_t i = 0; i < regs.size(); ++i) { for (std::size_t i = 0; i < regs.size(); ++i) {
if (regs[i] && ABI_ALL_GPRS[i]) { if (regs[i] && ABI_ALL_GPRS[i]) {
@ -185,14 +188,14 @@ inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::b
} }
} }
if (subtraction != 0) { if (frame_info.subtraction != 0) {
code.sub(code.rsp, subtraction); code.sub(code.rsp, frame_info.subtraction);
} }
for (std::size_t i = 0; i < regs.size(); ++i) { for (std::size_t i = 0; i < regs.size(); ++i) {
if (regs[i] && ABI_ALL_XMMS[i]) { if (regs[i] && ABI_ALL_XMMS[i]) {
code.movaps(code.xword[code.rsp + xmm_offset], IndexToXmm(i)); code.movaps(code.xword[code.rsp + frame_info.xmm_offset], IndexToXmm(i));
xmm_offset += 0x10; frame_info.xmm_offset += 0x10;
} }
} }
@ -201,18 +204,17 @@ inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::b
inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bitset<32> regs, inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bitset<32> regs,
size_t rsp_alignment, size_t needed_frame_size = 0) { size_t rsp_alignment, size_t needed_frame_size = 0) {
s32 subtraction, xmm_offset; auto frame_info = ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size);
ABI_CalculateFrameSize(regs, rsp_alignment, needed_frame_size, &subtraction, &xmm_offset);
for (std::size_t i = 0; i < regs.size(); ++i) { for (std::size_t i = 0; i < regs.size(); ++i) {
if (regs[i] && ABI_ALL_XMMS[i]) { if (regs[i] && ABI_ALL_XMMS[i]) {
code.movaps(IndexToXmm(i), code.xword[code.rsp + xmm_offset]); code.movaps(IndexToXmm(i), code.xword[code.rsp + frame_info.xmm_offset]);
xmm_offset += 0x10; frame_info.xmm_offset += 0x10;
} }
} }
if (subtraction != 0) { if (frame_info.subtraction != 0) {
code.add(code.rsp, subtraction); code.add(code.rsp, frame_info.subtraction);
} }
// GPRs need to be popped in reverse order // GPRs need to be popped in reverse order