|  | /* Area:		ffi_call, closure_call | 
|  | Purpose:		Check long double arguments. | 
|  | Limitations:	none. | 
|  | PR:			none. | 
|  | Originator:	Blake Chaffin	*/ | 
|  |  | 
|  | /* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have | 
|  | remove the xfail for arm*-*-* below, until we know more.  */ | 
|  | /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ | 
|  | /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ | 
|  |  | 
|  | #include "ffitest.h" | 
|  |  | 
|  | long double cls_ldouble_fn( | 
|  | long double	a1, | 
|  | long double	a2, | 
|  | long double	a3, | 
|  | long double	a4, | 
|  | long double	a5, | 
|  | long double	a6, | 
|  | long double	a7, | 
|  | long double	a8) | 
|  | { | 
|  | long double	r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; | 
|  |  | 
|  | printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", | 
|  | a1, a2, a3, a4, a5, a6, a7, a8, r); | 
|  |  | 
|  | return r; | 
|  | } | 
|  |  | 
|  | static void | 
|  | cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, | 
|  | void** args, void* userdata __UNUSED__) | 
|  | { | 
|  | long double	a1	= *(long double*)args[0]; | 
|  | long double	a2	= *(long double*)args[1]; | 
|  | long double	a3	= *(long double*)args[2]; | 
|  | long double	a4	= *(long double*)args[3]; | 
|  | long double	a5	= *(long double*)args[4]; | 
|  | long double	a6	= *(long double*)args[5]; | 
|  | long double	a7	= *(long double*)args[6]; | 
|  | long double	a8	= *(long double*)args[7]; | 
|  |  | 
|  | *(long double*)resp = cls_ldouble_fn( | 
|  | a1, a2, a3, a4, a5, a6, a7, a8); | 
|  | } | 
|  |  | 
|  | int main(void) | 
|  | { | 
|  | ffi_cif	cif; | 
|  | void* code; | 
|  | ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); | 
|  | void*			args[9]; | 
|  | ffi_type*		arg_types[9]; | 
|  | long double		res	= 0; | 
|  |  | 
|  | long double	arg1	= 1; | 
|  | long double	arg2	= 2; | 
|  | long double	arg3	= 3; | 
|  | long double	arg4	= 4; | 
|  | long double	arg5	= 5; | 
|  | long double	arg6	= 6; | 
|  | long double	arg7	= 7; | 
|  | long double	arg8	= 8; | 
|  |  | 
|  | arg_types[0] = &ffi_type_longdouble; | 
|  | arg_types[1] = &ffi_type_longdouble; | 
|  | arg_types[2] = &ffi_type_longdouble; | 
|  | arg_types[3] = &ffi_type_longdouble; | 
|  | arg_types[4] = &ffi_type_longdouble; | 
|  | arg_types[5] = &ffi_type_longdouble; | 
|  | arg_types[6] = &ffi_type_longdouble; | 
|  | arg_types[7] = &ffi_type_longdouble; | 
|  | arg_types[8] = NULL; | 
|  |  | 
|  | CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, | 
|  | arg_types) == FFI_OK); | 
|  |  | 
|  | args[0] = &arg1; | 
|  | args[1] = &arg2; | 
|  | args[2] = &arg3; | 
|  | args[3] = &arg4; | 
|  | args[4] = &arg5; | 
|  | args[5] = &arg6; | 
|  | args[6] = &arg7; | 
|  | args[7] = &arg8; | 
|  | args[8] = NULL; | 
|  |  | 
|  | ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); | 
|  | /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ | 
|  | printf("res: %Lg\n", res); | 
|  | /* { dg-output "\nres: 36" } */ | 
|  |  | 
|  | CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK); | 
|  |  | 
|  | res = ((long double(*)(long double, long double, long double, long double, | 
|  | long double, long double, long double, long double))(code))(arg1, arg2, | 
|  | arg3, arg4, arg5, arg6, arg7, arg8); | 
|  | /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ | 
|  | printf("res: %Lg\n", res); | 
|  | /* { dg-output "\nres: 36" } */ | 
|  |  | 
|  | return 0; | 
|  | } |