rbdc 0.8.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (215) hide show
  1. checksums.yaml +7 -0
  2. data/{bindings → dyncall-bindings}/ruby/rbdc/extconf.rb +1 -1
  3. data/{bindings → dyncall-bindings}/ruby/rbdc/rbdc.c +3 -1
  4. data/dyncall/AUTHORS +2 -0
  5. data/dyncall/BUGS +1 -0
  6. data/dyncall/CMakeLists.txt +10 -2
  7. data/dyncall/ChangeLog +46 -11
  8. data/dyncall/LICENSE +4 -1
  9. data/dyncall/Makefile.embedded +7 -3
  10. data/dyncall/README +23 -14
  11. data/dyncall/ToDo +27 -28
  12. data/dyncall/autovar/autovar_ABI.h +3 -2
  13. data/dyncall/autovar/autovar_ARCH.h +13 -10
  14. data/dyncall/autovar/autovar_CC.h +3 -2
  15. data/dyncall/autovar/autovar_OS.h +3 -2
  16. data/dyncall/autovar/autovar_OSFAMILY.h +3 -2
  17. data/dyncall/buildsys/scripts/batch-build-linux.sh +6 -2
  18. data/dyncall/buildsys/scripts/batch-build-minix.sh +2 -0
  19. data/dyncall/buildsys/scripts/batch-build-psp.sh +4 -1
  20. data/dyncall/buildsys/scripts/elf-to-psp-eboot.sh +19 -0
  21. data/dyncall/buildsys/scripts/setenv-cross-ios.sh +0 -0
  22. data/dyncall/buildsys/scripts/setenv-sdk-ios.sh +0 -0
  23. data/dyncall/configure +83 -30
  24. data/dyncall/dyncall/dyncall.3 +16 -4
  25. data/dyncall/dyncall/dyncall.h +9 -1
  26. data/dyncall/dyncall/dyncall_alloc.h +2 -1
  27. data/dyncall/dyncall/dyncall_api.c +2 -1
  28. data/dyncall/dyncall/dyncall_call.S +9 -2
  29. data/dyncall/dyncall/dyncall_call_arm32_arm.S +2 -1
  30. data/dyncall/dyncall/dyncall_call_arm32_arm.h +8 -2
  31. data/dyncall/dyncall/dyncall_call_arm32_arm_armhf.S +11 -19
  32. data/dyncall/dyncall/dyncall_call_arm32_arm_armhf.h +15 -2
  33. data/dyncall/dyncall/dyncall_call_arm32_thumb.h +8 -6
  34. data/dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S +10 -18
  35. data/dyncall/dyncall/dyncall_call_arm32_thumb_gas.s +0 -16
  36. data/dyncall/dyncall/dyncall_call_arm64.S +226 -0
  37. data/dyncall/dyncall/dyncall_call_arm64.h +45 -0
  38. data/dyncall/dyncall/dyncall_call_mips.h +2 -1
  39. data/dyncall/dyncall/dyncall_call_mips_eabi.h +2 -1
  40. data/dyncall/dyncall/dyncall_call_mips_gas.S +2 -1
  41. data/dyncall/dyncall/dyncall_call_mips_n32.h +2 -1
  42. data/dyncall/dyncall/dyncall_call_mips_n64.h +2 -1
  43. data/dyncall/dyncall/dyncall_call_mips_o32.h +2 -1
  44. data/dyncall/dyncall/dyncall_call_ppc32.S +27 -2
  45. data/dyncall/dyncall/dyncall_call_ppc32.h +2 -2
  46. data/dyncall/dyncall/dyncall_call_ppc64.S +210 -0
  47. data/dyncall/dyncall/dyncall_call_ppc64.h +55 -0
  48. data/dyncall/dyncall/dyncall_call_sparc.S +2 -1
  49. data/dyncall/dyncall/dyncall_call_sparc.h +2 -1
  50. data/dyncall/dyncall/dyncall_call_sparc64.S +2 -1
  51. data/dyncall/dyncall/dyncall_call_sparc64.h +2 -1
  52. data/dyncall/dyncall/dyncall_call_sparc_v9.S +25 -23
  53. data/dyncall/dyncall/dyncall_call_sparc_v9.h +2 -1
  54. data/dyncall/dyncall/dyncall_call_x64-att.S +2 -1
  55. data/dyncall/dyncall/dyncall_call_x64.S +2 -1
  56. data/dyncall/dyncall/dyncall_call_x64.h +2 -1
  57. data/dyncall/dyncall/dyncall_call_x86.S +2 -1
  58. data/dyncall/dyncall/dyncall_call_x86.h +2 -1
  59. data/dyncall/dyncall/dyncall_callf.c +56 -66
  60. data/dyncall/dyncall/dyncall_callf.h +5 -1
  61. data/dyncall/dyncall/dyncall_callvm.c +11 -2
  62. data/dyncall/dyncall/dyncall_callvm.h +2 -1
  63. data/dyncall/dyncall/dyncall_callvm_arm32_arm.c +2 -1
  64. data/dyncall/dyncall/dyncall_callvm_arm32_arm.h +2 -1
  65. data/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c +60 -30
  66. data/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.h +3 -2
  67. data/dyncall/dyncall/dyncall_callvm_arm32_thumb.c +2 -24
  68. data/dyncall/dyncall/dyncall_callvm_arm32_thumb.h +2 -1
  69. data/dyncall/dyncall/dyncall_callvm_arm64.c +165 -0
  70. data/dyncall/dyncall/dyncall_callvm_arm64.h +51 -0
  71. data/dyncall/dyncall/dyncall_callvm_arm64_apple.c +272 -0
  72. data/dyncall/dyncall/dyncall_callvm_base.c +2 -1
  73. data/dyncall/dyncall/dyncall_callvm_mips.c +2 -1
  74. data/dyncall/dyncall/dyncall_callvm_mips.h +2 -1
  75. data/dyncall/dyncall/dyncall_callvm_mips_eabi.c +2 -1
  76. data/dyncall/dyncall/dyncall_callvm_mips_eabi.h +2 -1
  77. data/dyncall/dyncall/dyncall_callvm_mips_n32.c +2 -1
  78. data/dyncall/dyncall/dyncall_callvm_mips_n64.c +2 -1
  79. data/dyncall/dyncall/dyncall_callvm_mips_n64.h +2 -1
  80. data/dyncall/dyncall/dyncall_callvm_mips_o32.c +2 -1
  81. data/dyncall/dyncall/dyncall_callvm_mips_o32.h +2 -1
  82. data/dyncall/dyncall/dyncall_callvm_ppc32.c +45 -2
  83. data/dyncall/dyncall/dyncall_callvm_ppc32.h +2 -1
  84. data/dyncall/dyncall/dyncall_callvm_ppc64.c +351 -0
  85. data/dyncall/dyncall/dyncall_callvm_ppc64.h +60 -0
  86. data/dyncall/dyncall/dyncall_callvm_sparc.c +2 -1
  87. data/dyncall/dyncall/dyncall_callvm_sparc.h +2 -1
  88. data/dyncall/dyncall/dyncall_callvm_sparc64.c +2 -2
  89. data/dyncall/dyncall/dyncall_callvm_sparc64.h +2 -1
  90. data/dyncall/dyncall/dyncall_callvm_sparc_v9.c +3 -3
  91. data/dyncall/dyncall/dyncall_callvm_sparc_v9.h +2 -1
  92. data/dyncall/dyncall/dyncall_callvm_x64.c +2 -1
  93. data/dyncall/dyncall/dyncall_callvm_x64.h +2 -1
  94. data/dyncall/dyncall/dyncall_callvm_x86.c +2 -1
  95. data/dyncall/dyncall/dyncall_callvm_x86.h +2 -1
  96. data/dyncall/dyncall/dyncall_config.h +2 -1
  97. data/dyncall/dyncall/dyncall_macros.h +46 -9
  98. data/dyncall/dyncall/dyncall_signature.h +2 -1
  99. data/dyncall/dyncall/dyncall_struct.c +2 -1
  100. data/dyncall/dyncall/dyncall_struct.h +2 -1
  101. data/dyncall/dyncall/dyncall_types.h +2 -1
  102. data/dyncall/dyncall/dyncall_utils.h +2 -1
  103. data/dyncall/dyncall/dyncall_value.h +19 -1
  104. data/dyncall/dyncall/dyncall_vector.c +2 -1
  105. data/dyncall/dyncall/dyncall_vector.h +3 -1
  106. data/dyncall/dyncall/gen-masm.sh +0 -0
  107. data/dyncall/dyncallback/Makefile.generic +1 -1
  108. data/dyncall/dyncallback/dyncall_alloc_wx.c +2 -1
  109. data/dyncall/dyncallback/dyncall_alloc_wx.h +2 -1
  110. data/dyncall/dyncallback/dyncall_alloc_wx_malloc.c +2 -1
  111. data/dyncall/dyncallback/dyncall_alloc_wx_mmap.c +2 -1
  112. data/dyncall/dyncallback/dyncall_alloc_wx_win32.c +2 -1
  113. data/dyncall/dyncallback/dyncall_args.c +22 -10
  114. data/dyncall/dyncallback/dyncall_args.h +2 -1
  115. data/dyncall/dyncallback/dyncall_args_arm32_arm.c +35 -4
  116. data/dyncall/dyncallback/dyncall_args_arm32_arm.h +7 -1
  117. data/dyncall/dyncallback/dyncall_args_arm32_thumb.c +2 -1
  118. data/dyncall/dyncallback/dyncall_args_arm32_thumb.h +2 -1
  119. data/dyncall/dyncallback/dyncall_args_arm64.c +77 -0
  120. data/dyncall/dyncallback/dyncall_args_arm64_apple.c +160 -0
  121. data/dyncall/dyncallback/dyncall_args_mips.c +3 -2
  122. data/dyncall/dyncallback/dyncall_args_mips.h +3 -2
  123. data/dyncall/dyncallback/dyncall_args_ppc32.c +2 -1
  124. data/dyncall/dyncallback/dyncall_args_ppc32.h +9 -7
  125. data/dyncall/dyncallback/dyncall_args_ppc32_sysv.c +95 -0
  126. data/dyncall/dyncallback/dyncall_args_ppc64.c +71 -0
  127. data/dyncall/dyncallback/dyncall_args_ppc64.h +40 -0
  128. data/dyncall/dyncallback/dyncall_args_sparc32.c +2 -1
  129. data/dyncall/dyncallback/dyncall_args_sparc32.h +2 -1
  130. data/dyncall/dyncallback/dyncall_args_sparc64.c +2 -1
  131. data/dyncall/dyncallback/dyncall_args_sparc64.h +2 -1
  132. data/dyncall/dyncallback/dyncall_args_x64.c +2 -1
  133. data/dyncall/dyncallback/dyncall_args_x64.h +2 -1
  134. data/dyncall/dyncallback/dyncall_args_x86.c +2 -1
  135. data/dyncall/dyncallback/dyncall_args_x86.h +2 -1
  136. data/dyncall/dyncallback/dyncall_callback.c +7 -2
  137. data/dyncall/dyncallback/dyncall_callback.h +3 -1
  138. data/dyncall/dyncallback/dyncall_callback_arch.S +14 -6
  139. data/dyncall/dyncallback/dyncall_callback_arm32_arm.c +2 -1
  140. data/dyncall/dyncallback/dyncall_callback_arm32_arm.h +2 -1
  141. data/dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s +1 -1
  142. data/dyncall/dyncallback/{dyncall_callback_arm32_arm_gas.s → dyncall_callback_arm32_arm_gas.S} +17 -7
  143. data/dyncall/dyncallback/dyncall_callback_arm32_thumb.c +2 -1
  144. data/dyncall/dyncallback/dyncall_callback_arm32_thumb.h +2 -1
  145. data/dyncall/dyncallback/{dyncall_callback_arm32_thumb_apple.s → dyncall_callback_arm32_thumb_apple.S} +2 -2
  146. data/dyncall/dyncallback/{dyncall_callback_arm32_thumb_gas.s → dyncall_callback_arm32_thumb_gas.S} +2 -2
  147. data/dyncall/dyncallback/dyncall_callback_arm64.S +111 -0
  148. data/dyncall/dyncallback/dyncall_callback_arm64.c +71 -0
  149. data/dyncall/dyncallback/dyncall_callback_mips.c +3 -2
  150. data/dyncall/dyncallback/dyncall_callback_mips.h +3 -2
  151. data/dyncall/dyncallback/dyncall_callback_ppc32.S +115 -4
  152. data/dyncall/dyncallback/dyncall_callback_ppc32.c +3 -2
  153. data/dyncall/dyncallback/dyncall_callback_ppc32.h +6 -6
  154. data/dyncall/dyncallback/dyncall_callback_ppc32_apple.s +6 -5
  155. data/dyncall/dyncallback/dyncall_callback_ppc64.S +170 -0
  156. data/dyncall/dyncallback/dyncall_callback_ppc64.c +60 -0
  157. data/dyncall/dyncallback/dyncall_callback_ppc64.h +56 -0
  158. data/dyncall/dyncallback/dyncall_callback_sparc32.c +2 -1
  159. data/dyncall/dyncallback/dyncall_callback_sparc32.h +2 -1
  160. data/dyncall/dyncallback/dyncall_callback_sparc32.s +1 -1
  161. data/dyncall/dyncallback/dyncall_callback_sparc64.c +2 -1
  162. data/dyncall/dyncallback/dyncall_callback_sparc64.s +1 -1
  163. data/dyncall/dyncallback/dyncall_callback_x64.S +5 -12
  164. data/dyncall/dyncallback/dyncall_callback_x64.c +2 -1
  165. data/dyncall/dyncallback/dyncall_callback_x64.h +2 -1
  166. data/dyncall/dyncallback/dyncall_callback_x64_masm.asm +0 -7
  167. data/dyncall/dyncallback/dyncall_callback_x86.S +5 -12
  168. data/dyncall/dyncallback/dyncall_callback_x86.c +2 -1
  169. data/dyncall/dyncallback/dyncall_callback_x86.h +2 -1
  170. data/dyncall/dyncallback/dyncall_callback_x86_masm.asm +2 -11
  171. data/dyncall/dyncallback/dyncall_thunk.c +11 -3
  172. data/dyncall/dyncallback/dyncall_thunk.h +8 -2
  173. data/dyncall/dyncallback/dyncall_thunk_arm32_arm.c +7 -7
  174. data/dyncall/dyncallback/dyncall_thunk_arm32_arm.h +2 -1
  175. data/dyncall/dyncallback/dyncall_thunk_arm32_thumb.c +2 -1
  176. data/dyncall/dyncallback/dyncall_thunk_arm32_thumb.h +2 -1
  177. data/dyncall/dyncallback/dyncall_thunk_arm64.c +64 -0
  178. data/dyncall/dyncallback/dyncall_thunk_arm64.h +42 -0
  179. data/dyncall/dyncallback/dyncall_thunk_mips.c +49 -17
  180. data/dyncall/dyncallback/dyncall_thunk_mips.h +3 -2
  181. data/dyncall/dyncallback/dyncall_thunk_ppc32.c +3 -2
  182. data/dyncall/dyncallback/dyncall_thunk_ppc32.h +7 -7
  183. data/dyncall/dyncallback/dyncall_thunk_ppc32_sysv.c +50 -0
  184. data/dyncall/dyncallback/dyncall_thunk_ppc64.c +87 -0
  185. data/dyncall/dyncallback/dyncall_thunk_ppc64.h +55 -0
  186. data/dyncall/dyncallback/dyncall_thunk_sparc32.c +2 -1
  187. data/dyncall/dyncallback/dyncall_thunk_sparc32.h +2 -1
  188. data/dyncall/dyncallback/dyncall_thunk_sparc64.c +2 -1
  189. data/dyncall/dyncallback/dyncall_thunk_sparc64.h +2 -1
  190. data/dyncall/dyncallback/dyncall_thunk_x64.c +2 -1
  191. data/dyncall/dyncallback/dyncall_thunk_x64.h +2 -1
  192. data/dyncall/dyncallback/dyncall_thunk_x86.c +2 -1
  193. data/dyncall/dyncallback/dyncall_thunk_x86.h +2 -1
  194. data/dyncall/dyncallback/dyncallback.3 +3 -3
  195. data/dyncall/dyncallback/gen-masm.sh +0 -0
  196. data/dyncall/dynload/dynload.c +2 -1
  197. data/dyncall/dynload/dynload.h +2 -1
  198. data/dyncall/dynload/dynload_alloc.h +2 -1
  199. data/dyncall/dynload/dynload_darwin.c +2 -1
  200. data/dyncall/dynload/dynload_syms.c +2 -1
  201. data/dyncall/dynload/dynload_syms_elf.c +2 -1
  202. data/dyncall/dynload/dynload_syms_mach-o.c +3 -2
  203. data/dyncall/dynload/dynload_syms_pe.c +2 -1
  204. data/dyncall/dynload/dynload_unix.c +2 -1
  205. data/dyncall/dynload/dynload_windows.c +2 -1
  206. data/dyncall/portasm/gen-masm.sh +0 -0
  207. data/dyncall/portasm/portasm-arm.S +3 -2
  208. data/dyncall/portasm/portasm-ppc.S +2 -1
  209. data/dyncall/portasm/portasm-ppc64.S +119 -0
  210. data/dyncall/portasm/portasm-x64-att.S +2 -1
  211. data/dyncall/portasm/portasm-x86.S +2 -1
  212. metadata +39 -18
  213. data/dyncall/dyncallback/dyncall_callback_x64_apple.s +0 -122
  214. data/dyncall/dyncallback/dyncall_callback_x64_gas.s +0 -119
  215. data/dyncall/dyncallback/dyncall_callback_x64_gas_w64.s +0 -102
