1 /* -----------------------------------------------------------------------
2 ffi.c - Copyright (c) 1996, 2007 Red Hat, Inc.
4 MIPS Foreign Function Interface
6 Permission is hereby granted, free of charge, to any person obtaining
7 a copy of this software and associated documentation files (the
8 ``Software''), to deal in the Software without restriction, including
9 without limitation the rights to use, copy, modify, merge, publish,
10 distribute, sublicense, and/or sell copies of the Software, and to
11 permit persons to whom the Software is furnished to do so, subject to
12 the following conditions:
14 The above copyright notice and this permission notice shall be included
15 in all copies or substantial portions of the Software.
17 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 OTHER DEALINGS IN THE SOFTWARE.
24 ----------------------------------------------------------------------- */
27 #include <ffi_common.h>
32 # define FFI_MIPS_STOP_HERE() ffi_stop_here()
34 # define FFI_MIPS_STOP_HERE() do {} while(0)
39 FFI_ASSERT(argp <= &stack[bytes]); \
40 if (argp == &stack[bytes]) \
43 FFI_MIPS_STOP_HERE(); \
50 /* ffi_prep_args is called by the assembly routine once stack space
51 has been allocated for the function's arguments */
53 static void ffi_prep_args(char *stack
,
64 /* If more than 8 double words are used, the remainder go
65 on the stack. We reorder stuff on the stack here to
66 support this easily. */
67 if (bytes
> 8 * sizeof(ffi_arg
))
68 argp
= &stack
[bytes
- (8 * sizeof(ffi_arg
))];
75 memset(stack
, 0, bytes
);
78 if ( ecif
->cif
->rstruct_flag
!= 0 )
80 if ( ecif
->cif
->rtype
->type
== FFI_TYPE_STRUCT
)
83 *(ffi_arg
*) argp
= (ffi_arg
) ecif
->rvalue
;
84 argp
+= sizeof(ffi_arg
);
88 p_argv
= ecif
->avalue
;
90 for (i
= ecif
->cif
->nargs
, p_arg
= ecif
->cif
->arg_types
; i
; i
--, p_arg
++)
95 /* Align if necessary. */
96 a
= (*p_arg
)->alignment
;
97 if (a
< sizeof(ffi_arg
))
100 if ((a
- 1) & (unsigned long) argp
)
102 argp
= (char *) ALIGN(argp
, a
);
107 if (z
<= sizeof(ffi_arg
))
109 int type
= (*p_arg
)->type
;
112 /* The size of a pointer depends on the ABI */
113 if (type
== FFI_TYPE_POINTER
)
115 (ecif
->cif
->abi
== FFI_N64
) ? FFI_TYPE_SINT64
: FFI_TYPE_SINT32
;
120 *(ffi_arg
*)argp
= *(SINT8
*)(* p_argv
);
124 *(ffi_arg
*)argp
= *(UINT8
*)(* p_argv
);
127 case FFI_TYPE_SINT16
:
128 *(ffi_arg
*)argp
= *(SINT16
*)(* p_argv
);
131 case FFI_TYPE_UINT16
:
132 *(ffi_arg
*)argp
= *(UINT16
*)(* p_argv
);
135 case FFI_TYPE_SINT32
:
136 *(ffi_arg
*)argp
= *(SINT32
*)(* p_argv
);
139 case FFI_TYPE_UINT32
:
140 *(ffi_arg
*)argp
= *(UINT32
*)(* p_argv
);
143 /* This can only happen with 64bit slots. */
145 *(float *) argp
= *(float *)(* p_argv
);
148 /* Handle structures. */
150 memcpy(argp
, *p_argv
, (*p_arg
)->size
);
157 memcpy(argp
, *p_argv
, z
);
160 unsigned long end
= (unsigned long) argp
+ z
;
161 unsigned long cap
= (unsigned long) stack
+ bytes
;
163 /* Check if the data will fit within the register space.
164 Handle it if it doesn't. */
167 memcpy(argp
, *p_argv
, z
);
170 unsigned long portion
= cap
- (unsigned long)argp
;
172 memcpy(argp
, *p_argv
, portion
);
175 memcpy(argp
, (void*)((unsigned long)(*p_argv
) + portion
),
189 /* The n32 spec says that if "a chunk consists solely of a double
190 float field (but not a double, which is part of a union), it
191 is passed in a floating point register. Any other chunk is
192 passed in an integer register". This code traverses structure
193 definitions and generates the appropriate flags. */
196 calc_n32_struct_flags(ffi_type
*arg
, unsigned *loc
, unsigned *arg_reg
)
203 while ((e
= arg
->elements
[index
]))
205 /* Align this object. */
206 *loc
= ALIGN(*loc
, e
->alignment
);
207 if (e
->type
== FFI_TYPE_DOUBLE
)
209 /* Already aligned to FFI_SIZEOF_ARG. */
210 *arg_reg
= *loc
/ FFI_SIZEOF_ARG
;
213 flags
+= (FFI_TYPE_DOUBLE
<< (*arg_reg
* FFI_FLAG_BITS
));
220 /* Next Argument register at alignment of FFI_SIZEOF_ARG. */
221 *arg_reg
= ALIGN(*loc
, FFI_SIZEOF_ARG
) / FFI_SIZEOF_ARG
;
227 calc_n32_return_struct_flags(ffi_type
*arg
)
230 unsigned small
= FFI_TYPE_SMALLSTRUCT
;
233 /* Returning structures under n32 is a tricky thing.
234 A struct with only one or two floating point fields
235 is returned in $f0 (and $f2 if necessary). Any other
236 struct results at most 128 bits are returned in $2
237 (the first 64 bits) and $3 (remainder, if necessary).
238 Larger structs are handled normally. */
244 small
= FFI_TYPE_SMALLSTRUCT2
;
246 e
= arg
->elements
[0];
247 if (e
->type
== FFI_TYPE_DOUBLE
)
248 flags
= FFI_TYPE_DOUBLE
;
249 else if (e
->type
== FFI_TYPE_FLOAT
)
250 flags
= FFI_TYPE_FLOAT
;
252 if (flags
&& (e
= arg
->elements
[1]))
254 if (e
->type
== FFI_TYPE_DOUBLE
)
255 flags
+= FFI_TYPE_DOUBLE
<< FFI_FLAG_BITS
;
256 else if (e
->type
== FFI_TYPE_FLOAT
)
257 flags
+= FFI_TYPE_FLOAT
<< FFI_FLAG_BITS
;
261 if (flags
&& (arg
->elements
[2]))
263 /* There are three arguments and the first two are
264 floats! This must be passed the old way. */
277 /* Perform machine dependent cif processing */
278 ffi_status
ffi_prep_cif_machdep(ffi_cif
*cif
)
283 /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT
284 * does not have special handling for floating point args.
287 if (cif
->rtype
->type
!= FFI_TYPE_STRUCT
&& cif
->abi
== FFI_O32
)
291 switch ((cif
->arg_types
)[0]->type
)
294 case FFI_TYPE_DOUBLE
:
295 cif
->flags
+= (cif
->arg_types
)[0]->type
;
304 /* Only handle the second argument if the first
305 is a float or double. */
308 switch ((cif
->arg_types
)[1]->type
)
311 case FFI_TYPE_DOUBLE
:
312 cif
->flags
+= (cif
->arg_types
)[1]->type
<< FFI_FLAG_BITS
;
323 /* Set the return type flag */
325 if (cif
->abi
== FFI_O32_SOFT_FLOAT
)
327 switch (cif
->rtype
->type
)
330 case FFI_TYPE_STRUCT
:
331 cif
->flags
+= cif
->rtype
->type
<< (FFI_FLAG_BITS
* 2);
334 case FFI_TYPE_SINT64
:
335 case FFI_TYPE_UINT64
:
336 case FFI_TYPE_DOUBLE
:
337 cif
->flags
+= FFI_TYPE_UINT64
<< (FFI_FLAG_BITS
* 2);
342 cif
->flags
+= FFI_TYPE_INT
<< (FFI_FLAG_BITS
* 2);
349 switch (cif
->rtype
->type
)
352 case FFI_TYPE_STRUCT
:
354 case FFI_TYPE_DOUBLE
:
355 cif
->flags
+= cif
->rtype
->type
<< (FFI_FLAG_BITS
* 2);
358 case FFI_TYPE_SINT64
:
359 case FFI_TYPE_UINT64
:
360 cif
->flags
+= FFI_TYPE_UINT64
<< (FFI_FLAG_BITS
* 2);
364 cif
->flags
+= FFI_TYPE_INT
<< (FFI_FLAG_BITS
* 2);
371 /* Set the flags necessary for N32 processing */
373 unsigned arg_reg
= 0;
375 unsigned count
= (cif
->nargs
< 8) ? cif
->nargs
: 8;
378 unsigned struct_flags
= 0;
380 if (cif
->rtype
->type
== FFI_TYPE_STRUCT
)
382 struct_flags
= calc_n32_return_struct_flags(cif
->rtype
);
384 if (struct_flags
== 0)
386 /* This means that the structure is being passed as
390 count
= (cif
->nargs
< 7) ? cif
->nargs
: 7;
392 cif
->rstruct_flag
= !0;
395 cif
->rstruct_flag
= 0;
398 cif
->rstruct_flag
= 0;
400 while (count
-- > 0 && arg_reg
< 8)
402 switch ((cif
->arg_types
)[index
]->type
)
405 case FFI_TYPE_DOUBLE
:
407 ((cif
->arg_types
)[index
]->type
<< (arg_reg
* FFI_FLAG_BITS
));
410 case FFI_TYPE_LONGDOUBLE
:
412 arg_reg
= ALIGN(arg_reg
, 2);
413 /* Treat it as two adjacent doubles. */
415 (FFI_TYPE_DOUBLE
<< (arg_reg
* FFI_FLAG_BITS
));
418 (FFI_TYPE_DOUBLE
<< (arg_reg
* FFI_FLAG_BITS
));
422 case FFI_TYPE_STRUCT
:
423 loc
= arg_reg
* FFI_SIZEOF_ARG
;
424 cif
->flags
+= calc_n32_struct_flags((cif
->arg_types
)[index
],
436 /* Set the return type flag */
437 switch (cif
->rtype
->type
)
439 case FFI_TYPE_STRUCT
:
441 if (struct_flags
== 0)
443 /* The structure is returned through a hidden
444 first argument. Do nothing, 'cause FFI_TYPE_VOID
449 /* The structure is returned via some tricky
451 cif
->flags
+= FFI_TYPE_STRUCT
<< (FFI_FLAG_BITS
* 8);
452 cif
->flags
+= struct_flags
<< (4 + (FFI_FLAG_BITS
* 8));
458 /* Do nothing, 'cause FFI_TYPE_VOID is 0 */
462 case FFI_TYPE_DOUBLE
:
463 cif
->flags
+= cif
->rtype
->type
<< (FFI_FLAG_BITS
* 8);
467 cif
->flags
+= FFI_TYPE_INT
<< (FFI_FLAG_BITS
* 8);
476 /* Low level routine for calling O32 functions */
477 extern int ffi_call_O32(void (*)(char *, extended_cif
*, int, int),
478 extended_cif
*, unsigned,
479 unsigned, unsigned *, void (*)());
481 /* Low level routine for calling N32 functions */
482 extern int ffi_call_N32(void (*)(char *, extended_cif
*, int, int),
483 extended_cif
*, unsigned,
484 unsigned, unsigned *, void (*)());
486 void ffi_call(ffi_cif
*cif
, void (*fn
)(), void *rvalue
, void **avalue
)
491 ecif
.avalue
= avalue
;
493 /* If the return value is a struct and we don't have a return */
494 /* value address then we need to make one */
496 if ((rvalue
== NULL
) &&
497 (cif
->rtype
->type
== FFI_TYPE_STRUCT
))
498 ecif
.rvalue
= alloca(cif
->rtype
->size
);
500 ecif
.rvalue
= rvalue
;
506 case FFI_O32_SOFT_FLOAT
:
507 ffi_call_O32(ffi_prep_args
, &ecif
, cif
->bytes
,
508 cif
->flags
, ecif
.rvalue
, fn
);
517 void *rvalue_copy
= ecif
.rvalue
;
518 if (cif
->rtype
->type
== FFI_TYPE_STRUCT
&& cif
->rtype
->size
< 16)
520 /* For structures smaller than 16 bytes we clobber memory
521 in 8 byte increments. Make a copy so we don't clobber
522 the callers memory outside of the struct bounds. */
523 rvalue_copy
= alloca(16);
526 ffi_call_N32(ffi_prep_args
, &ecif
, cif
->bytes
,
527 cif
->flags
, rvalue_copy
, fn
);
529 memcpy(ecif
.rvalue
, rvalue_copy
, cif
->rtype
->size
);
541 #if defined(FFI_MIPS_O32)
542 extern void ffi_closure_O32(void);
544 extern void ffi_closure_N32(void);
545 #endif /* FFI_MIPS_O32 */
548 ffi_prep_closure_loc (ffi_closure
*closure
,
550 void (*fun
)(ffi_cif
*,void*,void**,void*),
554 unsigned int *tramp
= (unsigned int *) &closure
->tramp
[0];
556 char *clear_location
= (char *) codeloc
;
558 #if defined(FFI_MIPS_O32)
559 FFI_ASSERT(cif
->abi
== FFI_O32
|| cif
->abi
== FFI_O32_SOFT_FLOAT
);
560 fn
= ffi_closure_O32
;
561 #else /* FFI_MIPS_N32 */
562 FFI_ASSERT(cif
->abi
== FFI_N32
|| cif
->abi
== FFI_N64
);
563 fn
= ffi_closure_N32
;
564 #endif /* FFI_MIPS_O32 */
566 #if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32)
567 /* lui $25,high(fn) */
568 tramp
[0] = 0x3c190000 | ((unsigned)fn
>> 16);
569 /* ori $25,low(fn) */
570 tramp
[1] = 0x37390000 | ((unsigned)fn
& 0xffff);
571 /* lui $12,high(codeloc) */
572 tramp
[2] = 0x3c0c0000 | ((unsigned)codeloc
>> 16);
574 tramp
[3] = 0x03200008;
575 /* ori $12,low(codeloc) */
576 tramp
[4] = 0x358c0000 | ((unsigned)codeloc
& 0xffff);
578 /* N64 has a somewhat larger trampoline. */
579 /* lui $25,high(fn) */
580 tramp
[0] = 0x3c190000 | ((unsigned long)fn
>> 48);
581 /* lui $12,high(codeloc) */
582 tramp
[1] = 0x3c0c0000 | ((unsigned long)codeloc
>> 48);
583 /* ori $25,mid-high(fn) */
584 tramp
[2] = 0x37390000 | (((unsigned long)fn
>> 32 ) & 0xffff);
585 /* ori $12,mid-high(codeloc) */
586 tramp
[3] = 0x358c0000 | (((unsigned long)codeloc
>> 32) & 0xffff);
587 /* dsll $25,$25,16 */
588 tramp
[4] = 0x0019cc38;
589 /* dsll $12,$12,16 */
590 tramp
[5] = 0x000c6438;
591 /* ori $25,mid-low(fn) */
592 tramp
[6] = 0x37390000 | (((unsigned long)fn
>> 16 ) & 0xffff);
593 /* ori $12,mid-low(codeloc) */
594 tramp
[7] = 0x358c0000 | (((unsigned long)codeloc
>> 16) & 0xffff);
595 /* dsll $25,$25,16 */
596 tramp
[8] = 0x0019cc38;
597 /* dsll $12,$12,16 */
598 tramp
[9] = 0x000c6438;
599 /* ori $25,low(fn) */
600 tramp
[10] = 0x37390000 | ((unsigned long)fn
& 0xffff);
602 tramp
[11] = 0x03200008;
603 /* ori $12,low(codeloc) */
604 tramp
[12] = 0x358c0000 | ((unsigned long)codeloc
& 0xffff);
610 closure
->user_data
= user_data
;
612 __builtin___clear_cache(clear_location
, clear_location
+ FFI_TRAMPOLINE_SIZE
);
618 * Decodes the arguments to a function, which will be stored on the
619 * stack. AR is the pointer to the beginning of the integer arguments
620 * (and, depending upon the arguments, some floating-point arguments
621 * as well). FPR is a pointer to the area where floating point
622 * registers have been saved, if any.
624 * RVALUE is the location where the function return value will be
625 * stored. CLOSURE is the prepared closure to invoke.
627 * This function should only be called from assembly, which is in
628 * turn called from a trampoline.
630 * Returns the function return type.
632 * Based on the similar routine for sparc.
635 ffi_closure_mips_inner_O32 (ffi_closure
*closure
,
636 void *rvalue
, ffi_arg
*ar
,
642 ffi_type
**arg_types
;
643 int i
, avn
, argn
, seen_int
;
646 avalue
= alloca (cif
->nargs
* sizeof (ffi_arg
));
647 avaluep
= alloca (cif
->nargs
* sizeof (ffi_arg
));
649 seen_int
= (cif
->abi
== FFI_O32_SOFT_FLOAT
);
652 if ((cif
->flags
>> (FFI_FLAG_BITS
* 2)) == FFI_TYPE_STRUCT
)
654 rvalue
= (void *)(UINT32
)ar
[0];
660 arg_types
= cif
->arg_types
;
664 if (i
< 2 && !seen_int
&&
665 (arg_types
[i
]->type
== FFI_TYPE_FLOAT
||
666 arg_types
[i
]->type
== FFI_TYPE_DOUBLE
))
669 if (arg_types
[i
]->type
== FFI_TYPE_FLOAT
)
670 avaluep
[i
] = ((char *) &fpr
[i
]) + sizeof (float);
673 avaluep
[i
] = (char *) &fpr
[i
];
677 if (arg_types
[i
]->alignment
== 8 && (argn
& 0x1))
679 switch (arg_types
[i
]->type
)
682 avaluep
[i
] = &avalue
[i
];
683 *(SINT8
*) &avalue
[i
] = (SINT8
) ar
[argn
];
687 avaluep
[i
] = &avalue
[i
];
688 *(UINT8
*) &avalue
[i
] = (UINT8
) ar
[argn
];
691 case FFI_TYPE_SINT16
:
692 avaluep
[i
] = &avalue
[i
];
693 *(SINT16
*) &avalue
[i
] = (SINT16
) ar
[argn
];
696 case FFI_TYPE_UINT16
:
697 avaluep
[i
] = &avalue
[i
];
698 *(UINT16
*) &avalue
[i
] = (UINT16
) ar
[argn
];
702 avaluep
[i
] = (char *) &ar
[argn
];
707 argn
+= ALIGN(arg_types
[i
]->size
, FFI_SIZEOF_ARG
) / FFI_SIZEOF_ARG
;
711 /* Invoke the closure. */
712 (closure
->fun
) (cif
, rvalue
, avaluep
, closure
->user_data
);
714 if (cif
->abi
== FFI_O32_SOFT_FLOAT
)
716 switch (cif
->rtype
->type
)
720 case FFI_TYPE_DOUBLE
:
721 return FFI_TYPE_UINT64
;
723 return cif
->rtype
->type
;
728 return cif
->rtype
->type
;
732 #if defined(FFI_MIPS_N32)
735 copy_struct_N32(char *target
, unsigned offset
, ffi_abi abi
, ffi_type
*type
,
736 int argn
, unsigned arg_offset
, ffi_arg
*ar
,
739 ffi_type
**elt_typep
= type
->elements
;
742 ffi_type
*elt_type
= *elt_typep
;
748 o
= ALIGN(offset
, elt_type
->alignment
);
749 arg_offset
+= o
- offset
;
751 argn
+= arg_offset
/ sizeof(ffi_arg
);
752 arg_offset
= arg_offset
% sizeof(ffi_arg
);
754 argp
= (char *)(ar
+ argn
);
755 fpp
= (char *)(argn
>= 8 ? ar
+ argn
: fpr
+ argn
);
757 tp
= target
+ offset
;
759 if (elt_type
->type
== FFI_TYPE_DOUBLE
)
760 *(double *)tp
= *(double *)fpp
;
762 memcpy(tp
, argp
+ arg_offset
, elt_type
->size
);
764 offset
+= elt_type
->size
;
765 arg_offset
+= elt_type
->size
;
767 argn
+= arg_offset
/ sizeof(ffi_arg
);
768 arg_offset
= arg_offset
% sizeof(ffi_arg
);
773 * Decodes the arguments to a function, which will be stored on the
774 * stack. AR is the pointer to the beginning of the integer
775 * arguments. FPR is a pointer to the area where floating point
776 * registers have been saved.
778 * RVALUE is the location where the function return value will be
779 * stored. CLOSURE is the prepared closure to invoke.
781 * This function should only be called from assembly, which is in
782 * turn called from a trampoline.
784 * Returns the function return flags.
788 ffi_closure_mips_inner_N32 (ffi_closure
*closure
,
789 void *rvalue
, ffi_arg
*ar
,
795 ffi_type
**arg_types
;
799 avalue
= alloca (cif
->nargs
* sizeof (ffi_arg
));
800 avaluep
= alloca (cif
->nargs
* sizeof (ffi_arg
));
804 if (cif
->rstruct_flag
)
806 #if _MIPS_SIM==_ABIN32
807 rvalue
= (void *)(UINT32
)ar
[0];
809 rvalue
= (void *)ar
[0];
816 arg_types
= cif
->arg_types
;
820 if (arg_types
[i
]->type
== FFI_TYPE_FLOAT
821 || arg_types
[i
]->type
== FFI_TYPE_DOUBLE
)
823 ffi_arg
*argp
= argn
>= 8 ? ar
+ argn
: fpr
+ argn
;
825 if (arg_types
[i
]->type
== FFI_TYPE_FLOAT
&& argn
< 8)
826 avaluep
[i
] = ((char *) argp
) + sizeof (float);
829 avaluep
[i
] = (char *) argp
;
833 unsigned type
= arg_types
[i
]->type
;
835 if (arg_types
[i
]->alignment
> sizeof(ffi_arg
))
836 argn
= ALIGN(argn
, arg_types
[i
]->alignment
/ sizeof(ffi_arg
));
838 ffi_arg
*argp
= ar
+ argn
;
840 /* The size of a pointer depends on the ABI */
841 if (type
== FFI_TYPE_POINTER
)
842 type
= (cif
->abi
== FFI_N64
) ? FFI_TYPE_SINT64
: FFI_TYPE_SINT32
;
847 avaluep
[i
] = &avalue
[i
];
848 *(SINT8
*) &avalue
[i
] = (SINT8
) *argp
;
852 avaluep
[i
] = &avalue
[i
];
853 *(UINT8
*) &avalue
[i
] = (UINT8
) *argp
;
856 case FFI_TYPE_SINT16
:
857 avaluep
[i
] = &avalue
[i
];
858 *(SINT16
*) &avalue
[i
] = (SINT16
) *argp
;
861 case FFI_TYPE_UINT16
:
862 avaluep
[i
] = &avalue
[i
];
863 *(UINT16
*) &avalue
[i
] = (UINT16
) *argp
;
866 case FFI_TYPE_SINT32
:
867 avaluep
[i
] = &avalue
[i
];
868 *(SINT32
*) &avalue
[i
] = (SINT32
) *argp
;
871 case FFI_TYPE_UINT32
:
872 avaluep
[i
] = &avalue
[i
];
873 *(UINT32
*) &avalue
[i
] = (UINT32
) *argp
;
876 case FFI_TYPE_STRUCT
:
879 /* Allocate space for the struct as at least part of
880 it was passed in registers. */
881 avaluep
[i
] = alloca(arg_types
[i
]->size
);
882 copy_struct_N32(avaluep
[i
], 0, cif
->abi
, arg_types
[i
],
887 /* Else fall through. */
889 avaluep
[i
] = (char *) argp
;
893 argn
+= ALIGN(arg_types
[i
]->size
, sizeof(ffi_arg
)) / sizeof(ffi_arg
);
897 /* Invoke the closure. */
898 (closure
->fun
) (cif
, rvalue
, avaluep
, closure
->user_data
);
900 return cif
->flags
>> (FFI_FLAG_BITS
* 8);
903 #endif /* FFI_MIPS_N32 */
905 #endif /* FFI_CLOSURES */