annotate gcc/testsuite/gcc.dg/atomic-op-2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Test __atomic routines for existence and proper execution on 2 byte
kono
parents:
diff changeset
2 values with each valid memory model. */
kono
parents:
diff changeset
3 /* { dg-do run } */
kono
parents:
diff changeset
4 /* { dg-require-effective-target sync_char_short } */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 /* Test the execution of the __atomic_*OP builtin routines for a short. */
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 extern void abort(void);
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 short v, count, res;
kono
parents:
diff changeset
12 const short init = ~0;
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 /* The fetch_op routines return the original value before the operation. */
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 void
kono
parents:
diff changeset
17 test_fetch_add ()
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 v = 0;
kono
parents:
diff changeset
20 count = 1;
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 if (__atomic_fetch_add (&v, count, __ATOMIC_RELAXED) != 0)
kono
parents:
diff changeset
23 abort ();
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 if (__atomic_fetch_add (&v, 1, __ATOMIC_CONSUME) != 1)
kono
parents:
diff changeset
26 abort ();
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 if (__atomic_fetch_add (&v, count, __ATOMIC_ACQUIRE) != 2)
kono
parents:
diff changeset
29 abort ();
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 if (__atomic_fetch_add (&v, 1, __ATOMIC_RELEASE) != 3)
kono
parents:
diff changeset
32 abort ();
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 if (__atomic_fetch_add (&v, count, __ATOMIC_ACQ_REL) != 4)
kono
parents:
diff changeset
35 abort ();
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 if (__atomic_fetch_add (&v, 1, __ATOMIC_SEQ_CST) != 5)
kono
parents:
diff changeset
38 abort ();
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 void
kono
parents:
diff changeset
43 test_fetch_sub()
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 v = res = 20;
kono
parents:
diff changeset
46 count = 0;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 if (__atomic_fetch_sub (&v, count + 1, __ATOMIC_RELAXED) != res--)
kono
parents:
diff changeset
49 abort ();
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 if (__atomic_fetch_sub (&v, 1, __ATOMIC_CONSUME) != res--)
kono
parents:
diff changeset
52 abort ();
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 if (__atomic_fetch_sub (&v, count + 1, __ATOMIC_ACQUIRE) != res--)
kono
parents:
diff changeset
55 abort ();
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 if (__atomic_fetch_sub (&v, 1, __ATOMIC_RELEASE) != res--)
kono
parents:
diff changeset
58 abort ();
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 if (__atomic_fetch_sub (&v, count + 1, __ATOMIC_ACQ_REL) != res--)
kono
parents:
diff changeset
61 abort ();
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 if (__atomic_fetch_sub (&v, 1, __ATOMIC_SEQ_CST) != res--)
kono
parents:
diff changeset
64 abort ();
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 void
kono
parents:
diff changeset
68 test_fetch_and ()
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 v = init;
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 if (__atomic_fetch_and (&v, 0, __ATOMIC_RELAXED) != init)
kono
parents:
diff changeset
73 abort ();
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 if (__atomic_fetch_and (&v, init, __ATOMIC_CONSUME) != 0)
kono
parents:
diff changeset
76 abort ();
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 if (__atomic_fetch_and (&v, 0, __ATOMIC_ACQUIRE) != 0)
kono
parents:
diff changeset
79 abort ();
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 v = ~v;
kono
parents:
diff changeset
82 if (__atomic_fetch_and (&v, init, __ATOMIC_RELEASE) != init)
kono
parents:
diff changeset
83 abort ();
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 if (__atomic_fetch_and (&v, 0, __ATOMIC_ACQ_REL) != init)
kono
parents:
diff changeset
86 abort ();
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 if (__atomic_fetch_and (&v, 0, __ATOMIC_SEQ_CST) != 0)
kono
parents:
diff changeset
89 abort ();
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 void
kono
parents:
diff changeset
93 test_fetch_nand ()
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 v = init;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 if (__atomic_fetch_nand (&v, 0, __ATOMIC_RELAXED) != init)
kono
parents:
diff changeset
98 abort ();
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 if (__atomic_fetch_nand (&v, init, __ATOMIC_CONSUME) != init)
kono
parents:
diff changeset
101 abort ();
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 if (__atomic_fetch_nand (&v, 0, __ATOMIC_ACQUIRE) != 0 )
kono
parents:
diff changeset
104 abort ();
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 if (__atomic_fetch_nand (&v, init, __ATOMIC_RELEASE) != init)
kono
parents:
diff changeset
107 abort ();
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 if (__atomic_fetch_nand (&v, init, __ATOMIC_ACQ_REL) != 0)
kono
parents:
diff changeset
110 abort ();
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 if (__atomic_fetch_nand (&v, 0, __ATOMIC_SEQ_CST) != init)
kono
parents:
diff changeset
113 abort ();
kono
parents:
diff changeset
114 }
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 void
kono
parents:
diff changeset
117 test_fetch_xor ()
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 v = init;
kono
parents:
diff changeset
120 count = 0;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 if (__atomic_fetch_xor (&v, count, __ATOMIC_RELAXED) != init)
kono
parents:
diff changeset
123 abort ();
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 if (__atomic_fetch_xor (&v, ~count, __ATOMIC_CONSUME) != init)
kono
parents:
diff changeset
126 abort ();
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 if (__atomic_fetch_xor (&v, 0, __ATOMIC_ACQUIRE) != 0)
kono
parents:
diff changeset
129 abort ();
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 if (__atomic_fetch_xor (&v, ~count, __ATOMIC_RELEASE) != 0)
kono
parents:
diff changeset
132 abort ();
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 if (__atomic_fetch_xor (&v, 0, __ATOMIC_ACQ_REL) != init)
kono
parents:
diff changeset
135 abort ();
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 if (__atomic_fetch_xor (&v, ~count, __ATOMIC_SEQ_CST) != init)
kono
parents:
diff changeset
138 abort ();
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 void
kono
parents:
diff changeset
142 test_fetch_or ()
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 v = 0;
kono
parents:
diff changeset
145 count = 1;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 if (__atomic_fetch_or (&v, count, __ATOMIC_RELAXED) != 0)
kono
parents:
diff changeset
148 abort ();
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 count *= 2;
kono
parents:
diff changeset
151 if (__atomic_fetch_or (&v, 2, __ATOMIC_CONSUME) != 1)
kono
parents:
diff changeset
152 abort ();
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 count *= 2;
kono
parents:
diff changeset
155 if (__atomic_fetch_or (&v, count, __ATOMIC_ACQUIRE) != 3)
kono
parents:
diff changeset
156 abort ();
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 count *= 2;
kono
parents:
diff changeset
159 if (__atomic_fetch_or (&v, 8, __ATOMIC_RELEASE) != 7)
kono
parents:
diff changeset
160 abort ();
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 count *= 2;
kono
parents:
diff changeset
163 if (__atomic_fetch_or (&v, count, __ATOMIC_ACQ_REL) != 15)
kono
parents:
diff changeset
164 abort ();
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 count *= 2;
kono
parents:
diff changeset
167 if (__atomic_fetch_or (&v, count, __ATOMIC_SEQ_CST) != 31)
kono
parents:
diff changeset
168 abort ();
kono
parents:
diff changeset
169 }
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 /* The OP_fetch routines return the new value after the operation. */
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 void
kono
parents:
diff changeset
174 test_add_fetch ()
kono
parents:
diff changeset
175 {
kono
parents:
diff changeset
176 v = 0;
kono
parents:
diff changeset
177 count = 1;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 if (__atomic_add_fetch (&v, count, __ATOMIC_RELAXED) != 1)
kono
parents:
diff changeset
180 abort ();
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 if (__atomic_add_fetch (&v, 1, __ATOMIC_CONSUME) != 2)
kono
parents:
diff changeset
183 abort ();
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 if (__atomic_add_fetch (&v, count, __ATOMIC_ACQUIRE) != 3)
kono
parents:
diff changeset
186 abort ();
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 if (__atomic_add_fetch (&v, 1, __ATOMIC_RELEASE) != 4)
kono
parents:
diff changeset
189 abort ();
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 if (__atomic_add_fetch (&v, count, __ATOMIC_ACQ_REL) != 5)
kono
parents:
diff changeset
192 abort ();
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 if (__atomic_add_fetch (&v, count, __ATOMIC_SEQ_CST) != 6)
kono
parents:
diff changeset
195 abort ();
kono
parents:
diff changeset
196 }
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 void
kono
parents:
diff changeset
200 test_sub_fetch ()
kono
parents:
diff changeset
201 {
kono
parents:
diff changeset
202 v = res = 20;
kono
parents:
diff changeset
203 count = 0;
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 if (__atomic_sub_fetch (&v, count + 1, __ATOMIC_RELAXED) != --res)
kono
parents:
diff changeset
206 abort ();
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 if (__atomic_sub_fetch (&v, 1, __ATOMIC_CONSUME) != --res)
kono
parents:
diff changeset
209 abort ();
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 if (__atomic_sub_fetch (&v, count + 1, __ATOMIC_ACQUIRE) != --res)
kono
parents:
diff changeset
212 abort ();
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 if (__atomic_sub_fetch (&v, 1, __ATOMIC_RELEASE) != --res)
kono
parents:
diff changeset
215 abort ();
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 if (__atomic_sub_fetch (&v, count + 1, __ATOMIC_ACQ_REL) != --res)
kono
parents:
diff changeset
218 abort ();
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 if (__atomic_sub_fetch (&v, count + 1, __ATOMIC_SEQ_CST) != --res)
kono
parents:
diff changeset
221 abort ();
kono
parents:
diff changeset
222 }
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 void
kono
parents:
diff changeset
225 test_and_fetch ()
kono
parents:
diff changeset
226 {
kono
parents:
diff changeset
227 v = init;
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 if (__atomic_and_fetch (&v, 0, __ATOMIC_RELAXED) != 0)
kono
parents:
diff changeset
230 abort ();
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 v = init;
kono
parents:
diff changeset
233 if (__atomic_and_fetch (&v, init, __ATOMIC_CONSUME) != init)
kono
parents:
diff changeset
234 abort ();
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 if (__atomic_and_fetch (&v, 0, __ATOMIC_ACQUIRE) != 0)
kono
parents:
diff changeset
237 abort ();
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 v = ~v;
kono
parents:
diff changeset
240 if (__atomic_and_fetch (&v, init, __ATOMIC_RELEASE) != init)
kono
parents:
diff changeset
241 abort ();
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 if (__atomic_and_fetch (&v, 0, __ATOMIC_ACQ_REL) != 0)
kono
parents:
diff changeset
244 abort ();
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 v = ~v;
kono
parents:
diff changeset
247 if (__atomic_and_fetch (&v, 0, __ATOMIC_SEQ_CST) != 0)
kono
parents:
diff changeset
248 abort ();
kono
parents:
diff changeset
249 }
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 void
kono
parents:
diff changeset
252 test_nand_fetch ()
kono
parents:
diff changeset
253 {
kono
parents:
diff changeset
254 v = init;
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 if (__atomic_nand_fetch (&v, 0, __ATOMIC_RELAXED) != init)
kono
parents:
diff changeset
257 abort ();
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 if (__atomic_nand_fetch (&v, init, __ATOMIC_CONSUME) != 0)
kono
parents:
diff changeset
260 abort ();
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 if (__atomic_nand_fetch (&v, 0, __ATOMIC_ACQUIRE) != init)
kono
parents:
diff changeset
263 abort ();
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 if (__atomic_nand_fetch (&v, init, __ATOMIC_RELEASE) != 0)
kono
parents:
diff changeset
266 abort ();
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 if (__atomic_nand_fetch (&v, init, __ATOMIC_ACQ_REL) != init)
kono
parents:
diff changeset
269 abort ();
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 if (__atomic_nand_fetch (&v, 0, __ATOMIC_SEQ_CST) != init)
kono
parents:
diff changeset
272 abort ();
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 void
kono
parents:
diff changeset
278 test_xor_fetch ()
kono
parents:
diff changeset
279 {
kono
parents:
diff changeset
280 v = init;
kono
parents:
diff changeset
281 count = 0;
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 if (__atomic_xor_fetch (&v, count, __ATOMIC_RELAXED) != init)
kono
parents:
diff changeset
284 abort ();
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 if (__atomic_xor_fetch (&v, ~count, __ATOMIC_CONSUME) != 0)
kono
parents:
diff changeset
287 abort ();
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 if (__atomic_xor_fetch (&v, 0, __ATOMIC_ACQUIRE) != 0)
kono
parents:
diff changeset
290 abort ();
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 if (__atomic_xor_fetch (&v, ~count, __ATOMIC_RELEASE) != init)
kono
parents:
diff changeset
293 abort ();
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 if (__atomic_xor_fetch (&v, 0, __ATOMIC_ACQ_REL) != init)
kono
parents:
diff changeset
296 abort ();
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 if (__atomic_xor_fetch (&v, ~count, __ATOMIC_SEQ_CST) != 0)
kono
parents:
diff changeset
299 abort ();
kono
parents:
diff changeset
300 }
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 void
kono
parents:
diff changeset
303 test_or_fetch ()
kono
parents:
diff changeset
304 {
kono
parents:
diff changeset
305 v = 0;
kono
parents:
diff changeset
306 count = 1;
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 if (__atomic_or_fetch (&v, count, __ATOMIC_RELAXED) != 1)
kono
parents:
diff changeset
309 abort ();
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 count *= 2;
kono
parents:
diff changeset
312 if (__atomic_or_fetch (&v, 2, __ATOMIC_CONSUME) != 3)
kono
parents:
diff changeset
313 abort ();
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 count *= 2;
kono
parents:
diff changeset
316 if (__atomic_or_fetch (&v, count, __ATOMIC_ACQUIRE) != 7)
kono
parents:
diff changeset
317 abort ();
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 count *= 2;
kono
parents:
diff changeset
320 if (__atomic_or_fetch (&v, 8, __ATOMIC_RELEASE) != 15)
kono
parents:
diff changeset
321 abort ();
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 count *= 2;
kono
parents:
diff changeset
324 if (__atomic_or_fetch (&v, count, __ATOMIC_ACQ_REL) != 31)
kono
parents:
diff changeset
325 abort ();
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 count *= 2;
kono
parents:
diff changeset
328 if (__atomic_or_fetch (&v, count, __ATOMIC_SEQ_CST) != 63)
kono
parents:
diff changeset
329 abort ();
kono
parents:
diff changeset
330 }
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 /* Test the OP routines with a result which isn't used. Use both variations
kono
parents:
diff changeset
334 within each function. */
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 void
kono
parents:
diff changeset
337 test_add ()
kono
parents:
diff changeset
338 {
kono
parents:
diff changeset
339 v = 0;
kono
parents:
diff changeset
340 count = 1;
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 __atomic_add_fetch (&v, count, __ATOMIC_RELAXED);
kono
parents:
diff changeset
343 if (v != 1)
kono
parents:
diff changeset
344 abort ();
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 __atomic_fetch_add (&v, count, __ATOMIC_CONSUME);
kono
parents:
diff changeset
347 if (v != 2)
kono
parents:
diff changeset
348 abort ();
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 __atomic_add_fetch (&v, 1 , __ATOMIC_ACQUIRE);
kono
parents:
diff changeset
351 if (v != 3)
kono
parents:
diff changeset
352 abort ();
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 __atomic_fetch_add (&v, 1, __ATOMIC_RELEASE);
kono
parents:
diff changeset
355 if (v != 4)
kono
parents:
diff changeset
356 abort ();
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 __atomic_add_fetch (&v, count, __ATOMIC_ACQ_REL);
kono
parents:
diff changeset
359 if (v != 5)
kono
parents:
diff changeset
360 abort ();
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 __atomic_fetch_add (&v, count, __ATOMIC_SEQ_CST);
kono
parents:
diff changeset
363 if (v != 6)
kono
parents:
diff changeset
364 abort ();
kono
parents:
diff changeset
365 }
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 void
kono
parents:
diff changeset
369 test_sub()
kono
parents:
diff changeset
370 {
kono
parents:
diff changeset
371 v = res = 20;
kono
parents:
diff changeset
372 count = 0;
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 __atomic_sub_fetch (&v, count + 1, __ATOMIC_RELAXED);
kono
parents:
diff changeset
375 if (v != --res)
kono
parents:
diff changeset
376 abort ();
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 __atomic_fetch_sub (&v, count + 1, __ATOMIC_CONSUME);
kono
parents:
diff changeset
379 if (v != --res)
kono
parents:
diff changeset
380 abort ();
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 __atomic_sub_fetch (&v, 1, __ATOMIC_ACQUIRE);
kono
parents:
diff changeset
383 if (v != --res)
kono
parents:
diff changeset
384 abort ();
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 __atomic_fetch_sub (&v, 1, __ATOMIC_RELEASE);
kono
parents:
diff changeset
387 if (v != --res)
kono
parents:
diff changeset
388 abort ();
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 __atomic_sub_fetch (&v, count + 1, __ATOMIC_ACQ_REL);
kono
parents:
diff changeset
391 if (v != --res)
kono
parents:
diff changeset
392 abort ();
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 __atomic_fetch_sub (&v, count + 1, __ATOMIC_SEQ_CST);
kono
parents:
diff changeset
395 if (v != --res)
kono
parents:
diff changeset
396 abort ();
kono
parents:
diff changeset
397 }
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 void
kono
parents:
diff changeset
400 test_and ()
kono
parents:
diff changeset
401 {
kono
parents:
diff changeset
402 v = init;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 __atomic_and_fetch (&v, 0, __ATOMIC_RELAXED);
kono
parents:
diff changeset
405 if (v != 0)
kono
parents:
diff changeset
406 abort ();
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 v = init;
kono
parents:
diff changeset
409 __atomic_fetch_and (&v, init, __ATOMIC_CONSUME);
kono
parents:
diff changeset
410 if (v != init)
kono
parents:
diff changeset
411 abort ();
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 __atomic_and_fetch (&v, 0, __ATOMIC_ACQUIRE);
kono
parents:
diff changeset
414 if (v != 0)
kono
parents:
diff changeset
415 abort ();
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 v = ~v;
kono
parents:
diff changeset
418 __atomic_fetch_and (&v, init, __ATOMIC_RELEASE);
kono
parents:
diff changeset
419 if (v != init)
kono
parents:
diff changeset
420 abort ();
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 __atomic_and_fetch (&v, 0, __ATOMIC_ACQ_REL);
kono
parents:
diff changeset
423 if (v != 0)
kono
parents:
diff changeset
424 abort ();
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 v = ~v;
kono
parents:
diff changeset
427 __atomic_fetch_and (&v, 0, __ATOMIC_SEQ_CST);
kono
parents:
diff changeset
428 if (v != 0)
kono
parents:
diff changeset
429 abort ();
kono
parents:
diff changeset
430 }
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 void
kono
parents:
diff changeset
433 test_nand ()
kono
parents:
diff changeset
434 {
kono
parents:
diff changeset
435 v = init;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 __atomic_fetch_nand (&v, 0, __ATOMIC_RELAXED);
kono
parents:
diff changeset
438 if (v != init)
kono
parents:
diff changeset
439 abort ();
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 __atomic_fetch_nand (&v, init, __ATOMIC_CONSUME);
kono
parents:
diff changeset
442 if (v != 0)
kono
parents:
diff changeset
443 abort ();
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 __atomic_nand_fetch (&v, 0, __ATOMIC_ACQUIRE);
kono
parents:
diff changeset
446 if (v != init)
kono
parents:
diff changeset
447 abort ();
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 __atomic_nand_fetch (&v, init, __ATOMIC_RELEASE);
kono
parents:
diff changeset
450 if (v != 0)
kono
parents:
diff changeset
451 abort ();
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 __atomic_fetch_nand (&v, init, __ATOMIC_ACQ_REL);
kono
parents:
diff changeset
454 if (v != init)
kono
parents:
diff changeset
455 abort ();
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 __atomic_nand_fetch (&v, 0, __ATOMIC_SEQ_CST);
kono
parents:
diff changeset
458 if (v != init)
kono
parents:
diff changeset
459 abort ();
kono
parents:
diff changeset
460 }
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 void
kono
parents:
diff changeset
465 test_xor ()
kono
parents:
diff changeset
466 {
kono
parents:
diff changeset
467 v = init;
kono
parents:
diff changeset
468 count = 0;
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 __atomic_xor_fetch (&v, count, __ATOMIC_RELAXED);
kono
parents:
diff changeset
471 if (v != init)
kono
parents:
diff changeset
472 abort ();
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 __atomic_fetch_xor (&v, ~count, __ATOMIC_CONSUME);
kono
parents:
diff changeset
475 if (v != 0)
kono
parents:
diff changeset
476 abort ();
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 __atomic_xor_fetch (&v, 0, __ATOMIC_ACQUIRE);
kono
parents:
diff changeset
479 if (v != 0)
kono
parents:
diff changeset
480 abort ();
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 __atomic_fetch_xor (&v, ~count, __ATOMIC_RELEASE);
kono
parents:
diff changeset
483 if (v != init)
kono
parents:
diff changeset
484 abort ();
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 __atomic_fetch_xor (&v, 0, __ATOMIC_ACQ_REL);
kono
parents:
diff changeset
487 if (v != init)
kono
parents:
diff changeset
488 abort ();
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 __atomic_xor_fetch (&v, ~count, __ATOMIC_SEQ_CST);
kono
parents:
diff changeset
491 if (v != 0)
kono
parents:
diff changeset
492 abort ();
kono
parents:
diff changeset
493 }
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 void
kono
parents:
diff changeset
496 test_or ()
kono
parents:
diff changeset
497 {
kono
parents:
diff changeset
498 v = 0;
kono
parents:
diff changeset
499 count = 1;
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 __atomic_or_fetch (&v, count, __ATOMIC_RELAXED);
kono
parents:
diff changeset
502 if (v != 1)
kono
parents:
diff changeset
503 abort ();
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 count *= 2;
kono
parents:
diff changeset
506 __atomic_fetch_or (&v, count, __ATOMIC_CONSUME);
kono
parents:
diff changeset
507 if (v != 3)
kono
parents:
diff changeset
508 abort ();
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 count *= 2;
kono
parents:
diff changeset
511 __atomic_or_fetch (&v, 4, __ATOMIC_ACQUIRE);
kono
parents:
diff changeset
512 if (v != 7)
kono
parents:
diff changeset
513 abort ();
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 count *= 2;
kono
parents:
diff changeset
516 __atomic_fetch_or (&v, 8, __ATOMIC_RELEASE);
kono
parents:
diff changeset
517 if (v != 15)
kono
parents:
diff changeset
518 abort ();
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 count *= 2;
kono
parents:
diff changeset
521 __atomic_or_fetch (&v, count, __ATOMIC_ACQ_REL);
kono
parents:
diff changeset
522 if (v != 31)
kono
parents:
diff changeset
523 abort ();
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 count *= 2;
kono
parents:
diff changeset
526 __atomic_fetch_or (&v, count, __ATOMIC_SEQ_CST);
kono
parents:
diff changeset
527 if (v != 63)
kono
parents:
diff changeset
528 abort ();
kono
parents:
diff changeset
529 }
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 int
kono
parents:
diff changeset
532 main ()
kono
parents:
diff changeset
533 {
kono
parents:
diff changeset
534 test_fetch_add ();
kono
parents:
diff changeset
535 test_fetch_sub ();
kono
parents:
diff changeset
536 test_fetch_and ();
kono
parents:
diff changeset
537 test_fetch_nand ();
kono
parents:
diff changeset
538 test_fetch_xor ();
kono
parents:
diff changeset
539 test_fetch_or ();
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 test_add_fetch ();
kono
parents:
diff changeset
542 test_sub_fetch ();
kono
parents:
diff changeset
543 test_and_fetch ();
kono
parents:
diff changeset
544 test_nand_fetch ();
kono
parents:
diff changeset
545 test_xor_fetch ();
kono
parents:
diff changeset
546 test_or_fetch ();
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 test_add ();
kono
parents:
diff changeset
549 test_sub ();
kono
parents:
diff changeset
550 test_and ();
kono
parents:
diff changeset
551 test_nand ();
kono
parents:
diff changeset
552 test_xor ();
kono
parents:
diff changeset
553 test_or ();
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 return 0;
kono
parents:
diff changeset
556 }