bitops.h 4.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
#ifndef _LINUX_BITOPS_H
#define _LINUX_BITOPS_H
#include <asm/types.h>

J
Jiri Slaby 已提交
5
#ifdef	__KERNEL__
J
Jiri Slaby 已提交
6
#define BIT(nr)			(1UL << (nr))
J
Jiri Slaby 已提交
7 8 9
#define BIT_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG))
#define BIT_WORD(nr)		((nr) / BITS_PER_LONG)
#define BITS_PER_BYTE		8
E
Eric Dumazet 已提交
10
#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
J
Jiri Slaby 已提交
11 12
#endif

13 14 15 16 17
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);

L
Linus Torvalds 已提交
18 19 20 21 22 23
/*
 * Include this here because some architectures need generic_ffs/fls in
 * scope
 */
#include <asm/bitops.h>

24
#define for_each_set_bit(bit, addr, size) \
25 26 27 28 29 30 31 32
	for ((bit) = find_first_bit((addr), (size));		\
	     (bit) < (size);					\
	     (bit) = find_next_bit((addr), (size), (bit) + 1))

/* same as for_each_set_bit() but use bit as value to start with */
#define for_each_set_bit_cont(bit, addr, size) \
	for ((bit) = find_next_bit((addr), (size), (bit));	\
	     (bit) < (size);					\
33 34
	     (bit) = find_next_bit((addr), (size), (bit) + 1))

L
Linus Torvalds 已提交
35 36 37
static __inline__ int get_bitmask_order(unsigned int count)
{
	int order;
38

L
Linus Torvalds 已提交
39 40 41 42
	order = fls(count);
	return order;	/* We could be slightly more clever with -1 here... */
}

43 44 45
static __inline__ int get_count_order(unsigned int count)
{
	int order;
46

47 48 49 50 51 52
	order = fls(count) - 1;
	if (count & (count - 1))
		order++;
	return order;
}

L
Linus Torvalds 已提交
53 54
static inline unsigned long hweight_long(unsigned long w)
{
55
	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
L
Linus Torvalds 已提交
56 57
}

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
/**
 * rol64 - rotate a 64-bit value left
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u64 rol64(__u64 word, unsigned int shift)
{
	return (word << shift) | (word >> (64 - shift));
}

/**
 * ror64 - rotate a 64-bit value right
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u64 ror64(__u64 word, unsigned int shift)
{
	return (word >> shift) | (word << (64 - shift));
}

78
/**
L
Linus Torvalds 已提交
79 80 81 82 83 84 85 86 87
 * rol32 - rotate a 32-bit value left
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u32 rol32(__u32 word, unsigned int shift)
{
	return (word << shift) | (word >> (32 - shift));
}

88
/**
L
Linus Torvalds 已提交
89 90 91 92 93 94 95 96 97
 * ror32 - rotate a 32-bit value right
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u32 ror32(__u32 word, unsigned int shift)
{
	return (word >> shift) | (word << (32 - shift));
}

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/**
 * 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));
}
137 138 139 140 141 142 143 144 145 146 147

/**
 * sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit
 * @value: value to sign extend
 * @index: 0 based bit index (0<=index<32) to sign bit
 */
static inline __s32 sign_extend32(__u32 value, int index)
{
	__u8 shift = 31 - index;
	return (__s32)(value << shift) >> shift;
}
148

149 150 151 152 153 154 155
static inline unsigned fls_long(unsigned long l)
{
	if (sizeof(l) == 4)
		return fls(l);
	return fls64(l);
}

S
Steven Whitehouse 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
/**
 * __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);
}

175
#ifdef __KERNEL__
176

177
#ifndef find_last_bit
R
Rusty Russell 已提交
178 179 180 181 182 183 184 185 186
/**
 * 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);
187
#endif
R
Rusty Russell 已提交
188

189
#endif /* __KERNEL__ */
L
Linus Torvalds 已提交
190
#endif