38#if defined(__HITACHI__)
39#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
41#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
46simple_type (ffi_type *
arg)
48 if (
arg->type != FFI_TYPE_STRUCT)
50 else if (
arg->elements[1])
51 return FFI_TYPE_STRUCT;
53 return simple_type (
arg->elements[0]);
57return_type (ffi_type *
arg)
61 if (
arg->type != FFI_TYPE_STRUCT)
64 type = simple_type (
arg->elements[0]);
65 if (!
arg->elements[1])
83 if (
arg->size <= 2 * sizeof (
int))
88 while ((e =
arg->elements[
i++]))
90 type = simple_type (e);
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;
127 if (return_type (ecif->
cif->rtype) == FFI_TYPE_STRUCT)
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++)
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);
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++)
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));
412void ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
423 if (cif->rtype->type == FFI_TYPE_STRUCT
424 && return_type (cif->rtype) != FFI_TYPE_STRUCT)
426 else if ((rvalue ==
NULL) &&
427 (cif->rtype->type == FFI_TYPE_STRUCT))
446 && cif->rtype->type == FFI_TYPE_STRUCT
447 && return_type (cif->rtype) != 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)
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)
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);
716 return return_type (cif->rtype);
void ffi_closure_SYSV(ffi_closure *)
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_call_SYSV(unsigned(*)(struct call_context *context, unsigned char *, extended_cif *), struct call_context *context, extended_cif *, size_t, void(*fn)(void))
void ffi_prep_args(char *stack, extended_cif *ecif)
VALUE type(ANYARGS)
ANYARGS-ed function type.
void ffi_closure_helper_SYSV(ffi_closure *, unsigned long *, unsigned long long *, unsigned long *)
void __ic_invalidate(void *line)
#define STRUCT_VALUE_ADDRESS_WITH_ARG