ok = a1.compare_exchange_strong(expected, 3.2l, mo);
VERIFY( !ok && a1.load() == 2.56l && expected == 2.56l );
- f0 = a0.fetch_add(1.2l);
- VERIFY( f0 == 12.8l );
- VERIFY( a0 == 14.0l );
- f1 = a1.fetch_add(2.4l, mo);
- VERIFY( f1 == 2.56l );
- VERIFY( a1 == 4.96l );
-
- f0 = a0.fetch_sub(1.2l);
- VERIFY( f0 == 14.0l );
- VERIFY( a0 == 12.8l );
- f1 = a1.fetch_sub(3.5l, mo);
- VERIFY( f1 == 4.96l );
- VERIFY( a1 == 1.46l );
-
- f0 = a0 += 1.2l;
- VERIFY( f0 == 14.0l );
- VERIFY( a0 == 14.0l );
-
- f0 = a0 -= 0.8l;
- VERIFY( f0 == 13.2l );
- VERIFY( a0 == 13.2l );
+ a1 = a0 = 0.5l;
+ f0 = a0.fetch_add(0.25l);
+ VERIFY( f0 == 0.5l );
+ VERIFY( a0 == 0.75l );
+ f1 = a1.fetch_add(0.25l, mo);
+ VERIFY( f1 == 0.5l );
+ VERIFY( a1 == 0.75l );
+
+ f0 = a0.fetch_sub(0.5l);
+ VERIFY( f0 == 0.75l );
+ VERIFY( a0 == 0.25l );
+ f1 = a1.fetch_sub(0.5l, mo);
+ VERIFY( f1 == 0.75l );
+ VERIFY( a1 == 0.25l );
+
+ f0 = a0 += 0.75l;
+ VERIFY( f0 == 1.0l );
+ VERIFY( a0 == 1.0l );
+
+ f0 = a0 -= 0.5l;
+ VERIFY( f0 == 0.5l );
+ VERIFY( a0 == 0.5l );
}
// Repeat for volatile std::atomic<long double>
ok = a1.compare_exchange_strong(expected, 3.2l, mo);
VERIFY( !ok && a1.load() == 2.56l && expected == 2.56l );
- f0 = a0.fetch_add(1.2l);
- VERIFY( f0 == 12.8l );
- VERIFY( a0 == 14.0l );
- f1 = a1.fetch_add(2.4l, mo);
- VERIFY( f1 == 2.56l );
- VERIFY( a1 == 4.96l );
-
- f0 = a0.fetch_sub(1.2l);
- VERIFY( f0 == 14.0l );
- VERIFY( a0 == 12.8l );
- f1 = a1.fetch_sub(3.5l, mo);
- VERIFY( f1 == 4.96l );
- VERIFY( a1 == 1.46l );
-
- f0 = a0 += 1.2l;
- VERIFY( f0 == 14.0l );
- VERIFY( a0 == 14.0l );
-
- f0 = a0 -= 0.8l;
- VERIFY( f0 == 13.2l );
- VERIFY( a0 == 13.2l );
+ a1 = a0 = 0.5l;
+ f0 = a0.fetch_add(0.25l);
+ VERIFY( f0 == 0.5l );
+ VERIFY( a0 == 0.75l );
+ f1 = a1.fetch_add(0.25l, mo);
+ VERIFY( f1 == 0.5l );
+ VERIFY( a1 == 0.75l );
+
+ f0 = a0.fetch_sub(0.5l);
+ VERIFY( f0 == 0.75l );
+ VERIFY( a0 == 0.25l );
+ f1 = a1.fetch_sub(0.5l, mo);
+ VERIFY( f1 == 0.75l );
+ VERIFY( a1 == 0.25l );
+
+ f0 = a0 += 0.75l;
+ VERIFY( f0 == 1.0l );
+ VERIFY( a0 == 1.0l );
+
+ f0 = a0 -= 0.5l;
+ VERIFY( f0 == 0.5l );
+ VERIFY( a0 == 0.5l );
}
}
ok = a.compare_exchange_strong(expected, 6.4l, mo);
VERIFY( !ok && a.load() == 204.8l && expected == 204.8l );
- v = a.fetch_add(3.2l);
- VERIFY( v == 204.8l );
- VERIFY( a == 208.0l );
- v = a.fetch_add(-8.5l, mo);
- VERIFY( v == 208.0l );
- VERIFY( a == 199.5l );
-
- v = a.fetch_sub(109.5l);
- VERIFY( v == 199.5l );
- VERIFY( a == 90.0l );
- v = a.fetch_sub(2, mo);
- VERIFY( v == 90.0l );
- VERIFY( a == 88.0l );
-
- v = a += 5.0l;
- VERIFY( v == 93.0l );
- VERIFY( a == 93.0l );
-
- v = a -= 6.5l;
- VERIFY( v == 86.5l );
- VERIFY( a == 86.5l );
+ a = 0.5l;
+ v = a.fetch_add(0.5l);
+ VERIFY( v == 0.5l );
+ VERIFY( a == 1.0l );
+ v = a.fetch_add(-0.2l, mo);
+ VERIFY( v == 1.0l );
+ VERIFY( a == 0.8l );
+
+ v = a.fetch_sub(0.4l);
+ VERIFY( v == 0.8l );
+ VERIFY( a == 0.4l );
+ v = a.fetch_sub(-0.4l, mo);
+ VERIFY( v == 0.4l );
+ VERIFY( a == 0.8l );
+
+ v = a += .8l;
+ VERIFY( v == 1.6l );
+ VERIFY( a == 1.6l );
+
+ v = a -= 0.6l;
+ VERIFY( v == 1.0l );
+ VERIFY( a == 1.0l );
}
if constexpr (std::atomic_ref<long double>::is_always_lock_free)
- VERIFY( value == 86.5l );
+ VERIFY( value == 1.0l );
}
void