66// which appeared in ASPLOS 2018.
77
88// ONCE
9- READ_ONCE(X) __load{once }(X)
10- WRITE_ONCE(X,V) { __store{once }(X,V); }
9+ READ_ONCE(X) __load{ONCE }(X)
10+ WRITE_ONCE(X,V) { __store{ONCE }(X,V); }
1111
1212// Release Acquire and friends
13- smp_store_release(X,V) { __store{release }(*X,V); }
14- smp_load_acquire(X) __load{acquire }(*X)
15- rcu_assign_pointer(X,V) { __store{release }(X,V); }
16- rcu_dereference(X) __load{once }(X)
17- smp_store_mb(X,V) { __store{once }(X,V); __fence{mb }; }
13+ smp_store_release(X,V) { __store{RELEASE }(*X,V); }
14+ smp_load_acquire(X) __load{ACQUIRE }(*X)
15+ rcu_assign_pointer(X,V) { __store{RELEASE }(X,V); }
16+ rcu_dereference(X) __load{ONCE }(X)
17+ smp_store_mb(X,V) { __store{ONCE }(X,V); __fence{MB }; }
1818
1919// Fences
20- smp_mb() { __fence{mb }; }
20+ smp_mb() { __fence{MB }; }
2121smp_rmb() { __fence{rmb}; }
2222smp_wmb() { __fence{wmb}; }
2323smp_mb__before_atomic() { __fence{before-atomic}; }
@@ -28,14 +28,14 @@ smp_mb__after_srcu_read_unlock() { __fence{after-srcu-read-unlock}; }
2828barrier() { __fence{barrier}; }
2929
3030// Exchange
31- xchg(X,V) __xchg{mb }(X,V)
32- xchg_relaxed(X,V) __xchg{once }(X,V)
33- xchg_release(X,V) __xchg{release }(X,V)
34- xchg_acquire(X,V) __xchg{acquire }(X,V)
35- cmpxchg(X,V,W) __cmpxchg{mb }(X,V,W)
36- cmpxchg_relaxed(X,V,W) __cmpxchg{once }(X,V,W)
37- cmpxchg_acquire(X,V,W) __cmpxchg{acquire }(X,V,W)
38- cmpxchg_release(X,V,W) __cmpxchg{release }(X,V,W)
31+ xchg(X,V) __xchg{MB }(X,V)
32+ xchg_relaxed(X,V) __xchg{ONCE }(X,V)
33+ xchg_release(X,V) __xchg{RELEASE }(X,V)
34+ xchg_acquire(X,V) __xchg{ACQUIRE }(X,V)
35+ cmpxchg(X,V,W) __cmpxchg{MB }(X,V,W)
36+ cmpxchg_relaxed(X,V,W) __cmpxchg{ONCE }(X,V,W)
37+ cmpxchg_acquire(X,V,W) __cmpxchg{ACQUIRE }(X,V,W)
38+ cmpxchg_release(X,V,W) __cmpxchg{RELEASE }(X,V,W)
3939
4040// Spinlocks
4141spin_lock(X) { __lock(X); }
@@ -63,86 +63,86 @@ atomic_set(X,V) { WRITE_ONCE(*X,V); }
6363atomic_read_acquire(X) smp_load_acquire(X)
6464atomic_set_release(X,V) { smp_store_release(X,V); }
6565
66- atomic_add(V,X) { __atomic_op{noreturn }(X,+,V); }
67- atomic_sub(V,X) { __atomic_op{noreturn }(X,-,V); }
68- atomic_and(V,X) { __atomic_op{noreturn }(X,&,V); }
69- atomic_or(V,X) { __atomic_op{noreturn }(X,|,V); }
70- atomic_xor(V,X) { __atomic_op{noreturn }(X,^,V); }
71- atomic_inc(X) { __atomic_op{noreturn }(X,+,1); }
72- atomic_dec(X) { __atomic_op{noreturn }(X,-,1); }
73- atomic_andnot(V,X) { __atomic_op{noreturn }(X,&~,V); }
74-
75- atomic_add_return(V,X) __atomic_op_return{mb }(X,+,V)
76- atomic_add_return_relaxed(V,X) __atomic_op_return{once }(X,+,V)
77- atomic_add_return_acquire(V,X) __atomic_op_return{acquire }(X,+,V)
78- atomic_add_return_release(V,X) __atomic_op_return{release }(X,+,V)
79- atomic_fetch_add(V,X) __atomic_fetch_op{mb }(X,+,V)
80- atomic_fetch_add_relaxed(V,X) __atomic_fetch_op{once }(X,+,V)
81- atomic_fetch_add_acquire(V,X) __atomic_fetch_op{acquire }(X,+,V)
82- atomic_fetch_add_release(V,X) __atomic_fetch_op{release }(X,+,V)
83-
84- atomic_fetch_and(V,X) __atomic_fetch_op{mb }(X,&,V)
85- atomic_fetch_and_relaxed(V,X) __atomic_fetch_op{once }(X,&,V)
86- atomic_fetch_and_acquire(V,X) __atomic_fetch_op{acquire }(X,&,V)
87- atomic_fetch_and_release(V,X) __atomic_fetch_op{release }(X,&,V)
88-
89- atomic_fetch_or(V,X) __atomic_fetch_op{mb }(X,|,V)
90- atomic_fetch_or_relaxed(V,X) __atomic_fetch_op{once }(X,|,V)
91- atomic_fetch_or_acquire(V,X) __atomic_fetch_op{acquire }(X,|,V)
92- atomic_fetch_or_release(V,X) __atomic_fetch_op{release }(X,|,V)
93-
94- atomic_fetch_xor(V,X) __atomic_fetch_op{mb }(X,^,V)
95- atomic_fetch_xor_relaxed(V,X) __atomic_fetch_op{once }(X,^,V)
96- atomic_fetch_xor_acquire(V,X) __atomic_fetch_op{acquire }(X,^,V)
97- atomic_fetch_xor_release(V,X) __atomic_fetch_op{release }(X,^,V)
98-
99- atomic_inc_return(X) __atomic_op_return{mb }(X,+,1)
100- atomic_inc_return_relaxed(X) __atomic_op_return{once }(X,+,1)
101- atomic_inc_return_acquire(X) __atomic_op_return{acquire }(X,+,1)
102- atomic_inc_return_release(X) __atomic_op_return{release }(X,+,1)
103- atomic_fetch_inc(X) __atomic_fetch_op{mb }(X,+,1)
104- atomic_fetch_inc_relaxed(X) __atomic_fetch_op{once }(X,+,1)
105- atomic_fetch_inc_acquire(X) __atomic_fetch_op{acquire }(X,+,1)
106- atomic_fetch_inc_release(X) __atomic_fetch_op{release }(X,+,1)
107-
108- atomic_sub_return(V,X) __atomic_op_return{mb }(X,-,V)
109- atomic_sub_return_relaxed(V,X) __atomic_op_return{once }(X,-,V)
110- atomic_sub_return_acquire(V,X) __atomic_op_return{acquire }(X,-,V)
111- atomic_sub_return_release(V,X) __atomic_op_return{release }(X,-,V)
112- atomic_fetch_sub(V,X) __atomic_fetch_op{mb }(X,-,V)
113- atomic_fetch_sub_relaxed(V,X) __atomic_fetch_op{once }(X,-,V)
114- atomic_fetch_sub_acquire(V,X) __atomic_fetch_op{acquire }(X,-,V)
115- atomic_fetch_sub_release(V,X) __atomic_fetch_op{release }(X,-,V)
116-
117- atomic_dec_return(X) __atomic_op_return{mb }(X,-,1)
118- atomic_dec_return_relaxed(X) __atomic_op_return{once }(X,-,1)
119- atomic_dec_return_acquire(X) __atomic_op_return{acquire }(X,-,1)
120- atomic_dec_return_release(X) __atomic_op_return{release }(X,-,1)
121- atomic_fetch_dec(X) __atomic_fetch_op{mb }(X,-,1)
122- atomic_fetch_dec_relaxed(X) __atomic_fetch_op{once }(X,-,1)
123- atomic_fetch_dec_acquire(X) __atomic_fetch_op{acquire }(X,-,1)
124- atomic_fetch_dec_release(X) __atomic_fetch_op{release }(X,-,1)
125-
126- atomic_xchg(X,V) __xchg{mb }(X,V)
127- atomic_xchg_relaxed(X,V) __xchg{once }(X,V)
128- atomic_xchg_release(X,V) __xchg{release }(X,V)
129- atomic_xchg_acquire(X,V) __xchg{acquire }(X,V)
130- atomic_cmpxchg(X,V,W) __cmpxchg{mb }(X,V,W)
131- atomic_cmpxchg_relaxed(X,V,W) __cmpxchg{once }(X,V,W)
132- atomic_cmpxchg_acquire(X,V,W) __cmpxchg{acquire }(X,V,W)
133- atomic_cmpxchg_release(X,V,W) __cmpxchg{release }(X,V,W)
134-
135- atomic_sub_and_test(V,X) __atomic_op_return{mb }(X,-,V) == 0
136- atomic_dec_and_test(X) __atomic_op_return{mb }(X,-,1) == 0
137- atomic_inc_and_test(X) __atomic_op_return{mb }(X,+,1) == 0
138- atomic_add_negative(V,X) __atomic_op_return{mb }(X,+,V) < 0
139- atomic_add_negative_relaxed(V,X) __atomic_op_return{once }(X,+,V) < 0
140- atomic_add_negative_acquire(V,X) __atomic_op_return{acquire }(X,+,V) < 0
141- atomic_add_negative_release(V,X) __atomic_op_return{release }(X,+,V) < 0
142-
143- atomic_fetch_andnot(V,X) __atomic_fetch_op{mb }(X,&~,V)
144- atomic_fetch_andnot_acquire(V,X) __atomic_fetch_op{acquire }(X,&~,V)
145- atomic_fetch_andnot_release(V,X) __atomic_fetch_op{release }(X,&~,V)
146- atomic_fetch_andnot_relaxed(V,X) __atomic_fetch_op{once }(X,&~,V)
147-
148- atomic_add_unless(X,V,W) __atomic_add_unless{mb }(X,V,W)
66+ atomic_add(V,X) { __atomic_op{NORETURN }(X,+,V); }
67+ atomic_sub(V,X) { __atomic_op{NORETURN }(X,-,V); }
68+ atomic_and(V,X) { __atomic_op{NORETURN }(X,&,V); }
69+ atomic_or(V,X) { __atomic_op{NORETURN }(X,|,V); }
70+ atomic_xor(V,X) { __atomic_op{NORETURN }(X,^,V); }
71+ atomic_inc(X) { __atomic_op{NORETURN }(X,+,1); }
72+ atomic_dec(X) { __atomic_op{NORETURN }(X,-,1); }
73+ atomic_andnot(V,X) { __atomic_op{NORETURN }(X,&~,V); }
74+
75+ atomic_add_return(V,X) __atomic_op_return{MB }(X,+,V)
76+ atomic_add_return_relaxed(V,X) __atomic_op_return{ONCE }(X,+,V)
77+ atomic_add_return_acquire(V,X) __atomic_op_return{ACQUIRE }(X,+,V)
78+ atomic_add_return_release(V,X) __atomic_op_return{RELEASE }(X,+,V)
79+ atomic_fetch_add(V,X) __atomic_fetch_op{MB }(X,+,V)
80+ atomic_fetch_add_relaxed(V,X) __atomic_fetch_op{ONCE }(X,+,V)
81+ atomic_fetch_add_acquire(V,X) __atomic_fetch_op{ACQUIRE }(X,+,V)
82+ atomic_fetch_add_release(V,X) __atomic_fetch_op{RELEASE }(X,+,V)
83+
84+ atomic_fetch_and(V,X) __atomic_fetch_op{MB }(X,&,V)
85+ atomic_fetch_and_relaxed(V,X) __atomic_fetch_op{ONCE }(X,&,V)
86+ atomic_fetch_and_acquire(V,X) __atomic_fetch_op{ACQUIRE }(X,&,V)
87+ atomic_fetch_and_release(V,X) __atomic_fetch_op{RELEASE }(X,&,V)
88+
89+ atomic_fetch_or(V,X) __atomic_fetch_op{MB }(X,|,V)
90+ atomic_fetch_or_relaxed(V,X) __atomic_fetch_op{ONCE }(X,|,V)
91+ atomic_fetch_or_acquire(V,X) __atomic_fetch_op{ACQUIRE }(X,|,V)
92+ atomic_fetch_or_release(V,X) __atomic_fetch_op{RELEASE }(X,|,V)
93+
94+ atomic_fetch_xor(V,X) __atomic_fetch_op{MB }(X,^,V)
95+ atomic_fetch_xor_relaxed(V,X) __atomic_fetch_op{ONCE }(X,^,V)
96+ atomic_fetch_xor_acquire(V,X) __atomic_fetch_op{ACQUIRE }(X,^,V)
97+ atomic_fetch_xor_release(V,X) __atomic_fetch_op{RELEASE }(X,^,V)
98+
99+ atomic_inc_return(X) __atomic_op_return{MB }(X,+,1)
100+ atomic_inc_return_relaxed(X) __atomic_op_return{ONCE }(X,+,1)
101+ atomic_inc_return_acquire(X) __atomic_op_return{ACQUIRE }(X,+,1)
102+ atomic_inc_return_release(X) __atomic_op_return{RELEASE }(X,+,1)
103+ atomic_fetch_inc(X) __atomic_fetch_op{MB }(X,+,1)
104+ atomic_fetch_inc_relaxed(X) __atomic_fetch_op{ONCE }(X,+,1)
105+ atomic_fetch_inc_acquire(X) __atomic_fetch_op{ACQUIRE }(X,+,1)
106+ atomic_fetch_inc_release(X) __atomic_fetch_op{RELEASE }(X,+,1)
107+
108+ atomic_sub_return(V,X) __atomic_op_return{MB }(X,-,V)
109+ atomic_sub_return_relaxed(V,X) __atomic_op_return{ONCE }(X,-,V)
110+ atomic_sub_return_acquire(V,X) __atomic_op_return{ACQUIRE }(X,-,V)
111+ atomic_sub_return_release(V,X) __atomic_op_return{RELEASE }(X,-,V)
112+ atomic_fetch_sub(V,X) __atomic_fetch_op{MB }(X,-,V)
113+ atomic_fetch_sub_relaxed(V,X) __atomic_fetch_op{ONCE }(X,-,V)
114+ atomic_fetch_sub_acquire(V,X) __atomic_fetch_op{ACQUIRE }(X,-,V)
115+ atomic_fetch_sub_release(V,X) __atomic_fetch_op{RELEASE }(X,-,V)
116+
117+ atomic_dec_return(X) __atomic_op_return{MB }(X,-,1)
118+ atomic_dec_return_relaxed(X) __atomic_op_return{ONCE }(X,-,1)
119+ atomic_dec_return_acquire(X) __atomic_op_return{ACQUIRE }(X,-,1)
120+ atomic_dec_return_release(X) __atomic_op_return{RELEASE }(X,-,1)
121+ atomic_fetch_dec(X) __atomic_fetch_op{MB }(X,-,1)
122+ atomic_fetch_dec_relaxed(X) __atomic_fetch_op{ONCE }(X,-,1)
123+ atomic_fetch_dec_acquire(X) __atomic_fetch_op{ACQUIRE }(X,-,1)
124+ atomic_fetch_dec_release(X) __atomic_fetch_op{RELEASE }(X,-,1)
125+
126+ atomic_xchg(X,V) __xchg{MB }(X,V)
127+ atomic_xchg_relaxed(X,V) __xchg{ONCE }(X,V)
128+ atomic_xchg_release(X,V) __xchg{RELEASE }(X,V)
129+ atomic_xchg_acquire(X,V) __xchg{ACQUIRE }(X,V)
130+ atomic_cmpxchg(X,V,W) __cmpxchg{MB }(X,V,W)
131+ atomic_cmpxchg_relaxed(X,V,W) __cmpxchg{ONCE }(X,V,W)
132+ atomic_cmpxchg_acquire(X,V,W) __cmpxchg{ACQUIRE }(X,V,W)
133+ atomic_cmpxchg_release(X,V,W) __cmpxchg{RELEASE }(X,V,W)
134+
135+ atomic_sub_and_test(V,X) __atomic_op_return{MB }(X,-,V) == 0
136+ atomic_dec_and_test(X) __atomic_op_return{MB }(X,-,1) == 0
137+ atomic_inc_and_test(X) __atomic_op_return{MB }(X,+,1) == 0
138+ atomic_add_negative(V,X) __atomic_op_return{MB }(X,+,V) < 0
139+ atomic_add_negative_relaxed(V,X) __atomic_op_return{ONCE }(X,+,V) < 0
140+ atomic_add_negative_acquire(V,X) __atomic_op_return{ACQUIRE }(X,+,V) < 0
141+ atomic_add_negative_release(V,X) __atomic_op_return{RELEASE }(X,+,V) < 0
142+
143+ atomic_fetch_andnot(V,X) __atomic_fetch_op{MB }(X,&~,V)
144+ atomic_fetch_andnot_acquire(V,X) __atomic_fetch_op{ACQUIRE }(X,&~,V)
145+ atomic_fetch_andnot_release(V,X) __atomic_fetch_op{RELEASE }(X,&~,V)
146+ atomic_fetch_andnot_relaxed(V,X) __atomic_fetch_op{ONCE }(X,&~,V)
147+
148+ atomic_add_unless(X,V,W) __atomic_add_unless{MB }(X,V,W)
0 commit comments