38 #if defined(__HITACHI__) 39 #define STRUCT_VALUE_ADDRESS_WITH_ARG 1 41 #define STRUCT_VALUE_ADDRESS_WITH_ARG 0 48 if (arg->type != FFI_TYPE_STRUCT)
50 else if (arg->elements[1])
51 return FFI_TYPE_STRUCT;
61 if (arg->type != FFI_TYPE_STRUCT)
65 if (! arg->elements[1])
83 if (arg->size <= 2 * sizeof (
int))
88 while ((e = arg->elements[i++]))
97 return FFI_TYPE_UINT64;
105 return FFI_TYPE_STRUCT;
113 register unsigned int i;
115 register unsigned int avn;
116 register void **p_argv;
118 register ffi_type **p_arg;
129 *(
void **) argp = ecif->
rvalue;
138 avn = ecif->
cif->nargs;
141 for (i = 0, p_arg = ecif->
cif->arg_types; i < avn; i++, p_arg++, p_argv++)
152 switch ((*p_arg)->type)
155 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
159 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
162 case FFI_TYPE_SINT16:
163 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
166 case FFI_TYPE_UINT16:
167 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
170 case FFI_TYPE_STRUCT:
171 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
179 else if (z ==
sizeof(
int))
182 if ((*p_arg)->type == FFI_TYPE_FLOAT)
193 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
197 else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
201 freg = (freg + 1) & ~1;
203 memcpy (argp, *p_argv, z);
209 int n = (z +
sizeof (int) - 1) /
sizeof (int);
218 memcpy (argp, *p_argv, z);
219 argp += n *
sizeof (int);
230 for (i = 0, p_arg = ecif->
cif->arg_types; i < avn; i++, p_arg++, p_argv++)
241 switch ((*p_arg)->type)
244 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
248 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
251 case FFI_TYPE_SINT16:
252 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
255 case FFI_TYPE_UINT16:
256 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
259 case FFI_TYPE_STRUCT:
260 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
268 else if (z ==
sizeof(
int))
271 if ((*p_arg)->type == FFI_TYPE_FLOAT)
282 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
286 else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
290 freg = (freg + 1) & ~1;
294 memcpy (argp, *p_argv, z);
300 int n = (z +
sizeof (int) - 1) /
sizeof (int);
306 #if (! defined(__SH4__)) 313 memcpy (argp, *p_argv, z);
314 argp += n *
sizeof (int);
334 greg = ((
return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
338 for (i = j = 0; i < cif->nargs && j < 12; i++)
340 type = (cif->arg_types)[i]->type;
347 cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
351 case FFI_TYPE_DOUBLE:
354 freg = (freg + 1) & ~1;
356 cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
361 size = (cif->arg_types)[i]->size;
362 n = (size +
sizeof (int) - 1) /
sizeof (int);
366 for (m = 0; m < n; m++)
367 cif->flags += FFI_TYPE_INT << (2 * j++);
372 for (i = j = 0; i < cif->nargs && j < 4; i++)
374 size = (cif->arg_types)[i]->size;
375 n = (size +
sizeof (int) - 1) /
sizeof (int);
381 for (m = 0; m < n; m++)
382 cif->flags += FFI_TYPE_INT << (2 * j++);
387 switch (cif->rtype->type)
389 case FFI_TYPE_STRUCT:
390 cif->flags += (unsigned) (
return_type (cif->rtype)) << 24;
395 case FFI_TYPE_DOUBLE:
396 case FFI_TYPE_SINT64:
397 case FFI_TYPE_UINT64:
398 cif->flags += (unsigned) cif->rtype->type << 24;
402 cif->flags += FFI_TYPE_INT << 24;
410 unsigned,
unsigned,
unsigned *,
void (*fn)(
void));
412 void ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
423 if (cif->rtype->type == FFI_TYPE_STRUCT
426 else if ((rvalue ==
NULL) &&
427 (cif->rtype->type == FFI_TYPE_STRUCT))
446 && cif->rtype->type == FFI_TYPE_STRUCT
448 memcpy (rvalue, &trvalue, cif->rtype->size);
459 void (*fun)(ffi_cif*,
void*,
void**,
void*),
469 tramp = (
unsigned int *) &closure->tramp[0];
471 insn = (
return_type (cif->rtype) == FFI_TYPE_STRUCT
475 #ifdef __LITTLE_ENDIAN__ 476 tramp[0] = 0xd301d102;
477 tramp[1] = 0x0000412b | (insn << 16);
479 tramp[0] = 0xd102d301;
480 tramp[1] = 0x412b0000 | insn;
482 *(
void **) &tramp[2] = (
void *)codeloc;
487 closure->user_data = user_data;
505 #ifdef __LITTLE_ENDIAN__ 515 unsigned long *pgr,
unsigned long *pfr,
528 avalue =
alloca(cif->nargs *
sizeof(
void *));
534 rvalue = (
void *) *pgr++;
545 for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
556 switch ((*p_arg)->type)
560 avalue[i] = (((
char *)pgr) +
OFS_INT8);
563 case FFI_TYPE_SINT16:
564 case FFI_TYPE_UINT16:
568 case FFI_TYPE_STRUCT:
577 else if (z ==
sizeof(
int))
580 if ((*p_arg)->type == FFI_TYPE_FLOAT)
597 else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
603 freg = (freg + 1) & ~1;
611 int n = (z +
sizeof (int) - 1) /
sizeof (int);
630 for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
641 switch ((*p_arg)->type)
645 avalue[i] = (((
char *)pst) +
OFS_INT8);
648 case FFI_TYPE_SINT16:
649 case FFI_TYPE_UINT16:
653 case FFI_TYPE_STRUCT:
662 else if (z ==
sizeof(
int))
665 if ((*p_arg)->type == FFI_TYPE_FLOAT)
680 else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
684 freg = (freg + 1) & ~1;
694 int n = (z +
sizeof (int) - 1) /
sizeof (int);
700 #if (! defined(__SH4__)) 713 (closure->fun) (cif, rvalue, avalue, closure->user_data);
void __ic_invalidate(void *line)
static int return_type(ffi_type *arg)
void ffi_closure_helper_SYSV(ffi_closure *, unsigned long *, unsigned long long *, unsigned long *)
void ffi_call_SYSV(unsigned(*)(struct call_context *context, unsigned char *, extended_cif *), struct call_context *context, extended_cif *, size_t, void(*fn)(void))
#define STRUCT_VALUE_ADDRESS_WITH_ARG
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_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
static int simple_type(ffi_type *arg)
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
void ffi_closure_SYSV(ffi_closure *)