Commit | Line | Data |
---|---|---|
88bcea43 ACM |
1 | #ifndef _TOOLS_LINUX_BITOPS_H_ |
2 | #define _TOOLS_LINUX_BITOPS_H_ | |
5a116dd2 | 3 | |
25cd480e | 4 | #include <asm/types.h> |
fb72014d | 5 | #include <linux/kernel.h> |
a860a608 | 6 | #include <linux/compiler.h> |
5a116dd2 | 7 | |
3f34f6c0 IT |
8 | #ifndef __WORDSIZE |
9 | #define __WORDSIZE (__SIZEOF_LONG__ * 8) | |
10 | #endif | |
11 | ||
fb72014d | 12 | #define BITS_PER_LONG __WORDSIZE |
93c49b3e ACM |
13 | |
14 | #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) | |
15 | #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) | |
16 | #define BITS_PER_BYTE 8 | |
17 | #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) | |
18 | #define BITS_TO_U64(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64)) | |
19 | #define BITS_TO_U32(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32)) | |
20 | #define BITS_TO_BYTES(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE) | |
ee3d2504 | 21 | |
25cd480e ACM |
22 | extern unsigned int __sw_hweight8(unsigned int w); |
23 | extern unsigned int __sw_hweight16(unsigned int w); | |
24 | extern unsigned int __sw_hweight32(unsigned int w); | |
25 | extern unsigned long __sw_hweight64(__u64 w); | |
26 | ||
88bcea43 ACM |
27 | /* |
28 | * Include this here because some architectures need generic_ffs/fls in | |
29 | * scope | |
30 | * | |
31 | * XXX: this needs to be asm/bitops.h, when we get to per arch optimizations | |
32 | */ | |
33 | #include <asm-generic/bitops.h> | |
34 | ||
b1e5a9be RR |
35 | #define for_each_set_bit(bit, addr, size) \ |
36 | for ((bit) = find_first_bit((addr), (size)); \ | |
37 | (bit) < (size); \ | |
38 | (bit) = find_next_bit((addr), (size), (bit) + 1)) | |
39 | ||
40 | /* same as for_each_set_bit() but use bit as value to start with */ | |
307b1cd7 | 41 | #define for_each_set_bit_from(bit, addr, size) \ |
b1e5a9be RR |
42 | for ((bit) = find_next_bit((addr), (size), (bit)); \ |
43 | (bit) < (size); \ | |
44 | (bit) = find_next_bit((addr), (size), (bit) + 1)) | |
45 | ||
fb72014d ACM |
46 | static inline unsigned long hweight_long(unsigned long w) |
47 | { | |
48 | return sizeof(w) == 4 ? hweight32(w) : hweight64(w); | |
49 | } | |
5a116dd2 | 50 | |
afcd4f62 ACM |
51 | static inline unsigned fls_long(unsigned long l) |
52 | { | |
53 | if (sizeof(l) == 4) | |
54 | return fls(l); | |
55 | return fls64(l); | |
56 | } | |
57 | ||
5a116dd2 | 58 | #endif |