x86_64 backend: fix handling large struct function arguments

This commit is contained in:
Nikita Lisitsa 2026-07-31 13:34:20 +03:00
parent d504a90555
commit 866af8d21c

View file

@ -15,9 +15,9 @@ namespace pslang::jit::linux_x86_64
{ {
template <typename ... Regs> template <typename ... Regs>
reg find_free_reg(Regs ... regs) reg find_free_reg(reg start, Regs ... regs)
{ {
for (int i = 0; i < 16; ++i) for (int i = (int)start; i < 16; ++i)
{ {
if ((true && ... && (regs != reg(i)))) if ((true && ... && (regs != reg(i))))
return reg(i); return reg(i);
@ -994,7 +994,7 @@ namespace pslang::jit::linux_x86_64
reg_src = *src.base; reg_src = *src.base;
else else
{ {
reg_src = find_free_reg(dst.base); reg_src = find_free_reg(reg::r10, dst.base);
builder.lea_rip_prev(0, reg_src); builder.lea_rip_prev(0, reg_src);
} }
@ -1003,13 +1003,13 @@ namespace pslang::jit::linux_x86_64
reg_dst = *dst.base; reg_dst = *dst.base;
else else
{ {
reg_dst = find_free_reg(reg_src); reg_dst = find_free_reg(reg::r10, reg_src);
builder.lea_rip_prev(storage_size_at_start - (std::int32_t)pcontext.storage.size(), reg_dst); builder.lea_rip_prev(storage_size_at_start - (std::int32_t)pcontext.storage.size(), reg_dst);
} }
std::int32_t offset = 0; std::int32_t offset = 0;
auto copy_reg = find_free_reg(reg_src, reg_dst); auto copy_reg = find_free_reg(reg::r10, reg_src, reg_dst);
while (size > 0) while (size > 0)
{ {