1 /* Area:	ffi_call
2    Purpose:	Check return value double, with many arguments
3    Limitations:	none.
4    PR:		none.
5    Originator:	From the original ffitest.c  */
6 
7 /* { dg-do run } */
8 #include "ffitest.h"
9 
10 #include <stdlib.h>
11 #include <float.h>
12 #include <math.h>
13 
many(double f1,double f2,double f3,double f4,double f5,double f6,double f7,double f8,double f9,double f10,double f11,double f12,double f13)14 static double many(double f1,
15 		  double f2,
16 		  double f3,
17 		  double f4,
18 		  double f5,
19 		  double f6,
20 		  double f7,
21 		  double f8,
22 		  double f9,
23 		  double f10,
24 		  double f11,
25 		  double f12,
26 		  double f13)
27 {
28 #if 0
29   printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
30 	 (double) f1, (double) f2, (double) f3, (double) f4, (double) f5,
31 	 (double) f6, (double) f7, (double) f8, (double) f9, (double) f10,
32 	 (double) f11, (double) f12, (double) f13);
33 #endif
34 
35   return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
36 }
37 
main(void)38 int main (void)
39 {
40   ffi_cif cif;
41   ffi_type *args[13];
42   void *values[13];
43   double fa[13];
44   double f, ff;
45   int i;
46 
47   for (i = 0; i < 13; i++)
48     {
49       args[i] = &ffi_type_double;
50       values[i] = &fa[i];
51       fa[i] = (double) i;
52     }
53 
54     /* Initialize the cif */
55     CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13,
56 		       &ffi_type_double, args) == FFI_OK);
57 
58     ffi_call(&cif, FFI_FN(many), &f, values);
59 
60     ff =  many(fa[0], fa[1],
61 	       fa[2], fa[3],
62 	       fa[4], fa[5],
63 	       fa[6], fa[7],
64 	       fa[8], fa[9],
65 	       fa[10],fa[11],fa[12]);
66     if (fabs(f - ff) < FLT_EPSILON)
67       exit(0);
68     else
69       abort();
70 }
71