From 8d4bc9aa62b0980be5b21b5a8e07569db57864f3 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 31 Jul 2026 13:34:20 +0300 Subject: [PATCH] x86_64 backend: fix handling large struct function arguments --- libs/jit/source/arch/linux_x86_64/compiler.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/jit/source/arch/linux_x86_64/compiler.cpp b/libs/jit/source/arch/linux_x86_64/compiler.cpp index 56f6c9e..4053a88 100644 --- a/libs/jit/source/arch/linux_x86_64/compiler.cpp +++ b/libs/jit/source/arch/linux_x86_64/compiler.cpp @@ -15,9 +15,9 @@ namespace pslang::jit::linux_x86_64 { template - 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) {