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 } */
10
11#include "ffitest.h"
12
13static void
14closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
15		 void* userdata)
16{
17  *(ffi_arg*)resp =
18    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
19    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
20    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
21    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
22    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
23    (int)*(unsigned long long *)args[10] +
24    (int)*(unsigned long long *)args[11] +
25    (int)*(unsigned long long *)args[12] +
26    (int)*(unsigned long long *)args[13] +
27    (int)*(unsigned long long *)args[14] +
28    *(int *)args[15] + (int)(long)userdata;
29
30  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
31	 (int)*(unsigned long long *)args[0],
32	 (int)*(unsigned long long *)args[1],
33	 (int)*(unsigned long long *)args[2],
34	 (int)*(unsigned long long *)args[3],
35	 (int)*(unsigned long long *)args[4],
36	 (int)*(unsigned long long *)args[5],
37	 (int)*(unsigned long long *)args[6],
38	 (int)*(unsigned long long *)args[7],
39	 (int)*(unsigned long long *)args[8],
40	 (int)*(unsigned long long *)args[9],
41	 (int)*(unsigned long long *)args[10],
42	 (int)*(unsigned long long *)args[11],
43	 (int)*(unsigned long long *)args[12],
44	 (int)*(unsigned long long *)args[13],
45	 (int)*(unsigned long long *)args[14],
46	 *(int *)args[15],
47	 (int)(long)userdata, (int)*(ffi_arg *)resp);
48
49}
50
51typedef int (*closure_test_type0)(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, unsigned long long,
58				  unsigned long long, int);
59
60int main (void)
61{
62  ffi_cif cif;
63#ifndef USING_MMAP
64  static ffi_closure cl;
65#endif
66  ffi_closure *pcl;
67  ffi_type * cl_arg_types[17];
68  int i, res;
69
70#ifdef USING_MMAP
71  pcl = allocate_mmap (sizeof(ffi_closure));
72#else
73  pcl = &cl;
74#endif
75
76  for (i = 0; i < 15; i++) {
77    cl_arg_types[i] = &ffi_type_uint64;
78  }
79  cl_arg_types[15] = &ffi_type_sint;
80  cl_arg_types[16] = NULL;
81
82  /* Initialize the cif */
83  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
84		     &ffi_type_sint, cl_arg_types) == FFI_OK);
85
86  CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
87			 (void *) 3 /* userdata */) == FFI_OK);
88
89  res = (*((closure_test_type0)pcl))
90    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL,
91     13LL, 19LL, 21LL, 1);
92  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
93  printf("res: %d\n",res);
94  /* { dg-output "\nres: 680" } */
95
96  exit(0);
97}
98