1/* Area:	closure_call
2   Purpose:	Check multiple long long values passing.
3		Also, exceed the limit of gpr and fpr registers on PowerPC
4		Darwin.
5   Limitations:	none.
6   PR:		none.
7   Originator:	<andreast@gcc.gnu.org> 20031026	 */
8
9/* { dg-do run { xfail mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
10
11#include "ffitest.h"
12
13static void
14closure_test_fn0(ffi_cif* cif,void* resp,void** args, void* userdata)
15{
16  *(ffi_arg*)resp =
17    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
18    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
19    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
20    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
21    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
22    (int)*(unsigned long long *)args[10] +
23    (int)*(unsigned long long *)args[11] +
24    (int)*(unsigned long long *)args[12] +
25    (int)*(unsigned long long *)args[13] +
26    (int)*(unsigned long long *)args[14] +
27    *(int *)args[15] + (int)(long)userdata;
28
29  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
30	 (int)*(unsigned long long *)args[0],
31	 (int)*(unsigned long long *)args[1],
32	 (int)*(unsigned long long *)args[2],
33	 (int)*(unsigned long long *)args[3],
34	 (int)*(unsigned long long *)args[4],
35	 (int)*(unsigned long long *)args[5],
36	 (int)*(unsigned long long *)args[6],
37	 (int)*(unsigned long long *)args[7],
38	 (int)*(unsigned long long *)args[8],
39	 (int)*(unsigned long long *)args[9],
40	 (int)*(unsigned long long *)args[10],
41	 (int)*(unsigned long long *)args[11],
42	 (int)*(unsigned long long *)args[12],
43	 (int)*(unsigned long long *)args[13],
44	 (int)*(unsigned long long *)args[14],
45	 *(int *)args[15],
46	 (int)(long)userdata, (int)*(ffi_arg *)resp);
47
48}
49
50typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
51				  unsigned long long, unsigned long long,
52				  unsigned long long, unsigned long long,
53				  unsigned long long, unsigned long long,
54				  unsigned long long, unsigned long long,
55				  unsigned long long, unsigned long long,
56				  unsigned long long, unsigned long long,
57				  unsigned long long, int);
58
59int main (void)
60{
61  ffi_cif cif;
62#ifndef USING_MMAP
63  static ffi_closure cl;
64#endif
65  ffi_closure *pcl;
66  ffi_type * cl_arg_types[17];
67  int i, res;
68
69#ifdef USING_MMAP
70  pcl = allocate_mmap (sizeof(ffi_closure));
71#else
72  pcl = &cl;
73#endif
74
75  for (i = 0; i < 15; i++) {
76    cl_arg_types[i] = &ffi_type_uint64;
77  }
78  cl_arg_types[15] = &ffi_type_uint;
79  cl_arg_types[16] = NULL;
80
81  /* Initialize the cif */
82  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
83		     &ffi_type_sint, cl_arg_types) == FFI_OK);
84
85  CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
86			 (void *) 3 /* userdata */) == FFI_OK);
87
88  res = (*((closure_test_type0)pcl))
89    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL,
90     13LL, 19LL, 21LL, 1);
91  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
92  printf("res: %d\n",res);
93  /* { dg-output "\nres: 680" } */
94
95  exit(0);
96}
97