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 1af72d91de
commit 8d4bc9aa62

View file

@ -15,9 +15,9 @@ namespace pslang::jit::linux_x86_64
{
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))))
return reg(i);
@ -994,7 +994,7 @@ namespace pslang::jit::linux_x86_64
reg_src = *src.base;
else
{
reg_src = find_free_reg(dst.base);
reg_src = find_free_reg(reg::r10, dst.base);
builder.lea_rip_prev(0, reg_src);
}
@ -1003,13 +1003,13 @@ namespace pslang::jit::linux_x86_64
reg_dst = *dst.base;
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);
}
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)
{