1*c9945492SAndroid Build Coastguard Worker #ifndef _ATOMIC_H
2*c9945492SAndroid Build Coastguard Worker #define _ATOMIC_H
3*c9945492SAndroid Build Coastguard Worker
4*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
5*c9945492SAndroid Build Coastguard Worker
6*c9945492SAndroid Build Coastguard Worker #include "atomic_arch.h"
7*c9945492SAndroid Build Coastguard Worker
8*c9945492SAndroid Build Coastguard Worker #ifdef a_ll
9*c9945492SAndroid Build Coastguard Worker
10*c9945492SAndroid Build Coastguard Worker #ifndef a_pre_llsc
11*c9945492SAndroid Build Coastguard Worker #define a_pre_llsc()
12*c9945492SAndroid Build Coastguard Worker #endif
13*c9945492SAndroid Build Coastguard Worker
14*c9945492SAndroid Build Coastguard Worker #ifndef a_post_llsc
15*c9945492SAndroid Build Coastguard Worker #define a_post_llsc()
16*c9945492SAndroid Build Coastguard Worker #endif
17*c9945492SAndroid Build Coastguard Worker
18*c9945492SAndroid Build Coastguard Worker #ifndef a_cas
19*c9945492SAndroid Build Coastguard Worker #define a_cas a_cas
a_cas(volatile int * p,int t,int s)20*c9945492SAndroid Build Coastguard Worker static inline int a_cas(volatile int *p, int t, int s)
21*c9945492SAndroid Build Coastguard Worker {
22*c9945492SAndroid Build Coastguard Worker int old;
23*c9945492SAndroid Build Coastguard Worker a_pre_llsc();
24*c9945492SAndroid Build Coastguard Worker do old = a_ll(p);
25*c9945492SAndroid Build Coastguard Worker while (old==t && !a_sc(p, s));
26*c9945492SAndroid Build Coastguard Worker a_post_llsc();
27*c9945492SAndroid Build Coastguard Worker return old;
28*c9945492SAndroid Build Coastguard Worker }
29*c9945492SAndroid Build Coastguard Worker #endif
30*c9945492SAndroid Build Coastguard Worker
31*c9945492SAndroid Build Coastguard Worker #ifndef a_swap
32*c9945492SAndroid Build Coastguard Worker #define a_swap a_swap
a_swap(volatile int * p,int v)33*c9945492SAndroid Build Coastguard Worker static inline int a_swap(volatile int *p, int v)
34*c9945492SAndroid Build Coastguard Worker {
35*c9945492SAndroid Build Coastguard Worker int old;
36*c9945492SAndroid Build Coastguard Worker a_pre_llsc();
37*c9945492SAndroid Build Coastguard Worker do old = a_ll(p);
38*c9945492SAndroid Build Coastguard Worker while (!a_sc(p, v));
39*c9945492SAndroid Build Coastguard Worker a_post_llsc();
40*c9945492SAndroid Build Coastguard Worker return old;
41*c9945492SAndroid Build Coastguard Worker }
42*c9945492SAndroid Build Coastguard Worker #endif
43*c9945492SAndroid Build Coastguard Worker
44*c9945492SAndroid Build Coastguard Worker #ifndef a_fetch_add
45*c9945492SAndroid Build Coastguard Worker #define a_fetch_add a_fetch_add
a_fetch_add(volatile int * p,int v)46*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_add(volatile int *p, int v)
47*c9945492SAndroid Build Coastguard Worker {
48*c9945492SAndroid Build Coastguard Worker int old;
49*c9945492SAndroid Build Coastguard Worker a_pre_llsc();
50*c9945492SAndroid Build Coastguard Worker do old = a_ll(p);
51*c9945492SAndroid Build Coastguard Worker while (!a_sc(p, (unsigned)old + v));
52*c9945492SAndroid Build Coastguard Worker a_post_llsc();
53*c9945492SAndroid Build Coastguard Worker return old;
54*c9945492SAndroid Build Coastguard Worker }
55*c9945492SAndroid Build Coastguard Worker #endif
56*c9945492SAndroid Build Coastguard Worker
57*c9945492SAndroid Build Coastguard Worker #ifndef a_fetch_and
58*c9945492SAndroid Build Coastguard Worker #define a_fetch_and a_fetch_and
a_fetch_and(volatile int * p,int v)59*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_and(volatile int *p, int v)
60*c9945492SAndroid Build Coastguard Worker {
61*c9945492SAndroid Build Coastguard Worker int old;
62*c9945492SAndroid Build Coastguard Worker a_pre_llsc();
63*c9945492SAndroid Build Coastguard Worker do old = a_ll(p);
64*c9945492SAndroid Build Coastguard Worker while (!a_sc(p, old & v));
65*c9945492SAndroid Build Coastguard Worker a_post_llsc();
66*c9945492SAndroid Build Coastguard Worker return old;
67*c9945492SAndroid Build Coastguard Worker }
68*c9945492SAndroid Build Coastguard Worker #endif
69*c9945492SAndroid Build Coastguard Worker
70*c9945492SAndroid Build Coastguard Worker #ifndef a_fetch_or
71*c9945492SAndroid Build Coastguard Worker #define a_fetch_or a_fetch_or
a_fetch_or(volatile int * p,int v)72*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_or(volatile int *p, int v)
73*c9945492SAndroid Build Coastguard Worker {
74*c9945492SAndroid Build Coastguard Worker int old;
75*c9945492SAndroid Build Coastguard Worker a_pre_llsc();
76*c9945492SAndroid Build Coastguard Worker do old = a_ll(p);
77*c9945492SAndroid Build Coastguard Worker while (!a_sc(p, old | v));
78*c9945492SAndroid Build Coastguard Worker a_post_llsc();
79*c9945492SAndroid Build Coastguard Worker return old;
80*c9945492SAndroid Build Coastguard Worker }
81*c9945492SAndroid Build Coastguard Worker #endif
82*c9945492SAndroid Build Coastguard Worker
83*c9945492SAndroid Build Coastguard Worker #endif
84*c9945492SAndroid Build Coastguard Worker
85*c9945492SAndroid Build Coastguard Worker #ifdef a_ll_p
86*c9945492SAndroid Build Coastguard Worker
87*c9945492SAndroid Build Coastguard Worker #ifndef a_cas_p
88*c9945492SAndroid Build Coastguard Worker #define a_cas_p a_cas_p
a_cas_p(volatile void * p,void * t,void * s)89*c9945492SAndroid Build Coastguard Worker static inline void *a_cas_p(volatile void *p, void *t, void *s)
90*c9945492SAndroid Build Coastguard Worker {
91*c9945492SAndroid Build Coastguard Worker void *old;
92*c9945492SAndroid Build Coastguard Worker a_pre_llsc();
93*c9945492SAndroid Build Coastguard Worker do old = a_ll_p(p);
94*c9945492SAndroid Build Coastguard Worker while (old==t && !a_sc_p(p, s));
95*c9945492SAndroid Build Coastguard Worker a_post_llsc();
96*c9945492SAndroid Build Coastguard Worker return old;
97*c9945492SAndroid Build Coastguard Worker }
98*c9945492SAndroid Build Coastguard Worker #endif
99*c9945492SAndroid Build Coastguard Worker
100*c9945492SAndroid Build Coastguard Worker #endif
101*c9945492SAndroid Build Coastguard Worker
102*c9945492SAndroid Build Coastguard Worker #ifndef a_cas
103*c9945492SAndroid Build Coastguard Worker #error missing definition of a_cas
104*c9945492SAndroid Build Coastguard Worker #endif
105*c9945492SAndroid Build Coastguard Worker
106*c9945492SAndroid Build Coastguard Worker #ifndef a_swap
107*c9945492SAndroid Build Coastguard Worker #define a_swap a_swap
a_swap(volatile int * p,int v)108*c9945492SAndroid Build Coastguard Worker static inline int a_swap(volatile int *p, int v)
109*c9945492SAndroid Build Coastguard Worker {
110*c9945492SAndroid Build Coastguard Worker int old;
111*c9945492SAndroid Build Coastguard Worker do old = *p;
112*c9945492SAndroid Build Coastguard Worker while (a_cas(p, old, v) != old);
113*c9945492SAndroid Build Coastguard Worker return old;
114*c9945492SAndroid Build Coastguard Worker }
115*c9945492SAndroid Build Coastguard Worker #endif
116*c9945492SAndroid Build Coastguard Worker
117*c9945492SAndroid Build Coastguard Worker #ifndef a_fetch_add
118*c9945492SAndroid Build Coastguard Worker #define a_fetch_add a_fetch_add
a_fetch_add(volatile int * p,int v)119*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_add(volatile int *p, int v)
120*c9945492SAndroid Build Coastguard Worker {
121*c9945492SAndroid Build Coastguard Worker int old;
122*c9945492SAndroid Build Coastguard Worker do old = *p;
123*c9945492SAndroid Build Coastguard Worker while (a_cas(p, old, (unsigned)old+v) != old);
124*c9945492SAndroid Build Coastguard Worker return old;
125*c9945492SAndroid Build Coastguard Worker }
126*c9945492SAndroid Build Coastguard Worker #endif
127*c9945492SAndroid Build Coastguard Worker
128*c9945492SAndroid Build Coastguard Worker #ifndef a_fetch_and
129*c9945492SAndroid Build Coastguard Worker #define a_fetch_and a_fetch_and
a_fetch_and(volatile int * p,int v)130*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_and(volatile int *p, int v)
131*c9945492SAndroid Build Coastguard Worker {
132*c9945492SAndroid Build Coastguard Worker int old;
133*c9945492SAndroid Build Coastguard Worker do old = *p;
134*c9945492SAndroid Build Coastguard Worker while (a_cas(p, old, old&v) != old);
135*c9945492SAndroid Build Coastguard Worker return old;
136*c9945492SAndroid Build Coastguard Worker }
137*c9945492SAndroid Build Coastguard Worker #endif
138*c9945492SAndroid Build Coastguard Worker #ifndef a_fetch_or
139*c9945492SAndroid Build Coastguard Worker #define a_fetch_or a_fetch_or
a_fetch_or(volatile int * p,int v)140*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_or(volatile int *p, int v)
141*c9945492SAndroid Build Coastguard Worker {
142*c9945492SAndroid Build Coastguard Worker int old;
143*c9945492SAndroid Build Coastguard Worker do old = *p;
144*c9945492SAndroid Build Coastguard Worker while (a_cas(p, old, old|v) != old);
145*c9945492SAndroid Build Coastguard Worker return old;
146*c9945492SAndroid Build Coastguard Worker }
147*c9945492SAndroid Build Coastguard Worker #endif
148*c9945492SAndroid Build Coastguard Worker
149*c9945492SAndroid Build Coastguard Worker #ifndef a_and
150*c9945492SAndroid Build Coastguard Worker #define a_and a_and
a_and(volatile int * p,int v)151*c9945492SAndroid Build Coastguard Worker static inline void a_and(volatile int *p, int v)
152*c9945492SAndroid Build Coastguard Worker {
153*c9945492SAndroid Build Coastguard Worker a_fetch_and(p, v);
154*c9945492SAndroid Build Coastguard Worker }
155*c9945492SAndroid Build Coastguard Worker #endif
156*c9945492SAndroid Build Coastguard Worker
157*c9945492SAndroid Build Coastguard Worker #ifndef a_or
158*c9945492SAndroid Build Coastguard Worker #define a_or a_or
a_or(volatile int * p,int v)159*c9945492SAndroid Build Coastguard Worker static inline void a_or(volatile int *p, int v)
160*c9945492SAndroid Build Coastguard Worker {
161*c9945492SAndroid Build Coastguard Worker a_fetch_or(p, v);
162*c9945492SAndroid Build Coastguard Worker }
163*c9945492SAndroid Build Coastguard Worker #endif
164*c9945492SAndroid Build Coastguard Worker
165*c9945492SAndroid Build Coastguard Worker #ifndef a_inc
166*c9945492SAndroid Build Coastguard Worker #define a_inc a_inc
a_inc(volatile int * p)167*c9945492SAndroid Build Coastguard Worker static inline void a_inc(volatile int *p)
168*c9945492SAndroid Build Coastguard Worker {
169*c9945492SAndroid Build Coastguard Worker a_fetch_add(p, 1);
170*c9945492SAndroid Build Coastguard Worker }
171*c9945492SAndroid Build Coastguard Worker #endif
172*c9945492SAndroid Build Coastguard Worker
173*c9945492SAndroid Build Coastguard Worker #ifndef a_dec
174*c9945492SAndroid Build Coastguard Worker #define a_dec a_dec
a_dec(volatile int * p)175*c9945492SAndroid Build Coastguard Worker static inline void a_dec(volatile int *p)
176*c9945492SAndroid Build Coastguard Worker {
177*c9945492SAndroid Build Coastguard Worker a_fetch_add(p, -1);
178*c9945492SAndroid Build Coastguard Worker }
179*c9945492SAndroid Build Coastguard Worker #endif
180*c9945492SAndroid Build Coastguard Worker
181*c9945492SAndroid Build Coastguard Worker #ifndef a_store
182*c9945492SAndroid Build Coastguard Worker #define a_store a_store
a_store(volatile int * p,int v)183*c9945492SAndroid Build Coastguard Worker static inline void a_store(volatile int *p, int v)
184*c9945492SAndroid Build Coastguard Worker {
185*c9945492SAndroid Build Coastguard Worker #ifdef a_barrier
186*c9945492SAndroid Build Coastguard Worker a_barrier();
187*c9945492SAndroid Build Coastguard Worker *p = v;
188*c9945492SAndroid Build Coastguard Worker a_barrier();
189*c9945492SAndroid Build Coastguard Worker #else
190*c9945492SAndroid Build Coastguard Worker a_swap(p, v);
191*c9945492SAndroid Build Coastguard Worker #endif
192*c9945492SAndroid Build Coastguard Worker }
193*c9945492SAndroid Build Coastguard Worker #endif
194*c9945492SAndroid Build Coastguard Worker
195*c9945492SAndroid Build Coastguard Worker #ifndef a_barrier
196*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier
a_barrier()197*c9945492SAndroid Build Coastguard Worker static inline void a_barrier()
198*c9945492SAndroid Build Coastguard Worker {
199*c9945492SAndroid Build Coastguard Worker volatile int tmp = 0;
200*c9945492SAndroid Build Coastguard Worker a_cas(&tmp, 0, 0);
201*c9945492SAndroid Build Coastguard Worker }
202*c9945492SAndroid Build Coastguard Worker #endif
203*c9945492SAndroid Build Coastguard Worker
204*c9945492SAndroid Build Coastguard Worker #ifndef a_spin
205*c9945492SAndroid Build Coastguard Worker #define a_spin a_barrier
206*c9945492SAndroid Build Coastguard Worker #endif
207*c9945492SAndroid Build Coastguard Worker
208*c9945492SAndroid Build Coastguard Worker #ifndef a_and_64
209*c9945492SAndroid Build Coastguard Worker #define a_and_64 a_and_64
a_and_64(volatile uint64_t * p,uint64_t v)210*c9945492SAndroid Build Coastguard Worker static inline void a_and_64(volatile uint64_t *p, uint64_t v)
211*c9945492SAndroid Build Coastguard Worker {
212*c9945492SAndroid Build Coastguard Worker union { uint64_t v; uint32_t r[2]; } u = { v };
213*c9945492SAndroid Build Coastguard Worker if (u.r[0]+1) a_and((int *)p, u.r[0]);
214*c9945492SAndroid Build Coastguard Worker if (u.r[1]+1) a_and((int *)p+1, u.r[1]);
215*c9945492SAndroid Build Coastguard Worker }
216*c9945492SAndroid Build Coastguard Worker #endif
217*c9945492SAndroid Build Coastguard Worker
218*c9945492SAndroid Build Coastguard Worker #ifndef a_or_64
219*c9945492SAndroid Build Coastguard Worker #define a_or_64 a_or_64
a_or_64(volatile uint64_t * p,uint64_t v)220*c9945492SAndroid Build Coastguard Worker static inline void a_or_64(volatile uint64_t *p, uint64_t v)
221*c9945492SAndroid Build Coastguard Worker {
222*c9945492SAndroid Build Coastguard Worker union { uint64_t v; uint32_t r[2]; } u = { v };
223*c9945492SAndroid Build Coastguard Worker if (u.r[0]) a_or((int *)p, u.r[0]);
224*c9945492SAndroid Build Coastguard Worker if (u.r[1]) a_or((int *)p+1, u.r[1]);
225*c9945492SAndroid Build Coastguard Worker }
226*c9945492SAndroid Build Coastguard Worker #endif
227*c9945492SAndroid Build Coastguard Worker
228*c9945492SAndroid Build Coastguard Worker #ifndef a_cas_p
229*c9945492SAndroid Build Coastguard Worker typedef char a_cas_p_undefined_but_pointer_not_32bit[-sizeof(char) == 0xffffffff ? 1 : -1];
230*c9945492SAndroid Build Coastguard Worker #define a_cas_p a_cas_p
a_cas_p(volatile void * p,void * t,void * s)231*c9945492SAndroid Build Coastguard Worker static inline void *a_cas_p(volatile void *p, void *t, void *s)
232*c9945492SAndroid Build Coastguard Worker {
233*c9945492SAndroid Build Coastguard Worker return (void *)a_cas((volatile int *)p, (int)t, (int)s);
234*c9945492SAndroid Build Coastguard Worker }
235*c9945492SAndroid Build Coastguard Worker #endif
236*c9945492SAndroid Build Coastguard Worker
237*c9945492SAndroid Build Coastguard Worker #ifndef a_or_l
238*c9945492SAndroid Build Coastguard Worker #define a_or_l a_or_l
a_or_l(volatile void * p,long v)239*c9945492SAndroid Build Coastguard Worker static inline void a_or_l(volatile void *p, long v)
240*c9945492SAndroid Build Coastguard Worker {
241*c9945492SAndroid Build Coastguard Worker if (sizeof(long) == sizeof(int)) a_or(p, v);
242*c9945492SAndroid Build Coastguard Worker else a_or_64(p, v);
243*c9945492SAndroid Build Coastguard Worker }
244*c9945492SAndroid Build Coastguard Worker #endif
245*c9945492SAndroid Build Coastguard Worker
246*c9945492SAndroid Build Coastguard Worker #ifndef a_crash
247*c9945492SAndroid Build Coastguard Worker #define a_crash a_crash
a_crash()248*c9945492SAndroid Build Coastguard Worker static inline void a_crash()
249*c9945492SAndroid Build Coastguard Worker {
250*c9945492SAndroid Build Coastguard Worker *(volatile char *)0=0;
251*c9945492SAndroid Build Coastguard Worker }
252*c9945492SAndroid Build Coastguard Worker #endif
253*c9945492SAndroid Build Coastguard Worker
254*c9945492SAndroid Build Coastguard Worker #ifndef a_ctz_32
255*c9945492SAndroid Build Coastguard Worker #define a_ctz_32 a_ctz_32
a_ctz_32(uint32_t x)256*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_32(uint32_t x)
257*c9945492SAndroid Build Coastguard Worker {
258*c9945492SAndroid Build Coastguard Worker #ifdef a_clz_32
259*c9945492SAndroid Build Coastguard Worker return 31-a_clz_32(x&-x);
260*c9945492SAndroid Build Coastguard Worker #else
261*c9945492SAndroid Build Coastguard Worker static const char debruijn32[32] = {
262*c9945492SAndroid Build Coastguard Worker 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
263*c9945492SAndroid Build Coastguard Worker 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
264*c9945492SAndroid Build Coastguard Worker };
265*c9945492SAndroid Build Coastguard Worker return debruijn32[(x&-x)*0x076be629 >> 27];
266*c9945492SAndroid Build Coastguard Worker #endif
267*c9945492SAndroid Build Coastguard Worker }
268*c9945492SAndroid Build Coastguard Worker #endif
269*c9945492SAndroid Build Coastguard Worker
270*c9945492SAndroid Build Coastguard Worker #ifndef a_ctz_64
271*c9945492SAndroid Build Coastguard Worker #define a_ctz_64 a_ctz_64
a_ctz_64(uint64_t x)272*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_64(uint64_t x)
273*c9945492SAndroid Build Coastguard Worker {
274*c9945492SAndroid Build Coastguard Worker static const char debruijn64[64] = {
275*c9945492SAndroid Build Coastguard Worker 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
276*c9945492SAndroid Build Coastguard Worker 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
277*c9945492SAndroid Build Coastguard Worker 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
278*c9945492SAndroid Build Coastguard Worker 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
279*c9945492SAndroid Build Coastguard Worker };
280*c9945492SAndroid Build Coastguard Worker if (sizeof(long) < 8) {
281*c9945492SAndroid Build Coastguard Worker uint32_t y = x;
282*c9945492SAndroid Build Coastguard Worker if (!y) {
283*c9945492SAndroid Build Coastguard Worker y = x>>32;
284*c9945492SAndroid Build Coastguard Worker return 32 + a_ctz_32(y);
285*c9945492SAndroid Build Coastguard Worker }
286*c9945492SAndroid Build Coastguard Worker return a_ctz_32(y);
287*c9945492SAndroid Build Coastguard Worker }
288*c9945492SAndroid Build Coastguard Worker return debruijn64[(x&-x)*0x022fdd63cc95386dull >> 58];
289*c9945492SAndroid Build Coastguard Worker }
290*c9945492SAndroid Build Coastguard Worker #endif
291*c9945492SAndroid Build Coastguard Worker
a_ctz_l(unsigned long x)292*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_l(unsigned long x)
293*c9945492SAndroid Build Coastguard Worker {
294*c9945492SAndroid Build Coastguard Worker return (sizeof(long) < 8) ? a_ctz_32(x) : a_ctz_64(x);
295*c9945492SAndroid Build Coastguard Worker }
296*c9945492SAndroid Build Coastguard Worker
297*c9945492SAndroid Build Coastguard Worker #ifndef a_clz_64
298*c9945492SAndroid Build Coastguard Worker #define a_clz_64 a_clz_64
a_clz_64(uint64_t x)299*c9945492SAndroid Build Coastguard Worker static inline int a_clz_64(uint64_t x)
300*c9945492SAndroid Build Coastguard Worker {
301*c9945492SAndroid Build Coastguard Worker #ifdef a_clz_32
302*c9945492SAndroid Build Coastguard Worker if (x>>32)
303*c9945492SAndroid Build Coastguard Worker return a_clz_32(x>>32);
304*c9945492SAndroid Build Coastguard Worker return a_clz_32(x) + 32;
305*c9945492SAndroid Build Coastguard Worker #else
306*c9945492SAndroid Build Coastguard Worker uint32_t y;
307*c9945492SAndroid Build Coastguard Worker int r;
308*c9945492SAndroid Build Coastguard Worker if (x>>32) y=x>>32, r=0; else y=x, r=32;
309*c9945492SAndroid Build Coastguard Worker if (y>>16) y>>=16; else r |= 16;
310*c9945492SAndroid Build Coastguard Worker if (y>>8) y>>=8; else r |= 8;
311*c9945492SAndroid Build Coastguard Worker if (y>>4) y>>=4; else r |= 4;
312*c9945492SAndroid Build Coastguard Worker if (y>>2) y>>=2; else r |= 2;
313*c9945492SAndroid Build Coastguard Worker return r | !(y>>1);
314*c9945492SAndroid Build Coastguard Worker #endif
315*c9945492SAndroid Build Coastguard Worker }
316*c9945492SAndroid Build Coastguard Worker #endif
317*c9945492SAndroid Build Coastguard Worker
318*c9945492SAndroid Build Coastguard Worker #ifndef a_clz_32
319*c9945492SAndroid Build Coastguard Worker #define a_clz_32 a_clz_32
a_clz_32(uint32_t x)320*c9945492SAndroid Build Coastguard Worker static inline int a_clz_32(uint32_t x)
321*c9945492SAndroid Build Coastguard Worker {
322*c9945492SAndroid Build Coastguard Worker x >>= 1;
323*c9945492SAndroid Build Coastguard Worker x |= x >> 1;
324*c9945492SAndroid Build Coastguard Worker x |= x >> 2;
325*c9945492SAndroid Build Coastguard Worker x |= x >> 4;
326*c9945492SAndroid Build Coastguard Worker x |= x >> 8;
327*c9945492SAndroid Build Coastguard Worker x |= x >> 16;
328*c9945492SAndroid Build Coastguard Worker x++;
329*c9945492SAndroid Build Coastguard Worker return 31-a_ctz_32(x);
330*c9945492SAndroid Build Coastguard Worker }
331*c9945492SAndroid Build Coastguard Worker #endif
332*c9945492SAndroid Build Coastguard Worker
333*c9945492SAndroid Build Coastguard Worker #if defined __has_builtin
334*c9945492SAndroid Build Coastguard Worker #if __has_builtin(__builtin_popcount)
335*c9945492SAndroid Build Coastguard Worker #define a_popcount_32 a_popcount_32
a_popcount_32(uint32_t x)336*c9945492SAndroid Build Coastguard Worker static inline int a_popcount_32(uint32_t x)
337*c9945492SAndroid Build Coastguard Worker {
338*c9945492SAndroid Build Coastguard Worker return __builtin_popcount(x);
339*c9945492SAndroid Build Coastguard Worker }
340*c9945492SAndroid Build Coastguard Worker #endif
341*c9945492SAndroid Build Coastguard Worker #endif
342*c9945492SAndroid Build Coastguard Worker
343*c9945492SAndroid Build Coastguard Worker #ifndef a_popcount_32
344*c9945492SAndroid Build Coastguard Worker #define a_popcount_32 a_popcount_32
a_popcount_32(uint32_t x)345*c9945492SAndroid Build Coastguard Worker static inline int a_popcount_32(uint32_t x)
346*c9945492SAndroid Build Coastguard Worker {
347*c9945492SAndroid Build Coastguard Worker const uint32_t m1 = 0x55555555;
348*c9945492SAndroid Build Coastguard Worker const uint32_t m2 = 0x33333333;
349*c9945492SAndroid Build Coastguard Worker const uint32_t m4 = 0x0f0f0f0f;
350*c9945492SAndroid Build Coastguard Worker x -= (x >> 1) & m1;
351*c9945492SAndroid Build Coastguard Worker x = (x & m2) + ((x >> 2) & m2);
352*c9945492SAndroid Build Coastguard Worker x = (x + (x >> 4)) & m4;
353*c9945492SAndroid Build Coastguard Worker x += x >> 8;
354*c9945492SAndroid Build Coastguard Worker x += x >> 16;
355*c9945492SAndroid Build Coastguard Worker return x & 0x3f;
356*c9945492SAndroid Build Coastguard Worker }
357*c9945492SAndroid Build Coastguard Worker #endif
358*c9945492SAndroid Build Coastguard Worker
359*c9945492SAndroid Build Coastguard Worker #endif
360