C · 388 bytes Raw Blame History
1 #include <stdatomic.h>
2
3 _Atomic unsigned short g16;
4
5 unsigned short load_then_store16(unsigned short x) {
6 unsigned short y = atomic_load_explicit(&g16, memory_order_acquire);
7 atomic_store_explicit(&g16, (unsigned short)(x + y), memory_order_release);
8 return y;
9 }
10
11 unsigned short swap16(unsigned short x) {
12 return atomic_exchange_explicit(&g16, x, memory_order_acq_rel);
13 }