ffi 0.5.4-x86-mswin32 → 0.6.3-x86-mswin32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- data/History.txt +102 -0
- data/LICENSE +1 -27
- data/Rakefile +4 -12
- data/ext/ffi_c/AbstractMemory.c +6 -8
- data/ext/ffi_c/AbstractMemory.h +23 -21
- data/ext/ffi_c/AutoPointer.c +0 -1
- data/ext/ffi_c/Buffer.c +23 -8
- data/ext/ffi_c/Call.c +31 -3
- data/ext/ffi_c/Call.h +5 -1
- data/ext/ffi_c/DynamicLibrary.c +0 -1
- data/ext/ffi_c/Function.c +22 -4
- data/ext/ffi_c/MemoryPointer.c +2 -3
- data/ext/ffi_c/Pointer.c +23 -9
- data/ext/ffi_c/Struct.c +227 -79
- data/ext/ffi_c/Struct.h +16 -7
- data/ext/ffi_c/StructLayout.c +92 -55
- data/ext/ffi_c/Type.c +5 -22
- data/ext/ffi_c/Type.h +1 -1
- data/ext/ffi_c/Types.c +9 -3
- data/ext/ffi_c/Types.h +2 -0
- data/ext/ffi_c/extconf.rb +11 -7
- data/ext/ffi_c/libffi.gnu.mk +1 -1
- data/ext/ffi_c/libffi.mk +1 -1
- data/ext/ffi_c/libffi/ChangeLog +900 -84
- data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +14 -4
- data/ext/ffi_c/libffi/Makefile.in +362 -211
- data/ext/ffi_c/libffi/README +70 -92
- data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
- data/ext/ffi_c/libffi/config.guess +125 -143
- data/ext/ffi_c/libffi/config.sub +103 -27
- data/ext/ffi_c/libffi/configure +11340 -18473
- data/ext/ffi_c/libffi/configure.ac +43 -4
- data/ext/ffi_c/libffi/doc/libffi.info +15 -15
- data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
- data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
- data/ext/ffi_c/libffi/include/Makefile.am +1 -1
- data/ext/ffi_c/libffi/include/Makefile.in +97 -50
- data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
- data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
- data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
- data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
- data/ext/ffi_c/libffi/man/Makefile.in +115 -62
- data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
- data/ext/ffi_c/libffi/missing +15 -8
- data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
- data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
- data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
- data/ext/ffi_c/libffi/src/closures.c +47 -10
- data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
- data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
- data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
- data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
- data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
- data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
- data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
- data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
- data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
- data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
- data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
- data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
- data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
- data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
- data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
- data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
- data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
- data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
- data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
- data/ext/ffi_c/libffi/texinfo.tex +155 -427
- data/gen/Rakefile +4 -2
- data/lib/1.8/ffi_c.so +0 -0
- data/lib/1.9/ffi_c.so +0 -0
- data/lib/ffi/autopointer.rb +79 -20
- data/lib/ffi/callback.rb +4 -10
- data/lib/ffi/enum.rb +28 -0
- data/lib/ffi/ffi.rb +1 -0
- data/lib/ffi/io.rb +28 -0
- data/lib/ffi/library.rb +237 -182
- data/lib/ffi/memorypointer.rb +28 -62
- data/lib/ffi/platform.rb +27 -0
- data/lib/ffi/pointer.rb +28 -0
- data/lib/ffi/struct.rb +55 -1
- data/lib/ffi/types.rb +29 -0
- data/lib/ffi/variadic.rb +29 -0
- data/spec/ffi/library_spec.rb +31 -5
- data/spec/ffi/rbx/attach_function_spec.rb +2 -1
- data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
- data/spec/ffi/spec_helper.rb +5 -1
- data/spec/ffi/struct_spec.rb +82 -0
- data/tasks/ann.rake +80 -0
- data/tasks/extension.rake +25 -0
- data/tasks/gem.rake +200 -0
- data/tasks/git.rake +41 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +50 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +300 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- metadata +312 -279
- data/ext/ffi_c/libffi/TODO +0 -1
- data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
- data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
- data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
- data/ext/ffi_c/libffi/ltconfig +0 -2862
- data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -0,0 +1,460 @@
|
|
1
|
+
#define LIBFFI_ASM
|
2
|
+
#include <fficonfig.h>
|
3
|
+
#include <ffi.h>
|
4
|
+
|
5
|
+
/* Constants for ffi_call_win64 */
|
6
|
+
#define STACK 0
|
7
|
+
#define PREP_ARGS_FN 32
|
8
|
+
#define ECIF 40
|
9
|
+
#define CIF_BYTES 48
|
10
|
+
#define CIF_FLAGS 56
|
11
|
+
#define RVALUE 64
|
12
|
+
#define FN 72
|
13
|
+
|
14
|
+
/* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *),
|
15
|
+
extended_cif *ecif, unsigned bytes, unsigned flags,
|
16
|
+
unsigned *rvalue, void (*fn)());
|
17
|
+
*/
|
18
|
+
|
19
|
+
#ifdef _MSC_VER
|
20
|
+
PUBLIC ffi_call_win64
|
21
|
+
|
22
|
+
EXTRN __chkstk:NEAR
|
23
|
+
EXTRN ffi_closure_win64_inner:NEAR
|
24
|
+
|
25
|
+
_TEXT SEGMENT
|
26
|
+
|
27
|
+
;;; ffi_closure_win64 will be called with these registers set:
|
28
|
+
;;; rax points to 'closure'
|
29
|
+
;;; r11 contains a bit mask that specifies which of the
|
30
|
+
;;; first four parameters are float or double
|
31
|
+
;;;
|
32
|
+
;;; It must move the parameters passed in registers to their stack location,
|
33
|
+
;;; call ffi_closure_win64_inner for the actual work, then return the result.
|
34
|
+
;;;
|
35
|
+
ffi_closure_win64 PROC FRAME
|
36
|
+
;; copy register arguments onto stack
|
37
|
+
test r11, 1
|
38
|
+
jne first_is_float
|
39
|
+
mov QWORD PTR [rsp+8], rcx
|
40
|
+
jmp second
|
41
|
+
first_is_float:
|
42
|
+
movlpd QWORD PTR [rsp+8], xmm0
|
43
|
+
|
44
|
+
second:
|
45
|
+
test r11, 2
|
46
|
+
jne second_is_float
|
47
|
+
mov QWORD PTR [rsp+16], rdx
|
48
|
+
jmp third
|
49
|
+
second_is_float:
|
50
|
+
movlpd QWORD PTR [rsp+16], xmm1
|
51
|
+
|
52
|
+
third:
|
53
|
+
test r11, 4
|
54
|
+
jne third_is_float
|
55
|
+
mov QWORD PTR [rsp+24], r8
|
56
|
+
jmp fourth
|
57
|
+
third_is_float:
|
58
|
+
movlpd QWORD PTR [rsp+24], xmm2
|
59
|
+
|
60
|
+
fourth:
|
61
|
+
test r11, 8
|
62
|
+
jne fourth_is_float
|
63
|
+
mov QWORD PTR [rsp+32], r9
|
64
|
+
jmp done
|
65
|
+
fourth_is_float:
|
66
|
+
movlpd QWORD PTR [rsp+32], xmm3
|
67
|
+
|
68
|
+
done:
|
69
|
+
.ALLOCSTACK 40
|
70
|
+
sub rsp, 40
|
71
|
+
.ENDPROLOG
|
72
|
+
mov rcx, rax ; context is first parameter
|
73
|
+
mov rdx, rsp ; stack is second parameter
|
74
|
+
add rdx, 48 ; point to start of arguments
|
75
|
+
mov rax, ffi_closure_win64_inner
|
76
|
+
call rax ; call the real closure function
|
77
|
+
add rsp, 40
|
78
|
+
movd xmm0, rax ; If the closure returned a float,
|
79
|
+
; ffi_closure_win64_inner wrote it to rax
|
80
|
+
ret 0
|
81
|
+
ffi_closure_win64 ENDP
|
82
|
+
|
83
|
+
ffi_call_win64 PROC FRAME
|
84
|
+
;; copy registers onto stack
|
85
|
+
mov QWORD PTR [rsp+32], r9
|
86
|
+
mov QWORD PTR [rsp+24], r8
|
87
|
+
mov QWORD PTR [rsp+16], rdx
|
88
|
+
mov QWORD PTR [rsp+8], rcx
|
89
|
+
.PUSHREG rbp
|
90
|
+
push rbp
|
91
|
+
.ALLOCSTACK 48
|
92
|
+
sub rsp, 48 ; 00000030H
|
93
|
+
.SETFRAME rbp, 32
|
94
|
+
lea rbp, QWORD PTR [rsp+32]
|
95
|
+
.ENDPROLOG
|
96
|
+
|
97
|
+
mov eax, DWORD PTR CIF_BYTES[rbp]
|
98
|
+
add rax, 15
|
99
|
+
and rax, -16
|
100
|
+
call __chkstk
|
101
|
+
sub rsp, rax
|
102
|
+
lea rax, QWORD PTR [rsp+32]
|
103
|
+
mov QWORD PTR STACK[rbp], rax
|
104
|
+
|
105
|
+
mov rdx, QWORD PTR ECIF[rbp]
|
106
|
+
mov rcx, QWORD PTR STACK[rbp]
|
107
|
+
call QWORD PTR PREP_ARGS_FN[rbp]
|
108
|
+
|
109
|
+
mov rsp, QWORD PTR STACK[rbp]
|
110
|
+
|
111
|
+
movlpd xmm3, QWORD PTR [rsp+24]
|
112
|
+
movd r9, xmm3
|
113
|
+
|
114
|
+
movlpd xmm2, QWORD PTR [rsp+16]
|
115
|
+
movd r8, xmm2
|
116
|
+
|
117
|
+
movlpd xmm1, QWORD PTR [rsp+8]
|
118
|
+
movd rdx, xmm1
|
119
|
+
|
120
|
+
movlpd xmm0, QWORD PTR [rsp]
|
121
|
+
movd rcx, xmm0
|
122
|
+
|
123
|
+
call QWORD PTR FN[rbp]
|
124
|
+
ret_struct4b$:
|
125
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B
|
126
|
+
jne ret_struct2b$
|
127
|
+
|
128
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
129
|
+
mov DWORD PTR [rcx], eax
|
130
|
+
jmp ret_void$
|
131
|
+
|
132
|
+
ret_struct2b$:
|
133
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B
|
134
|
+
jne ret_struct1b$
|
135
|
+
|
136
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
137
|
+
mov WORD PTR [rcx], ax
|
138
|
+
jmp ret_void$
|
139
|
+
|
140
|
+
ret_struct1b$:
|
141
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B
|
142
|
+
jne ret_uint8$
|
143
|
+
|
144
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
145
|
+
mov BYTE PTR [rcx], al
|
146
|
+
jmp ret_void$
|
147
|
+
|
148
|
+
ret_uint8$:
|
149
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8
|
150
|
+
jne ret_sint8$
|
151
|
+
|
152
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
153
|
+
movzx rax, al
|
154
|
+
mov QWORD PTR [rcx], rax
|
155
|
+
jmp ret_void$
|
156
|
+
|
157
|
+
ret_sint8$:
|
158
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8
|
159
|
+
jne ret_uint16$
|
160
|
+
|
161
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
162
|
+
movsx rax, al
|
163
|
+
mov QWORD PTR [rcx], rax
|
164
|
+
jmp ret_void$
|
165
|
+
|
166
|
+
ret_uint16$:
|
167
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16
|
168
|
+
jne ret_sint16$
|
169
|
+
|
170
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
171
|
+
movzx rax, ax
|
172
|
+
mov QWORD PTR [rcx], rax
|
173
|
+
jmp SHORT ret_void$
|
174
|
+
|
175
|
+
ret_sint16$:
|
176
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16
|
177
|
+
jne ret_uint32$
|
178
|
+
|
179
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
180
|
+
movsx rax, ax
|
181
|
+
mov QWORD PTR [rcx], rax
|
182
|
+
jmp SHORT ret_void$
|
183
|
+
|
184
|
+
ret_uint32$:
|
185
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32
|
186
|
+
jne ret_sint32$
|
187
|
+
|
188
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
189
|
+
mov eax, eax
|
190
|
+
mov QWORD PTR [rcx], rax
|
191
|
+
jmp SHORT ret_void$
|
192
|
+
|
193
|
+
ret_sint32$:
|
194
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32
|
195
|
+
jne ret_float$
|
196
|
+
|
197
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
198
|
+
cdqe
|
199
|
+
mov QWORD PTR [rcx], rax
|
200
|
+
jmp SHORT ret_void$
|
201
|
+
|
202
|
+
ret_float$:
|
203
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT
|
204
|
+
jne SHORT ret_double$
|
205
|
+
|
206
|
+
mov rax, QWORD PTR RVALUE[rbp]
|
207
|
+
movss DWORD PTR [rax], xmm0
|
208
|
+
jmp SHORT ret_void$
|
209
|
+
|
210
|
+
ret_double$:
|
211
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE
|
212
|
+
jne SHORT ret_sint64$
|
213
|
+
|
214
|
+
mov rax, QWORD PTR RVALUE[rbp]
|
215
|
+
movlpd QWORD PTR [rax], xmm0
|
216
|
+
jmp SHORT ret_void$
|
217
|
+
|
218
|
+
ret_sint64$:
|
219
|
+
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64
|
220
|
+
jne ret_void$
|
221
|
+
|
222
|
+
mov rcx, QWORD PTR RVALUE[rbp]
|
223
|
+
mov QWORD PTR [rcx], rax
|
224
|
+
jmp SHORT ret_void$
|
225
|
+
|
226
|
+
ret_void$:
|
227
|
+
xor rax, rax
|
228
|
+
|
229
|
+
lea rsp, QWORD PTR [rbp+16]
|
230
|
+
pop rbp
|
231
|
+
ret 0
|
232
|
+
ffi_call_win64 ENDP
|
233
|
+
_TEXT ENDS
|
234
|
+
END
|
235
|
+
#else
|
236
|
+
.text
|
237
|
+
|
238
|
+
.extern _ffi_closure_win64_inner
|
239
|
+
|
240
|
+
# ffi_closure_win64 will be called with these registers set:
|
241
|
+
# rax points to 'closure'
|
242
|
+
# r11 contains a bit mask that specifies which of the
|
243
|
+
# first four parameters are float or double
|
244
|
+
#
|
245
|
+
# It must move the parameters passed in registers to their stack location,
|
246
|
+
# call ffi_closure_win64_inner for the actual work, then return the result.
|
247
|
+
#
|
248
|
+
.balign 16
|
249
|
+
.globl _ffi_closure_win64
|
250
|
+
_ffi_closure_win64:
|
251
|
+
# copy register arguments onto stack
|
252
|
+
test $1,%r11
|
253
|
+
jne .Lfirst_is_float
|
254
|
+
mov %rcx, 8(%rsp)
|
255
|
+
jmp .Lsecond
|
256
|
+
.Lfirst_is_float:
|
257
|
+
movlpd %xmm0, 8(%rsp)
|
258
|
+
|
259
|
+
.Lsecond:
|
260
|
+
test $2, %r11
|
261
|
+
jne .Lsecond_is_float
|
262
|
+
mov %rdx, 16(%rsp)
|
263
|
+
jmp .Lthird
|
264
|
+
.Lsecond_is_float:
|
265
|
+
movlpd %xmm1, 16(%rsp)
|
266
|
+
|
267
|
+
.Lthird:
|
268
|
+
test $4, %r11
|
269
|
+
jne .Lthird_is_float
|
270
|
+
mov %r8,24(%rsp)
|
271
|
+
jmp .Lfourth
|
272
|
+
.Lthird_is_float:
|
273
|
+
movlpd %xmm2, 24(%rsp)
|
274
|
+
|
275
|
+
.Lfourth:
|
276
|
+
test $8, %r11
|
277
|
+
jne .Lfourth_is_float
|
278
|
+
mov %r9, 32(%rsp)
|
279
|
+
jmp .Ldone
|
280
|
+
.Lfourth_is_float:
|
281
|
+
movlpd %xmm3, 32(%rsp)
|
282
|
+
|
283
|
+
.Ldone:
|
284
|
+
#.ALLOCSTACK 40
|
285
|
+
sub $40, %rsp
|
286
|
+
#.ENDPROLOG
|
287
|
+
mov %rax, %rcx # context is first parameter
|
288
|
+
mov %rsp, %rdx # stack is second parameter
|
289
|
+
add $48, %rdx # point to start of arguments
|
290
|
+
mov $_ffi_closure_win64_inner, %rax
|
291
|
+
callq *%rax # call the real closure function
|
292
|
+
add $40, %rsp
|
293
|
+
movq %rax, %xmm0 # If the closure returned a float,
|
294
|
+
# ffi_closure_win64_inner wrote it to rax
|
295
|
+
retq
|
296
|
+
.ffi_closure_win64_end:
|
297
|
+
|
298
|
+
.balign 16
|
299
|
+
.globl _ffi_call_win64
|
300
|
+
_ffi_call_win64:
|
301
|
+
# copy registers onto stack
|
302
|
+
mov %r9,32(%rsp)
|
303
|
+
mov %r8,24(%rsp)
|
304
|
+
mov %rdx,16(%rsp)
|
305
|
+
mov %rcx,8(%rsp)
|
306
|
+
#.PUSHREG rbp
|
307
|
+
push %rbp
|
308
|
+
#.ALLOCSTACK 48
|
309
|
+
sub $48,%rsp
|
310
|
+
#.SETFRAME rbp, 32
|
311
|
+
lea 32(%rsp),%rbp
|
312
|
+
#.ENDPROLOG
|
313
|
+
|
314
|
+
mov CIF_BYTES(%rbp),%eax
|
315
|
+
add $15, %rax
|
316
|
+
and $-16, %rax
|
317
|
+
cmpq $0x1000, %rax
|
318
|
+
jb Lch_done
|
319
|
+
Lch_probe:
|
320
|
+
subq $0x1000,%rsp
|
321
|
+
orl $0x0, (%rsp)
|
322
|
+
subq $0x1000,%rax
|
323
|
+
cmpq $0x1000,%rax
|
324
|
+
ja Lch_probe
|
325
|
+
Lch_done:
|
326
|
+
subq %rax, %rsp
|
327
|
+
orl $0x0, (%rsp)
|
328
|
+
lea 32(%rsp), %rax
|
329
|
+
mov %rax, STACK(%rbp)
|
330
|
+
|
331
|
+
mov ECIF(%rbp), %rdx
|
332
|
+
mov STACK(%rbp), %rcx
|
333
|
+
callq *PREP_ARGS_FN(%rbp)
|
334
|
+
|
335
|
+
mov STACK(%rbp), %rsp
|
336
|
+
|
337
|
+
movlpd 24(%rsp), %xmm3
|
338
|
+
movd %xmm3, %r9
|
339
|
+
|
340
|
+
movlpd 16(%rsp), %xmm2
|
341
|
+
movd %xmm2, %r8
|
342
|
+
|
343
|
+
movlpd 8(%rsp), %xmm1
|
344
|
+
movd %xmm1, %rdx
|
345
|
+
|
346
|
+
movlpd (%rsp), %xmm0
|
347
|
+
movd %xmm0, %rcx
|
348
|
+
|
349
|
+
callq *FN(%rbp)
|
350
|
+
.Lret_struct4b:
|
351
|
+
cmpl $FFI_TYPE_SMALL_STRUCT_4B, CIF_FLAGS(%rbp)
|
352
|
+
jne .Lret_struct2b
|
353
|
+
|
354
|
+
mov RVALUE(%rbp), %rcx
|
355
|
+
mov %eax, (%rcx)
|
356
|
+
jmp .Lret_void
|
357
|
+
|
358
|
+
.Lret_struct2b:
|
359
|
+
cmpl $FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp)
|
360
|
+
jne .Lret_struct1b
|
361
|
+
|
362
|
+
mov RVALUE(%rbp), %rcx
|
363
|
+
mov %ax, (%rcx)
|
364
|
+
jmp .Lret_void
|
365
|
+
|
366
|
+
.Lret_struct1b:
|
367
|
+
cmpl $FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp)
|
368
|
+
jne .Lret_uint8
|
369
|
+
|
370
|
+
mov RVALUE(%rbp), %rcx
|
371
|
+
mov %al, (%rcx)
|
372
|
+
jmp .Lret_void
|
373
|
+
|
374
|
+
.Lret_uint8:
|
375
|
+
cmpl $FFI_TYPE_UINT8, CIF_FLAGS(%rbp)
|
376
|
+
jne .Lret_sint8
|
377
|
+
|
378
|
+
mov RVALUE(%rbp), %rcx
|
379
|
+
movzbq %al, %rax
|
380
|
+
movq %rax, (%rcx)
|
381
|
+
jmp .Lret_void
|
382
|
+
|
383
|
+
.Lret_sint8:
|
384
|
+
cmpl $FFI_TYPE_SINT8, CIF_FLAGS(%rbp)
|
385
|
+
jne .Lret_uint16
|
386
|
+
|
387
|
+
mov RVALUE(%rbp), %rcx
|
388
|
+
movsbq %al, %rax
|
389
|
+
movq %rax, (%rcx)
|
390
|
+
jmp .Lret_void
|
391
|
+
|
392
|
+
.Lret_uint16:
|
393
|
+
cmpl $FFI_TYPE_UINT16, CIF_FLAGS(%rbp)
|
394
|
+
jne .Lret_sint16
|
395
|
+
|
396
|
+
mov RVALUE(%rbp), %rcx
|
397
|
+
movzwq %ax, %rax
|
398
|
+
movq %rax, (%rcx)
|
399
|
+
jmp .Lret_void
|
400
|
+
|
401
|
+
.Lret_sint16:
|
402
|
+
cmpl $FFI_TYPE_SINT16, CIF_FLAGS(%rbp)
|
403
|
+
jne .Lret_uint32
|
404
|
+
|
405
|
+
mov RVALUE(%rbp), %rcx
|
406
|
+
movswq %ax, %rax
|
407
|
+
movq %rax, (%rcx)
|
408
|
+
jmp .Lret_void
|
409
|
+
|
410
|
+
.Lret_uint32:
|
411
|
+
cmpl $FFI_TYPE_UINT32, CIF_FLAGS(%rbp)
|
412
|
+
jne .Lret_sint32
|
413
|
+
|
414
|
+
mov RVALUE(%rbp), %rcx
|
415
|
+
movl %eax, %eax
|
416
|
+
movq %rax, (%rcx)
|
417
|
+
jmp .Lret_void
|
418
|
+
|
419
|
+
.Lret_sint32:
|
420
|
+
cmpl $FFI_TYPE_SINT32, CIF_FLAGS(%rbp)
|
421
|
+
jne .Lret_float
|
422
|
+
|
423
|
+
mov RVALUE(%rbp), %rcx
|
424
|
+
cltq
|
425
|
+
movq %rax, (%rcx)
|
426
|
+
jmp .Lret_void
|
427
|
+
|
428
|
+
.Lret_float:
|
429
|
+
cmpl $FFI_TYPE_FLOAT, CIF_FLAGS(%rbp)
|
430
|
+
jne .Lret_double
|
431
|
+
|
432
|
+
mov RVALUE(%rbp), %rax
|
433
|
+
movss %xmm0, (%rax)
|
434
|
+
jmp .Lret_void
|
435
|
+
|
436
|
+
.Lret_double:
|
437
|
+
cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp)
|
438
|
+
jne .Lret_sint64
|
439
|
+
|
440
|
+
mov RVALUE(%rbp), %rax
|
441
|
+
movlpd %xmm0, (%rax)
|
442
|
+
jmp .Lret_void
|
443
|
+
|
444
|
+
.Lret_sint64:
|
445
|
+
cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp)
|
446
|
+
jne .Lret_void
|
447
|
+
|
448
|
+
mov RVALUE(%rbp), %rcx
|
449
|
+
mov %rax, (%rcx)
|
450
|
+
jmp .Lret_void
|
451
|
+
|
452
|
+
.Lret_void:
|
453
|
+
xor %rax, %rax
|
454
|
+
|
455
|
+
lea 16(%rbp), %rsp
|
456
|
+
pop %rbp
|
457
|
+
retq
|
458
|
+
.ffi_call_win64_end:
|
459
|
+
#endif /* !_MSC_VER */
|
460
|
+
|