Blame view
include/linux/bitops.h
4.81 KB
1da177e4c
|
1 2 3 |
#ifndef _LINUX_BITOPS_H #define _LINUX_BITOPS_H #include <asm/types.h> |
d05be13bc
|
4 |
#ifdef __KERNEL__ |
93043ece0
|
5 |
#define BIT(nr) (1UL << (nr)) |
d05be13bc
|
6 7 |
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) |
d05be13bc
|
8 |
#define BITS_PER_BYTE 8 |
ede9c697b
|
9 |
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) |
d05be13bc
|
10 |
#endif |
4677d4a53
|
11 12 13 14 |
extern unsigned int __sw_hweight8(unsigned int w); extern unsigned int __sw_hweight16(unsigned int w); extern unsigned int __sw_hweight32(unsigned int w); extern unsigned long __sw_hweight64(__u64 w); |
1da177e4c
|
15 |
/* |
1da177e4c
|
16 17 18 19 |
* Include this here because some architectures need generic_ffs/fls in * scope */ #include <asm/bitops.h> |
984b3f574
|
20 |
#define for_each_set_bit(bit, addr, size) \ |
3e037454b
|
21 22 23 |
for ((bit) = find_first_bit((addr), (size)); \ (bit) < (size); \ (bit) = find_next_bit((addr), (size), (bit) + 1)) |
1da177e4c
|
24 25 26 |
static __inline__ int get_bitmask_order(unsigned int count) { int order; |
9f41699ed
|
27 |
|
1da177e4c
|
28 29 30 |
order = fls(count); return order; /* We could be slightly more clever with -1 here... */ } |
94605eff5
|
31 32 33 |
static __inline__ int get_count_order(unsigned int count) { int order; |
9f41699ed
|
34 |
|
94605eff5
|
35 36 37 38 39 |
order = fls(count) - 1; if (count & (count - 1)) order++; return order; } |
1da177e4c
|
40 41 |
static inline unsigned long hweight_long(unsigned long w) { |
e9bebd6f3
|
42 |
return sizeof(w) == 4 ? hweight32(w) : hweight64(w); |
1da177e4c
|
43 |
} |
45f8bde0d
|
44 |
/** |
1da177e4c
|
45 |
* rol32 - rotate a 32-bit value left |
1da177e4c
|
46 47 48 49 50 51 52 |
* @word: value to rotate * @shift: bits to roll */ static inline __u32 rol32(__u32 word, unsigned int shift) { return (word << shift) | (word >> (32 - shift)); } |
45f8bde0d
|
53 |
/** |
1da177e4c
|
54 |
* ror32 - rotate a 32-bit value right |
1da177e4c
|
55 56 57 58 59 60 61 |
* @word: value to rotate * @shift: bits to roll */ static inline __u32 ror32(__u32 word, unsigned int shift) { return (word >> shift) | (word << (32 - shift)); } |
3afe39259
|
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
/** * rol16 - rotate a 16-bit value left * @word: value to rotate * @shift: bits to roll */ static inline __u16 rol16(__u16 word, unsigned int shift) { return (word << shift) | (word >> (16 - shift)); } /** * ror16 - rotate a 16-bit value right * @word: value to rotate * @shift: bits to roll */ static inline __u16 ror16(__u16 word, unsigned int shift) { return (word >> shift) | (word << (16 - shift)); } /** * rol8 - rotate an 8-bit value left * @word: value to rotate * @shift: bits to roll */ static inline __u8 rol8(__u8 word, unsigned int shift) { return (word << shift) | (word >> (8 - shift)); } /** * ror8 - rotate an 8-bit value right * @word: value to rotate * @shift: bits to roll */ static inline __u8 ror8(__u8 word, unsigned int shift) { return (word >> shift) | (word << (8 - shift)); } |
962749af6
|
101 102 103 104 105 106 |
static inline unsigned fls_long(unsigned long l) { if (sizeof(l) == 4) return fls(l); return fls64(l); } |
952043ac1
|
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
/** * __ffs64 - find first set bit in a 64 bit word * @word: The 64 bit word * * On 64 bit arches this is a synomyn for __ffs * The result is not defined if no bits are set, so check that @word * is non-zero before calling this. */ static inline unsigned long __ffs64(u64 word) { #if BITS_PER_LONG == 32 if (((u32)word) == 0UL) return __ffs((u32)(word >> 32)) + 32; #elif BITS_PER_LONG != 64 #error BITS_PER_LONG not 32 or 64 #endif return __ffs((unsigned long)word); } |
64970b68d
|
125 |
#ifdef __KERNEL__ |
77b9bd9c4
|
126 |
#ifdef CONFIG_GENERIC_FIND_FIRST_BIT |
77b9bd9c4
|
127 128 129 130 131 132 133 134 |
/** * find_first_bit - find the first set bit in a memory region * @addr: The address to start the search at * @size: The maximum size to search * * Returns the bit number of the first set bit. */ |
fee4b19fb
|
135 136 |
extern unsigned long find_first_bit(const unsigned long *addr, unsigned long size); |
77b9bd9c4
|
137 138 139 140 141 142 143 144 |
/** * find_first_zero_bit - find the first cleared bit in a memory region * @addr: The address to start the search at * @size: The maximum size to search * * Returns the bit number of the first cleared bit. */ |
fee4b19fb
|
145 146 |
extern unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size); |
77b9bd9c4
|
147 |
#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ |
ab53d472e
|
148 149 150 151 152 153 154 155 156 157 158 |
#ifdef CONFIG_GENERIC_FIND_LAST_BIT /** * find_last_bit - find the last set bit in a memory region * @addr: The address to start the search at * @size: The maximum size to search * * Returns the bit number of the first set bit, or size. */ extern unsigned long find_last_bit(const unsigned long *addr, unsigned long size); #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ |
64970b68d
|
159 |
#ifdef CONFIG_GENERIC_FIND_NEXT_BIT |
64970b68d
|
160 161 162 163 164 165 166 |
/** * find_next_bit - find the next set bit in a memory region * @addr: The address to base the search on * @offset: The bitnumber to start searching at * @size: The bitmap size in bits */ |
fee4b19fb
|
167 168 |
extern unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset); |
64970b68d
|
169 170 171 172 173 174 175 |
/** * find_next_zero_bit - find the next cleared bit in a memory region * @addr: The address to base the search on * @offset: The bitnumber to start searching at * @size: The bitmap size in bits */ |
fee4b19fb
|
176 177 178 179 |
extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, unsigned long offset); |
64970b68d
|
180 181 |
#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */ #endif /* __KERNEL__ */ |
1da177e4c
|
182 |
#endif |