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