69 cif->bytes = (cif->bytes + 3) & ~3;
88 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT
89 && ecif->
cif->rtype->size > 8)
91 (*(
void **) argp) = ecif->
rvalue;
95 for (i = 0; i < ecif->
cif->nargs; i++)
97 void *avalue = ecif->
avalue[i];
98 ffi_type *atype = ecif->
cif->arg_types[i];
99 size_t size = atype->size;
100 size_t alignment = atype->alignment;
103 if ((alignment - 1) & (unsigned) argp)
104 argp = (
char *)
ALIGN (argp, alignment);
108 if (size <
sizeof (
int))
114 *(
signed int *) argp = (
signed int) *(SINT8 *) avalue;
118 *(
unsigned int *) argp = (
unsigned int) *(UINT8 *) avalue;
121 case FFI_TYPE_SINT16:
122 *(
signed int *) argp = (
signed int) *(SINT16 *) avalue;
125 case FFI_TYPE_UINT16:
126 *(
unsigned int *) argp = (
unsigned int) *(UINT16 *) avalue;
129 case FFI_TYPE_STRUCT:
130 memcpy (argp, avalue, atype->size);
137 else if (size ==
sizeof (
int))
138 *(
unsigned int *) argp = (
unsigned int) *(UINT32 *) avalue;
140 memcpy (argp, avalue, size);
150 void ffi_call (ffi_cif *cif,
void (*fn) (
void),
void *rvalue,
void **avalue)
159 int bigret = (cif->rtype->type == FFI_TYPE_STRUCT
160 && cif->rtype->size > 8);
167 if (rvalue ==
NULL && bigret)
177 if (rvalue && !bigret)
178 switch (cif->rtype->size)
181 *(UINT8 *)rvalue = (UINT8)
result;
184 *(UINT16 *)rvalue = (UINT16)
result;
187 *(UINT32 *)rvalue = (UINT32)
result;
190 *(UINT64 *)rvalue = (UINT64)
result;
193 memcpy (rvalue, (
void *)&result, cif->rtype->size);
204 ffi_closure *closure)
206 ffi_cif *cif = closure->cif;
207 unsigned char *argp = args;
208 void **parsed_args =
alloca (cif->nargs * sizeof (
void *));
216 if (cif->rtype->type == FFI_TYPE_STRUCT
217 && cif->rtype->size > 8)
219 retptr = *((
void **) argp);
223 retptr = (
void *) &result;
226 for (i = 0; i < cif->nargs; i++)
228 size_t size = cif->arg_types[i]->size;
229 size_t alignment = cif->arg_types[i]->alignment;
232 if ((alignment - 1) & (unsigned) argp)
233 argp = (
char *)
ALIGN (argp, alignment);
236 if (size <
sizeof (
int))
240 parsed_args[i] = argp;
245 (closure->fun) (cif, retptr, parsed_args, closure->user_data);
255 void (*fun) (ffi_cif*,
void*,
void**,
void*),
259 unsigned int *tramp = (
unsigned int *) &closure->tramp[0];
280 #define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff) 281 #define LO(x) (((unsigned int) (x)) & 0xffff) 286 tramp[4] = (0 << 27) | (10 << 22) | (
HI (closure) << 6) | 0x34;
287 tramp[5] = (10 << 27) | (10 << 22) | (
LO (closure) << 6) | 0x14;
288 tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a;
294 for (i = 0; i < 7; i++)
295 asm volatile (
"flushd 0(%0); flushi %0" ::
"r"(tramp + i) :
"memory");
296 asm volatile (
"flushp" :::
"memory");
300 closure->user_data = user_data;
UINT64 ffi_call_sysv(void(*)(char *, extended_cif *), extended_cif *, unsigned, void(*fn)(void))
if(len<=MAX_WORD_LENGTH &&len >=MIN_WORD_LENGTH)
void ffi_closure_sysv(void)
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)
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
static UINT64 ffi_closure_helper(unsigned char *args, ffi_closure *closure)