Deleted Added
full compact
atomic.h (71023) atomic.h (71085)
1/*-
2 * Copyright (c) 1998 Doug Rabson
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 unchanged lines hidden (view full) ---

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 *
1/*-
2 * Copyright (c) 1998 Doug Rabson
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 unchanged lines hidden (view full) ---

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/i386/include/atomic.h 71023 2001-01-14 09:55:21Z jhb $
26 * $FreeBSD: head/sys/i386/include/atomic.h 71085 2001-01-16 00:18:36Z jhb $
27 */
28#ifndef _MACHINE_ATOMIC_H_
29#define _MACHINE_ATOMIC_H_
30
31/*
32 * Various simple arithmetic on memory which is atomic in the presence
33 * of interrupts and multiple processors.
34 *

--- 29 unchanged lines hidden (view full) ---

64 * This allows kernel modules to be portable between UP and SMP systems.
65 */
66#if defined(KLD_MODULE)
67#define ATOMIC_ASM(NAME, TYPE, OP, V) \
68void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v);
69
70int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src);
71
27 */
28#ifndef _MACHINE_ATOMIC_H_
29#define _MACHINE_ATOMIC_H_
30
31/*
32 * Various simple arithmetic on memory which is atomic in the presence
33 * of interrupts and multiple processors.
34 *

--- 29 unchanged lines hidden (view full) ---

64 * This allows kernel modules to be portable between UP and SMP systems.
65 */
66#if defined(KLD_MODULE)
67#define ATOMIC_ASM(NAME, TYPE, OP, V) \
68void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v);
69
70int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src);
71
72#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \
73u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p); \
74void atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v);
75
72#else /* !KLD_MODULE */
73#if defined(SMP)
74#if defined(LOCORE)
75#define MPLOCKED lock ;
76#else
77#define MPLOCKED "lock ; "
78#endif
79#else
80#define MPLOCKED
81#endif
82
83/*
84 * The assembly is volatilized to demark potential before-and-after side
85 * effects if an interrupt or SMP collision were to occur.
86 */
76#else /* !KLD_MODULE */
77#if defined(SMP)
78#if defined(LOCORE)
79#define MPLOCKED lock ;
80#else
81#define MPLOCKED "lock ; "
82#endif
83#else
84#define MPLOCKED
85#endif
86
87/*
88 * The assembly is volatilized to demark potential before-and-after side
89 * effects if an interrupt or SMP collision were to occur.
90 */
87#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 9)
88/* egcs 1.1.2+ version */
89#define ATOMIC_ASM(NAME, TYPE, OP, V) \
90static __inline void \
91atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
92{ \
93 __asm __volatile(MPLOCKED OP \
94 : "=m" (*p) \
95 : "0" (*p), "ir" (V)); \
96}

--- 49 unchanged lines hidden (view full) ---

146 "r" (src), /* 2 */
147 "m" (*(dst)) /* 3 */
148 : "memory");
149
150 return (res);
151}
152#endif /* defined(I386_CPU) */
153
91#define ATOMIC_ASM(NAME, TYPE, OP, V) \
92static __inline void \
93atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
94{ \
95 __asm __volatile(MPLOCKED OP \
96 : "=m" (*p) \
97 : "0" (*p), "ir" (V)); \
98}

--- 49 unchanged lines hidden (view full) ---

