]> Git Repo - qemu.git/blob - include/qemu/bitops.h
Merge remote-tracking branch 'rth/tcg-next' into staging
[qemu.git] / include / qemu / bitops.h
1 /*
2  * Bitops Module
3  *
4  * Copyright (C) 2010 Corentin Chary <[email protected]>
5  *
6  * Mostly inspired by (stolen from) linux/bitmap.h and linux/bitops.h
7  *
8  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
9  * See the COPYING.LIB file in the top-level directory.
10  */
11
12 #ifndef BITOPS_H
13 #define BITOPS_H
14
15 #include "qemu-common.h"
16 #include "host-utils.h"
17
18 #define BITS_PER_BYTE           CHAR_BIT
19 #define BITS_PER_LONG           (sizeof (unsigned long) * BITS_PER_BYTE)
20
21 #define BIT(nr)                 (1UL << (nr))
22 #define BIT_MASK(nr)            (1UL << ((nr) % BITS_PER_LONG))
23 #define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
24 #define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
25
26 /**
27  * set_bit - Set a bit in memory
28  * @nr: the bit to set
29  * @addr: the address to start counting from
30  */
31 static inline void set_bit(int nr, unsigned long *addr)
32 {
33         unsigned long mask = BIT_MASK(nr);
34         unsigned long *p = addr + BIT_WORD(nr);
35
36         *p  |= mask;
37 }
38
39 /**
40  * clear_bit - Clears a bit in memory
41  * @nr: Bit to clear
42  * @addr: Address to start counting from
43  */
44 static inline void clear_bit(int nr, unsigned long *addr)
45 {
46         unsigned long mask = BIT_MASK(nr);
47         unsigned long *p = addr + BIT_WORD(nr);
48
49         *p &= ~mask;
50 }
51
52 /**
53  * change_bit - Toggle a bit in memory
54  * @nr: Bit to change
55  * @addr: Address to start counting from
56  */
57 static inline void change_bit(int nr, unsigned long *addr)
58 {
59         unsigned long mask = BIT_MASK(nr);
60         unsigned long *p = addr + BIT_WORD(nr);
61
62         *p ^= mask;
63 }
64
65 /**
66  * test_and_set_bit - Set a bit and return its old value
67  * @nr: Bit to set
68  * @addr: Address to count from
69  */
70 static inline int test_and_set_bit(int nr, unsigned long *addr)
71 {
72         unsigned long mask = BIT_MASK(nr);
73         unsigned long *p = addr + BIT_WORD(nr);
74         unsigned long old = *p;
75
76         *p = old | mask;
77         return (old & mask) != 0;
78 }
79
80 /**
81  * test_and_clear_bit - Clear a bit and return its old value
82  * @nr: Bit to clear
83  * @addr: Address to count from
84  */
85 static inline int test_and_clear_bit(int nr, unsigned long *addr)
86 {
87         unsigned long mask = BIT_MASK(nr);
88         unsigned long *p = addr + BIT_WORD(nr);
89         unsigned long old = *p;
90
91         *p = old & ~mask;
92         return (old & mask) != 0;
93 }
94
95 /**
96  * test_and_change_bit - Change a bit and return its old value
97  * @nr: Bit to change
98  * @addr: Address to count from
99  */
100 static inline int test_and_change_bit(int nr, unsigned long *addr)
101 {
102         unsigned long mask = BIT_MASK(nr);
103         unsigned long *p = addr + BIT_WORD(nr);
104         unsigned long old = *p;
105
106         *p = old ^ mask;
107         return (old & mask) != 0;
108 }
109
110 /**
111  * test_bit - Determine whether a bit is set
112  * @nr: bit number to test
113  * @addr: Address to start counting from
114  */
115 static inline int test_bit(int nr, const unsigned long *addr)
116 {
117         return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
118 }
119
120 /**
121  * find_last_bit - find the last set bit in a memory region
122  * @addr: The address to start the search at
123  * @size: The maximum size to search
124  *
125  * Returns the bit number of the first set bit, or size.
126  */
127 unsigned long find_last_bit(const unsigned long *addr,
128                             unsigned long size);
129
130 /**
131  * find_next_bit - find the next set bit in a memory region
132  * @addr: The address to base the search on
133  * @offset: The bitnumber to start searching at
134  * @size: The bitmap size in bits
135  */
136 unsigned long find_next_bit(const unsigned long *addr,
137                                    unsigned long size, unsigned long offset);
138
139 /**
140  * find_next_zero_bit - find the next cleared bit in a memory region
141  * @addr: The address to base the search on
142  * @offset: The bitnumber to start searching at
143  * @size: The bitmap size in bits
144  */
145
146 unsigned long find_next_zero_bit(const unsigned long *addr,
147                                  unsigned long size,
148                                  unsigned long offset);
149
150 /**
151  * find_first_bit - find the first set bit in a memory region
152  * @addr: The address to start the search at
153  * @size: The maximum size to search
154  *
155  * Returns the bit number of the first set bit.
156  */
157 static inline unsigned long find_first_bit(const unsigned long *addr,
158                                            unsigned long size)
159 {
160     return find_next_bit(addr, size, 0);
161 }
162
163 /**
164  * find_first_zero_bit - find the first cleared bit in a memory region
165  * @addr: The address to start the search at
166  * @size: The maximum size to search
167  *
168  * Returns the bit number of the first cleared bit.
169  */
170 static inline unsigned long find_first_zero_bit(const unsigned long *addr,
171                                                 unsigned long size)
172 {
173     return find_next_zero_bit(addr, size, 0);
174 }
175
176 static inline unsigned long hweight_long(unsigned long w)
177 {
178     unsigned long count;
179
180     for (count = 0; w; w >>= 1) {
181         count += w & 1;
182     }
183     return count;
184 }
185
186 /**
187  * extract32:
188  * @value: the value to extract the bit field from
189  * @start: the lowest bit in the bit field (numbered from 0)
190  * @length: the length of the bit field
191  *
192  * Extract from the 32 bit input @value the bit field specified by the
193  * @start and @length parameters, and return it. The bit field must
194  * lie entirely within the 32 bit word. It is valid to request that
195  * all 32 bits are returned (ie @length 32 and @start 0).
196  *
197  * Returns: the value of the bit field extracted from the input value.
198  */
199 static inline uint32_t extract32(uint32_t value, int start, int length)
200 {
201     assert(start >= 0 && length > 0 && length <= 32 - start);
202     return (value >> start) & (~0U >> (32 - length));
203 }
204
205 /**
206  * extract64:
207  * @value: the value to extract the bit field from
208  * @start: the lowest bit in the bit field (numbered from 0)
209  * @length: the length of the bit field
210  *
211  * Extract from the 64 bit input @value the bit field specified by the
212  * @start and @length parameters, and return it. The bit field must
213  * lie entirely within the 64 bit word. It is valid to request that
214  * all 64 bits are returned (ie @length 64 and @start 0).
215  *
216  * Returns: the value of the bit field extracted from the input value.
217  */
218 static inline uint64_t extract64(uint64_t value, int start, int length)
219 {
220     assert(start >= 0 && length > 0 && length <= 64 - start);
221     return (value >> start) & (~0ULL >> (64 - length));
222 }
223
224 /**
225  * sextract32:
226  * @value: the value to extract the bit field from
227  * @start: the lowest bit in the bit field (numbered from 0)
228  * @length: the length of the bit field
229  *
230  * Extract from the 32 bit input @value the bit field specified by the
231  * @start and @length parameters, and return it, sign extended to
232  * an int32_t (ie with the most significant bit of the field propagated
233  * to all the upper bits of the return value). The bit field must lie
234  * entirely within the 32 bit word. It is valid to request that
235  * all 32 bits are returned (ie @length 32 and @start 0).
236  *
237  * Returns: the sign extended value of the bit field extracted from the
238  * input value.
239  */
240 static inline int32_t sextract32(uint32_t value, int start, int length)
241 {
242     assert(start >= 0 && length > 0 && length <= 32 - start);
243     /* Note that this implementation relies on right shift of signed
244      * integers being an arithmetic shift.
245      */
246     return ((int32_t)(value << (32 - length - start))) >> (32 - length);
247 }
248
249 /**
250  * sextract64:
251  * @value: the value to extract the bit field from
252  * @start: the lowest bit in the bit field (numbered from 0)
253  * @length: the length of the bit field
254  *
255  * Extract from the 64 bit input @value the bit field specified by the
256  * @start and @length parameters, and return it, sign extended to
257  * an int64_t (ie with the most significant bit of the field propagated
258  * to all the upper bits of the return value). The bit field must lie
259  * entirely within the 64 bit word. It is valid to request that
260  * all 64 bits are returned (ie @length 64 and @start 0).
261  *
262  * Returns: the sign extended value of the bit field extracted from the
263  * input value.
264  */
265 static inline uint64_t sextract64(uint64_t value, int start, int length)
266 {
267     assert(start >= 0 && length > 0 && length <= 64 - start);
268     /* Note that this implementation relies on right shift of signed
269      * integers being an arithmetic shift.
270      */
271     return ((int64_t)(value << (64 - length - start))) >> (64 - length);
272 }
273
274 /**
275  * deposit32:
276  * @value: initial value to insert bit field into
277  * @start: the lowest bit in the bit field (numbered from 0)
278  * @length: the length of the bit field
279  * @fieldval: the value to insert into the bit field
280  *
281  * Deposit @fieldval into the 32 bit @value at the bit field specified
282  * by the @start and @length parameters, and return the modified
283  * @value. Bits of @value outside the bit field are not modified.
284  * Bits of @fieldval above the least significant @length bits are
285  * ignored. The bit field must lie entirely within the 32 bit word.
286  * It is valid to request that all 32 bits are modified (ie @length
287  * 32 and @start 0).
288  *
289  * Returns: the modified @value.
290  */
291 static inline uint32_t deposit32(uint32_t value, int start, int length,
292                                  uint32_t fieldval)
293 {
294     uint32_t mask;
295     assert(start >= 0 && length > 0 && length <= 32 - start);
296     mask = (~0U >> (32 - length)) << start;
297     return (value & ~mask) | ((fieldval << start) & mask);
298 }
299
300 /**
301  * deposit64:
302  * @value: initial value to insert bit field into
303  * @start: the lowest bit in the bit field (numbered from 0)
304  * @length: the length of the bit field
305  * @fieldval: the value to insert into the bit field
306  *
307  * Deposit @fieldval into the 64 bit @value at the bit field specified
308  * by the @start and @length parameters, and return the modified
309  * @value. Bits of @value outside the bit field are not modified.
310  * Bits of @fieldval above the least significant @length bits are
311  * ignored. The bit field must lie entirely within the 64 bit word.
312  * It is valid to request that all 64 bits are modified (ie @length
313  * 64 and @start 0).
314  *
315  * Returns: the modified @value.
316  */
317 static inline uint64_t deposit64(uint64_t value, int start, int length,
318                                  uint64_t fieldval)
319 {
320     uint64_t mask;
321     assert(start >= 0 && length > 0 && length <= 64 - start);
322     mask = (~0ULL >> (64 - length)) << start;
323     return (value & ~mask) | ((fieldval << start) & mask);
324 }
325
326 #endif
This page took 0.047395 seconds and 4 git commands to generate.