ffi 0.5.4 → 0.6.0

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.

Files changed (203) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +2 -11
  3. data/ext/ffi_c/AbstractMemory.c +6 -8
  4. data/ext/ffi_c/AbstractMemory.h +23 -21
  5. data/ext/ffi_c/AutoPointer.c +0 -1
  6. data/ext/ffi_c/Buffer.c +23 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +5 -1
  9. data/ext/ffi_c/DynamicLibrary.c +0 -1
  10. data/ext/ffi_c/Function.c +19 -2
  11. data/ext/ffi_c/MemoryPointer.c +2 -3
  12. data/ext/ffi_c/Pointer.c +23 -9
  13. data/ext/ffi_c/Struct.c +142 -69
  14. data/ext/ffi_c/Struct.h +16 -7
  15. data/ext/ffi_c/StructLayout.c +92 -55
  16. data/ext/ffi_c/Type.c +5 -22
  17. data/ext/ffi_c/Type.h +1 -1
  18. data/ext/ffi_c/Types.c +8 -2
  19. data/ext/ffi_c/Types.h +2 -0
  20. data/ext/ffi_c/extconf.rb +11 -7
  21. data/ext/ffi_c/libffi/ChangeLog +900 -84
  22. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  23. data/ext/ffi_c/libffi/LICENSE +1 -1
  24. data/ext/ffi_c/libffi/Makefile.am +14 -4
  25. data/ext/ffi_c/libffi/Makefile.in +362 -211
  26. data/ext/ffi_c/libffi/README +70 -92
  27. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  28. data/ext/ffi_c/libffi/config.guess +125 -143
  29. data/ext/ffi_c/libffi/config.sub +103 -27
  30. data/ext/ffi_c/libffi/configure +11364 -18497
  31. data/ext/ffi_c/libffi/configure.ac +43 -4
  32. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  33. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  34. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  35. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  36. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  37. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  38. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  39. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  40. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  41. data/ext/ffi_c/libffi/libtool-version +1 -1
  42. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  43. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  44. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  45. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  46. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  47. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  48. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  49. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  50. data/ext/ffi_c/libffi/missing +15 -8
  51. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  52. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  53. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  54. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  55. data/ext/ffi_c/libffi/src/closures.c +47 -10
  56. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  57. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  58. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  59. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  60. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  61. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  62. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  63. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  64. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  65. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  66. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  67. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  68. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  69. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  70. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  71. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  72. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  73. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  74. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  75. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  76. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  77. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  78. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  79. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  80. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  81. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  82. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  83. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  84. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  85. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  86. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  87. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  88. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  89. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  179. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  180. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  181. data/lib/ffi/autopointer.rb +79 -20
  182. data/lib/ffi/callback.rb +4 -10
  183. data/lib/ffi/enum.rb +28 -0
  184. data/lib/ffi/io.rb +28 -0
  185. data/lib/ffi/library.rb +237 -182
  186. data/lib/ffi/memorypointer.rb +28 -62
  187. data/lib/ffi/platform.rb +27 -0
  188. data/lib/ffi/pointer.rb +28 -0
  189. data/lib/ffi/struct.rb +55 -1
  190. data/lib/ffi/types.rb +29 -0
  191. data/lib/ffi/variadic.rb +29 -0
  192. data/spec/ffi/library_spec.rb +31 -5
  193. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  194. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  195. data/spec/ffi/spec_helper.rb +5 -1
  196. data/spec/ffi/struct_spec.rb +64 -0
  197. metadata +28 -8
  198. data/ext/ffi_c/libffi/TODO +0 -1
  199. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  200. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  201. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  202. data/ext/ffi_c/libffi/ltconfig +0 -2862
  203. 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
+