34#if defined(__LONG_DOUBLE_128__)
35# if FFI_TYPE_LONGDOUBLE != 4
36# error FFI_TYPE_LONGDOUBLE out of date
39# undef FFI_TYPE_LONGDOUBLE
40# define FFI_TYPE_LONGDOUBLE 4
43extern void ffi_call_osf(
void *,
unsigned long,
unsigned,
void *,
void (*)(
void))
57 switch (cif->rtype->type)
62 cif->flags = cif->rtype->type;
67 cif->flags = FFI_TYPE_STRUCT;
71 cif->flags = FFI_TYPE_INT;
80ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
82 unsigned long *stack, *argp;
88 if (rvalue ==
NULL && cif->flags == FFI_TYPE_STRUCT)
89 rvalue =
alloca(cif->rtype->size);
95 if (cif->flags == FFI_TYPE_STRUCT)
96 *(
void **) argp++ = rvalue;
100 arg_types = cif->arg_types;
104 size_t size = (*arg_types)->size;
106 switch ((*arg_types)->type)
109 *(SINT64 *) argp = *(SINT8 *)(* avalue);
113 *(SINT64 *) argp = *(UINT8 *)(* avalue);
116 case FFI_TYPE_SINT16:
117 *(SINT64 *) argp = *(SINT16 *)(* avalue);
120 case FFI_TYPE_UINT16:
121 *(SINT64 *) argp = *(UINT16 *)(* avalue);
124 case FFI_TYPE_SINT32:
125 case FFI_TYPE_UINT32:
127 *(SINT64 *) argp = *(SINT32 *)(* avalue);
130 case FFI_TYPE_SINT64:
131 case FFI_TYPE_UINT64:
132 case FFI_TYPE_POINTER:
133 *(UINT64 *) argp = *(UINT64 *)(* avalue);
137 if (argp - stack < 6)
141 *(
double *) argp = *(
float *)(* avalue);
144 *(
float *) argp = *(
float *)(* avalue);
147 case FFI_TYPE_DOUBLE:
148 *(
double *) argp = *(
double *)(* avalue);
153 *(
long double **) argp = (
long double *)(* avalue);
154 size =
sizeof (
long double *);
157 case FFI_TYPE_STRUCT:
158 memcpy(argp, *avalue, (*arg_types)->size);
166 i++, arg_types++, avalue++;
169 ffi_call_osf(stack, cif->bytes, cif->flags, rvalue, fn);
176 void (*fun)(ffi_cif*,
void*,
void**,
void*),
185 tramp = (
unsigned int *) &closure->tramp[0];
186 tramp[0] = 0x47fb0401;
187 tramp[1] = 0xa77b0010;
188 tramp[2] = 0x6bfb0000;
189 tramp[3] = 0x47ff041f;
190 *(
void **) &tramp[4] = ffi_closure_osf;
194 closure->user_data = user_data;
202 asm volatile (
"call_pal 0x86" : : :
"memory");
213 ffi_type **arg_types;
217 avalue =
alloca(cif->nargs *
sizeof(
void *));
223 if (cif->flags == FFI_TYPE_STRUCT)
225 rvalue = (
void *) argp[0];
231 arg_types = cif->arg_types;
236 size_t size = arg_types[
i]->size;
238 switch (arg_types[
i]->
type)
242 case FFI_TYPE_SINT16:
243 case FFI_TYPE_UINT16:
244 case FFI_TYPE_SINT32:
245 case FFI_TYPE_UINT32:
246 case FFI_TYPE_SINT64:
247 case FFI_TYPE_UINT64:
248 case FFI_TYPE_POINTER:
249 case FFI_TYPE_STRUCT:
250 avalue[
i] = &argp[argn];
258 *(
float *)&argp[argn - 6] = *(
double *)&argp[argn - 6];
259 avalue[
i] = &argp[argn - 6];
262 avalue[
i] = &argp[argn];
265 case FFI_TYPE_DOUBLE:
266 avalue[
i] = &argp[argn - (argn < 6 ? 6 : 0)];
271 avalue[
i] = (
long double *) argp[argn];
272 size =
sizeof (
long double *);
284 closure->fun (cif, rvalue, avalue, closure->user_data);
287 return cif->rtype->type;
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)
#define FFI_TYPE_LONGDOUBLE
void ffi_call_osf(void *, unsigned long, unsigned, void *, void(*)(void))
long FFI_HIDDEN ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp)
VALUE type(ANYARGS)
ANYARGS-ed function type.
const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN