void test_xor () { v = init; count = 0; atomic_fetch_xor (&v, count); if (v != init) abort (); atomic_fetch_xor_explicit (&v, ~count, memory_order_consume); if (v != 0) abort (); atomic_fetch_xor (&v, 0); if (v != 0) abort (); atomic_fetch_xor_explicit (&v, ~count, memory_order_release); if (v != init) abort (); atomic_fetch_xor_explicit (&v, 0, memory_order_acq_rel); if (v != init) abort (); atomic_fetch_xor (&v, ~count); if (v != 0) abort (); }
void test_fetch_xor () { v = init; count = 0; if (atomic_fetch_xor_explicit (&v, count, memory_order_relaxed) != init) abort (); if (atomic_fetch_xor_explicit (&v, ~count, memory_order_consume) != init) abort (); if (atomic_fetch_xor_explicit (&v, 0, memory_order_acquire) != 0) abort (); if (atomic_fetch_xor_explicit (&v, ~count, memory_order_release) != 0) abort (); if (atomic_fetch_xor_explicit (&v, 0, memory_order_acq_rel) != init) abort (); if (atomic_fetch_xor_explicit (&v, ~count, memory_order_seq_cst) != init) abort (); if (atomic_fetch_xor (&v, ~count) != 0) abort (); }
TEST(stdatomic, atomic_fetch_xor) { atomic_int i = ATOMIC_VAR_INIT(0x100); ASSERT_EQ(0x100, atomic_fetch_xor(&i, 0x120)); ASSERT_EQ(0x020, atomic_fetch_xor_explicit(&i, 0x103, memory_order_relaxed)); ASSERT_EQ(0x123, atomic_load(&i)); }