bitops_64.h 1.6 KB

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