]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
88bcea43 ACM |
2 | #ifndef _TOOLS_LINUX_BITOPS_H_ |
3 | #define _TOOLS_LINUX_BITOPS_H_ | |
5a116dd2 | 4 | |
25cd480e | 5 | #include <asm/types.h> |
a860a608 | 6 | #include <linux/compiler.h> |
5a116dd2 | 7 | |
3f34f6c0 IT |
8 | #ifndef __WORDSIZE |
9 | #define __WORDSIZE (__SIZEOF_LONG__ * 8) | |
10 | #endif | |
11 | ||
7b39cafb IM |
12 | #ifndef BITS_PER_LONG |
13 | # define BITS_PER_LONG __WORDSIZE | |
14 | #endif | |
93c49b3e ACM |
15 | |
16 | #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) | |
17 | #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) | |
18 | #define BITS_PER_BYTE 8 | |
19 | #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) | |
20 | #define BITS_TO_U64(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64)) | |
21 | #define BITS_TO_U32(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32)) | |
22 | #define BITS_TO_BYTES(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE) | |
ee3d2504 | 23 | |
25cd480e ACM |
24 | extern unsigned int __sw_hweight8(unsigned int w); |
25 | extern unsigned int __sw_hweight16(unsigned int w); | |
26 | extern unsigned int __sw_hweight32(unsigned int w); | |
27 | extern unsigned long __sw_hweight64(__u64 w); | |
28 | ||
88bcea43 ACM |
29 | /* |
30 | * Include this here because some architectures need generic_ffs/fls in | |
31 | * scope | |
32 | * | |
33 | * XXX: this needs to be asm/bitops.h, when we get to per arch optimizations | |
34 | */ | |
35 | #include <asm-generic/bitops.h> | |
36 | ||
b1e5a9be RR |
37 | #define for_each_set_bit(bit, addr, size) \ |
38 | for ((bit) = find_first_bit((addr), (size)); \ | |
39 | (bit) < (size); \ | |
40 | (bit) = find_next_bit((addr), (size), (bit) + 1)) | |
41 | ||
02bc11de JO |
42 | #define for_each_clear_bit(bit, addr, size) \ |
43 | for ((bit) = find_first_zero_bit((addr), (size)); \ | |
44 | (bit) < (size); \ | |
45 | (bit) = find_next_zero_bit((addr), (size), (bit) + 1)) | |
46 | ||
b1e5a9be | 47 | /* same as for_each_set_bit() but use bit as value to start with */ |
307b1cd7 | 48 | #define for_each_set_bit_from(bit, addr, size) \ |
b1e5a9be RR |
49 | for ((bit) = find_next_bit((addr), (size), (bit)); \ |
50 | (bit) < (size); \ | |
51 | (bit) = find_next_bit((addr), (size), (bit) + 1)) | |
52 | ||
fb72014d ACM |
53 | static inline unsigned long hweight_long(unsigned long w) |
54 | { | |
55 | return sizeof(w) == 4 ? hweight32(w) : hweight64(w); | |
56 | } | |
5a116dd2 | 57 | |
afcd4f62 ACM |
58 | static inline unsigned fls_long(unsigned long l) |
59 | { | |
60 | if (sizeof(l) == 4) | |
61 | return fls(l); | |
62 | return fls64(l); | |
63 | } | |
64 | ||
6c8e6483 LASL |
65 | /** |
66 | * rol32 - rotate a 32-bit value left | |
67 | * @word: value to rotate | |
68 | * @shift: bits to roll | |
69 | */ | |
70 | static inline __u32 rol32(__u32 word, unsigned int shift) | |
71 | { | |
72 | return (word << shift) | (word >> ((-shift) & 31)); | |
73 | } | |
74 | ||
5a116dd2 | 75 | #endif |