148 "r" (src), /* 2 */
149 "m" (*(dst)) /* 3 */
150 : "memory");
151
152 return (res);
153}
154#endif /* defined(I386_CPU) */
155
154#define atomic_cmpset_long atomic_cmpset_int
155#define atomic_cmpset_acq_int atomic_cmpset_int
156#define atomic_cmpset_rel_int atomic_cmpset_int
157#define atomic_cmpset_acq_long atomic_cmpset_acq_int
158#define atomic_cmpset_rel_long atomic_cmpset_rel_int
159
160#else
161/* gcc <= 2.8 version */
162#define ATOMIC_ASM(NAME, TYPE, OP, V) \
163static __inline void \
164atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
165{ \
166 __asm __volatile(MPLOCKED OP \
167 : "=m" (*p) \
168 : "ir" (V)); \
169} \
170 \
171
172#endif
173#endif /* KLD_MODULE */
174
175#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 9)
176
177/* egcs 1.1.2+ version */
178ATOMIC_ASM(set, char, "orb %b2,%0", v)
179ATOMIC_ASM(clear, char, "andb %b2,%0", ~v)
180ATOMIC_ASM(add, char, "addb %b2,%0", v)
181ATOMIC_ASM(subtract, char, "subb %b2,%0", v)
182
183ATOMIC_ASM(set, short, "orw %w2,%0", v)
184ATOMIC_ASM(clear, short, "andw %w2,%0", ~v)
185ATOMIC_ASM(add, short, "addw %w2,%0", v)
186ATOMIC_ASM(subtract, short, "subw %w2,%0", v)
187
188ATOMIC_ASM(set, int, "orl %2,%0", v)
189ATOMIC_ASM(clear, int, "andl %2,%0", ~v)
190ATOMIC_ASM(add, int, "addl %2,%0", v)
191ATOMIC_ASM(subtract, int, "subl %2,%0", v)
192
193ATOMIC_ASM(set, long, "orl %2,%0", v)
194ATOMIC_ASM(clear, long, "andl %2,%0", ~v)
195ATOMIC_ASM(add, long, "addl %2,%0", v)
196ATOMIC_ASM(subtract, long, "subl %2,%0", v)
197
198#else
199
200/* gcc <= 2.8 version */
201ATOMIC_ASM(set, char, "orb %1,%0", v)
202ATOMIC_ASM(clear, char, "andb %1,%0", ~v)
203ATOMIC_ASM(add, char, "addb %1,%0", v)
204ATOMIC_ASM(subtract, char, "subb %1,%0", v)
205
206ATOMIC_ASM(set, short, "orw %1,%0", v)
207ATOMIC_ASM(clear, short, "andw %1,%0", ~v)
208ATOMIC_ASM(add, short, "addw %1,%0", v)
209ATOMIC_ASM(subtract, short, "subw %1,%0", v)
210
211ATOMIC_ASM(set, int, "orl %1,%0", v)
212ATOMIC_ASM(clear, int, "andl %1,%0", ~v)
213ATOMIC_ASM(add, int, "addl %1,%0", v)
214ATOMIC_ASM(subtract, int, "subl %1,%0", v)
215
216ATOMIC_ASM(set, long, "orl %1,%0", v)
217ATOMIC_ASM(clear, long, "andl %1,%0", ~v)
218ATOMIC_ASM(add, long, "addl %1,%0", v)
219ATOMIC_ASM(subtract, long, "subl %1,%0", v)
220
221#endif
222
223#undef ATOMIC_ASM
224
225#ifndef WANT_FUNCTIONS
226#define ATOMIC_ACQ_REL(NAME, TYPE) \
227static __inline void \
228atomic_##NAME##_acq_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
229{ \
230 atomic_##NAME##_##TYPE(p, v); \
231} \
232 \
233static __inline void \
234atomic_##NAME##_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
235{ \
236 atomic_##NAME##_##TYPE(p, v); \
237}
238
239ATOMIC_ACQ_REL(set, char)
240ATOMIC_ACQ_REL(clear, char)
241ATOMIC_ACQ_REL(add, char)
242ATOMIC_ACQ_REL(subtract, char)
243ATOMIC_ACQ_REL(set, short)
244ATOMIC_ACQ_REL(clear, short)
245ATOMIC_ACQ_REL(add, short)
246ATOMIC_ACQ_REL(subtract, short)
247ATOMIC_ACQ_REL(set, int)
248ATOMIC_ACQ_REL(clear, int)
249ATOMIC_ACQ_REL(add, int)
250ATOMIC_ACQ_REL(subtract, int)
251ATOMIC_ACQ_REL(set, long)
252ATOMIC_ACQ_REL(clear, long)
253ATOMIC_ACQ_REL(add, long)
254ATOMIC_ACQ_REL(subtract, long)
255
256#undef ATOMIC_ACQ_REL
257
258#if defined(KLD_MODULE)
259#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \
260u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p); \
261void atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v);
262#else
263#if defined(I386_CPU)
264/*
265 * We assume that a = b will do atomic loads and stores.
266 *
267 * XXX: This is _NOT_ safe on a P6 or higher because it does not guarantee
268 * memory ordering. These should only be used on a 386.
269 */
270#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \

--- 32 unchanged lines hidden (view full) ---

303atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
304{ \
305 __asm __volatile(SOP \
306 : "+m" (*p), /* 0 */ \
307 "+r" (v) /* 1 */ \
308 : : "memory"); \
309}
310#endif /* defined(I386_CPU) */
156#if defined(I386_CPU)
157/*
158 * We assume that a = b will do atomic loads and stores.
159 *
160 * XXX: This is _NOT_ safe on a P6 or higher because it does not guarantee
161 * memory ordering. These should only be used on a 386.
162 */
163#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \

--- 32 unchanged lines hidden (view full) ---

196atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
197{ \
198 __asm __volatile(SOP \
199 : "+m" (*p), /* 0 */ \
200 "+r" (v) /* 1 */ \
201 : : "memory"); \
202}
203#endif /* defined(I386_CPU) */
311#endif /* defined(KLD_MODULE) */
204#endif /* KLD_MODULE */
312
205
206ATOMIC_ASM(set, char, "orb %b2,%0", v)
207ATOMIC_ASM(clear, char, "andb %b2,%0", ~v)
208ATOMIC_ASM(add, char, "addb %b2,%0", v)
209ATOMIC_ASM(subtract, char, "subb %b2,%0", v)
210
211ATOMIC_ASM(set, short, "orw %w2,%0", v)
212ATOMIC_ASM(clear, short, "andw %w2,%0", ~v)
213ATOMIC_ASM(add, short, "addw %w2,%0", v)
214ATOMIC_ASM(subtract, short, "subw %w2,%0", v)
215
216ATOMIC_ASM(set, int, "orl %2,%0", v)
217ATOMIC_ASM(clear, int, "andl %2,%0", ~v)
218ATOMIC_ASM(add, int, "addl %2,%0", v)
219ATOMIC_ASM(subtract, int, "subl %2,%0", v)
220
221ATOMIC_ASM(set, long, "orl %2,%0", v)
222ATOMIC_ASM(clear, long, "andl %2,%0", ~v)
223ATOMIC_ASM(add, long, "addl %2,%0", v)
224ATOMIC_ASM(subtract, long, "subl %2,%0", v)
225
313ATOMIC_STORE_LOAD(char, "cmpxchgb %b0,%1", "xchgb %b1,%0")
314ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0")
315ATOMIC_STORE_LOAD(int, "cmpxchgl %0,%1", "xchgl %1,%0")
316ATOMIC_STORE_LOAD(long, "cmpxchgl %0,%1", "xchgl %1,%0")
317
226ATOMIC_STORE_LOAD(char, "cmpxchgb %b0,%1", "xchgb %b1,%0")
227ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0")
228ATOMIC_STORE_LOAD(int, "cmpxchgl %0,%1", "xchgl %1,%0")
229ATOMIC_STORE_LOAD(long, "cmpxchgl %0,%1", "xchgl %1,%0")
230
231#undef ATOMIC_ASM
318#undef ATOMIC_STORE_LOAD
319
232#undef ATOMIC_STORE_LOAD
233
234#define atomic_set_acq_char atomic_set_char
235#define atomic_set_rel_char atomic_set_char
236#define atomic_clear_acq_char atomic_clear_char
237#define atomic_clear_rel_char atomic_clear_char
238#define atomic_add_acq_char atomic_add_char
239#define atomic_add_rel_char atomic_add_char
240#define atomic_subtract_acq_char atomic_subtract_char
241#define atomic_subtract_rel_char atomic_subtract_char
242
243#define atomic_set_acq_short atomic_set_short
244#define atomic_set_rel_short atomic_set_short
245#define atomic_clear_acq_short atomic_clear_short
246#define atomic_clear_rel_short atomic_clear_short
247#define atomic_add_acq_short atomic_add_short
248#define atomic_add_rel_short atomic_add_short
249#define atomic_subtract_acq_short atomic_subtract_short
250#define atomic_subtract_rel_short atomic_subtract_short
251
252#define atomic_set_acq_int atomic_set_int
253#define atomic_set_rel_int atomic_set_int
254#define atomic_clear_acq_int atomic_clear_int
255#define atomic_clear_rel_int atomic_clear_int
256#define atomic_add_acq_int atomic_add_int
257#define atomic_add_rel_int atomic_add_int
258#define atomic_subtract_acq_int atomic_subtract_int
259#define atomic_subtract_rel_int atomic_subtract_int
260#define atomic_cmpset_acq_int atomic_cmpset_int
261#define atomic_cmpset_rel_int atomic_cmpset_int
262
263#define atomic_set_acq_long atomic_set_long
264#define atomic_set_rel_long atomic_set_long
265#define atomic_clear_acq_long atomic_clear_long
266#define atomic_clear_rel_long atomic_clear_long
267#define atomic_add_acq_long atomic_add_long
268#define atomic_add_rel_long atomic_add_long
269#define atomic_subtract_acq_long atomic_subtract_long
270#define atomic_subtract_rel_long atomic_subtract_long
271#define atomic_cmpset_long atomic_cmpset_int
272#define atomic_cmpset_acq_long atomic_cmpset_acq_int
273#define atomic_cmpset_rel_long atomic_cmpset_rel_int
274
275#define atomic_cmpset_acq_ptr atomic_cmpset_ptr
276#define atomic_cmpset_rel_ptr atomic_cmpset_ptr
277
278#define atomic_set_8 atomic_set_char
279#define atomic_set_acq_8 atomic_set_acq_char
280#define atomic_set_rel_8 atomic_set_rel_char
281#define atomic_clear_8 atomic_clear_char
282#define atomic_clear_acq_8 atomic_clear_acq_char
283#define atomic_clear_rel_8 atomic_clear_rel_char
284#define atomic_add_8 atomic_add_char
285#define atomic_add_acq_8 atomic_add_acq_char
286#define atomic_add_rel_8 atomic_add_rel_char
287#define atomic_subtract_8 atomic_subtract_char
288#define atomic_subtract_acq_8 atomic_subtract_acq_char
289#define atomic_subtract_rel_8 atomic_subtract_rel_char
290#define atomic_load_acq_8 atomic_load_acq_char
291#define atomic_store_rel_8 atomic_store_rel_char
292
293#define atomic_set_16 atomic_set_short
294#define atomic_set_acq_16 atomic_set_acq_short
295#define atomic_set_rel_16 atomic_set_rel_short
296#define atomic_clear_16 atomic_clear_short
297#define atomic_clear_acq_16 atomic_clear_acq_short
298#define atomic_clear_rel_16 atomic_clear_rel_short
299#define atomic_add_16 atomic_add_short
300#define atomic_add_acq_16 atomic_add_acq_short
301#define atomic_add_rel_16 atomic_add_rel_short
302#define atomic_subtract_16 atomic_subtract_short
303#define atomic_subtract_acq_16 atomic_subtract_acq_short
304#define atomic_subtract_rel_16 atomic_subtract_rel_short
305#define atomic_load_acq_16 atomic_load_acq_short
306#define atomic_store_rel_16 atomic_store_rel_short
307
308#define atomic_set_32 atomic_set_int
309#define atomic_set_acq_32 atomic_set_acq_int
310#define atomic_set_rel_32 atomic_set_rel_int
311#define atomic_clear_32 atomic_clear_int
312#define atomic_clear_acq_32 atomic_clear_acq_int
313#define atomic_clear_rel_32 atomic_clear_rel_int
314#define atomic_add_32 atomic_add_int
315#define atomic_add_acq_32 atomic_add_acq_int
316#define atomic_add_rel_32 atomic_add_rel_int
317#define atomic_subtract_32 atomic_subtract_int
318#define atomic_subtract_acq_32 atomic_subtract_acq_int
319#define atomic_subtract_rel_32 atomic_subtract_rel_int
320#define atomic_load_acq_32 atomic_load_acq_int
321#define atomic_store_rel_32 atomic_store_rel_int
322#define atomic_cmpset_32 atomic_cmpset_int
323#define atomic_cmpset_acq_32 atomic_cmpset_acq_int
324#define atomic_cmpset_rel_32 atomic_cmpset_rel_int
325#define atomic_readandclear_32 atomic_readandclear_int
326
327#if !defined(WANT_FUNCTIONS)
320static __inline int
321atomic_cmpset_ptr(volatile void *dst, void *exp, void *src)
322{
323
328static __inline int
329atomic_cmpset_ptr(volatile void *dst, void *exp, void *src)
330{
331
324 return (
325 atomic_cmpset_int((volatile u_int *)dst, (u_int)exp, (u_int)src));
332 return (atomic_cmpset_int((volatile u_int *)dst, (u_int)exp,
333 (u_int)src));
326}
327
334}
335
328#define atomic_cmpset_acq_ptr atomic_cmpset_ptr
329#define atomic_cmpset_rel_ptr atomic_cmpset_ptr
330
331static __inline void *
332atomic_load_acq_ptr(volatile void *p)
333{
334 return (void *)atomic_load_acq_int((volatile u_int *)p);
335}
336
337static __inline void
338atomic_store_rel_ptr(volatile void *p, void *v)

