]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/29_atomics/atomic_float/1.cc
1 // Copyright (C) 2019-2022 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-options "-std=gnu++2a" }
19 // { dg-add-options ieee }
20 // { dg-do run { target c++2a } }
23 #include <testsuite_hooks.h>
28 const auto mo
= std::memory_order_relaxed
;
32 if constexpr (std::atomic
<float>::is_always_lock_free
)
34 std::atomic
<float> a0
;
35 std::atomic
<float> a1(1.0f
);
36 ok
= a0
.is_lock_free();
38 VERIFY( a0
.load() == a1
.load() );
39 VERIFY( a0
.load(mo
) == a0
.load() );
42 VERIFY( a0
.load() == a1
.load() );
43 auto f0
= a0
.exchange(12.5f
);
44 auto f1
= a1
.exchange(12.5f
, mo
);
45 VERIFY( a0
== 12.5f
);
46 VERIFY( a0
.load() == a1
.load() );
51 while (!a0
.compare_exchange_weak(expected
, 1.6f
, mo
, mo
))
52 { /* weak form can fail spuriously */ }
53 VERIFY( a0
.load() == 1.6f
);
54 VERIFY( expected
== 12.5f
);
56 ok
= a1
.compare_exchange_weak(expected
, 1.6f
, mo
, mo
);
57 VERIFY( !ok
&& a1
.load() == 12.5f
&& expected
== 12.5f
);
58 VERIFY( expected
== 12.5f
);
60 ok
= a0
.compare_exchange_strong(expected
, 3.2f
, mo
, mo
);
61 VERIFY( ok
&& a0
.load() == 3.2f
);
62 VERIFY( expected
== 1.6f
);
64 ok
= a1
.compare_exchange_strong(expected
, 3.2f
, mo
, mo
);
65 VERIFY( !ok
&& a1
.load() == 12.5f
&& expected
== 12.5f
);
68 while (!a0
.compare_exchange_weak(expected
, .64f
))
69 { /* weak form can fail spuriously */ }
70 VERIFY( a0
.load() == .64f
);
72 while (!a1
.compare_exchange_weak(expected
, 1.6f
, mo
))
73 { /* weak form can fail spuriously */ }
74 VERIFY( a1
.load() == 1.6f
);
76 ok
= a0
.compare_exchange_weak(expected
, 3.2f
);
77 VERIFY( !ok
&& a0
.load() == .64f
&& expected
== .64f
);
79 ok
= a1
.compare_exchange_weak(expected
, 3.2f
, mo
);
80 VERIFY( !ok
&& a1
.load() == 1.6f
&& expected
== 1.6f
);
83 ok
= a0
.compare_exchange_strong(expected
, 12.8f
);
84 VERIFY( ok
&& a0
.load() == 12.8f
);
86 ok
= a1
.compare_exchange_strong(expected
, 2.56f
, mo
);
87 VERIFY( ok
&& a1
.load() == 2.56f
);
89 ok
= a0
.compare_exchange_strong(expected
, 3.2f
);
90 VERIFY( !ok
&& a0
.load() == 12.8f
&& expected
== 12.8f
);
92 ok
= a1
.compare_exchange_strong(expected
, 3.2f
, mo
);
93 VERIFY( !ok
&& a1
.load() == 2.56f
&& expected
== 2.56f
);
95 f0
= a0
.fetch_add(1.2f
);
96 VERIFY( f0
== 12.8f
);
97 VERIFY( a0
== 14.0f
);
98 f1
= a1
.fetch_add(2.4f
, mo
);
99 VERIFY( f1
== 2.56f
);
100 VERIFY( a1
== 4.96f
);
102 f0
= a0
.fetch_sub(1.2f
);
103 VERIFY( f0
== 14.0f
);
104 VERIFY( a0
== 12.8f
);
105 f1
= a1
.fetch_sub(3.5f
, mo
);
106 VERIFY( f1
== 4.96f
);
107 VERIFY( a1
== 1.46f
);
110 VERIFY( f0
== 14.0f
);
111 VERIFY( a0
== 14.0f
);
114 VERIFY( f0
== 13.2f
);
115 VERIFY( a0
== 13.2f
);
118 // Repeat for volatile std::atomic<float>
119 if constexpr (std::atomic
<float>::is_always_lock_free
)
121 volatile std::atomic
<float> a0
;
122 volatile std::atomic
<float> a1(1.0f
);
123 ok
= a0
.is_lock_free();
125 VERIFY( a0
.load() == a1
.load() );
126 VERIFY( a0
.load(mo
) == a0
.load() );
129 VERIFY( a0
.load() == a1
.load() );
130 auto f0
= a0
.exchange(12.5f
);
131 auto f1
= a1
.exchange(12.5f
, mo
);
132 VERIFY( a0
== 12.5f
);
133 VERIFY( a0
.load() == a1
.load() );
134 VERIFY( f0
== 0.5f
);
138 while (!a0
.compare_exchange_weak(expected
, 1.6f
, mo
, mo
))
139 { /* weak form can fail spuriously */ }
140 VERIFY( a0
.load() == 1.6f
);
141 VERIFY( expected
== 12.5f
);
143 ok
= a1
.compare_exchange_weak(expected
, 1.6f
, mo
, mo
);
144 VERIFY( !ok
&& a1
.load() == 12.5f
&& expected
== 12.5f
);
145 VERIFY( expected
== 12.5f
);
147 ok
= a0
.compare_exchange_strong(expected
, 3.2f
, mo
, mo
);
148 VERIFY( ok
&& a0
.load() == 3.2f
);
149 VERIFY( expected
== 1.6f
);
151 ok
= a1
.compare_exchange_strong(expected
, 3.2f
, mo
, mo
);
152 VERIFY( !ok
&& a1
.load() == 12.5f
&& expected
== 12.5f
);
155 while (!a0
.compare_exchange_weak(expected
, .64f
))
156 { /* weak form can fail spuriously */ }
157 VERIFY( a0
.load() == .64f
);
159 while (!a1
.compare_exchange_weak(expected
, 1.6f
, mo
))
160 { /* weak form can fail spuriously */ }
161 VERIFY( a1
.load() == 1.6f
);
163 ok
= a0
.compare_exchange_weak(expected
, 3.2f
);
164 VERIFY( !ok
&& a0
.load() == .64f
&& expected
== .64f
);
166 ok
= a1
.compare_exchange_weak(expected
, 3.2f
, mo
);
167 VERIFY( !ok
&& a1
.load() == 1.6f
&& expected
== 1.6f
);
170 ok
= a0
.compare_exchange_strong(expected
, 12.8f
);
171 VERIFY( ok
&& a0
.load() == 12.8f
);
173 ok
= a1
.compare_exchange_strong(expected
, 2.56f
, mo
);
174 VERIFY( ok
&& a1
.load() == 2.56f
);
176 ok
= a0
.compare_exchange_strong(expected
, 3.2f
);
177 VERIFY( !ok
&& a0
.load() == 12.8f
&& expected
== 12.8f
);
179 ok
= a1
.compare_exchange_strong(expected
, 3.2f
, mo
);
180 VERIFY( !ok
&& a1
.load() == 2.56f
&& expected
== 2.56f
);
182 f0
= a0
.fetch_add(1.2f
);
183 VERIFY( f0
== 12.8f
);
184 VERIFY( a0
== 14.0f
);
185 f1
= a1
.fetch_add(2.4f
, mo
);
186 VERIFY( f1
== 2.56f
);
187 VERIFY( a1
== 4.96f
);
189 f0
= a0
.fetch_sub(1.2f
);
190 VERIFY( f0
== 14.0f
);
191 VERIFY( a0
== 12.8f
);
192 f1
= a1
.fetch_sub(3.5f
, mo
);
193 VERIFY( f1
== 4.96f
);
194 VERIFY( a1
== 1.46f
);
197 VERIFY( f0
== 14.0f
);
198 VERIFY( a0
== 14.0f
);
201 VERIFY( f0
== 13.2f
);
202 VERIFY( a0
== 13.2f
);
209 const auto mo
= std::memory_order_relaxed
;
213 if constexpr (std::atomic
<double>::is_always_lock_free
)
215 std::atomic
<double> a0
;
216 std::atomic
<double> a1(1.0);
217 ok
= a0
.is_lock_free();
219 VERIFY( a0
.load() == a1
.load() );
220 VERIFY( a0
.load(mo
) == a0
.load() );
223 VERIFY( a0
.load() == a1
.load() );
224 auto f0
= a0
.exchange(12.5);
225 auto f1
= a1
.exchange(12.5, mo
);
226 VERIFY( a0
== 12.5 );
227 VERIFY( a0
.load() == a1
.load() );
232 while (!a0
.compare_exchange_weak(expected
, 1.6, mo
, mo
))
233 { /* weak form can fail spuriously */ }
234 VERIFY( a0
.load() == 1.6 );
235 VERIFY( expected
== 12.5 );
237 ok
= a1
.compare_exchange_weak(expected
, 1.6, mo
, mo
);
238 VERIFY( !ok
&& a1
.load() == 12.5 && expected
== 12.5 );
239 VERIFY( expected
== 12.5 );
241 ok
= a0
.compare_exchange_strong(expected
, 3.2, mo
, mo
);
242 VERIFY( ok
&& a0
.load() == 3.2 );
243 VERIFY( expected
== 1.6 );
245 ok
= a1
.compare_exchange_strong(expected
, 3.2, mo
, mo
);
246 VERIFY( !ok
&& a1
.load() == 12.5 && expected
== 12.5 );
249 while (!a0
.compare_exchange_weak(expected
, .64))
250 { /* weak form can fail spuriously */ }
251 VERIFY( a0
.load() == .64 );
253 while (!a1
.compare_exchange_weak(expected
, 1.6, mo
))
254 { /* weak form can fail spuriously */ }
255 VERIFY( a1
.load() == 1.6 );
257 ok
= a0
.compare_exchange_weak(expected
, 3.2);
258 VERIFY( !ok
&& a0
.load() == .64 && expected
== .64 );
260 ok
= a1
.compare_exchange_weak(expected
, 3.2, mo
);
261 VERIFY( !ok
&& a1
.load() == 1.6 && expected
== 1.6 );
264 ok
= a0
.compare_exchange_strong(expected
, 12.8);
265 VERIFY( ok
&& a0
.load() == 12.8 );
267 ok
= a1
.compare_exchange_strong(expected
, 2.56, mo
);
268 VERIFY( ok
&& a1
.load() == 2.56 );
270 ok
= a0
.compare_exchange_strong(expected
, 3.2);
271 VERIFY( !ok
&& a0
.load() == 12.8 && expected
== 12.8 );
273 ok
= a1
.compare_exchange_strong(expected
, 3.2, mo
);
274 VERIFY( !ok
&& a1
.load() == 2.56 && expected
== 2.56 );
276 f0
= a0
.fetch_add(1.2);
277 VERIFY( f0
== 12.8 );
278 VERIFY( a0
== 14.0 );
279 f1
= a1
.fetch_add(2.4, mo
);
280 VERIFY( f1
== 2.56 );
281 VERIFY( a1
== 4.96 );
283 f0
= a0
.fetch_sub(1.2);
284 VERIFY( f0
== 14.0 );
285 VERIFY( a0
== 12.8 );
286 f1
= a1
.fetch_sub(3.5, mo
);
287 VERIFY( f1
== 4.96 );
288 VERIFY( a1
== 1.46 );
291 VERIFY( f0
== 14.0 );
292 VERIFY( a0
== 14.0 );
295 VERIFY( f0
== 13.2 );
296 VERIFY( a0
== 13.2 );
299 // Repeat for volatile std::atomic<double>
300 if constexpr (std::atomic
<double>::is_always_lock_free
)
302 volatile std::atomic
<double> a0
;
303 volatile std::atomic
<double> a1(1.0);
304 ok
= a0
.is_lock_free();
306 VERIFY( a0
.load() == a1
.load() );
307 VERIFY( a0
.load(mo
) == a0
.load() );
310 VERIFY( a0
.load() == a1
.load() );
311 auto f0
= a0
.exchange(12.5);
312 auto f1
= a1
.exchange(12.5, mo
);
313 VERIFY( a0
== 12.5 );
314 VERIFY( a0
.load() == a1
.load() );
319 while (!a0
.compare_exchange_weak(expected
, 1.6, mo
, mo
))
320 { /* weak form can fail spuriously */ }
321 VERIFY( a0
.load() == 1.6 );
322 VERIFY( expected
== 12.5 );
324 ok
= a1
.compare_exchange_weak(expected
, 1.6, mo
, mo
);
325 VERIFY( !ok
&& a1
.load() == 12.5 && expected
== 12.5 );
326 VERIFY( expected
== 12.5 );
328 ok
= a0
.compare_exchange_strong(expected
, 3.2, mo
, mo
);
329 VERIFY( ok
&& a0
.load() == 3.2 );
330 VERIFY( expected
== 1.6 );
332 ok
= a1
.compare_exchange_strong(expected
, 3.2, mo
, mo
);
333 VERIFY( !ok
&& a1
.load() == 12.5 && expected
== 12.5 );
336 while (!a0
.compare_exchange_weak(expected
, .64))
337 { /* weak form can fail spuriously */ }
338 VERIFY( a0
.load() == .64 );
340 while (!a1
.compare_exchange_weak(expected
, 1.6, mo
))
341 { /* weak form can fail spuriously */ }
342 VERIFY( a1
.load() == 1.6 );
344 ok
= a0
.compare_exchange_weak(expected
, 3.2);
345 VERIFY( !ok
&& a0
.load() == .64 && expected
== .64 );
347 ok
= a1
.compare_exchange_weak(expected
, 3.2, mo
);
348 VERIFY( !ok
&& a1
.load() == 1.6 && expected
== 1.6 );
351 ok
= a0
.compare_exchange_strong(expected
, 12.8);
352 VERIFY( ok
&& a0
.load() == 12.8 );
354 ok
= a1
.compare_exchange_strong(expected
, 2.56, mo
);
355 VERIFY( ok
&& a1
.load() == 2.56 );
357 ok
= a0
.compare_exchange_strong(expected
, 3.2);
358 VERIFY( !ok
&& a0
.load() == 12.8 && expected
== 12.8 );
360 ok
= a1
.compare_exchange_strong(expected
, 3.2, mo
);
361 VERIFY( !ok
&& a1
.load() == 2.56 && expected
== 2.56 );
363 f0
= a0
.fetch_add(1.2);
364 VERIFY( f0
== 12.8 );
365 VERIFY( a0
== 14.0 );
366 f1
= a1
.fetch_add(2.4, mo
);
367 VERIFY( f1
== 2.56 );
368 VERIFY( a1
== 4.96 );
370 f0
= a0
.fetch_sub(1.2);
371 VERIFY( f0
== 14.0 );
372 VERIFY( a0
== 12.8 );
373 f1
= a1
.fetch_sub(3.5, mo
);
374 VERIFY( f1
== 4.96 );
375 VERIFY( a1
== 1.46 );
378 VERIFY( f0
== 14.0 );
379 VERIFY( a0
== 14.0 );
382 VERIFY( f0
== 13.2 );
383 VERIFY( a0
== 13.2 );
390 const auto mo
= std::memory_order_relaxed
;
392 long double expected
;
394 if constexpr (std::atomic
<long double>::is_always_lock_free
)
396 std::atomic
<long double> a0
;
397 std::atomic
<long double> a1(1.0l);
398 ok
= a0
.is_lock_free();
400 VERIFY( a0
.load() == a1
.load() );
401 VERIFY( a0
.load(mo
) == a0
.load() );
404 VERIFY( a0
.load() == a1
.load() );
405 auto f0
= a0
.exchange(12.5l);
406 auto f1
= a1
.exchange(12.5l, mo
);
407 VERIFY( a0
== 12.5l );
408 VERIFY( a0
.load() == a1
.load() );
409 VERIFY( f0
== 0.5l );
413 while (!a0
.compare_exchange_weak(expected
, 1.6l, mo
, mo
))
414 { /* weak form can fail spuriously */ }
415 VERIFY( a0
.load() == 1.6l );
416 VERIFY( expected
== 12.5l );
418 ok
= a1
.compare_exchange_weak(expected
, 1.6l, mo
, mo
);
419 VERIFY( !ok
&& a1
.load() == 12.5l && expected
== 12.5l );
420 VERIFY( expected
== 12.5l );
422 ok
= a0
.compare_exchange_strong(expected
, 3.2l, mo
, mo
);
423 VERIFY( ok
&& a0
.load() == 3.2l );
424 VERIFY( expected
== 1.6l );
426 ok
= a1
.compare_exchange_strong(expected
, 3.2l, mo
, mo
);
427 VERIFY( !ok
&& a1
.load() == 12.5l && expected
== 12.5l );
430 while (!a0
.compare_exchange_weak(expected
, .64l))
431 { /* weak form can fail spuriously */ }
432 VERIFY( a0
.load() == .64l );
434 while (!a1
.compare_exchange_weak(expected
, 1.6l, mo
))
435 { /* weak form can fail spuriously */ }
436 VERIFY( a1
.load() == 1.6l );
438 ok
= a0
.compare_exchange_weak(expected
, 3.2l);
439 VERIFY( !ok
&& a0
.load() == .64l && expected
== .64l );
441 ok
= a1
.compare_exchange_weak(expected
, 3.2l, mo
);
442 VERIFY( !ok
&& a1
.load() == 1.6l && expected
== 1.6l );
445 ok
= a0
.compare_exchange_strong(expected
, 12.8l);
446 VERIFY( ok
&& a0
.load() == 12.8l );
448 ok
= a1
.compare_exchange_strong(expected
, 2.56l, mo
);
449 VERIFY( ok
&& a1
.load() == 2.56l );
451 ok
= a0
.compare_exchange_strong(expected
, 3.2l);
452 VERIFY( !ok
&& a0
.load() == 12.8l && expected
== 12.8l );
454 ok
= a1
.compare_exchange_strong(expected
, 3.2l, mo
);
455 VERIFY( !ok
&& a1
.load() == 2.56l && expected
== 2.56l );
458 f0
= a0
.fetch_add(0.25l);
459 VERIFY( f0
== 0.5l );
460 VERIFY( a0
== 0.75l );
461 f1
= a1
.fetch_add(0.25l, mo
);
462 VERIFY( f1
== 0.5l );
463 VERIFY( a1
== 0.75l );
465 f0
= a0
.fetch_sub(0.5l);
466 VERIFY( f0
== 0.75l );
467 VERIFY( a0
== 0.25l );
468 f1
= a1
.fetch_sub(0.5l, mo
);
469 VERIFY( f1
== 0.75l );
470 VERIFY( a1
== 0.25l );
473 VERIFY( f0
== 1.0l );
474 VERIFY( a0
== 1.0l );
477 VERIFY( f0
== 0.5l );
478 VERIFY( a0
== 0.5l );
481 // Repeat for volatile std::atomic<long double>
482 if constexpr (std::atomic
<long double>::is_always_lock_free
)
484 volatile std::atomic
<long double> a0
;
485 volatile std::atomic
<long double> a1(1.0l);
486 ok
= a0
.is_lock_free();
488 VERIFY( a0
.load() == a1
.load() );
489 VERIFY( a0
.load(mo
) == a0
.load() );
492 VERIFY( a0
.load() == a1
.load() );
493 auto f0
= a0
.exchange(12.5l);
494 auto f1
= a1
.exchange(12.5l, mo
);
495 VERIFY( a0
== 12.5l );
496 VERIFY( a0
.load() == a1
.load() );
497 VERIFY( f0
== 0.5l );
501 while (!a0
.compare_exchange_weak(expected
, 1.6l, mo
, mo
))
502 { /* weak form can fail spuriously */ }
503 VERIFY( a0
.load() == 1.6l );
504 VERIFY( expected
== 12.5l );
506 ok
= a1
.compare_exchange_weak(expected
, 1.6l, mo
, mo
);
507 VERIFY( !ok
&& a1
.load() == 12.5l && expected
== 12.5l );
508 VERIFY( expected
== 12.5l );
510 ok
= a0
.compare_exchange_strong(expected
, 3.2l, mo
, mo
);
511 VERIFY( ok
&& a0
.load() == 3.2l );
512 VERIFY( expected
== 1.6l );
514 ok
= a1
.compare_exchange_strong(expected
, 3.2l, mo
, mo
);
515 VERIFY( !ok
&& a1
.load() == 12.5l && expected
== 12.5l );
518 while (!a0
.compare_exchange_weak(expected
, .64l))
519 { /* weak form can fail spuriously */ }
520 VERIFY( a0
.load() == .64l );
522 while (!a1
.compare_exchange_weak(expected
, 1.6l, mo
))
523 { /* weak form can fail spuriously */ }
524 VERIFY( a1
.load() == 1.6l );
526 ok
= a0
.compare_exchange_weak(expected
, 3.2l);
527 VERIFY( !ok
&& a0
.load() == .64l && expected
== .64l );
529 ok
= a1
.compare_exchange_weak(expected
, 3.2l, mo
);
530 VERIFY( !ok
&& a1
.load() == 1.6l && expected
== 1.6l );
533 ok
= a0
.compare_exchange_strong(expected
, 12.8l);
534 VERIFY( ok
&& a0
.load() == 12.8l );
536 ok
= a1
.compare_exchange_strong(expected
, 2.56l, mo
);
537 VERIFY( ok
&& a1
.load() == 2.56l );
539 ok
= a0
.compare_exchange_strong(expected
, 3.2l);
540 VERIFY( !ok
&& a0
.load() == 12.8l && expected
== 12.8l );
542 ok
= a1
.compare_exchange_strong(expected
, 3.2l, mo
);
543 VERIFY( !ok
&& a1
.load() == 2.56l && expected
== 2.56l );
546 f0
= a0
.fetch_add(0.25l);
547 VERIFY( f0
== 0.5l );
548 VERIFY( a0
== 0.75l );
549 f1
= a1
.fetch_add(0.25l, mo
);
550 VERIFY( f1
== 0.5l );
551 VERIFY( a1
== 0.75l );
553 f0
= a0
.fetch_sub(0.5l);
554 VERIFY( f0
== 0.75l );
555 VERIFY( a0
== 0.25l );
556 f1
= a1
.fetch_sub(0.5l, mo
);
557 VERIFY( f1
== 0.75l );
558 VERIFY( a1
== 0.25l );
561 VERIFY( f0
== 1.0l );
562 VERIFY( a0
== 1.0l );
565 VERIFY( f0
== 0.5l );
566 VERIFY( a0
== 0.5l );