Skip to content

Commit dcc5197

Browse files
Jonas Oberhauserpaulmckrcu
authored andcommitted
tools/memory-model: Distinguish between syntactic and semantic tags
Not all annotated accesses provide the semantics their syntactic tags would imply. For example, an 'acquire tag on a write does not imply that the write is finally in the Acquire set and provides acquire ordering. To distinguish in those cases between the syntactic tags and actual sets, we capitalize the former, so 'ACQUIRE tags may be present on both reads and writes, but only reads will appear in the Acquire set. For tags where the two concepts are the same we do not use specific capitalization to make this distinction. Reported-by: Boqun Feng <[email protected]> Signed-off-by: Jonas Oberhauser <[email protected]> Reviewed-by: Boqun Feng <[email protected]> Tested-by: Boqun Feng <[email protected]> Signed-off-by: Paul E. McKenney <[email protected]> Tested-by: Akira Yokosawa <[email protected]> # herdtools7.7.58
1 parent fafa180 commit dcc5197

File tree

3 files changed

+132
-132
lines changed

3 files changed

+132
-132
lines changed

tools/memory-model/Documentation/herd-representation.txt

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
# Note that the syntactic representation does not always match the sets and
2222
# relations in linux-kernel.cat, due to redefinitions in linux-kernel.bell and
2323
# lock.cat. For example, the po link between LKR and LKW is upgraded to an rmw
24-
# link, and W[acquire] are not included in the Acquire set.
24+
# link, and W[ACQUIRE] are not included in the Acquire set.
2525
#
2626
# Disclaimer. The table includes representations of "add" and "and" operations;
2727
# corresponding/identical representations of "sub", "inc", "dec" and "or", "xor",
@@ -32,16 +32,16 @@
3232
------------------------------------------------------------------------------
3333
| Non-RMW ops | |
3434
------------------------------------------------------------------------------
35-
| READ_ONCE | R[once] |
35+
| READ_ONCE | R[ONCE] |
3636
| atomic_read | |
37-
| WRITE_ONCE | W[once] |
37+
| WRITE_ONCE | W[ONCE] |
3838
| atomic_set | |
39-
| smp_load_acquire | R[acquire] |
39+
| smp_load_acquire | R[ACQUIRE] |
4040
| atomic_read_acquire | |
41-
| smp_store_release | W[release] |
41+
| smp_store_release | W[RELEASE] |
4242
| atomic_set_release | |
43-
| smp_store_mb | W[once] ->po F[mb] |
44-
| smp_mb | F[mb] |
43+
| smp_store_mb | W[ONCE] ->po F[MB] |
44+
| smp_mb | F[MB] |
4545
| smp_rmb | F[rmb] |
4646
| smp_wmb | F[wmb] |
4747
| smp_mb__before_atomic | F[before-atomic] |
@@ -54,8 +54,8 @@
5454
| rcu_read_lock | F[rcu-lock] |
5555
| rcu_read_unlock | F[rcu-unlock] |
5656
| synchronize_rcu | F[sync-rcu] |
57-
| rcu_dereference | R[once] |
58-
| rcu_assign_pointer | W[release] |
57+
| rcu_dereference | R[ONCE] |
58+
| rcu_assign_pointer | W[RELEASE] |
5959
| srcu_read_lock | R[srcu-lock] |
6060
| srcu_down_read | |
6161
| srcu_read_unlock | W[srcu-unlock] |
@@ -65,31 +65,31 @@
6565
------------------------------------------------------------------------------
6666
| RMW ops w/o return value | |
6767
------------------------------------------------------------------------------
68-
| atomic_add | R*[noreturn] ->rmw W*[noreturn] |
68+
| atomic_add | R*[NORETURN] ->rmw W*[NORETURN] |
6969
| atomic_and | |
7070
| spin_lock | LKR ->po LKW |
7171
------------------------------------------------------------------------------
7272
| RMW ops w/ return value | |
7373
------------------------------------------------------------------------------
74-
| atomic_add_return | R*[mb] ->rmw W*[mb] |
74+
| atomic_add_return | R*[MB] ->rmw W*[MB] |
7575
| atomic_fetch_add | |
7676
| atomic_fetch_and | |
7777
| atomic_xchg | |
7878
| xchg | |
7979
| atomic_add_negative | |
80-
| atomic_add_return_relaxed | R*[once] ->rmw W*[once] |
80+
| atomic_add_return_relaxed | R*[ONCE] ->rmw W*[ONCE] |
8181
| atomic_fetch_add_relaxed | |
8282
| atomic_fetch_and_relaxed | |
8383
| atomic_xchg_relaxed | |
8484
| xchg_relaxed | |
8585
| atomic_add_negative_relaxed | |
86-
| atomic_add_return_acquire | R*[acquire] ->rmw W*[acquire] |
86+
| atomic_add_return_acquire | R*[ACQUIRE] ->rmw W*[ACQUIRE] |
8787
| atomic_fetch_add_acquire | |
8888
| atomic_fetch_and_acquire | |
8989
| atomic_xchg_acquire | |
9090
| xchg_acquire | |
9191
| atomic_add_negative_acquire | |
92-
| atomic_add_return_release | R*[release] ->rmw W*[release] |
92+
| atomic_add_return_release | R*[RELEASE] ->rmw W*[RELEASE] |
9393
| atomic_fetch_add_release | |
9494
| atomic_fetch_and_release | |
9595
| atomic_xchg_release | |
@@ -98,16 +98,16 @@
9898
------------------------------------------------------------------------------
9999
| Conditional RMW ops | |
100100
------------------------------------------------------------------------------
101-
| atomic_cmpxchg | On success: R*[mb] ->rmw W*[mb] |
102-
| | On failure: R*[mb] |
101+
| atomic_cmpxchg | On success: R*[MB] ->rmw W*[MB] |
102+
| | On failure: R*[MB] |
103103
| cmpxchg | |
104104
| atomic_add_unless | |
105-
| atomic_cmpxchg_relaxed | On success: R*[once] ->rmw W*[once] |
106-
| | On failure: R*[once] |
107-
| atomic_cmpxchg_acquire | On success: R*[acquire] ->rmw W*[acquire] |
108-
| | On failure: R*[acquire] |
109-
| atomic_cmpxchg_release | On success: R*[release] ->rmw W*[release] |
110-
| | On failure: R*[release] |
105+
| atomic_cmpxchg_relaxed | On success: R*[ONCE] ->rmw W*[ONCE] |
106+
| | On failure: R*[ONCE] |
107+
| atomic_cmpxchg_acquire | On success: R*[ACQUIRE] ->rmw W*[ACQUIRE] |
108+
| | On failure: R*[ACQUIRE] |
109+
| atomic_cmpxchg_release | On success: R*[RELEASE] ->rmw W*[RELEASE] |
110+
| | On failure: R*[RELEASE] |
111111
| spin_trylock | On success: LKR ->po LKW |
112112
| | On failure: LF |
113113
------------------------------------------------------------------------------

