1*c9945492SAndroid Build Coastguard Worker #define a_cas a_cas
a_cas(volatile int * p,int t,int s)2*c9945492SAndroid Build Coastguard Worker static inline int a_cas(volatile int *p, int t, int s)
3*c9945492SAndroid Build Coastguard Worker {
4*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__ (
5*c9945492SAndroid Build Coastguard Worker "lock ; cmpxchg %3, %1"
6*c9945492SAndroid Build Coastguard Worker : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
7*c9945492SAndroid Build Coastguard Worker return t;
8*c9945492SAndroid Build Coastguard Worker }
9*c9945492SAndroid Build Coastguard Worker
10*c9945492SAndroid Build Coastguard Worker #define a_swap a_swap
a_swap(volatile int * p,int v)11*c9945492SAndroid Build Coastguard Worker static inline int a_swap(volatile int *p, int v)
12*c9945492SAndroid Build Coastguard Worker {
13*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
14*c9945492SAndroid Build Coastguard Worker "xchg %0, %1"
15*c9945492SAndroid Build Coastguard Worker : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
16*c9945492SAndroid Build Coastguard Worker return v;
17*c9945492SAndroid Build Coastguard Worker }
18*c9945492SAndroid Build Coastguard Worker
19*c9945492SAndroid Build Coastguard Worker #define a_fetch_add a_fetch_add
a_fetch_add(volatile int * p,int v)20*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_add(volatile int *p, int v)
21*c9945492SAndroid Build Coastguard Worker {
22*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
23*c9945492SAndroid Build Coastguard Worker "lock ; xadd %0, %1"
24*c9945492SAndroid Build Coastguard Worker : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
25*c9945492SAndroid Build Coastguard Worker return v;
26*c9945492SAndroid Build Coastguard Worker }
27*c9945492SAndroid Build Coastguard Worker
28*c9945492SAndroid Build Coastguard Worker #define a_and a_and
a_and(volatile int * p,int v)29*c9945492SAndroid Build Coastguard Worker static inline void a_and(volatile int *p, int v)
30*c9945492SAndroid Build Coastguard Worker {
31*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
32*c9945492SAndroid Build Coastguard Worker "lock ; and %1, %0"
33*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "r"(v) : "memory" );
34*c9945492SAndroid Build Coastguard Worker }
35*c9945492SAndroid Build Coastguard Worker
36*c9945492SAndroid Build Coastguard Worker #define a_or a_or
a_or(volatile int * p,int v)37*c9945492SAndroid Build Coastguard Worker static inline void a_or(volatile int *p, int v)
38*c9945492SAndroid Build Coastguard Worker {
39*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
40*c9945492SAndroid Build Coastguard Worker "lock ; or %1, %0"
41*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "r"(v) : "memory" );
42*c9945492SAndroid Build Coastguard Worker }
43*c9945492SAndroid Build Coastguard Worker
44*c9945492SAndroid Build Coastguard Worker #define a_and_64 a_and_64
a_and_64(volatile uint64_t * p,uint64_t v)45*c9945492SAndroid Build Coastguard Worker static inline void a_and_64(volatile uint64_t *p, uint64_t v)
46*c9945492SAndroid Build Coastguard Worker {
47*c9945492SAndroid Build Coastguard Worker __asm__ __volatile(
48*c9945492SAndroid Build Coastguard Worker "lock ; and %1, %0"
49*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "r"(v) : "memory" );
50*c9945492SAndroid Build Coastguard Worker }
51*c9945492SAndroid Build Coastguard Worker
52*c9945492SAndroid Build Coastguard Worker #define a_or_64 a_or_64
a_or_64(volatile uint64_t * p,uint64_t v)53*c9945492SAndroid Build Coastguard Worker static inline void a_or_64(volatile uint64_t *p, uint64_t v)
54*c9945492SAndroid Build Coastguard Worker {
55*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
56*c9945492SAndroid Build Coastguard Worker "lock ; or %1, %0"
57*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "r"(v) : "memory" );
58*c9945492SAndroid Build Coastguard Worker }
59*c9945492SAndroid Build Coastguard Worker
60*c9945492SAndroid Build Coastguard Worker #define a_inc a_inc
a_inc(volatile int * p)61*c9945492SAndroid Build Coastguard Worker static inline void a_inc(volatile int *p)
62*c9945492SAndroid Build Coastguard Worker {
63*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
64*c9945492SAndroid Build Coastguard Worker "lock ; incl %0"
65*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "m"(*p) : "memory" );
66*c9945492SAndroid Build Coastguard Worker }
67*c9945492SAndroid Build Coastguard Worker
68*c9945492SAndroid Build Coastguard Worker #define a_dec a_dec
a_dec(volatile int * p)69*c9945492SAndroid Build Coastguard Worker static inline void a_dec(volatile int *p)
70*c9945492SAndroid Build Coastguard Worker {
71*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
72*c9945492SAndroid Build Coastguard Worker "lock ; decl %0"
73*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "m"(*p) : "memory" );
74*c9945492SAndroid Build Coastguard Worker }
75*c9945492SAndroid Build Coastguard Worker
76*c9945492SAndroid Build Coastguard Worker #define a_store a_store
a_store(volatile int * p,int x)77*c9945492SAndroid Build Coastguard Worker static inline void a_store(volatile int *p, int x)
78*c9945492SAndroid Build Coastguard Worker {
79*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
80*c9945492SAndroid Build Coastguard Worker "mov %1, %0 ; lock ; orl $0,(%%rsp)"
81*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "r"(x) : "memory" );
82*c9945492SAndroid Build Coastguard Worker }
83*c9945492SAndroid Build Coastguard Worker
84*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier
a_barrier()85*c9945492SAndroid Build Coastguard Worker static inline void a_barrier()
86*c9945492SAndroid Build Coastguard Worker {
87*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__( "" : : : "memory" );
88*c9945492SAndroid Build Coastguard Worker }
89*c9945492SAndroid Build Coastguard Worker
90*c9945492SAndroid Build Coastguard Worker #define a_spin a_spin
a_spin()91*c9945492SAndroid Build Coastguard Worker static inline void a_spin()
92*c9945492SAndroid Build Coastguard Worker {
93*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__( "pause" : : : "memory" );
94*c9945492SAndroid Build Coastguard Worker }
95*c9945492SAndroid Build Coastguard Worker
96*c9945492SAndroid Build Coastguard Worker #define a_crash a_crash
a_crash()97*c9945492SAndroid Build Coastguard Worker static inline void a_crash()
98*c9945492SAndroid Build Coastguard Worker {
99*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__( "hlt" : : : "memory" );
100*c9945492SAndroid Build Coastguard Worker }
101*c9945492SAndroid Build Coastguard Worker
102*c9945492SAndroid Build Coastguard Worker #define a_ctz_64 a_ctz_64
a_ctz_64(uint64_t x)103*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_64(uint64_t x)
104*c9945492SAndroid Build Coastguard Worker {
105*c9945492SAndroid Build Coastguard Worker __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
106*c9945492SAndroid Build Coastguard Worker return x;
107*c9945492SAndroid Build Coastguard Worker }
108*c9945492SAndroid Build Coastguard Worker
109*c9945492SAndroid Build Coastguard Worker #define a_ctz_32 a_ctz_32
a_ctz_32(uint32_t x)110*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_32(uint32_t x)
111*c9945492SAndroid Build Coastguard Worker {
112*c9945492SAndroid Build Coastguard Worker __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
113*c9945492SAndroid Build Coastguard Worker return x;
114*c9945492SAndroid Build Coastguard Worker }
115*c9945492SAndroid Build Coastguard Worker
116*c9945492SAndroid Build Coastguard Worker #define a_clz_64 a_clz_64
a_clz_64(uint64_t x)117*c9945492SAndroid Build Coastguard Worker static inline int a_clz_64(uint64_t x)
118*c9945492SAndroid Build Coastguard Worker {
119*c9945492SAndroid Build Coastguard Worker __asm__( "bsr %1,%0 ; xor $63,%0" : "=r"(x) : "r"(x) );
120*c9945492SAndroid Build Coastguard Worker return x;
121*c9945492SAndroid Build Coastguard Worker }
122