--- 51 unchanged lines hidden (view full) ---

390 " xorl %0,%0 ; "
391 " xchgl %1,%0 ; "
392 "# atomic_readandclear_int"
393 : "=&r" (result) /* 0 (result) */
394 : "m" (*addr)); /* 1 (addr) */
395
396 return (result);
397}
336static __inline void *
337atomic_load_acq_ptr(volatile void *p)
338{
339 return (void *)atomic_load_acq_int((volatile u_int *)p);
340}
341
342static __inline void
343atomic_store_rel_ptr(volatile void *p, void *v)

--- 51 unchanged lines hidden (view full) ---

395 " xorl %0,%0 ; "
396 " xchgl %1,%0 ; "
397 "# atomic_readandclear_int"
398 : "=&r" (result) /* 0 (result) */
399 : "m" (*addr)); /* 1 (addr) */
400
401 return (result);
402}
398#endif
399
400#define atomic_set_8 atomic_set_char
401#define atomic_set_acq_8 atomic_set_acq_char
402#define atomic_set_rel_8 atomic_set_rel_char
403#define atomic_clear_8 atomic_clear_char
404#define atomic_clear_acq_8 atomic_clear_acq_char
405#define atomic_clear_rel_8 atomic_clear_rel_char
406#define atomic_add_8 atomic_add_char
407#define atomic_add_acq_8 atomic_add_acq_char
408#define atomic_add_rel_8 atomic_add_rel_char
409#define atomic_subtract_8 atomic_subtract_char
410#define atomic_subtract_acq_8 atomic_subtract_acq_char
411#define atomic_subtract_rel_8 atomic_subtract_rel_char
412#define atomic_load_acq_8 atomic_load_acq_char
413#define atomic_store_rel_8 atomic_store_rel_char
414
415#define atomic_set_16 atomic_set_short
416#define atomic_set_acq_16 atomic_set_acq_short
417#define atomic_set_rel_16 atomic_set_rel_short
418#define atomic_clear_16 atomic_clear_short
419#define atomic_clear_acq_16 atomic_clear_acq_short
420#define atomic_clear_rel_16 atomic_clear_rel_short
421#define atomic_add_16 atomic_add_short
422#define atomic_add_acq_16 atomic_add_acq_short
423#define atomic_add_rel_16 atomic_add_rel_short
424#define atomic_subtract_16 atomic_subtract_short
425#define atomic_subtract_acq_16 atomic_subtract_acq_short
426#define atomic_subtract_rel_16 atomic_subtract_rel_short
427#define atomic_load_acq_16 atomic_load_acq_short
428#define atomic_store_rel_16 atomic_store_rel_short
429
430#define atomic_set_32 atomic_set_int
431#define atomic_set_acq_32 atomic_set_acq_int
432#define atomic_set_rel_32 atomic_set_rel_int
433#define atomic_clear_32 atomic_clear_int
434#define atomic_clear_acq_32 atomic_clear_acq_int
435#define atomic_clear_rel_32 atomic_clear_rel_int
436#define atomic_add_32 atomic_add_int
437#define atomic_add_acq_32 atomic_add_acq_int
438#define atomic_add_rel_32 atomic_add_rel_int
439#define atomic_subtract_32 atomic_subtract_int
440#define atomic_subtract_acq_32 atomic_subtract_acq_int
441#define atomic_subtract_rel_32 atomic_subtract_rel_int
442#define atomic_load_acq_32 atomic_load_acq_int
443#define atomic_store_rel_32 atomic_store_rel_int
444#define atomic_cmpset_32 atomic_cmpset_int
445#define atomic_cmpset_acq_32 atomic_cmpset_acq_int
446#define atomic_cmpset_rel_32 atomic_cmpset_rel_int
447#define atomic_readandclear_32 atomic_readandclear_int
448
403#endif /* !defined(WANT_FUNCTIONS) */
449#endif /* ! _MACHINE_ATOMIC_H_ */
404#endif /* ! _MACHINE_ATOMIC_H_ */