diff --git a/lib/dynasm-backend/src/codegen_x64.rs b/lib/dynasm-backend/src/codegen_x64.rs index bbd3d4f3a..ae0664c31 100644 --- a/lib/dynasm-backend/src/codegen_x64.rs +++ b/lib/dynasm-backend/src/codegen_x64.rs @@ -876,13 +876,13 @@ impl X64FunctionCode { if is_dword(size) { dynasm!( assembler - ; mov eax, [rsp + (total_size + 16 + caller_stack_offset) as i32] + ; mov eax, [rsp + (total_size + 16 + saved_regs.len() * 8 + caller_stack_offset) as i32] ; mov [rsp + offset as i32], eax ); } else { dynasm!( assembler - ; mov rax, [rsp + (total_size + 16 + caller_stack_offset) as i32] + ; mov rax, [rsp + (total_size + 16 + saved_regs.len() * 8 + caller_stack_offset) as i32] ; mov [rsp + offset as i32], rax ); } @@ -910,6 +910,14 @@ impl X64FunctionCode { ; jmp =>target ; after_call: ); + + for reg in saved_regs.iter().rev() { + dynasm!( + assembler + ; pop Rq(*reg as u8) + ); + } + if caller_stack_offset != 0 { dynasm!( assembler @@ -929,13 +937,6 @@ impl X64FunctionCode { } } - for reg in saved_regs.iter().rev() { - dynasm!( - assembler - ; pop Rq(*reg as u8) - ); - } - Ok(()) } }