@@ -6,7 +6,7 @@
6
6
  Description: Call Kernel for ARM 32-bit ARM Architecture
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
 
27
+
27
28
  #include "../portasm/portasm-arm.S"
28
29
 
29
30
  /* ============================================================================
@@ -6,7 +6,7 @@
6
6
  Description:
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
 
27
+
27
28
  /*
28
29
 
29
30
  dyncall 32bit ARM32 family interface (ARM mode)
@@ -49,9 +50,14 @@ extern "C" {
49
50
  **
50
51
  ** - hybrid return-type call (bool ... pointer)
51
52
  **
53
+ ** Note the return type of this declaration is intentially of double-word size.
54
+ ** On some platforms (FreeBSD/arm, Nintendo DS, ...) the compiler generates cleanup code
55
+ ** in the caller (dc_callvm_call_arm32_arm) that reuses, thus overwrites r0 and r1.
56
+ ** With this "hint", we preserve those registers by letting the compiler assume both
57
+ ** registers are used for the return type.
52
58
  */
53
59
 
54
- void dcCall_arm32_arm(DCpointer target, DCpointer stackdata, DCsize size);
60
+ DClonglong dcCall_arm32_arm(DCpointer target, DCpointer stackdata, DCsize size);
55
61
 
56
62
  #ifdef __cplusplus
