1/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "" { target *-*-* } 0 } */
2/* { dg-options "-ffat-lto-objects" } */
3
4/* Validate that each of the __sync builtins compiles.  This won't
5   necessarily link, since the target might not support the builtin,
6   so this may result in external library calls.  */
7
8void test_op_ignore (void)
9{
10signed char sc[2];
11unsigned char uc[2];
12signed short ss[2];
13unsigned short us[2];
14signed int si[2];
15unsigned int ui[2];
16signed long sl[2];
17unsigned long ul[2];
18signed long long sll[2];
19unsigned long long ull[2];
20  (void) __sync_fetch_and_add (&sc[1], -1);
21  (void) __sync_fetch_and_add (&uc[1], -1);
22  (void) __sync_fetch_and_add (&ss[1], -1);
23  (void) __sync_fetch_and_add (&us[1], -1);
24  (void) __sync_fetch_and_add (&si[1], -1);
25  (void) __sync_fetch_and_add (&ui[1], -1);
26  (void) __sync_fetch_and_add (&sl[1], -1);
27  (void) __sync_fetch_and_add (&ul[1], -1);
28  (void) __sync_fetch_and_add (&sll[1], -1);
29  (void) __sync_fetch_and_add (&ull[1], -1);
30
31  (void) __sync_fetch_and_sub (&sc[1], -1);
32  (void) __sync_fetch_and_sub (&uc[1], -1);
33  (void) __sync_fetch_and_sub (&ss[1], -1);
34  (void) __sync_fetch_and_sub (&us[1], -1);
35  (void) __sync_fetch_and_sub (&si[1], -1);
36  (void) __sync_fetch_and_sub (&ui[1], -1);
37  (void) __sync_fetch_and_sub (&sl[1], -1);
38  (void) __sync_fetch_and_sub (&ul[1], -1);
39  (void) __sync_fetch_and_sub (&sll[1], -1);
40  (void) __sync_fetch_and_sub (&ull[1], -1);
41
42  (void) __sync_fetch_and_or (&sc[1], -1);
43  (void) __sync_fetch_and_or (&uc[1], -1);
44  (void) __sync_fetch_and_or (&ss[1], -1);
45  (void) __sync_fetch_and_or (&us[1], -1);
46  (void) __sync_fetch_and_or (&si[1], -1);
47  (void) __sync_fetch_and_or (&ui[1], -1);
48  (void) __sync_fetch_and_or (&sl[1], -1);
49  (void) __sync_fetch_and_or (&ul[1], -1);
50  (void) __sync_fetch_and_or (&sll[1], -1);
51  (void) __sync_fetch_and_or (&ull[1], -1);
52
53  (void) __sync_fetch_and_xor (&sc[1], -1);
54  (void) __sync_fetch_and_xor (&uc[1], -1);
55  (void) __sync_fetch_and_xor (&ss[1], -1);
56  (void) __sync_fetch_and_xor (&us[1], -1);
57  (void) __sync_fetch_and_xor (&si[1], -1);
58  (void) __sync_fetch_and_xor (&ui[1], -1);
59  (void) __sync_fetch_and_xor (&sl[1], -1);
60  (void) __sync_fetch_and_xor (&ul[1], -1);
61  (void) __sync_fetch_and_xor (&sll[1], -1);
62  (void) __sync_fetch_and_xor (&ull[1], -1);
63
64  (void) __sync_fetch_and_and (&sc[1], -1);
65  (void) __sync_fetch_and_and (&uc[1], -1);
66  (void) __sync_fetch_and_and (&ss[1], -1);
67  (void) __sync_fetch_and_and (&us[1], -1);
68  (void) __sync_fetch_and_and (&si[1], -1);
69  (void) __sync_fetch_and_and (&ui[1], -1);
70  (void) __sync_fetch_and_and (&sl[1], -1);
71  (void) __sync_fetch_and_and (&ul[1], -1);
72  (void) __sync_fetch_and_and (&sll[1], -1);
73  (void) __sync_fetch_and_and (&ull[1], -1);
74
75  (void) __sync_fetch_and_nand (&sc[1], -1);
76  (void) __sync_fetch_and_nand (&uc[1], -1);
77  (void) __sync_fetch_and_nand (&ss[1], -1);
78  (void) __sync_fetch_and_nand (&us[1], -1);
79  (void) __sync_fetch_and_nand (&si[1], -1);
80  (void) __sync_fetch_and_nand (&ui[1], -1);
81  (void) __sync_fetch_and_nand (&sl[1], -1);
82  (void) __sync_fetch_and_nand (&ul[1], -1);
83  (void) __sync_fetch_and_nand (&sll[1], -1);
84  (void) __sync_fetch_and_nand (&ull[1], -1);
85}
86
87void test_fetch_and_op (void)
88{
89signed char sc[2];
90unsigned char uc[2];
91signed short ss[2];
92unsigned short us[2];
93signed int si[2];
94unsigned int ui[2];
95signed long sl[2];
96unsigned long ul[2];
97signed long long sll[2];
98unsigned long long ull[2];
99  sc[1] = __sync_fetch_and_add (&sc[1], -11);
100  uc[1] = __sync_fetch_and_add (&uc[1], -11);
101  ss[1] = __sync_fetch_and_add (&ss[1], -11);
102  us[1] = __sync_fetch_and_add (&us[1], -11);
103  si[1] = __sync_fetch_and_add (&si[1], -11);
104  ui[1] = __sync_fetch_and_add (&ui[1], -11);
105  sl[1] = __sync_fetch_and_add (&sl[1], -11);
106  ul[1] = __sync_fetch_and_add (&ul[1], -11);
107  sll[1] = __sync_fetch_and_add (&sll[1], -11);
108  ull[1] = __sync_fetch_and_add (&ull[1], -11);
109
110  sc[1] = __sync_fetch_and_sub (&sc[1], -11);
111  uc[1] = __sync_fetch_and_sub (&uc[1], -11);
112  ss[1] = __sync_fetch_and_sub (&ss[1], -11);
113  us[1] = __sync_fetch_and_sub (&us[1], -11);
114  si[1] = __sync_fetch_and_sub (&si[1], -11);
115  ui[1] = __sync_fetch_and_sub (&ui[1], -11);
116  sl[1] = __sync_fetch_and_sub (&sl[1], -11);
117  ul[1] = __sync_fetch_and_sub (&ul[1], -11);
118  sll[1] = __sync_fetch_and_sub (&sll[1], -11);
119  ull[1] = __sync_fetch_and_sub (&ull[1], -11);
120
121  sc[1] = __sync_fetch_and_or (&sc[1], -11);
122  uc[1] = __sync_fetch_and_or (&uc[1], -11);
123  ss[1] = __sync_fetch_and_or (&ss[1], -11);
124  us[1] = __sync_fetch_and_or (&us[1], -11);
125  si[1] = __sync_fetch_and_or (&si[1], -11);
126  ui[1] = __sync_fetch_and_or (&ui[1], -11);
127  sl[1] = __sync_fetch_and_or (&sl[1], -11);
128  ul[1] = __sync_fetch_and_or (&ul[1], -11);
129  sll[1] = __sync_fetch_and_or (&sll[1], -11);
130  ull[1] = __sync_fetch_and_or (&ull[1], -11);
131
132  sc[1] = __sync_fetch_and_xor (&sc[1], -11);
133  uc[1] = __sync_fetch_and_xor (&uc[1], -11);
134  ss[1] = __sync_fetch_and_xor (&ss[1], -11);
135  us[1] = __sync_fetch_and_xor (&us[1], -11);
136  si[1] = __sync_fetch_and_xor (&si[1], -11);
137  ui[1] = __sync_fetch_and_xor (&ui[1], -11);
138  sl[1] = __sync_fetch_and_xor (&sl[1], -11);
139  ul[1] = __sync_fetch_and_xor (&ul[1], -11);
140  sll[1] = __sync_fetch_and_xor (&sll[1], -11);
141  ull[1] = __sync_fetch_and_xor (&ull[1], -11);
142
143  sc[1] = __sync_fetch_and_and (&sc[1], -11);
144  uc[1] = __sync_fetch_and_and (&uc[1], -11);
145  ss[1] = __sync_fetch_and_and (&ss[1], -11);
146  us[1] = __sync_fetch_and_and (&us[1], -11);
147  si[1] = __sync_fetch_and_and (&si[1], -11);
148  ui[1] = __sync_fetch_and_and (&ui[1], -11);
149  sl[1] = __sync_fetch_and_and (&sl[1], -11);
150  ul[1] = __sync_fetch_and_and (&ul[1], -11);
151  sll[1] = __sync_fetch_and_and (&sll[1], -11);
152  ull[1] = __sync_fetch_and_and (&ull[1], -11);
153
154  sc[1] = __sync_fetch_and_nand (&sc[1], -11);
155  uc[1] = __sync_fetch_and_nand (&uc[1], -11);
156  ss[1] = __sync_fetch_and_nand (&ss[1], -11);
157  us[1] = __sync_fetch_and_nand (&us[1], -11);
158  si[1] = __sync_fetch_and_nand (&si[1], -11);
159  ui[1] = __sync_fetch_and_nand (&ui[1], -11);
160  sl[1] = __sync_fetch_and_nand (&sl[1], -11);
161  ul[1] = __sync_fetch_and_nand (&ul[1], -11);
162  sll[1] = __sync_fetch_and_nand (&sll[1], -11);
163  ull[1] = __sync_fetch_and_nand (&ull[1], -11);
164}
165
166void test_lock (void)
167{
168signed char sc[2];
169unsigned char uc[2];
170signed short ss[2];
171unsigned short us[2];
172signed int si[2];
173unsigned int ui[2];
174signed long sl[2];
175unsigned long ul[2];
176signed long long sll[2];
177unsigned long long ull[2];
178  sc[1] = __sync_lock_test_and_set (&sc[1], -1);
179  uc[1] = __sync_lock_test_and_set (&uc[1], -1);
180  ss[1] = __sync_lock_test_and_set (&ss[1], -1);
181  us[1] = __sync_lock_test_and_set (&us[1], -1);
182  si[1] = __sync_lock_test_and_set (&si[1], -1);
183  ui[1] = __sync_lock_test_and_set (&ui[1], -1);
184  sl[1] = __sync_lock_test_and_set (&sl[1], -1);
185  ul[1] = __sync_lock_test_and_set (&ul[1], -1);
186  sll[1] = __sync_lock_test_and_set (&sll[1], -1);
187  ull[1] = __sync_lock_test_and_set (&ull[1], -1);
188}
189