Skip to content

Commit e0591f6

Browse files
committed
BridJ/dyncall: added missing dyncall_callback_arm32_arm_armhf.(c, h)
1 parent b2713dc commit e0591f6

1 file changed

Lines changed: 193 additions & 0 deletions

File tree

src/main/cpp/bridj/dyncall.diff

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,199 @@ Index: dyncall/dyncallback/dyncall_args.c
107107
+# include "dyncall_args_sparc64.c"
108108
#endif
109109

110+
Index: dyncall/dyncallback/dyncall_args_arm32_arm_armhf.c
111+
===================================================================
112+
--- dyncall/dyncallback/dyncall_args_arm32_arm_armhf.c (revision 0)
113+
+++ dyncall/dyncallback/dyncall_args_arm32_arm_armhf.c (working copy)
114+
@@ -0,0 +1,140 @@
115+
+/*
116+
+
117+
+ Package: dyncall
118+
+ Library: dyncallback
119+
+ File: dyncallback/dyncall_args_arm32_arm.c
120+
+ Description: Callback's Arguments VM - Implementation for ARM32 (ARM mode)
121+
+ License:
122+
+
123+
+ Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
124+
+ Tassilo Philipp <tphilipp@potion-studios.com>
125+
+
126+
+ Permission to use, copy, modify, and distribute this software for any
127+
+ purpose with or without fee is hereby granted, provided that the above
128+
+ copyright notice and this permission notice appear in all copies.
129+
+
130+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
131+
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
132+
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
133+
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
134+
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
135+
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
136+
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
137+
+
138+
+*/
139+
+
140+
+
141+
+#include "dyncall_args_arm32_arm.h"
142+
+
143+
+
144+
+static void arm_align_64(DCArgs* args)
145+
+{
146+
+ /* Look at signature to see if current calling convention needs alignment */
147+
+ /* or not (e.g. EABI has different alignment). If nothing specified, fall */
148+
+ /* back to default behaviour for this platform. */
149+
+ /* @@@ check signature string */
150+
+
151+
+ int sig =
152+
+#if defined(DC__ABI_ARM_EABI)
153+
+ 0; /* EABI */
154+
+#else
155+
+ 1; /* ATPCS */
156+
+#endif
157+
+ if(sig == 0) {
158+
+ if(args->reg_count < 4)
159+
+ args->reg_count = (args->reg_count+1)&~1;
160+
+ if(args->reg_count >= 4 && (int)args->stack_ptr & 4)
161+
+ ++args->stack_ptr;
162+
+ }
163+
+}
164+
+
165+
+
166+
+static void* arm_word(DCArgs* args)
167+
+{
168+
+ if(args->reg_count < 4)
169+
+ return &args->reg_data[args->reg_count++];
170+
+ else
171+
+ return (void*)args->stack_ptr++;
172+
+}
173+
+
174+
+static DCfloat arm_float(DCArgs* p)
175+
+{
176+
+ if (p->s < 16) {
177+
+ DCfloat value = p->S[p->s++];
178+
+ if (p->d < p->s) {
179+
+ p->d = (p->s+1) & ~(1U);
180+
+ } else {
181+
+ p->s = p->d;
182+
+ }
183+
+ return value;
184+
+ } else {
185+
+ return *(DCfloat*) arm_word(p);
186+
+ }
187+
+}
188+
+
189+
+static DCdouble arm_double(DCArgs* p)
190+
+{
191+
+ if (p->d <= 14) {
192+
+ //if (p->d < 16) {
193+
+ DCdouble value = * (double*) &p->S[p->d];
194+
+ p->d += 2;
195+
+ if (!(p->s & 1)) {
196+
+ /* if s is even it always equals d.
197+
+ otherwise, s points to an odd float register.
198+
+ */
199+
+ p->s = p->d;
200+
+ }
201+
+ return value;
202+
+ } else {
203+
+ p->s = 16;
204+
+ union {
205+
+ DCdouble d;
206+
+ DClong l[2];
207+
+ } d;
208+
+ arm_align_64(p);
209+
+ d.l[0] = *(DClong*)arm_word(p);
210+
+ d.l[1] = *(DClong*)arm_word(p);
211+
+ return d.d;
212+
+ }
213+
+}
214+
+
215+
+
216+
+static DClonglong arm_longlong(DCArgs* args)
217+
+{
218+
+ union {
219+
+ DClonglong ll;
220+
+ DClong l[2];
221+
+ } ll;
222+
+ arm_align_64(args);
223+
+ ll.l[0] = *(DClong*)arm_word(args);
224+
+ ll.l[1] = *(DClong*)arm_word(args);
225+
+ return ll.ll;
226+
+}
227+
+
228+
+
229+
+
230+
+// ----------------------------------------------------------------------------
231+
+// C API implementation:
232+
+
233+
+
234+
+// base operations:
235+
+
236+
+DClonglong dcbArgLongLong (DCArgs* p) { return arm_longlong(p); }
237+
+DClong dcbArgLong (DCArgs* p) { return *(DClong*)arm_word(p); }
238+
+DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgLong(p); }
239+
+DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgLong(p); }
240+
+DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgLong(p); }
241+
+DCbool dcbArgBool (DCArgs* p) { return (dcbArgLong(p) == 0) ? 0 : 1; }
242+
+
243+
+DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); }
244+
+DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); }
245+
+DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); }
246+
+DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); }
247+
+DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong)dcbArgLongLong(p); }
248+
+
249+
+
250+
+DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLong(p); }
251+
+
252+
+DCdouble dcbArgDouble (DCArgs* p) { return arm_double(p); }
253+
+DCfloat dcbArgFloat (DCArgs* p) { return arm_float(p); }
254+
+
255+
Index: dyncall/dyncallback/dyncall_args_arm32_arm_armhf.h
256+
===================================================================
257+
--- dyncall/dyncallback/dyncall_args_arm32_arm_armhf.h (revision 0)
258+
+++ dyncall/dyncallback/dyncall_args_arm32_arm_armhf.h (working copy)
259+
@@ -0,0 +1,43 @@
260+
+/*
261+
+
262+
+ Package: dyncall
263+
+ Library: dyncallback
264+
+ File: dyncallback/dyncall_args_arm32_arm.h
265+
+ Description: Callback's Arguments VM - Header for ARM32 (ARM mode)
266+
+ License:
267+
+
268+
+ Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
269+
+ Tassilo Philipp <tphilipp@potion-studios.com>
270+
+
271+
+ Permission to use, copy, modify, and distribute this software for any
272+
+ purpose with or without fee is hereby granted, provided that the above
273+
+ copyright notice and this permission notice appear in all copies.
274+
+
275+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
276+
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
277+
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
278+
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
279+
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
280+
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
281+
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
282+
+
283+
+*/
284+
+
285+
+#ifndef DYNCALLBACK_ARGS_ARM32_ARM_H
286+
+#define DYNCALLBACK_ARGS_ARM32_ARM_H
287+
+
288+
+#include "dyncall_args.h"
289+
+
290+
+struct DCArgs
291+
+{
292+
+ /* Don't change order! */
293+
+ long reg_data[4];
294+
+ int reg_count;
295+
+ long* stack_ptr;
296+
+ unsigned int s;
297+
+ unsigned int d;
298+
+ DCfloat S[16];
299+
+};
300+
+
301+
+#endif /* DYNCALLBACK_ARGS_ARM32_ARM_H */
302+
+
110303
Index: dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s
111304
===================================================================
112305
--- dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s (revision 1637)

0 commit comments

Comments
 (0)