summaryrefslogtreecommitdiff
path: root/tests/checkasm
diff options
context:
space:
mode:
authorHenrik Gramner <henrik@gramner.com>2015-09-23 16:06:02 +0200
committerHenrik Gramner <henrik@gramner.com>2015-09-27 20:21:26 +0200
commit7ca1de5b4f1a369a997c5cf9924b0197606f558d (patch)
tree21d9d24b3669c4ddba76494d70a726c5b990c305 /tests/checkasm
parent6e61231d641b23d9d298b31e9241371f5e7abddb (diff)
checkasm/x86: Correctly handle variadic functions
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.
Diffstat (limited to 'tests/checkasm')
-rw-r--r--tests/checkasm/x86/checkasm.asm7
1 files changed, 5 insertions, 2 deletions
diff --git a/tests/checkasm/x86/checkasm.asm b/tests/checkasm/x86/checkasm.asm
index 5f3def9e57..20012f8ecb 100644
--- a/tests/checkasm/x86/checkasm.asm
+++ b/tests/checkasm/x86/checkasm.asm
@@ -77,8 +77,10 @@ cglobal stack_clobber, 1,2
%if WIN64
%assign free_regs 7
+ DECLARE_REG_TMP 4
%else
%assign free_regs 9
+ DECLARE_REG_TMP 7
%endif
;-----------------------------------------------------------------------------
@@ -86,7 +88,7 @@ cglobal stack_clobber, 1,2
;-----------------------------------------------------------------------------
INIT_XMM
cglobal checked_call, 2,15,16,max_args*8+8
- mov r6, r0
+ mov t0, r0
; 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.
@@ -129,7 +131,7 @@ cglobal checked_call, 2,15,16,max_args*8+8
mov r %+ i, [n %+ i]
%assign i i-1
%endrep
- call r6
+ call t0
%assign i 14
%rep 15-free_regs
xor r %+ i, [n %+ i]
@@ -156,6 +158,7 @@ cglobal checked_call, 2,15,16,max_args*8+8
mov r9, rax
mov r10, rdx
lea r0, [error_message]
+ xor eax, eax
call fail_func
mov rdx, r10
mov rax, r9