bitops.h 1.6 KB

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