tools/memory-model/linux-kernel.bell

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@
1313

1414
"Linux-kernel memory consistency model"
1515

16-
enum Accesses = 'once (*READ_ONCE,WRITE_ONCE*) ||
17-
'release (*smp_store_release*) ||
18-
'acquire (*smp_load_acquire*) ||
19-
'noreturn (* R of non-return RMW *) ||
20-
'mb (*xchg(),cmpxchg(),...*)
16+
enum Accesses = 'ONCE (*READ_ONCE,WRITE_ONCE*) ||
17+
'RELEASE (*smp_store_release*) ||
18+
'ACQUIRE (*smp_load_acquire*) ||
19+
'NORETURN (* R of non-return RMW *) ||
20+
'MB (*xchg(),cmpxchg(),...*)
2121
instructions R[Accesses]
2222
instructions W[Accesses]
2323
instructions RMW[Accesses]
2424

2525
enum Barriers = 'wmb (*smp_wmb*) ||
2626
'rmb (*smp_rmb*) ||
27-
'mb (*smp_mb*) ||
27+
'MB (*smp_mb*) ||
2828
'barrier (*barrier*) ||
2929
'rcu-lock (*rcu_read_lock*) ||
3030
'rcu-unlock (*rcu_read_unlock*) ||
@@ -42,10 +42,10 @@ instructions F[Barriers]
4242
* semantic ordering, such as Acquire on a store or Mb on a failed RMW.
4343
*)
4444
let FailedRMW = RMW \ (domain(rmw) | range(rmw))
45-
let Acquire = Acquire \ W \ FailedRMW
46-
let Release = Release \ R \ FailedRMW
47-
let Mb = Mb \ FailedRMW
48-
let Noreturn = Noreturn \ W
45+
let Acquire = ACQUIRE \ W \ FailedRMW
46+
let Release = RELEASE \ R \ FailedRMW
47+
let Mb = MB \ FailedRMW
48+
let Noreturn = NORETURN \ W
4949

5050
(* SRCU *)
5151
enum SRCU = 'srcu-lock || 'srcu-unlock || 'sync-srcu
@@ -85,7 +85,7 @@ flag ~empty rcu-rscs & (po ; [Sync-srcu] ; po) as invalid-sleep
8585
flag ~empty different-values(srcu-rscs) as srcu-bad-value-match
8686

8787
(* Compute marked and plain memory accesses *)
88-
let Marked = (~M) | IW | Once | Release | Acquire | domain(rmw) | range(rmw) |
88+
let Marked = (~M) | IW | ONCE | RELEASE | ACQUIRE | MB | RMW |
8989
LKR | LKW | UL | LF | RL | RU | Srcu-lock | Srcu-unlock
9090
let Plain = M \ Marked
9191

tools/memory-model/linux-kernel.def

Lines changed: 99 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
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}; }
2121
smp_rmb() { __fence{rmb}; }
2222
smp_wmb() { __fence{wmb}; }
2323
smp_mb__before_atomic() { __fence{before-atomic}; }
@@ -28,14 +28,14 @@ smp_mb__after_srcu_read_unlock() { __fence{after-srcu-read-unlock}; }
2828
barrier() { __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
4141
spin_lock(X) { __lock(X); }
@@ -63,86 +63,86 @@ atomic_set(X,V) { WRITE_ONCE(*X,V); }
6363
atomic_read_acquire(X) smp_load_acquire(X)
6464
atomic_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

Comments
 (0)