37 register unsigned int i;
38 register void **p_argv;
40 register ffi_type **p_arg;
41 register int count = 0;
46 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT)
48 *(
void **) argp = ecif->
rvalue;
52 for (
i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types;
60 if ((*p_arg)->type == FFI_TYPE_STRUCT)
63 *(
void **) argp = *p_argv;
65 else if (z <
sizeof(
int))
68 switch ((*p_arg)->type)
71 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
75 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
79 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
83 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
90 else if (z ==
sizeof(
int))
92 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
109 if (cif->rtype->type == FFI_TYPE_STRUCT)
112 cif->flags = cif->rtype->size;
114 cif->bytes =
ALIGN (cif->bytes, 8);
138 if ((rvalue ==
NULL) &&
139 (cif->rtype->type == FFI_TYPE_STRUCT))
150 cif->flags, ecif.
rvalue, fn);
159 unsigned arg4,
unsigned arg5,
unsigned arg6)
164 register ffi_closure *creg
__asm__ (
"$r12");
165 ffi_closure *closure = creg;
169 register char *frame_pointer
__asm__ (
"$fp");
172 void *struct_rvalue = (
void *) arg1;
175 char *stack_args = frame_pointer + 9*4;
178 unsigned register_args[6] =
179 { arg1, arg2, arg3, arg4, arg5, arg6 };
180 char *register_args_ptr = (
char *) register_args;
182 ffi_cif *cif = closure->cif;
183 ffi_type **arg_types = cif->arg_types;
184 void **avalue =
alloca (cif->nargs *
sizeof(
void *));
185 char *
ptr = (
char *) register_args;
189 if ((cif->rtype !=
NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
191 register_args_ptr = (
char *)®ister_args[1];
195 for (
i = 0;
i < cif->nargs;
i++)
197 switch (arg_types[
i]->
type)
203 case FFI_TYPE_SINT16:
204 case FFI_TYPE_UINT16:
207 case FFI_TYPE_SINT32:
208 case FFI_TYPE_UINT32:
210 case FFI_TYPE_POINTER:
213 case FFI_TYPE_STRUCT:
214 avalue[
i] = *(
void**)
ptr;
226 if (
ptr == ®ister_args[6])
231 if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT))
233 (closure->fun) (cif, struct_rvalue, avalue, closure->user_data);
239 (closure->fun) (cif, &rvalue, avalue, closure->user_data);
240 asm (
"mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : :
"r" (&rvalue));
247 void (*fun)(ffi_cif*,
void*,
void**,
void*),
251 unsigned short *tramp = (
unsigned short *) &closure->tramp[0];
253 unsigned long cls = (
long) codeloc;
261 tramp[1] = cls >> 16;
262 tramp[2] = cls & 0xffff;
265 tramp[5] = fn & 0xffff;
269 closure->user_data = user_data;
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
void ffi_prep_args(char *stack, extended_cif *ecif)
void ffi_call_EABI(void *(*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void(*fn)(void))
void ffi_closure_eabi(unsigned arg1, unsigned arg2, unsigned arg3, unsigned arg4, unsigned arg5, unsigned arg6)
VALUE type(ANYARGS)
ANYARGS-ed function type.