Blame view

include/linux/bitops.h 3.94 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) \
1e2ad28f8   Robert Richter   perf, x86: Implem...
21
22
23
24
25
26
27
28
  	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);					\
3e037454b   Shannon Nelson   I/OAT: Add suppor...
29
  	     (bit) = find_next_bit((addr), (size), (bit) + 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
  static __inline__ int get_bitmask_order(unsigned int count)
  {
  	int order;
9f41699ed   Peter Zijlstra   bitops: Provide c...
33

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

94605eff5   Siddha, Suresh B   [PATCH] x86-64/i3...
41
42
43
44
45
  	order = fls(count) - 1;
  	if (count & (count - 1))
  		order++;
  	return order;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
  static inline unsigned long hweight_long(unsigned long w)
  {
e9bebd6f3   Akinobu Mita   [PATCH] bitops: r...
48
  	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  }
45f8bde0d   Robert P. J. Day   [PATCH] fix vario...
50
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
   * rol32 - rotate a 32-bit value left
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
56
57
58
   * @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...
59
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
   * ror32 - rotate a 32-bit value right
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
67
   * @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...
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
101
102
103
104
105
106
  /**
   * 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));
  }
7919a57bc   Andreas Herrmann   bitops: Provide g...
107
108
109
110
111
112
113
114
115
116
117
  
  /**
   * 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;
  }
3afe39259   Harvey Harrison   kernel: add bit r...
118

962749af6   Andrew Morton   [PATCH] roundup_p...
119
120
121
122
123
124
  static inline unsigned fls_long(unsigned long l)
  {
  	if (sizeof(l) == 4)
  		return fls(l);
  	return fls64(l);
  }
952043ac1   Steven Whitehouse   bitops: Add __ffs...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  /**
   * __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...
143
  #ifdef __KERNEL__
77b9bd9c4   Alexander van Heukelum   x86: generic vers...
144

19de85ef5   Akinobu Mita   bitops: add #ifnd...
145
  #ifndef find_last_bit
ab53d472e   Rusty Russell   bitmap: find_last...
146
147
148
149
150
151
152
153
154
  /**
   * 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);
19de85ef5   Akinobu Mita   bitops: add #ifnd...
155
  #endif
ab53d472e   Rusty Russell   bitmap: find_last...
156

64970b68d   Alexander van Heukelum   x86, generic: opt...
157
  #endif /* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
  #endif