1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_BITOPS_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_BITOPS_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/types.h>
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Include this here because some architectures need generic_ffs/fls in
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * scope
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/bitops.h>
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __inline__ int get_bitmask_order(unsigned int count)
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int order;
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	order = fls(count);
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return order;	/* We could be slightly more clever with -1 here... */
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __inline__ int get_count_order(unsigned int count)
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int order;
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	order = fls(count) - 1;
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (count & (count - 1))
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		order++;
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return order;
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long hweight_long(unsigned long w)
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * rol32 - rotate a 32-bit value left
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @word: value to rotate
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @shift: bits to roll
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __u32 rol32(__u32 word, unsigned int shift)
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (word << shift) | (word >> (32 - shift));
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ror32 - rotate a 32-bit value right
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @word: value to rotate
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @shift: bits to roll
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __u32 ror32(__u32 word, unsigned int shift)
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (word >> shift) | (word << (32 - shift));
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned fls_long(unsigned long l)
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (sizeof(l) == 4)
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		return fls(l);
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return fls64(l);
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
64