The System V ABI on x86-64 specifies that the al register contains an upper
bound of the number of arguments passed in vector registers when calling
variadic functions, so we aren't allowed to clobber it.
checkasm_fail_func() is a variadic function so also zero al before calling it.
%if WIN64
%assign free_regs 7
%if WIN64
%assign free_regs 7
%else
%assign free_regs 9
%else
%assign free_regs 9
%endif
;-----------------------------------------------------------------------------
%endif
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
INIT_XMM
cglobal checked_call, 2,15,16,max_args*8+8
;-----------------------------------------------------------------------------
INIT_XMM
cglobal checked_call, 2,15,16,max_args*8+8
; All arguments have been pushed on the stack instead of registers in order to
; test for incorrect assumptions that 32-bit ints are zero-extended to 64-bit.
; All arguments have been pushed on the stack instead of registers in order to
; test for incorrect assumptions that 32-bit ints are zero-extended to 64-bit.
mov r %+ i, [n %+ i]
%assign i i-1
%endrep
mov r %+ i, [n %+ i]
%assign i i-1
%endrep
%assign i 14
%rep 15-free_regs
xor r %+ i, [n %+ i]
%assign i 14
%rep 15-free_regs
xor r %+ i, [n %+ i]
mov r9, rax
mov r10, rdx
lea r0, [error_message]
mov r9, rax
mov r10, rdx
lea r0, [error_message]
call fail_func
mov rdx, r10
mov rax, r9
call fail_func
mov rdx, r10
mov rax, r9