57
63
  }
@@ -6,7 +6,7 @@
6
6
  Description: Call Kernel for ARM 32-bit ARM Architecture - Hard Float
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2012 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
 
27
+
27
28
  #include "../portasm/portasm-arm.S"
28
29
 
29
30
  /* ============================================================================
@@ -40,6 +41,12 @@
40
41
  .arch armv6
41
42
  .fpu vfp
42
43
 
44
+ /*
45
+ 1st arg / r0 = funptr
46
+ 2st arg / r1 = ptr to int args
47
+ 3st arg / r2 = size
48
+ 4st arg / r3 = ptr to float args
49
+ */
43
50
  GLOBAL_C(dcCall_arm32_armhf)
44
51
  ENTRY_C(dcCall_arm32_armhf)
45
52
 
@@ -52,24 +59,9 @@ ENTRY_C(dcCall_arm32_armhf)
52
59
  mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */
53
60
 
54
61
  /* Load 16 single-precision registers (= 8 double-precision registers). */
55
- flds s0, [r3,#0 ]
56
- flds s1, [r3,#4 ]
57
- flds s2, [r3,#8 ]
58
- flds s3, [r3,#12]
59
- flds s4, [r3,#16]
60
- flds s5, [r3,#20]
61
- flds s6, [r3,#24]
62
- flds s7, [r3,#28]
63
- flds s8, [r3,#32]
64
- flds s9, [r3,#36]
65
- flds s10, [r3,#40]
66
- flds s11, [r3,#44]
67
- flds s12, [r3,#48]
68
- flds s13, [r3,#52]
69
- flds s14, [r3,#56]
70
- flds s15, [r3,#60]
71
-
72
- sub r2 , r2 , #16
62
+ fldmiad r3, {d0-d7}
63
+
64
+ sub r2 , r2 , #16 /* skip spill area */
73
65
  cmp r2, #0
74
66
  ble armhf_call
75
67
 
@@ -6,7 +6,7 @@
6
6
  Description:
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2012 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
 
27
+
27
28
  #ifndef DYNCALL_CALL_ARM32_ARM_ARMHF_H
28
29
  #define DYNCALL_CALL_ARM32_ARM_ARMHF_H
29
30
 
@@ -34,7 +35,19 @@
34
35
  extern "C" {
35
36
  #endif
36
37
 
37
- void dcCall_arm32_armhf(DCpointer target, DCpointer stackdata, DCsize size, DCfloat* p_s16);
38
+ /*
39
+ ** arm32 armhf mode calling convention calls
40
+ **
41
+ ** - hybrid return-type call (bool ... pointer)
42
+ **
43
+ ** Note the return type of this declaration is intentially of double-word size.
44
+ ** On some platforms the compiler generates cleanup code in the caller (dyncall_callvm_arm32_arm_armhf.c's
45
+ ** call()) that reuses,thus overwrites r0 and r1.
46
+ ** With this "hint", we preserve those registers by letting the compiler assume both
47
+ ** registers are used for the return type.
48
+ */
49
+
50
+ DClonglong dcCall_arm32_armhf(DCpointer target, DCpointer stackdata, DCsize size, DCfloat* p_s16);
38
51
 
39
52
  #ifdef __cplusplus
40
53
  }
@@ -6,7 +6,7 @@
6
6
  Description:
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
 
27
+
27
28
  /*
28
29
 
29
30
  dyncall 32bit ARM32 family interface (THUMB mode)
@@ -49,13 +50,14 @@ extern "C" {
49
50
  **
50
51
  ** - hybrid return-type call (bool ... pointer)
51
52
  **
53
+ ** Note the return type of this declaration is intentially of double-word size.
54
+ ** On some platforms (FreeBSD/arm, Nintendo DS, ...) the compiler generates cleanup code
55
+ ** in the caller (dc_callvm_call_arm32_thumb) that reuses, thus overwrites r0 and r1.
56
+ ** With this "hint", we preserve those registers by letting the compiler assume both
57
+ ** registers are used for the return type.
52
58
  */
53
59
 
54
- void dcCall_arm32_thumb(DCpointer target, DCpointer stackdata, DCsize size);
55
-
56
- /* Internally used to avoid compiler overwriting r0 and r1 in call stub */
57
- DClong dcCall_arm32_thumb_word (DCpointer target, DCpointer stackdata, DCsize size);
58
- DClonglong dcCall_arm32_thumb_dword(DCpointer target, DCpointer stackdata, DCsize size);
60
+ DClonglong dcCall_arm32_thumb(DCpointer target, DCpointer stackdata, DCsize size);
59
61
 
60
62
  #ifdef __cplusplus
61
63
  }
@@ -3,10 +3,10 @@
3
3
  Package: dyncall
4
4
  Library: dyncall
5
5
  File: dyncall/dyncall_call_arm32_thumb_armhf.S
6
- Description: Call Kernel for ARM 32-bit ARM Architecture - Hard Float in Thumb code
6
+ Description: Call Kernel for ARM 32-bit ARM Architecture - Hard Float in Thumb code
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2012 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
 
27
+
27
28
  #include "../portasm/portasm-arm.S"
28
29
 
29
30
  /* ============================================================================
@@ -43,6 +44,12 @@
43
44
  // .arch armv6
44
45
  // .fpu vfp
45
46
 
47
+ /*
48
+ 1st arg / r0 = funptr
49
+ 2st arg / r1 = ptr to int args
50
+ 3st arg / r2 = size
51
+ 4st arg / r3 = ptr to float args
52
+ */
46
53
  GLOBAL_C(dcCall_arm32_armhf)
47
54
  .thumb_func
48
55
  ENTRY_C(dcCall_arm32_armhf)
@@ -61,22 +68,7 @@ ENTRY_C(dcCall_arm32_armhf)
61
68
  mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */
62
69
 
63
70
  /* Load 16 single-precision registers (= 8 double-precision registers). */
64
- flds s0, [r3,#0 ]
65
- flds s1, [r3,#4 ]
66
- flds s2, [r3,#8 ]
67
- flds s3, [r3,#12]
68
- flds s4, [r3,#16]
69
- flds s5, [r3,#20]
70
- flds s6, [r3,#24]
71
- flds s7, [r3,#28]
72
- flds s8, [r3,#32]
73
- flds s9, [r3,#36]
74
- flds s10, [r3,#40]
75
- flds s11, [r3,#44]
76
- flds s12, [r3,#48]
77
- flds s13, [r3,#52]
78
- flds s14, [r3,#56]
79
- flds s15, [r3,#60]
71
+ fldmiad r3, {d0-d7}
80
72
 
81
73
  sub r2 , #16
82
74
  cmp r2, #0
@@ -83,19 +83,3 @@ call:
83
83
  mov %r13, %r7 /* Reset stack ptr. */
84
84
  pop {%r4-%r7, %r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */
85
85
 
86
-
87
-
88
- /* Internally used to avoid compiler overwriting r0 and r1 in call stub */
89
- .globl dcCall_arm32_thumb_word
90
-
91
- .thumb_func
92
- dcCall_arm32_thumb_word:
93
- b dcCall_arm32_thumb
94
-
95
-
96
- .globl dcCall_arm32_thumb_dword
97
-
98
- .thumb_func
99
- dcCall_arm32_thumb_dword:
100
- b dcCall_arm32_thumb
101
-
@@ -0,0 +1,226 @@
1
+ /*
2
+
3
+ Package: dyncall
4
+ Library: dyncall
5
+ File: dyncall/dyncall_call_arm64.S
6
+ Description: Call Kernel for ARM 64-bit Architecture (aka ARM64, AArch64)
7
+ License:
8
+
9
+ Copyright (c) 2015 Daniel Adler <dadler@uni-goettingen.de>,
10
+ Tassilo Philipp <tphilipp@potion-studios.com>
11
+
12
+ Permission to use, copy, modify, and distribute this software for any
13
+ purpose with or without fee is hereby granted, provided that the above
14
+ copyright notice and this permission notice appear in all copies.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
17
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
18
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
19
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
+
24
+ */
25
+
26
+
27
+
28
+ #include "../portasm/portasm-arm.S"
29
+
30
+ /* ============================================================================
31
+ DynCall Call Kernel for ARM 64-bit ARM Architecture
32
+ ----------------------------------------------------------------------------
33
+ C Interface:
34
+ dcCall_arm64 (DCpointer target, DCpointer data, DCsize size, DCfloat* regdata);
35
+
36
+ This Call Kernel was tested on Debian/qemu-debootstrap arm64 jessie.
37
+ */
38
+
39
+ .text
40
+ //
41
+ // DynCall Back-End arm64
42
+ //
43
+ // Supported ABIs:
44
+ // - 'ARM 64-bit AArch64 PCS' (@dadler: work in progress)
45
+ //
46
+ // Useful Links:
47
+ // - http://lxr.free-electrons.com/source/arch/arm64/kernel/stacktrace.c
48
+
49
+ GLOBAL_C(dcCall_arm64)
50
+ ENTRY_C(dcCall_arm64)
51
+ .align 2
52
+
53
+ // input:
54
+ // x0: target (address of target)
55
+ // x1: data (address of stack copy data)
56
+ // x2: size (number of 'pair' 16-byte units)
57
+ // x3: regdata (address of register data)
58
+
59
+ // prolog:
60
+
61
+ stp x29, x30, [sp, #-16]! // allocate frame
62
+ mov x29, sp
63
+
64
+ // load 64-bit floating-point registers
65
+
66
+ ldr d0, [x3,#0 ]
67
+ ldr d1, [x3,#8 ]
68
+ ldr d2, [x3,#16]
69
+ ldr d3, [x3,#24]
70
+ ldr d4, [x3,#32]
71
+ ldr d5, [x3,#40]
72
+ ldr d6, [x3,#48]
73
+ ldr d7, [x3,#56]
74
+
75
+ // copy to stack
76
+
77
+ sub sp, sp, x2 // create call-frame
78
+
79
+ eor x4, x4, x4 // x4: cnt = 0
80
+
81
+ mov x5, x1 // x5: read pointer = data
82
+ mov x6, sp // x6: write pointer = sp
83
+
84
+ .next:
85
+ cmp x4, x2
86
+ b.ge .done
87
+
88
+ ldp x7, x9, [x5], #16 // get pair from data
89
+ stp x7, x9, [x6], #16 // put to stack
90
+ add x4, x4, 16 // advance 16 bytes
91
+
92
+ b .next
93
+
94
+ .done:
95
+
96
+ // rescue temp int registers
97
+
98
+ mov x9 , x0 // x9: target
99
+ add x10, x3, 64 // x3: integer reg buffer
100
+
101
+ // load 64-bit integer registers ( 8 x 64-bit )
102
+
103
+ // load register set
104
+
105
+ ldr x0, [x10, #0]
106
+ ldr x1, [x10, #8]
107
+ ldr x2, [x10, #16]
108
+ ldr x3, [x10, #24]
109
+ ldr x4, [x10, #32]
110
+ ldr x5, [x10, #40]
111
+ ldr x6, [x10, #48]
112
+ ldr x7, [x10, #56]
113
+
114
+ // call target:
115
+
116
+ blr x9
117
+
118
+ // epilog:
119
+
120
+ mov sp, x29
121
+ ldp x29, x30, [sp], 16
122
+
123
+ ret
124
+
125
+ #if 0
126
+
127
+
128
+
129
+ // epilog:
130
+
131
+ add sp, x28, 0 // remove call record
132
+
133
+ ret
134
+
135
+ // -- OLD:
136
+
137
+ str x27, [sp, 16] // use 1 local var (size)
138
+
139
+
140
+ ldr q0, [x3,#0 ]
141
+ ldr q1, [x3,#8 ]
142
+ ldr q2, [x3,#16]
143
+ ldr q3, [x3,#24]
144
+ ldr q4, [x3,#32]
145
+ ldr q5, [x3,#40]
146
+ ldr q6, [x3,#48]
147
+ ldr q7, [x3,#56]
148
+
149
+ ldr d8, [x3,#32]
150
+ ldr d9, [x3,#36]
151
+ ldr d10, [x3,#40]
152
+ ldr d11, [x3,#44]
153
+ ldr d12, [x3,#48]
154
+ ldr d13, [x3,#52]
155
+ ldr d14, [x3,#56]
156
+ ldr d15, [x3,#60]
157
+
158
+
159
+ // load float ( 16 x 32-bit )
160
+
161
+ ldr s0, [x3,#0 ]
162
+ ldr s1, [x3,#4 ]
163
+ ldr s2, [x3,#8 ]
164
+ ldr s3, [x3,#12]
165
+ ldr s4, [x3,#16]
166
+ ldr s5, [x3,#20]
167
+ ldr s6, [x3,#24]
168
+ ldr s7, [x3,#28]
169
+ ldr s8, [x3,#32]
170
+ ldr s9, [x3,#36]
171
+ ldr s10, [x3,#40]
172
+ ldr s11, [x3,#44]
173
+ ldr s12, [x3,#48]
174
+ ldr s13, [x3,#52]
175
+ ldr s14, [x3,#56]
176
+ ldr s15, [x3,#60]
177
+
178
+ // call
179
+
180
+ blr x0
181
+
182
+ // epilog
183
+
184
+ ldp x29, x30, [sp], 32
185
+ ret
186
+
187
+ // stack copy
188
+
189
+ sub sp, sp, x2 // decrement stack by size (x2)
190
+ eor x3, x3, x3 // x3 = counter, set to zero
191
+
192
+ // .next:
193
+ ldr x4, [x1, x3] // x4 = 64-bit stack data
194
+ str x4, [sp, x3] // store to stack
195
+ add x3, x3, #8
196
+ cmp x3, x2
197
+ blt .next
198
+
199
+
200
+ // rescue int registers
201
+
202
+ mov x9 , x0 // x9 = code ptr
203
+ mov x10, x2
204
+
205
+ // load int ( 8 x 64-bit )
206
+
207
+ ldr x0, [sp, #0]
208
+ ldr x1, [sp, #8]
209
+ ldr x2, [sp, #16]
210
+ ldr x3, [sp, #24]
211
+ ldr x4, [sp, #32]
212
+ ldr x5, [sp, #40]
213
+ ldr x6, [sp, #48]
214
+ ldr x7, [sp, #56]
215
+
216
+ // call
217
+
218
+ blr x9
219
+
220
+ // epilog
221
+
222
+ ldp x29, x30, [sp], 32
223
+ ret
224
+ #endif
225
+
226
+