xref: /linux-6.15/include/linux/bitops.h (revision e9bebd6f)
11da177e4SLinus Torvalds #ifndef _LINUX_BITOPS_H
21da177e4SLinus Torvalds #define _LINUX_BITOPS_H
31da177e4SLinus Torvalds #include <asm/types.h>
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  * Include this here because some architectures need generic_ffs/fls in
71da177e4SLinus Torvalds  * scope
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds #include <asm/bitops.h>
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds static __inline__ int get_bitmask_order(unsigned int count)
121da177e4SLinus Torvalds {
131da177e4SLinus Torvalds 	int order;
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds 	order = fls(count);
161da177e4SLinus Torvalds 	return order;	/* We could be slightly more clever with -1 here... */
171da177e4SLinus Torvalds }
181da177e4SLinus Torvalds 
1994605effSSiddha, Suresh B static __inline__ int get_count_order(unsigned int count)
2094605effSSiddha, Suresh B {
2194605effSSiddha, Suresh B 	int order;
2294605effSSiddha, Suresh B 
2394605effSSiddha, Suresh B 	order = fls(count) - 1;
2494605effSSiddha, Suresh B 	if (count & (count - 1))
2594605effSSiddha, Suresh B 		order++;
2694605effSSiddha, Suresh B 	return order;
2794605effSSiddha, Suresh B }
2894605effSSiddha, Suresh B 
291da177e4SLinus Torvalds static inline unsigned long hweight_long(unsigned long w)
301da177e4SLinus Torvalds {
31*e9bebd6fSAkinobu Mita 	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
321da177e4SLinus Torvalds }
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds /*
351da177e4SLinus Torvalds  * rol32 - rotate a 32-bit value left
361da177e4SLinus Torvalds  *
371da177e4SLinus Torvalds  * @word: value to rotate
381da177e4SLinus Torvalds  * @shift: bits to roll
391da177e4SLinus Torvalds  */
401da177e4SLinus Torvalds static inline __u32 rol32(__u32 word, unsigned int shift)
411da177e4SLinus Torvalds {
421da177e4SLinus Torvalds 	return (word << shift) | (word >> (32 - shift));
431da177e4SLinus Torvalds }
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds /*
461da177e4SLinus Torvalds  * ror32 - rotate a 32-bit value right
471da177e4SLinus Torvalds  *
481da177e4SLinus Torvalds  * @word: value to rotate
491da177e4SLinus Torvalds  * @shift: bits to roll
501da177e4SLinus Torvalds  */
511da177e4SLinus Torvalds static inline __u32 ror32(__u32 word, unsigned int shift)
521da177e4SLinus Torvalds {
531da177e4SLinus Torvalds 	return (word >> shift) | (word << (32 - shift));
541da177e4SLinus Torvalds }
551da177e4SLinus Torvalds 
56962749afSAndrew Morton static inline unsigned fls_long(unsigned long l)
57962749afSAndrew Morton {
58962749afSAndrew Morton 	if (sizeof(l) == 4)
59962749afSAndrew Morton 		return fls(l);
60962749afSAndrew Morton 	return fls64(l);
61962749afSAndrew Morton }
62962749afSAndrew Morton 
631da177e4SLinus Torvalds #endif
64