mirror of https://github.com/python/cpython
Add missing file for _ctypes.pyd port to win64 on AMD64.
This commit is contained in:
parent
98619f267c
commit
b1a7d758e2
|
@ -0,0 +1,156 @@
|
|||
PUBLIC ffi_call_AMD64
|
||||
|
||||
EXTRN __chkstk:NEAR
|
||||
EXTRN ffi_closure_SYSV:NEAR
|
||||
|
||||
_TEXT SEGMENT
|
||||
|
||||
;;; ffi_closure_OUTER will be called with these registers set:
|
||||
;;; rax points to 'closure'
|
||||
;;; r11 contains a bit mask that specifies which of the
|
||||
;;; first four parameters are float or double
|
||||
;;;
|
||||
;;; It must move the parameters passed in registers to their stack location,
|
||||
;;; call ffi_closure_SYSV for the actual work, then return the result.
|
||||
;;;
|
||||
ffi_closure_OUTER PROC FRAME
|
||||
;; save actual arguments to their stack space.
|
||||
test r11, 1
|
||||
jne first_is_float
|
||||
mov QWORD PTR [rsp+8], rcx
|
||||
jmp second
|
||||
first_is_float:
|
||||
movlpd QWORD PTR [rsp+8], xmm0
|
||||
|
||||
second:
|
||||
test r11, 2
|
||||
jne second_is_float
|
||||
mov QWORD PTR [rsp+16], rdx
|
||||
jmp third
|
||||
second_is_float:
|
||||
movlpd QWORD PTR [rsp+16], xmm1
|
||||
|
||||
third:
|
||||
test r11, 4
|
||||
jne third_is_float
|
||||
mov QWORD PTR [rsp+24], r8
|
||||
jmp forth
|
||||
third_is_float:
|
||||
movlpd QWORD PTR [rsp+24], xmm2
|
||||
|
||||
forth:
|
||||
test r11, 8
|
||||
jne forth_is_float
|
||||
mov QWORD PTR [rsp+32], r9
|
||||
jmp done
|
||||
forth_is_float:
|
||||
movlpd QWORD PTR [rsp+32], xmm3
|
||||
|
||||
done:
|
||||
.ALLOCSTACK 40
|
||||
sub rsp, 40
|
||||
.ENDPROLOG
|
||||
mov rcx, rax ; context is first parameter
|
||||
mov rdx, rsp ; stack is second parameter
|
||||
add rdx, 40 ; correct our own area
|
||||
mov rax, ffi_closure_SYSV
|
||||
call rax ; call the real closure function
|
||||
;; Here, code is missing that handles float return values
|
||||
add rsp, 40
|
||||
movd xmm0, rax ; In case the closure returned a float.
|
||||
ret 0
|
||||
ffi_closure_OUTER ENDP
|
||||
|
||||
|
||||
;;; ffi_call_AMD64
|
||||
|
||||
stack$ = 0
|
||||
prepfunc$ = 32
|
||||
ecif$ = 40
|
||||
bytes$ = 48
|
||||
flags$ = 56
|
||||
rvalue$ = 64
|
||||
fn$ = 72
|
||||
|
||||
ffi_call_AMD64 PROC FRAME
|
||||
|
||||
mov QWORD PTR [rsp+32], r9
|
||||
mov QWORD PTR [rsp+24], r8
|
||||
mov QWORD PTR [rsp+16], rdx
|
||||
mov QWORD PTR [rsp+8], rcx
|
||||
.PUSHREG rbp
|
||||
push rbp
|
||||
.ALLOCSTACK 48
|
||||
sub rsp, 48 ; 00000030H
|
||||
.SETFRAME rbp, 32
|
||||
lea rbp, QWORD PTR [rsp+32]
|
||||
.ENDPROLOG
|
||||
|
||||
mov eax, DWORD PTR bytes$[rbp]
|
||||
add rax, 15
|
||||
and rax, -16
|
||||
call __chkstk
|
||||
sub rsp, rax
|
||||
lea rax, QWORD PTR [rsp+32]
|
||||
mov QWORD PTR stack$[rbp], rax
|
||||
|
||||
mov rdx, QWORD PTR ecif$[rbp]
|
||||
mov rcx, QWORD PTR stack$[rbp]
|
||||
call QWORD PTR prepfunc$[rbp]
|
||||
|
||||
mov rsp, QWORD PTR stack$[rbp]
|
||||
|
||||
movlpd xmm3, QWORD PTR [rsp+24]
|
||||
movd r9, xmm3
|
||||
|
||||
movlpd xmm2, QWORD PTR [rsp+16]
|
||||
movd r8, xmm2
|
||||
|
||||
movlpd xmm1, QWORD PTR [rsp+8]
|
||||
movd rdx, xmm1
|
||||
|
||||
movlpd xmm0, QWORD PTR [rsp]
|
||||
movd rcx, xmm0
|
||||
|
||||
call QWORD PTR fn$[rbp]
|
||||
ret_int$:
|
||||
cmp DWORD PTR flags$[rbp], 1 ; FFI_TYPE_INT
|
||||
jne ret_float$
|
||||
|
||||
mov rcx, QWORD PTR rvalue$[rbp]
|
||||
mov DWORD PTR [rcx], eax
|
||||
jmp SHORT ret_nothing$
|
||||
|
||||
ret_float$:
|
||||
cmp DWORD PTR flags$[rbp], 2 ; FFI_TYPE_FLOAT
|
||||
jne SHORT ret_double$
|
||||
|
||||
mov rax, QWORD PTR rvalue$[rbp]
|
||||
movlpd QWORD PTR [rax], xmm0
|
||||
jmp SHORT ret_nothing$
|
||||
|
||||
ret_double$:
|
||||
cmp DWORD PTR flags$[rbp], 3 ; FFI_TYPE_DOUBLE
|
||||
jne SHORT ret_int64$
|
||||
|
||||
mov rax, QWORD PTR rvalue$[rbp]
|
||||
movlpd QWORD PTR [rax], xmm0
|
||||
jmp SHORT ret_nothing$
|
||||
|
||||
ret_int64$:
|
||||
cmp DWORD PTR flags$[rbp], 12 ; FFI_TYPE_SINT64
|
||||
jne ret_nothing$
|
||||
|
||||
mov rcx, QWORD PTR rvalue$[rbp]
|
||||
mov QWORD PTR [rcx], rax
|
||||
jmp SHORT ret_nothing$
|
||||
|
||||
ret_nothing$:
|
||||
xor eax, eax
|
||||
|
||||
lea rsp, QWORD PTR [rbp+16]
|
||||
pop rbp
|
||||
ret 0
|
||||
ffi_call_AMD64 ENDP
|
||||
_TEXT ENDS
|
||||
END
|
Loading…
Reference in New Issue