Blame view

include/linux/bitops.h 4.81 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
  #ifndef _LINUX_BITOPS_H
  #define _LINUX_BITOPS_H
  #include <asm/types.h>
d05be13bc   Jiri Slaby   define first set ...
4
  #ifdef	__KERNEL__
93043ece0   Jiri Slaby   define global BIT...
5
  #define BIT(nr)			(1UL << (nr))
d05be13bc   Jiri Slaby   define first set ...
6
7
  #define BIT_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG))
  #define BIT_WORD(nr)		((nr) / BITS_PER_LONG)
d05be13bc   Jiri Slaby   define first set ...
8
  #define BITS_PER_BYTE		8
ede9c697b   Eric Dumazet   Avoid divides in ...
9
  #define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
d05be13bc   Jiri Slaby   define first set ...
10
  #endif
4677d4a53   Borislav Petkov   arch, hweight: Fi...
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   Linus Torvalds   Linux-2.6.12-rc2
15
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
   * Include this here because some architectures need generic_ffs/fls in
   * scope
   */
  #include <asm/bitops.h>
984b3f574   Akinobu Mita   bitops: rename fo...
20
  #define for_each_set_bit(bit, addr, size) \
3e037454b   Shannon Nelson   I/OAT: Add suppor...
21
22
23
  	for ((bit) = find_first_bit((addr), (size)); \
  	     (bit) < (size); \
  	     (bit) = find_next_bit((addr), (size), (bit) + 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
  static __inline__ int get_bitmask_order(unsigned int count)
  {
  	int order;
9f41699ed   Peter Zijlstra   bitops: Provide c...
27

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
  	order = fls(count);
  	return order;	/* We could be slightly more clever with -1 here... */
  }
94605eff5   Siddha, Suresh B   [PATCH] x86-64/i3...
31
32
33
  static __inline__ int get_count_order(unsigned int count)
  {
  	int order;
9f41699ed   Peter Zijlstra   bitops: Provide c...
34

94605eff5   Siddha, Suresh B   [PATCH] x86-64/i3...
35
36
37
38
39
  	order = fls(count) - 1;
  	if (count & (count - 1))
  		order++;
  	return order;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
  static inline unsigned long hweight_long(unsigned long w)
  {
e9bebd6f3   Akinobu Mita   [PATCH] bitops: r...
42
  	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
  }
45f8bde0d   Robert P. J. Day   [PATCH] fix vario...
44
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
   * rol32 - rotate a 32-bit value left
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Robert P. J. Day   [PATCH] fix vario...
53
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
   * ror32 - rotate a 32-bit value right
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Harvey Harrison   kernel: add bit r...
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   Andrew Morton   [PATCH] roundup_p...
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   Steven Whitehouse   bitops: Add __ffs...
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   Alexander van Heukelum   x86, generic: opt...
125
  #ifdef __KERNEL__
77b9bd9c4   Alexander van Heukelum   x86: generic vers...
126
  #ifdef CONFIG_GENERIC_FIND_FIRST_BIT
77b9bd9c4   Alexander van Heukelum   x86: generic vers...
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   Thomas Gleixner   bitops: remove "o...
135
136
  extern unsigned long find_first_bit(const unsigned long *addr,
  				    unsigned long size);
77b9bd9c4   Alexander van Heukelum   x86: generic vers...
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   Thomas Gleixner   bitops: remove "o...
145
146
  extern unsigned long find_first_zero_bit(const unsigned long *addr,
  					 unsigned long size);
77b9bd9c4   Alexander van Heukelum   x86: generic vers...
147
  #endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
ab53d472e   Rusty Russell   bitmap: find_last...
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   Alexander van Heukelum   x86, generic: opt...
159
  #ifdef CONFIG_GENERIC_FIND_NEXT_BIT
64970b68d   Alexander van Heukelum   x86, generic: opt...
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   Thomas Gleixner   bitops: remove "o...
167
168
  extern unsigned long find_next_bit(const unsigned long *addr,
  				   unsigned long size, unsigned long offset);
64970b68d   Alexander van Heukelum   x86, generic: opt...
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   Thomas Gleixner   bitops: remove "o...
176
177
178
179
  
  extern unsigned long find_next_zero_bit(const unsigned long *addr,
  					unsigned long size,
  					unsigned long offset);
64970b68d   Alexander van Heukelum   x86, generic: opt...
180
181
  #endif /* CONFIG_GENERIC_FIND_NEXT_BIT */
  #endif /* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  #endif