x86_64 backend: fix handling large struct function arguments
This commit is contained in:
parent
d504a90555
commit
866af8d21c
1 changed files with 5 additions and 5 deletions
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue