bitops_64.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef _X86_64_BITOPS_H
  2. #define _X86_64_BITOPS_H
  3. /*
  4. * Copyright 1992, Linus Torvalds.
  5. */
  6. extern long find_first_zero_bit(const unsigned long *addr, unsigned long size);
  7. extern long find_first_bit(const unsigned long *addr, unsigned long size);
  8. /* return index of first bet set in val or max when no bit is set */
  9. static inline long __scanbit(unsigned long val, unsigned long max)
  10. {
  11. asm("bsfq %1,%0 ; cmovz %2,%0" : "=&r" (val) : "r" (val), "r" (max));
  12. return val;
  13. }
  14. #define find_first_bit(addr, size) \
  15. ((__builtin_constant_p((size)) && (size) <= BITS_PER_LONG \
  16. ? (__scanbit(*(unsigned long *)(addr), (size))) \
  17. : find_first_bit((addr), (size))))
  18. #define find_first_zero_bit(addr, size) \
  19. ((__builtin_constant_p((size)) && (size) <= BITS_PER_LONG \
  20. ? (__scanbit(~*(unsigned long *)(addr), (size))) \
  21. : find_first_zero_bit((addr), (size))))
  22. static inline void set_bit_string(unsigned long *bitmap, unsigned long i,
  23. int len)
  24. {
  25. unsigned long end = i + len;
  26. while (i < end) {
  27. __set_bit(i, bitmap);
  28. i++;
  29. }
  30. }
  31. #ifdef __KERNEL__
  32. #include <asm-generic/bitops/sched.h>
  33. /**
  34. * fls64 - find last bit set in 64 bit word
  35. * @x: the word to search
  36. *
  37. * This is defined the same way as fls.
  38. */
  39. static inline int fls64(__u64 x)
  40. {
  41. if (x == 0)
  42. return 0;
  43. return __fls(x) + 1;
  44. }
  45. #define ARCH_HAS_FAST_MULTIPLIER 1
  46. #include <asm-generic/bitops/hweight.h>
  47. #endif /* __KERNEL__ */
  48. #ifdef __KERNEL__
  49. #include <asm-generic/bitops/ext2-non-atomic.h>
  50. #define ext2_set_bit_atomic(lock, nr, addr) \
  51. test_and_set_bit((nr), (unsigned long *)(addr))
  52. #define ext2_clear_bit_atomic(lock, nr, addr) \
  53. test_and_clear_bit((nr), (unsigned long *)(addr))
  54. #include <asm-generic/bitops/minix.h>
  55. #endif /* __KERNEL__ */
  56. #endif /* _X86_64_BITOPS_H */