bitops_64.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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_next_zero_bit(const unsigned long *addr, long size, long offset);
  8. extern long find_first_bit(const unsigned long *addr, unsigned long size);
  9. extern long find_next_bit(const unsigned long *addr, long size, long offset);
  10. /* return index of first bet set in val or max when no bit is set */
  11. static inline long __scanbit(unsigned long val, unsigned long max)
  12. {
  13. asm("bsfq %1,%0 ; cmovz %2,%0" : "=&r" (val) : "r" (val), "r" (max));
  14. return val;
  15. }
  16. #define find_first_bit(addr,size) \
  17. ((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
  18. (__scanbit(*(unsigned long *)addr,(size))) : \
  19. find_first_bit(addr,size)))
  20. #define find_next_bit(addr,size,off) \
  21. ((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
  22. ((off) + (__scanbit((*(unsigned long *)addr) >> (off),(size)-(off)))) : \
  23. find_next_bit(addr,size,off)))
  24. #define find_first_zero_bit(addr,size) \
  25. ((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
  26. (__scanbit(~*(unsigned long *)addr,(size))) : \
  27. find_first_zero_bit(addr,size)))
  28. #define find_next_zero_bit(addr,size,off) \
  29. ((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
  30. ((off)+(__scanbit(~(((*(unsigned long *)addr)) >> (off)),(size)-(off)))) : \
  31. find_next_zero_bit(addr,size,off)))
  32. /*
  33. * Find string of zero bits in a bitmap. -1 when not found.
  34. */
  35. extern unsigned long
  36. find_next_zero_string(unsigned long *bitmap, long start, long nbits, int len);
  37. static inline void set_bit_string(unsigned long *bitmap, unsigned long i,
  38. int len)
  39. {
  40. unsigned long end = i + len;
  41. while (i < end) {
  42. __set_bit(i, bitmap);
  43. i++;
  44. }
  45. }
  46. static inline void __clear_bit_string(unsigned long *bitmap, unsigned long i,
  47. int len)
  48. {
  49. unsigned long end = i + len;
  50. while (i < end) {
  51. __clear_bit(i, bitmap);
  52. i++;
  53. }
  54. }
  55. /**
  56. * ffz - find first zero in word.
  57. * @word: The word to search
  58. *
  59. * Undefined if no zero exists, so code should check against ~0UL first.
  60. */
  61. static inline unsigned long ffz(unsigned long word)
  62. {
  63. __asm__("bsfq %1,%0"
  64. :"=r" (word)
  65. :"r" (~word));
  66. return word;
  67. }
  68. /**
  69. * __ffs - find first bit in word.
  70. * @word: The word to search
  71. *
  72. * Undefined if no bit exists, so code should check against 0 first.
  73. */
  74. static inline unsigned long __ffs(unsigned long word)
  75. {
  76. __asm__("bsfq %1,%0"
  77. :"=r" (word)
  78. :"rm" (word));
  79. return word;
  80. }
  81. /*
  82. * __fls: find last bit set.
  83. * @word: The word to search
  84. *
  85. * Undefined if no zero exists, so code should check against ~0UL first.
  86. */
  87. static inline unsigned long __fls(unsigned long word)
  88. {
  89. __asm__("bsrq %1,%0"
  90. :"=r" (word)
  91. :"rm" (word));
  92. return word;
  93. }
  94. #ifdef __KERNEL__
  95. #include <asm-generic/bitops/sched.h>
  96. /**
  97. * ffs - find first bit set
  98. * @x: the word to search
  99. *
  100. * This is defined the same way as
  101. * the libc and compiler builtin ffs routines, therefore
  102. * differs in spirit from the above ffz (man ffs).
  103. */
  104. static inline int ffs(int x)
  105. {
  106. int r;
  107. __asm__("bsfl %1,%0\n\t"
  108. "cmovzl %2,%0"
  109. : "=r" (r) : "rm" (x), "r" (-1));
  110. return r+1;
  111. }
  112. /**
  113. * fls64 - find last bit set in 64 bit word
  114. * @x: the word to search
  115. *
  116. * This is defined the same way as fls.
  117. */
  118. static inline int fls64(__u64 x)
  119. {
  120. if (x == 0)
  121. return 0;
  122. return __fls(x) + 1;
  123. }
  124. /**
  125. * fls - find last bit set
  126. * @x: the word to search
  127. *
  128. * This is defined the same way as ffs.
  129. */
  130. static inline int fls(int x)
  131. {
  132. int r;
  133. __asm__("bsrl %1,%0\n\t"
  134. "cmovzl %2,%0"
  135. : "=&r" (r) : "rm" (x), "rm" (-1));
  136. return r+1;
  137. }
  138. #define ARCH_HAS_FAST_MULTIPLIER 1
  139. #include <asm-generic/bitops/hweight.h>
  140. #endif /* __KERNEL__ */
  141. #ifdef __KERNEL__
  142. #include <asm-generic/bitops/ext2-non-atomic.h>
  143. #define ext2_set_bit_atomic(lock,nr,addr) \
  144. test_and_set_bit((nr),(unsigned long*)addr)
  145. #define ext2_clear_bit_atomic(lock,nr,addr) \
  146. test_and_clear_bit((nr),(unsigned long*)addr)
  147. #include <asm-generic/bitops/minix.h>
  148. #endif /* __KERNEL__ */
  149. #endif /* _X86_64_BITOPS_H */