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_inc a_inc
a_inc(volatile int * p)45*c9945492SAndroid Build Coastguard Worker static inline void a_inc(volatile int *p)
46*c9945492SAndroid Build Coastguard Worker {
47*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
48*c9945492SAndroid Build Coastguard Worker "lock ; incl %0"
49*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "m"(*p) : "memory" );
50*c9945492SAndroid Build Coastguard Worker }
51*c9945492SAndroid Build Coastguard Worker
52*c9945492SAndroid Build Coastguard Worker #define a_dec a_dec
a_dec(volatile int * p)53*c9945492SAndroid Build Coastguard Worker static inline void a_dec(volatile int *p)
54*c9945492SAndroid Build Coastguard Worker {
55*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
56*c9945492SAndroid Build Coastguard Worker "lock ; decl %0"
57*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "m"(*p) : "memory" );
58*c9945492SAndroid Build Coastguard Worker }
59*c9945492SAndroid Build Coastguard Worker
60*c9945492SAndroid Build Coastguard Worker #define a_store a_store
a_store(volatile int * p,int x)61*c9945492SAndroid Build Coastguard Worker static inline void a_store(volatile int *p, int x)
62*c9945492SAndroid Build Coastguard Worker {
63*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__(
64*c9945492SAndroid Build Coastguard Worker "mov %1, %0 ; lock ; orl $0,(%%esp)"
65*c9945492SAndroid Build Coastguard Worker : "=m"(*p) : "r"(x) : "memory" );
66*c9945492SAndroid Build Coastguard Worker }
67*c9945492SAndroid Build Coastguard Worker
68*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier
a_barrier()69*c9945492SAndroid Build Coastguard Worker static inline void a_barrier()
70*c9945492SAndroid Build Coastguard Worker {
71*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__( "" : : : "memory" );
72*c9945492SAndroid Build Coastguard Worker }
73*c9945492SAndroid Build Coastguard Worker
74*c9945492SAndroid Build Coastguard Worker #define a_spin a_spin
a_spin()75*c9945492SAndroid Build Coastguard Worker static inline void a_spin()
76*c9945492SAndroid Build Coastguard Worker {
77*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__( "pause" : : : "memory" );
78*c9945492SAndroid Build Coastguard Worker }
79*c9945492SAndroid Build Coastguard Worker
80*c9945492SAndroid Build Coastguard Worker #define a_crash a_crash
a_crash()81*c9945492SAndroid Build Coastguard Worker static inline void a_crash()
82*c9945492SAndroid Build Coastguard Worker {
83*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__( "hlt" : : : "memory" );
84*c9945492SAndroid Build Coastguard Worker }
85*c9945492SAndroid Build Coastguard Worker
86*c9945492SAndroid Build Coastguard Worker #define a_ctz_64 a_ctz_64
a_ctz_64(uint64_t x)87*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_64(uint64_t x)
88*c9945492SAndroid Build Coastguard Worker {
89*c9945492SAndroid Build Coastguard Worker int r;
90*c9945492SAndroid Build Coastguard Worker __asm__( "bsf %1,%0 ; jnz 1f ; bsf %2,%0 ; add $32,%0\n1:"
91*c9945492SAndroid Build Coastguard Worker : "=&r"(r) : "r"((unsigned)x), "r"((unsigned)(x>>32)) );
92*c9945492SAndroid Build Coastguard Worker return r;
93*c9945492SAndroid Build Coastguard Worker }
94*c9945492SAndroid Build Coastguard Worker
95*c9945492SAndroid Build Coastguard Worker #define a_ctz_32 a_ctz_32
a_ctz_32(uint32_t x)96*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_32(uint32_t x)
97*c9945492SAndroid Build Coastguard Worker {
98*c9945492SAndroid Build Coastguard Worker int r;
99*c9945492SAndroid Build Coastguard Worker __asm__( "bsf %1,%0" : "=r"(r) : "r"(x) );
100*c9945492SAndroid Build Coastguard Worker return r;
101*c9945492SAndroid Build Coastguard Worker }
102*c9945492SAndroid Build Coastguard Worker
103*c9945492SAndroid Build Coastguard Worker #define a_clz_32 a_clz_32
a_clz_32(uint32_t x)104*c9945492SAndroid Build Coastguard Worker static inline int a_clz_32(uint32_t x)
105*c9945492SAndroid Build Coastguard Worker {
106*c9945492SAndroid Build Coastguard Worker __asm__( "bsr %1,%0 ; xor $31,%0" : "=r"(x) : "r"(x) );
107*c9945492SAndroid Build Coastguard Worker return x;
108*c9945492SAndroid Build Coastguard Worker }
109