1457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique/* Area:	closure_call
2457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique   Purpose:	Check multiple long long values passing.
3457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique		Exceed the limit of gpr registers on PowerPC
4457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique		Darwin.
5457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique   Limitations:	none.
6457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique   PR:		none.
7457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique   Originator:	<andreast@gcc.gnu.org> 20031026	 */
8457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
9457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique/* { dg-do run } */
10457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique#include "ffitest.h"
11457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
12457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piquestatic void
13457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piqueclosure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args,
14457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique		 void* userdata)
15457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique{
16457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  *(ffi_arg*)resp =
17457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
18457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
19457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
20457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
21457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
22457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(int *)args[10] +
23457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[11] +
24457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[12] +
25457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[13] +
26457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (int)*(unsigned long long *)args[14] +
27457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    *(int *)args[15] + (intptr_t)userdata;
28457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
29457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
30457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[0],
31457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[1],
32457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[2],
33457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[3],
34457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[4],
35457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[5],
36457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[6],
37457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[7],
38457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[8],
39457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[9],
40457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(int *)args[10],
41457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[11],
42457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[12],
43457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[13],
44457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)*(unsigned long long *)args[14],
45457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 *(int *)args[15],
46457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
47457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
48457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique}
49457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
50457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piquetypedef int (*closure_test_type0)(unsigned long long, unsigned long long,
51457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  unsigned long long, unsigned long long,
52457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  unsigned long long, unsigned long long,
53457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  unsigned long long, unsigned long long,
54457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  unsigned long long, unsigned long long,
55457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  int, unsigned long long,
56457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  unsigned long long, unsigned long long,
57457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique				  unsigned long long, int);
58457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
59457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piqueint main (void)
60457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique{
61457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  ffi_cif cif;
62457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  void *code;
63457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
64457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  ffi_type * cl_arg_types[17];
65457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  int i, res;
66457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
67457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  for (i = 0; i < 10; i++) {
68457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    cl_arg_types[i] = &ffi_type_uint64;
69457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  }
70457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  cl_arg_types[10] = &ffi_type_sint;
71457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  for (i = 11; i < 15; i++) {
72457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    cl_arg_types[i] = &ffi_type_uint64;
73457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  }
74457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  cl_arg_types[15] = &ffi_type_sint;
75457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  cl_arg_types[16] = NULL;
76457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
77457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  /* Initialize the cif */
78457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
79457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique		     &ffi_type_sint, cl_arg_types) == FFI_OK);
80457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
81457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5,
82457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique                             (void *) 3 /* userdata */, code) == FFI_OK);
83457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
84457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  res = (*((closure_test_type0)code))
85457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL,
86457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique     13LL, 19LL, 21LL, 1);
87457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
88457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  printf("res: %d\n",res);
89457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  /* { dg-output "\nres: 680" } */
90457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique
91457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique  exit(0);
92457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique}
93