fix O_SYNC definition, cleanup fcntl.h
[musl] / arch / x86_64 / atomic.h
1 #ifndef _INTERNAA_ATOMIC_H
2 #define _INTERNAA_ATOMIC_H
3
4 #include <stdint.h>
5
6 static inline int a_ctz_64(uint64_t x)
7 {
8         long r;
9         __asm__( "bsf %1,%0" : "=r"(r) : "r"(x) );
10         return r;
11 }
12
13
14 static inline void a_and_64(volatile uint64_t *p, uint64_t v)
15 {
16         __asm__( "lock ; andq %1, %0"
17                          : "=m"(*(long *)p) : "r"(v) : "memory" );
18 }
19
20 static inline void a_or_64(volatile uint64_t *p, uint64_t v)
21 {
22         __asm__( "lock ; orq %1, %0"
23                          : "=m"(*(long *)p) : "r"(v) : "memory" );
24 }
25
26 static inline void a_store_l(volatile void *p, long x)
27 {
28         __asm__( "movq %1, %0" : "=m"(*(long *)p) : "r"(x) : "memory" );
29 }
30
31 static inline void a_or_l(volatile void *p, long v)
32 {
33         __asm__( "lock ; orq %1, %0"
34                 : "=m"(*(long *)p) : "r"(v) : "memory" );
35 }
36
37 static inline void *a_cas_p(volatile void *p, void *t, void *s)
38 {
39         __asm__( "lock ; cmpxchg %3, %1"
40                 : "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" );
41         return t;
42 }
43
44 static inline long a_cas_l(volatile void *p, long t, long s)
45 {
46         __asm__( "lock ; cmpxchg %3, %1"
47                 : "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" );
48         return t;
49 }
50
51 static inline int a_cas(volatile int *p, int t, int s)
52 {
53         __asm__( "lock ; cmpxchgl %3, %1"
54                 : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
55         return t;
56 }
57
58 static inline void *a_swap_p(void *volatile *x, void *v)
59 {
60         __asm__( "xchg %0, %1" : "=r"(v), "=m"(*(void **)x) : "0"(v) : "memory" );
61         return v;
62 }
63 static inline long a_swap_l(volatile void *x, long v)
64 {
65         __asm__( "xchg %0, %1" : "=r"(v), "=m"(*(long *)x) : "0"(v) : "memory" );
66         return v;
67 }
68
69 static inline void a_or(volatile void *p, int v)
70 {
71         __asm__( "lock ; orl %1, %0"
72                 : "=m"(*(int *)p) : "r"(v) : "memory" );
73 }
74
75 static inline void a_and(volatile void *p, int v)
76 {
77         __asm__( "lock ; andl %1, %0"
78                 : "=m"(*(int *)p) : "r"(v) : "memory" );
79 }
80
81 static inline int a_swap(volatile int *x, int v)
82 {
83         __asm__( "xchg %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
84         return v;
85 }
86
87 #define a_xchg a_swap
88
89 static inline int a_fetch_add(volatile int *x, int v)
90 {
91         __asm__( "lock ; xadd %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" );
92         return v;
93 }
94
95 static inline void a_inc(volatile int *x)
96 {
97         __asm__( "lock ; incl %0" : "=m"(*x) : "m"(*x) : "memory" );
98 }
99
100 static inline void a_dec(volatile int *x)
101 {
102         __asm__( "lock ; decl %0" : "=m"(*x) : "m"(*x) : "memory" );
103 }
104
105 static inline void a_store(volatile int *p, int x)
106 {
107         __asm__( "movl %1, %0" : "=m"(*p) : "r"(x) : "memory" );
108 }
109
110 static inline void a_spin()
111 {
112         __asm__ __volatile__( "pause" : : : "memory" );
113 }
114
115
116 #endif