.CODE
; void Call_x64_real(FARPROC ApiFunction, size_t *int_registers, double *float_registers, stackitem *stack, size_t nstack, size_t *iret, double *dret)
Call_x64_real PROC FRAME
; store register parameters
mov qword ptr[rsp+32], r9 ; stack
mov qword ptr[rsp+24], r8 ; float_registers
mov qword ptr[rsp+16], rdx ; int_registers
mov qword ptr[rsp+8], rcx ; ApiFunction
;old code, I couldn't get SAVEREG to work, maybe someone else can
;so instead the push was added, and all the ebp offsets +8'ed
; mov qword ptr[rsp-16], rbp
push rbp
.PUSHREG rbp
mov rbp, rsp
.SETFRAME rbp, 0
.ENDPROLOG
sub rsp, 32
; Load up integer registers first...
mov rax, qword ptr [rbp+24]
mov rcx, qword ptr [rax]
mov rdx, qword ptr [rax+8]
mov r8, qword ptr [rax+16]
mov r9, qword ptr [rax+24]
; Now floating-point registers
mov rax, qword ptr [rbp+32]
movsd xmm0, qword ptr [rax]
movsd xmm1, qword ptr [rax+8]
movsd xmm2, qword ptr [rax+16]
movsd xmm3, qword ptr [rax+24]
; Now the stack
mov r11, qword ptr [rbp+40]
mov rax, qword ptr [rbp+48]
; Except not if there isn't any
test rax, rax
jz docall
copystack:
sub rax, 1
mov r10, qword ptr [r11+8*rax]
push r10
test rax, rax
jnz copystack
docall:
; And call
sub rsp, 32
mov r10, qword ptr [rbp+16]
call r10
; Store return value
mov r10, qword ptr [rbp+56]
mov qword ptr [r10], rax
mov r10, qword ptr [rbp+64]
movsd qword ptr [r10], xmm0
; Cleanup
mov rsp, rbp
;old code, see note above
; mov rbp, qword ptr [rsp-16]
pop rbp
ret
Call_x64_real ENDP
END