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