@@ -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+ +
110303Index: dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s
111304===================================================================
112305--- dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s (revision 1637)
0 commit comments