39 register unsigned int i;
40 register void **p_argv;
42 register ffi_type **p_arg;
43 register int count = 0;
48 for (i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types;
56 if ((*p_arg)->type == FFI_TYPE_STRUCT)
59 *(
void **) argp = *p_argv;
72 else if (z <
sizeof(
int))
75 switch ((*p_arg)->type)
78 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
82 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
86 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
90 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
97 else if (z ==
sizeof(
int))
99 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
110 return (stack + ((count > 24) ? 24 :
ALIGN_DOWN(count, 8)));
116 if (cif->rtype->type == FFI_TYPE_STRUCT)
119 cif->flags = cif->rtype->size;
121 cif->bytes =
ALIGN (cif->bytes, 8);
145 if ((rvalue ==
NULL) &&
146 (cif->rtype->type == FFI_TYPE_STRUCT))
158 cif->flags, ecif.
rvalue, fn);
167 unsigned arg4,
unsigned arg5,
unsigned arg6)
172 register ffi_closure *creg
__asm__ (
"gr7");
173 ffi_closure *closure = creg;
177 register char *frame_pointer
__asm__ (
"fp");
178 char *stack_args = frame_pointer + 16;
181 unsigned register_args[6] =
182 { arg1, arg2, arg3, arg4, arg5, arg6 };
184 ffi_cif *cif = closure->cif;
185 ffi_type **arg_types = cif->arg_types;
186 void **avalue =
alloca (cif->nargs *
sizeof(
void *));
187 char *ptr = (
char *) register_args;
191 for (i = 0; i < cif->nargs; i++)
193 switch (arg_types[i]->type)
199 case FFI_TYPE_SINT16:
200 case FFI_TYPE_UINT16:
203 case FFI_TYPE_SINT32:
204 case FFI_TYPE_UINT32:
208 case FFI_TYPE_STRUCT:
209 avalue[i] = *(
void**)ptr;
221 if (ptr == ((
char *)register_args + (6*4)))
226 if (cif->rtype->type == FFI_TYPE_STRUCT)
231 register void *return_struct_ptr
__asm__(
"gr3");
232 (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data);
238 (closure->fun) (cif, &rvalue, avalue, closure->user_data);
243 asm (
"ldi @(%0, #0), gr8" : :
"r" (&rvalue));
244 asm (
"ldi @(%0, #0), gr9" : :
"r" (&((
int *) &rvalue)[1]));
251 void (*fun)(ffi_cif*,
void*,
void**,
void*),
255 unsigned int *tramp = (
unsigned int *) &closure->tramp[0];
257 unsigned long cls = (long) codeloc;
259 register void *got
__asm__(
"gr15");
266 tramp[0] = &((
unsigned int *)codeloc)[2];
268 tramp[2] = 0x8cfc0000 + (fn & 0xffff);
269 tramp[3] = 0x8efc0000 + (cls & 0xffff);
270 tramp[4] = 0x8cf80000 + (fn >> 16);
271 tramp[5] = 0x8ef80000 + (cls >> 16);
272 tramp[6] = 0x9cc86000;
273 tramp[7] = 0x8030e000;
275 tramp[0] = 0x8cfc0000 + (fn & 0xffff);
276 tramp[1] = 0x8efc0000 + (cls & 0xffff);
277 tramp[2] = 0x8cf80000 + (fn >> 16);
278 tramp[3] = 0x8ef80000 + (cls >> 16);
279 tramp[4] = 0x80300006;
284 closure->user_data = user_data;
288 __asm__
volatile (
"dcf @(%0,%1)\n\tici @(%2,%1)" ::
"r" (tramp),
"r" (i),
#define FFI_TRAMPOLINE_SIZE
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
void ffi_closure_eabi(unsigned arg1, unsigned arg2, unsigned arg3, unsigned arg4, unsigned arg5, unsigned arg6)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
void ffi_call_EABI(void *(*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void(*fn)(void))
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)