Skip to content

Commit b2713dc

Browse files
committed
BridJ/dyncall: simplify arm32 dyncall code (use one fldmiad instruction instead of many flds), and draft support for VFP in dyncallback (issue #525)
1 parent cce21c6 commit b2713dc

1 file changed

Lines changed: 129 additions & 4 deletions

File tree

src/main/cpp/bridj/dyncall.diff

Lines changed: 129 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,131 @@
1+
Index: dyncall/dyncall/dyncall_call_arm32_arm_armhf.S
2+
===================================================================
3+
--- dyncall/dyncall/dyncall_call_arm32_arm_armhf.S (revision 1637)
4+
+++ dyncall/dyncall/dyncall_call_arm32_arm_armhf.S (working copy)
5+
@@ -52,22 +52,8 @@
6+
mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */
7+
8+
/* Load 16 single-precision registers (= 8 double-precision registers). */
9+
- flds s0, [r3,#0 ]
10+
- flds s1, [r3,#4 ]
11+
- flds s2, [r3,#8 ]
12+
- flds s3, [r3,#12]
13+
- flds s4, [r3,#16]
14+
- flds s5, [r3,#20]
15+
- flds s6, [r3,#24]
16+
- flds s7, [r3,#28]
17+
- flds s8, [r3,#32]
18+
- flds s9, [r3,#36]
19+
- flds s10, [r3,#40]
20+
- flds s11, [r3,#44]
21+
- flds s12, [r3,#48]
22+
- flds s13, [r3,#52]
23+
- flds s14, [r3,#56]
24+
- flds s15, [r3,#60]
25+
+ /* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/Bcfchhif.html */
26+
+ fldmiad r3, {d0-d7}
27+
28+
sub r2 , r2 , #16
29+
cmp r2, #0
30+
Index: dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S
31+
===================================================================
32+
--- dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S (revision 1637)
33+
+++ dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S (working copy)
34+
@@ -61,22 +61,8 @@
35+
mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */
36+
37+
/* Load 16 single-precision registers (= 8 double-precision registers). */
38+
- flds s0, [r3,#0 ]
39+
- flds s1, [r3,#4 ]
40+
- flds s2, [r3,#8 ]
41+
- flds s3, [r3,#12]
42+
- flds s4, [r3,#16]
43+
- flds s5, [r3,#20]
44+
- flds s6, [r3,#24]
45+
- flds s7, [r3,#28]
46+
- flds s8, [r3,#32]
47+
- flds s9, [r3,#36]
48+
- flds s10, [r3,#40]
49+
- flds s11, [r3,#44]
50+
- flds s12, [r3,#48]
51+
- flds s13, [r3,#52]
52+
- flds s14, [r3,#56]
53+
- flds s15, [r3,#60]
54+
+ /* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/Bcfchhif.html */
55+
+ fldmiad r3, {d0-d7}
56+
57+
sub r2 , #16
58+
cmp r2, #0
59+
Index: dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c
60+
===================================================================
61+
--- dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c (revision 1637)
62+
+++ dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c (working copy)
63+
@@ -105,7 +105,8 @@
64+
static void a_double(DCCallVM* in_p, DCdouble x)
65+
{
66+
DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p;
67+
- if (p->d < 16) {
68+
+ if (p->d <= 14) {
69+
+ //if (p->d < 16) {
70+
* (double*) &p->S[p->d] = x;
71+
p->d += 2;
72+
if (!(p->s & 1)) {
73+
Index: dyncall/dyncallback/dyncall_args.c
74+
===================================================================
75+
--- dyncall/dyncallback/dyncall_args.c (revision 1637)
76+
+++ dyncall/dyncallback/dyncall_args.c (working copy)
77+
@@ -26,20 +26,24 @@
78+
#include "../dyncall/dyncall_macros.h"
79+
80+
#if defined(DC__Arch_Intel_x86)
81+
-#include "dyncall_args_x86.c"
82+
+# include "dyncall_args_x86.c"
83+
#elif defined (DC__Arch_AMD64)
84+
-#include "dyncall_args_x64.c"
85+
+# include "dyncall_args_x64.c"
86+
#elif defined (DC__Arch_PowerPC)
87+
-#include "dyncall_args_ppc32.c"
88+
+# include "dyncall_args_ppc32.c"
89+
#elif defined (DC__Arch_ARM_ARM)
90+
-#include "dyncall_args_arm32_arm.c"
91+
+# if defined(DC__ABI_ARM_HF)
92+
+# include "dyncall_args_arm32_arm_armhf.c"
93+
+# else
94+
+# include "dyncall_args_arm32_arm.c"
95+
+# endif
96+
#elif defined (DC__Arch_ARM_THUMB)
97+
-#include "dyncall_args_arm32_thumb.c"
98+
+# include "dyncall_args_arm32_thumb.c"
99+
#elif defined (DC__Arch_MIPS)
100+
-#include "dyncall_args_mips.c"
101+
+# include "dyncall_args_mips.c"
102+
#elif defined (DC__Arch_Sparc)
103+
-#include "dyncall_args_sparc32.c"
104+
+# include "dyncall_args_sparc32.c"
105+
#elif defined (DC__Arch_Sparcv9)
106+
-#include "dyncall_args_sparc64.c"
107+
+# include "dyncall_args_sparc64.c"
108+
#endif
109+
110+
Index: dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s
111+
===================================================================
112+
--- dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s (revision 1637)
113+
+++ dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s (working copy)
114+
@@ -52,6 +52,11 @@
115+
/* Grab arguments. */
116+
mov %r4, #0
117+
stmdb %r13!, {%r0-%r4, %r11} /* Spill first 4 args to DCArgs, along with reg_count and (stack) pointer to remaining args. */
118+
+ sub %r13, #4 /* Make room for s */
119+
+ mov %r13, #0 /* Initialize s to 0 */
120+
+ sub %r13, #4 /* Make room for d */
121+
+ mov %r13, #0 /* Initialize d to 0 */
122+
+ fstmdbd %r13!, { d0-d7 } /* Copy d0 to d7 to S while decreasing frame pointer */
123+
124+
/* Prepare callback handler call. */
125+
mov %r0, %r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */
1126
Index: dyncall/dynload/dynload_syms_elf.c
2127
===================================================================
3-
--- dyncall/dynload/dynload_syms_elf.c (revision 1418)
128+
--- dyncall/dynload/dynload_syms_elf.c (revision 1637)
4129
+++ dyncall/dynload/dynload_syms_elf.c (working copy)
5130
@@ -54,6 +54,7 @@
6131

@@ -12,7 +137,7 @@ Index: dyncall/dynload/dynload_syms_elf.c
12137
#include <string.h>
13138
Index: dyncall/dynload/dynload_syms_mach-o.c
14139
===================================================================
15-
--- dyncall/dynload/dynload_syms_mach-o.c (revision 1418)
140+
--- dyncall/dynload/dynload_syms_mach-o.c (revision 1637)
16141
+++ dyncall/dynload/dynload_syms_mach-o.c (working copy)
17142
@@ -28,6 +28,7 @@
18143
dynamic symbol resolver for Mach-O
@@ -314,7 +439,7 @@ Index: dyncall/dynload/dynload_syms_mach-o.c
314439
return NULL;
315440
Index: dyncall/dynload/dynload_unix.c
316441
===================================================================
317-
--- dyncall/dynload/dynload_unix.c (revision 1418)
442+
--- dyncall/dynload/dynload_unix.c (revision 1637)
318443
+++ dyncall/dynload/dynload_unix.c (working copy)
319444
@@ -40,7 +40,7 @@
320445

@@ -327,7 +452,7 @@ Index: dyncall/dynload/dynload_unix.c
327452

328453
Index: dyncall/dynload/dynload_windows.c
329454
===================================================================
330-
--- dyncall/dynload/dynload_windows.c (revision 1418)
455+
--- dyncall/dynload/dynload_windows.c (revision 1637)
331456
+++ dyncall/dynload/dynload_windows.c (working copy)
332457
@@ -40,7 +40,9 @@
333458
DLLib* dlLoadLibrary(const char* libPath)

0 commit comments

Comments
 (0)