4
EXTRN ffi_closure_SYSV:NEAR
8
;;; ffi_closure_OUTER will be called with these registers set:
9
;;; rax points to 'closure'
10
;;; r11 contains a bit mask that specifies which of the
11
;;; first four parameters are float or double
13
;;; It must move the parameters passed in registers to their stack location,
14
;;; call ffi_closure_SYSV for the actual work, then return the result.
16
ffi_closure_OUTER PROC FRAME
17
;; save actual arguments to their stack space.
20
mov QWORD PTR [rsp+8], rcx
23
movlpd QWORD PTR [rsp+8], xmm0
28
mov QWORD PTR [rsp+16], rdx
31
movlpd QWORD PTR [rsp+16], xmm1
36
mov QWORD PTR [rsp+24], r8
39
movlpd QWORD PTR [rsp+24], xmm2
44
mov QWORD PTR [rsp+32], r9
47
movlpd QWORD PTR [rsp+32], xmm3
53
mov rcx, rax ; context is first parameter
54
mov rdx, rsp ; stack is second parameter
55
add rdx, 40 ; correct our own area
56
mov rax, ffi_closure_SYSV
57
call rax ; call the real closure function
58
;; Here, code is missing that handles float return values
60
movd xmm0, rax ; In case the closure returned a float.
62
ffi_closure_OUTER ENDP
75
ffi_call_AMD64 PROC FRAME
77
mov QWORD PTR [rsp+32], r9
78
mov QWORD PTR [rsp+24], r8
79
mov QWORD PTR [rsp+16], rdx
80
mov QWORD PTR [rsp+8], rcx
84
sub rsp, 48 ; 00000030H
86
lea rbp, QWORD PTR [rsp+32]
89
mov eax, DWORD PTR bytes$[rbp]
94
lea rax, QWORD PTR [rsp+32]
95
mov QWORD PTR stack$[rbp], rax
97
mov rdx, QWORD PTR ecif$[rbp]
98
mov rcx, QWORD PTR stack$[rbp]
99
call QWORD PTR prepfunc$[rbp]
101
mov rsp, QWORD PTR stack$[rbp]
103
movlpd xmm3, QWORD PTR [rsp+24]
106
movlpd xmm2, QWORD PTR [rsp+16]
109
movlpd xmm1, QWORD PTR [rsp+8]
112
movlpd xmm0, QWORD PTR [rsp]
115
call QWORD PTR fn$[rbp]
117
cmp DWORD PTR flags$[rbp], 1 ; FFI_TYPE_INT
120
mov rcx, QWORD PTR rvalue$[rbp]
121
mov DWORD PTR [rcx], eax
122
jmp SHORT ret_nothing$
125
cmp DWORD PTR flags$[rbp], 2 ; FFI_TYPE_FLOAT
126
jne SHORT ret_double$
128
mov rax, QWORD PTR rvalue$[rbp]
129
movlpd QWORD PTR [rax], xmm0
130
jmp SHORT ret_nothing$
133
cmp DWORD PTR flags$[rbp], 3 ; FFI_TYPE_DOUBLE
136
mov rax, QWORD PTR rvalue$[rbp]
137
movlpd QWORD PTR [rax], xmm0
138
jmp SHORT ret_nothing$
141
cmp DWORD PTR flags$[rbp], 12 ; FFI_TYPE_SINT64
144
mov rcx, QWORD PTR rvalue$[rbp]
145
mov QWORD PTR [rcx], rax
146
jmp SHORT ret_nothing$
151
lea rsp, QWORD PTR [rbp+16]