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