1/* { dg-do run } */
2/* { dg-require-effective-target sync_int_long } */
3/* { dg-options } */
4/* { dg-options "-march=i486" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
5
6/* Test basic functionality of the intrinsics.  */
7
8extern void abort (void);
9extern void *memcpy (void *, const void *, __SIZE_TYPE__);
10
11static int AI[18];
12static int init_si[18] = { 0,0,0,1,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 };
13static int test_si[18] = { 1,1,1,1,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 };
14
15static void
16do_si (void)
17{
18  if (__sync_val_compare_and_swap(AI+0, 0, 1) != 0)
19    abort ();
20  if (__sync_val_compare_and_swap(AI+0, 0, 1) != 1)
21    abort ();
22  if (__sync_bool_compare_and_swap(AI+1, 0, 1) != 1)
23    abort ();
24  if (__sync_bool_compare_and_swap(AI+1, 0, 1) != 0)
25    abort ();
26
27  if (__sync_lock_test_and_set(AI+2, 1) != 0)
28    abort ();
29
30  if (__sync_fetch_and_add(AI+4, 1) != 0)
31    abort ();
32  if (__sync_fetch_and_add(AI+5, 4) != 0)
33    abort ();
34  if (__sync_fetch_and_add(AI+6, 22) != 0)
35    abort ();
36  if (__sync_fetch_and_sub(AI+7, 12) != 0)
37    abort ();
38  if (__sync_fetch_and_and(AI+8, 7) != -1)
39    abort ();
40  if (__sync_fetch_and_or(AI+9, 8) != 0)
41    abort ();
42  if (__sync_fetch_and_xor(AI+10, 9) != 0)
43    abort ();
44  if (__sync_fetch_and_nand(AI+11, 7) != 0)
45    abort ();
46
47  if (__sync_add_and_fetch(AI+12, 1) != 1)
48    abort ();
49  if (__sync_sub_and_fetch(AI+13, 12) != -12)
50    abort ();
51  if (__sync_and_and_fetch(AI+14, 7) != 7)
52    abort ();
53  if (__sync_or_and_fetch(AI+15, 8) != 8)
54    abort ();
55  if (__sync_xor_and_fetch(AI+16, 9) != 9)
56    abort ();
57  if (__sync_nand_and_fetch(AI+17, 7) != 7)
58    abort ();
59}
60
61static long AL[18];
62static long init_di[18] = { 0,0,0,1,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 };
63static long test_di[18] = { 1,1,1,1,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 };
64
65static void
66do_di (void)
67{
68  if (__sync_val_compare_and_swap(AL+0, 0, 1) != 0)
69    abort ();
70  if (__sync_val_compare_and_swap(AL+0, 0, 1) != 1)
71    abort ();
72  if (__sync_bool_compare_and_swap(AL+1, 0, 1) != 1)
73    abort ();
74  if (__sync_bool_compare_and_swap(AL+1, 0, 1) != 0)
75    abort ();
76
77  if (__sync_lock_test_and_set(AL+2, 1) != 0)
78    abort ();
79
80  if (__sync_fetch_and_add(AL+4, 1) != 0)
81    abort ();
82  if (__sync_fetch_and_add(AL+5, 4) != 0)
83    abort ();
84  if (__sync_fetch_and_add(AL+6, 22) != 0)
85    abort ();
86  if (__sync_fetch_and_sub(AL+7, 12) != 0)
87    abort ();
88  if (__sync_fetch_and_and(AL+8, 7) != -1)
89    abort ();
90  if (__sync_fetch_and_or(AL+9, 8) != 0)
91    abort ();
92  if (__sync_fetch_and_xor(AL+10, 9) != 0)
93    abort ();
94  if (__sync_fetch_and_nand(AL+11, 7) != 0)
95    abort ();
96
97  if (__sync_add_and_fetch(AL+12, 1) != 1)
98    abort ();
99  if (__sync_sub_and_fetch(AL+13, 12) != -12)
100    abort ();
101  if (__sync_and_and_fetch(AL+14, 7) != 7)
102    abort ();
103  if (__sync_or_and_fetch(AL+15, 8) != 8)
104    abort ();
105  if (__sync_xor_and_fetch(AL+16, 9) != 9)
106    abort ();
107  if (__sync_nand_and_fetch(AL+17, 7) != 7)
108    abort ();
109}
110
111int main()
112{
113  memcpy(AI, init_si, sizeof(init_si));
114  memcpy(AL, init_di, sizeof(init_di));
115
116  do_si ();
117  do_di ();
118
119  if (memcmp (AI, test_si, sizeof(test_si)))
120    abort ();
121  if (memcmp (AL, test_di, sizeof(test_di)))
122    abort ();
123
124  return 0;
125}
126