30 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
39 register unsigned int i;
40 register void **p_argv;
42 register ffi_type **p_arg;
47 if ( ecif->
cif->flags == FFI_TYPE_STRUCT ) {
49 *(
void **) argp = ecif->
rvalue;
55 for (
i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types; (
i != 0);
i--, p_arg++, p_argv++)
66 if (z <
sizeof(
int)) {
68 switch ((*p_arg)->type)
71 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
74 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
77 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
80 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
82 memcpy(argp, *p_argv, (*p_arg)->size);
87 }
else if ( z ==
sizeof(
int)) {
88 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
96 return ALIGN(
MIN(stack - argp, 6*4), 8);
103 unsigned i, bytes = 0;
105 for (
ptr = cif->arg_types,
i = cif->nargs;
i > 0;
i--,
ptr++) {
106 if ((*ptr)->size == 0)
107 return FFI_BAD_TYPEDEF;
114 if (((*ptr)->alignment - 1) & bytes)
115 bytes =
ALIGN(bytes, (*ptr)->alignment);
117 bytes +=
ALIGN((*ptr)->size, 4);
121 bytes =
ALIGN(bytes, 8);
124 if (cif->rtype->type == FFI_TYPE_STRUCT) {
125 bytes +=
sizeof(
void*);
128 bytes =
ALIGN(bytes, 8);
134 switch (cif->rtype->type) {
137 case FFI_TYPE_DOUBLE:
138 cif->flags = (
unsigned) cif->rtype->type;
140 case FFI_TYPE_SINT64:
141 case FFI_TYPE_UINT64:
142 cif->flags = (
unsigned) FFI_TYPE_SINT64;
144 case FFI_TYPE_STRUCT:
146 if (cif->rtype->size <= 4)
148 cif->flags = (
unsigned)FFI_TYPE_INT;
149 else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8))
151 cif->flags = (
unsigned)FFI_TYPE_DOUBLE;
154 cif->flags = (
unsigned)FFI_TYPE_STRUCT;
157 cif->flags = (
unsigned)FFI_TYPE_INT;
173 void ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
177 int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT));
188 if ((rvalue ==
NULL ) && (cif->flags == FFI_TYPE_STRUCT))
190 else if (small_struct)
205 memcpy (rvalue, &temp, cif->rtype->size);
210 static void ffi_prep_incoming_args_SYSV (
char *,
void **,
void **,
229 *(
unsigned int*) &__tramp[40] = __ctx;
230 *(
unsigned int*) &__tramp[44] = __fun;
232 __builtin_meta2_cachewd(&__tramp[0], 1);
233 __builtin_meta2_cachewd(&__tramp[47], 1);
243 void (*fun)(ffi_cif*,
void*,
void**,
void*),
247 void (*closure_func)(ffi_closure*) =
NULL;
255 (
unsigned char*)&closure->tramp[0],
256 (
unsigned int)closure_func,
257 (
unsigned int)codeloc);
260 closure->user_data = user_data;
269 ffi_closure *closure;
278 arg_area = (
void**)
alloca (cif->nargs * sizeof (
void*));
287 ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args);
289 (closure->fun) ( cif, *respp, arg_area, closure->user_data);
294 static void ffi_prep_incoming_args_SYSV(
char *stack,
void **rvalue,
295 void **avalue, ffi_cif *cif,
298 register unsigned int i;
299 register void **p_argv;
301 register ffi_type **p_arg;
307 if ( cif->flags == FFI_TYPE_STRUCT ) {
309 *rvalue = *(
void **) argp;
314 for (
i = cif->nargs, p_arg = cif->arg_types; (
i != 0);
i--, p_arg++) {
318 alignment = (*p_arg)->alignment;
321 if ((alignment - 1) & (
unsigned)argp)
322 argp = (
char *)
ALIGN(argp, alignment);
325 *p_argv = (
void*) argp;