atomic.h revision 80708
1/*-
2 * Copyright (c) 2001 Jake Burkholder.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/sparc64/include/atomic.h 80708 2001-07-31 05:45:16Z jake $
27 */
28
29/*
30 * This is not atomic.  It is just a stub to make things compile.
31 */
32
33#ifndef	_MACHINE_ATOMIC_H_
34#define	_MACHINE_ATOMIC_H_
35
36#define	__atomic_op(p, op, v) ({					\
37	__typeof(*p) __v = (__typeof(*p))v;				\
38	*p op __v;							\
39})
40
41#define	__atomic_load(p) ({						\
42	__typeof(*p) __v;						\
43	__v = *p;							\
44	__v;								\
45})
46
47#define	__atomic_load_clear(p) ({					\
48	__typeof(*p) __v;						\
49	__v = *p;							\
50	*p = 0;								\
51	__v;								\
52})
53
54#define	__atomic_cas(p, e, s) ({					\
55	u_int __v;							\
56	if (*p == (__typeof(*p))e) {					\
57		*p = (__typeof(*p))s;					\
58		__v = 1;						\
59	} else {							\
60		__v = 0;						\
61	}								\
62	__v;								\
63})
64
65#define	__atomic_op_8(p, op, v)		__atomic_op(p, op, v)
66#define	__atomic_op_16(p, op, v)	__atomic_op(p, op, v)
67#define	__atomic_op_32(p, op, v)	__atomic_op(p, op, v)
68#define	__atomic_load_32(p)		__atomic_load(p)
69#define	__atomic_load_clear_32(p)	__atomic_load_clear(p)
70#define	__atomic_cas_32(p, e, s)	__atomic_cas(p, e, s)
71#define	__atomic_op_64(p, op, v)	__atomic_op(p, op, v)
72#define	__atomic_load_64(p)		__atomic_load(p)
73#define	__atomic_load_clear_64(p)	__atomic_load_clear(p)
74#define	__atomic_cas_64(p, e, s)	__atomic_cas(p, e, s)
75
76#define	atomic_add_8(p, v)		__atomic_op_8(p, +=, v)
77#define	atomic_subtract_8(p, v)		__atomic_op_8(p, -=, v)
78#define	atomic_set_8(p, v)		__atomic_op_8(p, |=, v)
79#define	atomic_clear_8(p, v)		__atomic_op_8(p, &=, ~v)
80#define	atomic_store_8(p, v)		__atomic_op_8(p, =, v)
81
82#define	atomic_add_16(p, v)		__atomic_op_16(p, +=, v)
83#define	atomic_subtract_16(p, v)	__atomic_op_16(p, -=, v)
84#define	atomic_set_16(p, v)		__atomic_op_16(p, |=, v)
85#define	atomic_clear_16(p, v)		__atomic_op_16(p, &=, ~v)
86#define	atomic_store_16(p, v)		__atomic_op_16(p, =, v)
87
88#define	atomic_add_32(p, v)		__atomic_op_32(p, +=, v)
89#define	atomic_subtract_32(p, v)	__atomic_op_32(p, -=, v)
90#define	atomic_set_32(p, v)		__atomic_op_32(p, |=, v)
91#define	atomic_clear_32(p, v)		__atomic_op_32(p, &=, ~v)
92#define	atomic_store_32(p, v)		__atomic_op_32(p, =, v)
93#define	atomic_load_32(p)		__atomic_load_32(p)
94#define	atomic_readandclear_32(p)	__atomic_load_clear_32(p)
95#define	atomic_cmpset_32(p, e, s)	__atomic_cas_32(p, e, s)
96
97#define	atomic_add_64(p, v)		__atomic_op_64(p, +=, v)
98#define	atomic_subtract_64(p, v)	__atomic_op_64(p, -=, v)
99#define	atomic_set_64(p, v)		__atomic_op_64(p, |=, v)
100#define	atomic_clear_64(p, v)		__atomic_op_64(p, &=, ~v)
101#define	atomic_store_64(p, v)		__atomic_op_64(p, =, v)
102#define	atomic_load_64(p)		__atomic_load_64(p)
103#define	atomic_readandclear_64(p)	__atomic_load_clear_64(p)
104#define	atomic_cmpset_64(p, e, s)	__atomic_cas_64(p, e, s)
105
106#define	atomic_add_acq_8(p, v)		__atomic_op_8(p, +=, v)
107#define	atomic_subtract_acq_8(p, v)	__atomic_op_8(p, -=, v)
108#define	atomic_set_acq_8(p, v)		__atomic_op_8(p, |=, v)
109#define	atomic_clear_acq_8(p, v)	__atomic_op_8(p, &=, ~v)
110#define	atomic_store_acq_8(p, v)	__atomic_op_8(p, =, v)
111
112#define	atomic_add_acq_16(p, v)		__atomic_op_16(p, +=, v)
113#define	atomic_subtract_acq_16(p, v)	__atomic_op_16(p, -=, v)
114#define	atomic_set_acq_16(p, v)		__atomic_op_16(p, |=, v)
115#define	atomic_clear_acq_16(p, v)	__atomic_op_16(p, &=, ~v)
116#define	atomic_store_acq_16(p, v)	__atomic_op_16(p, =, v)
117
118#define	atomic_add_acq_32(p, v)		__atomic_op_32(p, +=, v)
119#define	atomic_subtract_acq_32(p, v)	__atomic_op_32(p, -=, v)
120#define	atomic_set_acq_32(p, v)		__atomic_op_32(p, |=, v)
121#define	atomic_clear_acq_32(p, v)	__atomic_op_32(p, &=, ~v)
122#define	atomic_store_acq_32(p, v)	__atomic_op_32(p, =, v)
123#define	atomic_load_acq_32(p)		__atomic_load_32(p)
124#define	atomic_cmpset_acq_32(p, e, s)	__atomic_cas_32(p, e, s)
125
126#define	atomic_add_acq_64(p, v)		__atomic_op_64(p, +=, v)
127#define	atomic_subtract_acq_64(p, v)	__atomic_op_64(p, -=, v)
128#define	atomic_set_acq_64(p, v)		__atomic_op_64(p, |=, v)
129#define	atomic_clear_acq_64(p, v)	__atomic_op_64(p, &=, ~v)
130#define	atomic_store_acq_64(p, v)	__atomic_op_64(p, =, v)
131#define	atomic_load_acq_64(p)		__atomic_load_64(p)
132#define	atomic_cmpset_acq_64(p, e, s)	__atomic_cas_64(p, e, s)
133
134#define	atomic_add_rel_8(p, v)		__atomic_op_8(p, +=, v)
135#define	atomic_subtract_rel_8(p, v)	__atomic_op_8(p, -=, v)
136#define	atomic_set_rel_8(p, v)		__atomic_op_8(p, |=, v)
137#define	atomic_clear_rel_8(p, v)	__atomic_op_8(p, &=, ~v)
138#define	atomic_store_rel_8(p, v)	__atomic_op_8(p, =, v)
139
140#define	atomic_add_rel_16(p, v)		__atomic_op_16(p, +=, v)
141#define	atomic_subtract_rel_16(p, v)	__atomic_op_16(p, -=, v)
142#define	atomic_set_rel_16(p, v)		__atomic_op_16(p, |=, v)
143#define	atomic_clear_rel_16(p, v)	__atomic_op_16(p, &=, ~v)
144#define	atomic_store_rel_16(p, v)	__atomic_op_16(p, =, v)
145
146#define	atomic_add_rel_32(p, v)		__atomic_op_32(p, +=, v)
147#define	atomic_subtract_rel_32(p, v)	__atomic_op_32(p, -=, v)
148#define	atomic_set_rel_32(p, v)		__atomic_op_32(p, |=, v)
149#define	atomic_clear_rel_32(p, v)	__atomic_op_32(p, &=, ~v)
150#define	atomic_store_rel_32(p, v)	__atomic_op_32(p, =, v)
151#define	atomic_cmpset_rel_32(p, e, s)	__atomic_cas_32(p, e, s)
152
153#define	atomic_add_rel_64(p, v)		__atomic_op_64(p, +=, v)
154#define	atomic_subtract_rel_64(p, v)	__atomic_op_64(p, -=, v)
155#define	atomic_set_rel_64(p, v)		__atomic_op_64(p, |=, v)
156#define	atomic_clear_rel_64(p, v)	__atomic_op_64(p, &=, ~v)
157#define	atomic_store_rel_64(p, v)	__atomic_op_64(p, =, v)
158#define	atomic_cmpset_rel_64(p, e, s)	__atomic_cas_64(p, e, s)
159
160#define	atomic_add_char(p, v)		__atomic_op_8(p, +=, v)
161#define	atomic_subtract_char(p, v)	__atomic_op_8(p, -=, v)
162#define	atomic_set_char(p, v)		__atomic_op_8(p, |=, v)
163#define	atomic_clear_char(p, v)		__atomic_op_8(p, &=, ~v)
164#define	atomic_store_char(p, v)		__atomic_op_8(p, =, v)
165
166#define	atomic_add_short(p, v)		__atomic_op_16(p, +=, v)
167#define	atomic_subtract_short(p, v)	__atomic_op_16(p, -=, v)
168#define	atomic_set_short(p, v)		__atomic_op_16(p, |=, v)
169#define	atomic_clear_short(p, v)	__atomic_op_16(p, &=, ~v)
170#define	atomic_store_short(p, v)	__atomic_op_16(p, =, v)
171
172#define	atomic_add_int(p, v)		__atomic_op_32(p, +=, v)
173#define	atomic_subtract_int(p, v)	__atomic_op_32(p, -=, v)
174#define	atomic_set_int(p, v)		__atomic_op_32(p, |=, v)
175#define	atomic_clear_int(p, v)		__atomic_op_32(p, &=, ~v)
176#define	atomic_store_int(p, v)		__atomic_op_32(p, =, v)
177#define	atomic_load_int(p)		__atomic_load_32(p)
178#define	atomic_readandclear_int(p)	__atomic_load_clear_32(p)
179#define	atomic_cmpset_int(p, e, s)	__atomic_cas_32(p, e, s)
180
181#define	atomic_add_long(p, v)		__atomic_op_64(p, +=, v)
182#define	atomic_subtract_long(p, v)	__atomic_op_64(p, -=, v)
183#define	atomic_set_long(p, v)		__atomic_op_64(p, |=, v)
184#define	atomic_clear_long(p, v)		__atomic_op_64(p, &=, ~v)
185#define	atomic_store_long(p, v)		__atomic_op_64(p, =, v)
186#define	atomic_load_long(p)		__atomic_load_64(p)
187#define	atomic_readandclear_long(p)	__atomic_load_clear_64(p)
188#define	atomic_cmpset_long(p, e, s)	__atomic_cas_64(p, e, s)
189
190#define	atomic_add_acq_char(p, v)	__atomic_op_8(p, +=, v)
191#define	atomic_subtract_acq_char(p, v)	__atomic_op_8(p, -=, v)
192#define	atomic_set_acq_char(p, v)	__atomic_op_8(p, |=, v)
193#define	atomic_clear_acq_char(p, v)	__atomic_op_8(p, &=, ~v)
194#define	atomic_store_acq_char(p, v)	__atomic_op_8(p, =, v)
195
196#define	atomic_add_acq_short(p, v)	__atomic_op_16(p, +=, v)
197#define	atomic_subtract_acq_short(p, v)	__atomic_op_16(p, -=, v)
198#define	atomic_set_acq_short(p, v)	__atomic_op_16(p, |=, v)
199#define	atomic_clear_acq_short(p, v)	__atomic_op_16(p, &=, ~v)
200#define	atomic_store_acq_short(p, v)	__atomic_op_16(p, =, v)
201
202#define	atomic_add_acq_int(p, v)	__atomic_op_32(p, +=, v)
203#define	atomic_subtract_acq_int(p, v)	__atomic_op_32(p, -=, v)
204#define	atomic_set_acq_int(p, v)	__atomic_op_32(p, |=, v)
205#define	atomic_clear_acq_int(p, v)	__atomic_op_32(p, &=, ~v)
206#define	atomic_store_acq_int(p, v)	__atomic_op_32(p, =, v)
207#define	atomic_load_acq_int(p)		__atomic_load_32(p)
208#define	atomic_cmpset_acq_int(p, e, s)	__atomic_cas_32(p, e, s)
209
210#define	atomic_add_acq_long(p, v)	__atomic_op_64(p, +=, v)
211#define	atomic_subtract_acq_long(p, v)	__atomic_op_64(p, -=, v)
212#define	atomic_set_acq_long(p, v)	__atomic_op_64(p, |=, v)
213#define	atomic_clear_acq_long(p, v)	__atomic_op_64(p, &=, ~v)
214#define	atomic_store_acq_long(p, v)	__atomic_op_64(p, =, v)
215#define	atomic_load_acq_long(p)		__atomic_load_64(p)
216#define	atomic_cmpset_acq_long(p, e, s)	__atomic_cas_64(p, e, s)
217
218#define	atomic_add_rel_char(p, v)	__atomic_op_8(p, +=, v)
219#define	atomic_subtract_rel_char(p, v)	__atomic_op_8(p, -=, v)
220#define	atomic_set_rel_char(p, v)	__atomic_op_8(p, |=, v)
221#define	atomic_clear_rel_char(p, v)	__atomic_op_8(p, &=, ~v)
222#define	atomic_store_rel_char(p, v)	__atomic_op_8(p, =, v)
223
224#define	atomic_add_rel_short(p, v)	__atomic_op_16(p, +=, v)
225#define	atomic_subtract_rel_short(p, v)	__atomic_op_16(p, -=, v)
226#define	atomic_set_rel_short(p, v)	__atomic_op_16(p, |=, v)
227#define	atomic_clear_rel_short(p, v)	__atomic_op_16(p, &=, ~v)
228#define	atomic_store_rel_short(p, v)	__atomic_op_16(p, =, v)
229
230#define	atomic_add_rel_int(p, v)	__atomic_op_32(p, +=, v)
231#define	atomic_subtract_rel_int(p, v)	__atomic_op_32(p, -=, v)
232#define	atomic_set_rel_int(p, v)	__atomic_op_32(p, |=, v)
233#define	atomic_clear_rel_int(p, v)	__atomic_op_32(p, &=, ~v)
234#define	atomic_store_rel_int(p, v)	__atomic_op_32(p, =, v)
235#define	atomic_cmpset_rel_int(p, e, s)	__atomic_cas_32(p, e, s)
236
237#define	atomic_add_rel_long(p, v)	__atomic_op_64(p, +=, v)
238#define	atomic_subtract_rel_long(p, v)	__atomic_op_64(p, -=, v)
239#define	atomic_set_rel_long(p, v)	__atomic_op_64(p, |=, v)
240#define	atomic_clear_rel_long(p, v)	__atomic_op_64(p, &=, ~v)
241#define	atomic_store_rel_long(p, v)	__atomic_op_64(p, =, v)
242#define	atomic_cmpset_rel_long(p, e, s)	__atomic_cas_64(p, e, s)
243
244#define	atomic_add_char(p, v)		__atomic_op_8(p, +=, v)
245#define	atomic_subtract_char(p, v)	__atomic_op_8(p, -=, v)
246#define	atomic_set_char(p, v)		__atomic_op_8(p, |=, v)
247#define	atomic_clear_char(p, v)		__atomic_op_8(p, &=, ~v)
248#define	atomic_store_char(p, v)		__atomic_op_8(p, =, v)
249
250#define	atomic_add_short(p, v)		__atomic_op_16(p, +=, v)
251#define	atomic_subtract_short(p, v)	__atomic_op_16(p, -=, v)
252#define	atomic_set_short(p, v)		__atomic_op_16(p, |=, v)
253#define	atomic_clear_short(p, v)	__atomic_op_16(p, &=, ~v)
254#define	atomic_store_short(p, v)	__atomic_op_16(p, =, v)
255
256#define	atomic_add_int(p, v)		__atomic_op_32(p, +=, v)
257#define	atomic_subtract_int(p, v)	__atomic_op_32(p, -=, v)
258#define	atomic_set_int(p, v)		__atomic_op_32(p, |=, v)
259#define	atomic_clear_int(p, v)		__atomic_op_32(p, &=, ~v)
260#define	atomic_store_int(p, v)		__atomic_op_32(p, =, v)
261#define	atomic_load_int(p)		__atomic_load_32(p)
262#define	atomic_readandclear_int(p)	__atomic_load_clear_32(p)
263#define	atomic_cmpset_int(p, e, s)	__atomic_cas_32(p, e, s)
264
265#define	atomic_add_long(p, v)		__atomic_op_64(p, +=, v)
266#define	atomic_subtract_long(p, v)	__atomic_op_64(p, -=, v)
267#define	atomic_set_long(p, v)		__atomic_op_64(p, |=, v)
268#define	atomic_clear_long(p, v)		__atomic_op_64(p, &=, ~v)
269#define	atomic_store_long(p, v)		__atomic_op_64(p, =, v)
270#define	atomic_load_long(p)		__atomic_load_64(p)
271#define	atomic_readandclear_long(p)	__atomic_load_clear_64(p)
272#define	atomic_cmpset_long(p, e, s)	__atomic_cas_64(p, e, s)
273
274#define	atomic_add_ptr(p, v)		__atomic_op_64(p, +=, v)
275#define	atomic_subtract_ptr(p, v)	__atomic_op_64(p, -=, v)
276#define	atomic_set_ptr(p, v)		__atomic_op_64(p, |=, v)
277#define	atomic_clear_ptr(p, v)		__atomic_op_64(p, &=, ~v)
278#define	atomic_store_ptr(p, v)		__atomic_op_64(p, =, v)
279#define	atomic_load_ptr(p)		__atomic_load_64(p)
280#define	atomic_readandclear_ptr(p)	__atomic_load_clear_64(p)
281#define	atomic_cmpset_ptr(p, e, s)	__atomic_cas_64(p, e, s)
282
283#define	atomic_add_acq_char(p, v)	__atomic_op_8(p, +=, v)
284#define	atomic_subtract_acq_char(p, v)	__atomic_op_8(p, -=, v)
285#define	atomic_set_acq_char(p, v)	__atomic_op_8(p, |=, v)
286#define	atomic_clear_acq_char(p, v)	__atomic_op_8(p, &=, ~v)
287#define	atomic_store_acq_char(p, v)	__atomic_op_8(p, =, v)
288
289#define	atomic_add_acq_short(p, v)	__atomic_op_16(p, +=, v)
290#define	atomic_subtract_acq_short(p, v)	__atomic_op_16(p, -=, v)
291#define	atomic_set_acq_short(p, v)	__atomic_op_16(p, |=, v)
292#define	atomic_clear_acq_short(p, v)	__atomic_op_16(p, &=, ~v)
293#define	atomic_store_acq_short(p, v)	__atomic_op_16(p, =, v)
294
295#define	atomic_add_acq_int(p, v)	__atomic_op_32(p, +=, v)
296#define	atomic_subtract_acq_int(p, v)	__atomic_op_32(p, -=, v)
297#define	atomic_set_acq_int(p, v)	__atomic_op_32(p, |=, v)
298#define	atomic_clear_acq_int(p, v)	__atomic_op_32(p, &=, ~v)
299#define	atomic_store_acq_int(p, v)	__atomic_op_32(p, =, v)
300#define	atomic_load_acq_int(p)		__atomic_load_32(p)
301#define	atomic_cmpset_acq_int(p, e, s)	__atomic_cas_32(p, e, s)
302
303#define	atomic_add_acq_long(p, v)	__atomic_op_64(p, +=, v)
304#define	atomic_subtract_acq_long(p, v)	__atomic_op_64(p, -=, v)
305#define	atomic_set_acq_long(p, v)	__atomic_op_64(p, |=, v)
306#define	atomic_clear_acq_long(p, v)	__atomic_op_64(p, &=, ~v)
307#define	atomic_store_acq_long(p, v)	__atomic_op_64(p, =, v)
308#define	atomic_load_acq_long(p)		__atomic_load_64(p)
309#define	atomic_cmpset_acq_long(p, e, s)	__atomic_cas_64(p, e, s)
310
311#define	atomic_add_acq_ptr(p, v)	__atomic_op_64(p, +=, v)
312#define	atomic_subtract_acq_ptr(p, v)	__atomic_op_64(p, -=, v)
313#define	atomic_set_acq_ptr(p, v)	__atomic_op_64(p, |=, v)
314#define	atomic_clear_acq_ptr(p, v)	__atomic_op_64(p, &=, ~v)
315#define	atomic_store_acq_ptr(p, v)	__atomic_op_64(p, =, v)
316#define	atomic_load_acq_ptr(p)		__atomic_load_64(p)
317#define	atomic_cmpset_acq_ptr(p, e, s)	__atomic_cas_64(p, e, s)
318
319#define	atomic_add_rel_char(p, v)	__atomic_op_8(p, +=, v)
320#define	atomic_subtract_rel_char(p, v)	__atomic_op_8(p, -=, v)
321#define	atomic_set_rel_char(p, v)	__atomic_op_8(p, |=, v)
322#define	atomic_clear_rel_char(p, v)	__atomic_op_8(p, &=, ~v)
323#define	atomic_store_rel_char(p, v)	__atomic_op_8(p, =, v)
324
325#define	atomic_add_rel_short(p, v)	__atomic_op_16(p, +=, v)
326#define	atomic_subtract_rel_short(p, v)	__atomic_op_16(p, -=, v)
327#define	atomic_set_rel_short(p, v)	__atomic_op_16(p, |=, v)
328#define	atomic_clear_rel_short(p, v)	__atomic_op_16(p, &=, ~v)
329#define	atomic_store_rel_short(p, v)	__atomic_op_16(p, =, v)
330
331#define	atomic_add_rel_int(p, v)	__atomic_op_32(p, +=, v)
332#define	atomic_subtract_rel_int(p, v)	__atomic_op_32(p, -=, v)
333#define	atomic_set_rel_int(p, v)	__atomic_op_32(p, |=, v)
334#define	atomic_clear_rel_int(p, v)	__atomic_op_32(p, &=, ~v)
335#define	atomic_store_rel_int(p, v)	__atomic_op_32(p, =, v)
336#define	atomic_cmpset_rel_int(p, e, s)	__atomic_cas_32(p, e, s)
337
338#define	atomic_add_rel_long(p, v)	__atomic_op_64(p, +=, v)
339#define	atomic_subtract_rel_long(p, v)	__atomic_op_64(p, -=, v)
340#define	atomic_set_rel_long(p, v)	__atomic_op_64(p, |=, v)
341#define	atomic_clear_rel_long(p, v)	__atomic_op_64(p, &=, ~v)
342#define	atomic_store_rel_long(p, v)	__atomic_op_64(p, =, v)
343#define	atomic_cmpset_rel_long(p, e, s)	__atomic_cas_64(p, e, s)
344
345#define	atomic_add_rel_ptr(p, v)	__atomic_op_64(p, +=, v)
346#define	atomic_subtract_rel_ptr(p, v)	__atomic_op_64(p, -=, v)
347#define	atomic_set_rel_ptr(p, v)	__atomic_op_64(p, |=, v)
348#define	atomic_clear_rel_ptr(p, v)	__atomic_op_64(p, &=, ~v)
349#define	atomic_store_rel_ptr(p, v)	__atomic_op_64(p, =, v)
350#define	atomic_cmpset_rel_ptr(p, e, s)	__atomic_cas_64(p, e, s)
351
352#endif /* !_MACHINE_ATOMIC_H_ */
353