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++)
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;
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);
203 ffi_closure_helper (
unsigned char *args,
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)
284 tramp[2] = (0 << 27) | (9 << 22) | (
HI (ffi_closure_helper) << 6) | 0x34;
285 tramp[3] = (9 << 27) | (9 << 22) | (
LO (ffi_closure_helper) << 6) | 0x14;
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;