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