1/* Area:		ffi_call, closure_call
2   Purpose:		Check long double arguments.
3   Limitations:	none.
4   PR:			none.
5   Originator:	Blake Chaffin	*/
6
7/* { dg-do run { xfail mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
8/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
9
10#include "ffitest.h"
11
12long double cls_ldouble_fn(
13	long double	a1,
14	long double	a2,
15	long double	a3,
16	long double	a4,
17	long double	a5,
18	long double	a6,
19	long double	a7,
20	long double	a8)
21{
22	long double	r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
23
24	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n",
25		a1, a2, a3, a4, a5, a6, a7, a8, r);
26
27	return r;
28}
29
30static void
31cls_ldouble_gn(ffi_cif* cif, void* resp, void** args, void* userdata)
32{
33	long double	a1	= *(long double*)args[0];
34	long double	a2	= *(long double*)args[1];
35	long double	a3	= *(long double*)args[2];
36	long double	a4	= *(long double*)args[3];
37	long double	a5	= *(long double*)args[4];
38	long double	a6	= *(long double*)args[5];
39	long double	a7	= *(long double*)args[6];
40	long double	a8	= *(long double*)args[7];
41
42	*(long double*)resp = cls_ldouble_fn(
43		a1, a2, a3, a4, a5, a6, a7, a8);
44}
45
46int main(void)
47{
48	ffi_cif	cif;
49#ifndef USING_MMAP
50	static ffi_closure	cl;
51#endif
52	ffi_closure*	pcl;
53	void*			args[9];
54	ffi_type*		arg_types[9];
55	long double		res	= 0;
56
57#ifdef USING_MMAP
58	pcl = allocate_mmap(sizeof(ffi_closure));
59#else
60	pcl = &cl;
61#endif
62
63	long double	arg1	= 1;
64	long double	arg2	= 2;
65	long double	arg3	= 3;
66	long double	arg4	= 4;
67	long double	arg5	= 5;
68	long double	arg6	= 6;
69	long double	arg7	= 7;
70	long double	arg8	= 8;
71
72	arg_types[0] = &ffi_type_longdouble;
73	arg_types[1] = &ffi_type_longdouble;
74	arg_types[2] = &ffi_type_longdouble;
75	arg_types[3] = &ffi_type_longdouble;
76	arg_types[4] = &ffi_type_longdouble;
77	arg_types[5] = &ffi_type_longdouble;
78	arg_types[6] = &ffi_type_longdouble;
79	arg_types[7] = &ffi_type_longdouble;
80	arg_types[8] = NULL;
81
82	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble,
83		arg_types) == FFI_OK);
84
85	args[0] = &arg1;
86	args[1] = &arg2;
87	args[2] = &arg3;
88	args[3] = &arg4;
89	args[4] = &arg5;
90	args[5] = &arg6;
91	args[6] = &arg7;
92	args[7] = &arg8;
93	args[8] = NULL;
94
95	ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args);
96	/* { dg-output "1 2 3 4 5 6 7 8: 36" } */
97	printf("res: %Lg\n", res);
98	/* { dg-output "\nres: 36" } */
99
100	CHECK(ffi_prep_closure(pcl, &cif, cls_ldouble_gn, NULL) == FFI_OK);
101
102	res = ((long double(*)(long double, long double, long double, long double,
103		long double, long double, long double, long double))(pcl))(arg1, arg2,
104		arg3, arg4, arg5, arg6, arg7, arg8);
105	/* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */
106	printf("res: %Lg\n", res);
107	/* { dg-output "\nres: 36" } */
108
109	return 0;
110}
111