Browse Source

checkasm: x86: properly save rdx/edx in checked_call()

If the return value doesn't fit in a single register rdx/edx can in some
cases be used in addition to rax/eax.

Doesn't affect any of the existing checkasm tests but might be useful later.

Also comment the relevant code a bit better.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
tags/n2.8
Henrik Gramner Anton Khirnov 10 years ago
parent
commit
e13da244f4
1 changed files with 7 additions and 0 deletions
  1. +7
    -0
      tests/checkasm/x86/checkasm.asm

+ 7
- 0
tests/checkasm/x86/checkasm.asm View File

@@ -145,10 +145,15 @@ cglobal checked_call, 2,15,16,max_args*8+8
or r14, r5
%endif

; Call fail_func() with a descriptive message to mark it as a failure
; if the called function didn't preserve all callee-saved registers.
; Save the return value located in rdx:rax first to prevent clobbering.
jz .ok
mov r9, rax
mov r10, rdx
lea r0, [error_message]
call fail_func
mov rdx, r10
mov rax, r9
.ok:
RET
@@ -182,9 +187,11 @@ cglobal checked_call, 1,7
or r3, r5
jz .ok
mov r3, eax
mov r4, edx
lea r0, [error_message]
mov [esp], r0
call fail_func
mov edx, r4
mov eax, r3
.ok:
add esp, max_args*4


Loading…
Cancel
Save