bitops.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. /* $Id: bitops.h,v 1.39 2002/01/30 01:40:00 davem Exp $
  2. * bitops.h: Bit string operations on the V9.
  3. *
  4. * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
  5. */
  6. #ifndef _SPARC64_BITOPS_H
  7. #define _SPARC64_BITOPS_H
  8. #include <linux/config.h>
  9. #include <linux/compiler.h>
  10. #include <asm/byteorder.h>
  11. extern int test_and_set_bit(unsigned long nr, volatile unsigned long *addr);
  12. extern int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr);
  13. extern int test_and_change_bit(unsigned long nr, volatile unsigned long *addr);
  14. extern void set_bit(unsigned long nr, volatile unsigned long *addr);
  15. extern void clear_bit(unsigned long nr, volatile unsigned long *addr);
  16. extern void change_bit(unsigned long nr, volatile unsigned long *addr);
  17. /* "non-atomic" versions... */
  18. static inline void __set_bit(int nr, volatile unsigned long *addr)
  19. {
  20. unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
  21. *m |= (1UL << (nr & 63));
  22. }
  23. static inline void __clear_bit(int nr, volatile unsigned long *addr)
  24. {
  25. unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
  26. *m &= ~(1UL << (nr & 63));
  27. }
  28. static inline void __change_bit(int nr, volatile unsigned long *addr)
  29. {
  30. unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
  31. *m ^= (1UL << (nr & 63));
  32. }
  33. static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)
  34. {
  35. unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
  36. unsigned long old = *m;
  37. unsigned long mask = (1UL << (nr & 63));
  38. *m = (old | mask);
  39. return ((old & mask) != 0);
  40. }
  41. static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)
  42. {
  43. unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
  44. unsigned long old = *m;
  45. unsigned long mask = (1UL << (nr & 63));
  46. *m = (old & ~mask);
  47. return ((old & mask) != 0);
  48. }
  49. static inline int __test_and_change_bit(int nr, volatile unsigned long *addr)
  50. {
  51. unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
  52. unsigned long old = *m;
  53. unsigned long mask = (1UL << (nr & 63));
  54. *m = (old ^ mask);
  55. return ((old & mask) != 0);
  56. }
  57. #ifdef CONFIG_SMP
  58. #define smp_mb__before_clear_bit() membar_storeload_loadload()
  59. #define smp_mb__after_clear_bit() membar_storeload_storestore()
  60. #else
  61. #define smp_mb__before_clear_bit() barrier()
  62. #define smp_mb__after_clear_bit() barrier()
  63. #endif
  64. static inline int test_bit(int nr, __const__ volatile unsigned long *addr)
  65. {
  66. return (1UL & (addr[nr >> 6] >> (nr & 63))) != 0UL;
  67. }
  68. /* The easy/cheese version for now. */
  69. static inline unsigned long ffz(unsigned long word)
  70. {
  71. unsigned long result;
  72. result = 0;
  73. while(word & 1) {
  74. result++;
  75. word >>= 1;
  76. }
  77. return result;
  78. }
  79. /**
  80. * __ffs - find first bit in word.
  81. * @word: The word to search
  82. *
  83. * Undefined if no bit exists, so code should check against 0 first.
  84. */
  85. static inline unsigned long __ffs(unsigned long word)
  86. {
  87. unsigned long result = 0;
  88. while (!(word & 1UL)) {
  89. result++;
  90. word >>= 1;
  91. }
  92. return result;
  93. }
  94. /*
  95. * fls: find last bit set.
  96. */
  97. #define fls(x) generic_fls(x)
  98. #ifdef __KERNEL__
  99. /*
  100. * Every architecture must define this function. It's the fastest
  101. * way of searching a 140-bit bitmap where the first 100 bits are
  102. * unlikely to be set. It's guaranteed that at least one of the 140
  103. * bits is cleared.
  104. */
  105. static inline int sched_find_first_bit(unsigned long *b)
  106. {
  107. if (unlikely(b[0]))
  108. return __ffs(b[0]);
  109. if (unlikely(((unsigned int)b[1])))
  110. return __ffs(b[1]) + 64;
  111. if (b[1] >> 32)
  112. return __ffs(b[1] >> 32) + 96;
  113. return __ffs(b[2]) + 128;
  114. }
  115. /*
  116. * ffs: find first bit set. This is defined the same way as
  117. * the libc and compiler builtin ffs routines, therefore
  118. * differs in spirit from the above ffz (man ffs).
  119. */
  120. static inline int ffs(int x)
  121. {
  122. if (!x)
  123. return 0;
  124. return __ffs((unsigned long)x) + 1;
  125. }
  126. /*
  127. * hweightN: returns the hamming weight (i.e. the number
  128. * of bits set) of a N-bit word
  129. */
  130. #ifdef ULTRA_HAS_POPULATION_COUNT
  131. static inline unsigned int hweight64(unsigned long w)
  132. {
  133. unsigned int res;
  134. __asm__ ("popc %1,%0" : "=r" (res) : "r" (w));
  135. return res;
  136. }
  137. static inline unsigned int hweight32(unsigned int w)
  138. {
  139. unsigned int res;
  140. __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffffffff));
  141. return res;
  142. }
  143. static inline unsigned int hweight16(unsigned int w)
  144. {
  145. unsigned int res;
  146. __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffff));
  147. return res;
  148. }
  149. static inline unsigned int hweight8(unsigned int w)
  150. {
  151. unsigned int res;
  152. __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xff));
  153. return res;
  154. }
  155. #else
  156. #define hweight64(x) generic_hweight64(x)
  157. #define hweight32(x) generic_hweight32(x)
  158. #define hweight16(x) generic_hweight16(x)
  159. #define hweight8(x) generic_hweight8(x)
  160. #endif
  161. #endif /* __KERNEL__ */
  162. /**
  163. * find_next_bit - find the next set bit in a memory region
  164. * @addr: The address to base the search on
  165. * @offset: The bitnumber to start searching at
  166. * @size: The maximum size to search
  167. */
  168. extern unsigned long find_next_bit(const unsigned long *, unsigned long,
  169. unsigned long);
  170. /**
  171. * find_first_bit - find the first set bit in a memory region
  172. * @addr: The address to start the search at
  173. * @size: The maximum size to search
  174. *
  175. * Returns the bit-number of the first set bit, not the number of the byte
  176. * containing a bit.
  177. */
  178. #define find_first_bit(addr, size) \
  179. find_next_bit((addr), (size), 0)
  180. /* find_next_zero_bit() finds the first zero bit in a bit string of length
  181. * 'size' bits, starting the search at bit 'offset'. This is largely based
  182. * on Linus's ALPHA routines, which are pretty portable BTW.
  183. */
  184. extern unsigned long find_next_zero_bit(const unsigned long *,
  185. unsigned long, unsigned long);
  186. #define find_first_zero_bit(addr, size) \
  187. find_next_zero_bit((addr), (size), 0)
  188. #define test_and_set_le_bit(nr,addr) \
  189. test_and_set_bit((nr) ^ 0x38, (addr))
  190. #define test_and_clear_le_bit(nr,addr) \
  191. test_and_clear_bit((nr) ^ 0x38, (addr))
  192. static inline int test_le_bit(int nr, __const__ unsigned long * addr)
  193. {
  194. int mask;
  195. __const__ unsigned char *ADDR = (__const__ unsigned char *) addr;
  196. ADDR += nr >> 3;
  197. mask = 1 << (nr & 0x07);
  198. return ((mask & *ADDR) != 0);
  199. }
  200. #define find_first_zero_le_bit(addr, size) \
  201. find_next_zero_le_bit((addr), (size), 0)
  202. extern unsigned long find_next_zero_le_bit(unsigned long *, unsigned long, unsigned long);
  203. #ifdef __KERNEL__
  204. #define __set_le_bit(nr, addr) \
  205. __set_bit((nr) ^ 0x38, (addr))
  206. #define __clear_le_bit(nr, addr) \
  207. __clear_bit((nr) ^ 0x38, (addr))
  208. #define __test_and_clear_le_bit(nr, addr) \
  209. __test_and_clear_bit((nr) ^ 0x38, (addr))
  210. #define __test_and_set_le_bit(nr, addr) \
  211. __test_and_set_bit((nr) ^ 0x38, (addr))
  212. #define ext2_set_bit(nr,addr) \
  213. __test_and_set_le_bit((nr),(unsigned long *)(addr))
  214. #define ext2_set_bit_atomic(lock,nr,addr) \
  215. test_and_set_le_bit((nr),(unsigned long *)(addr))
  216. #define ext2_clear_bit(nr,addr) \
  217. __test_and_clear_le_bit((nr),(unsigned long *)(addr))
  218. #define ext2_clear_bit_atomic(lock,nr,addr) \
  219. test_and_clear_le_bit((nr),(unsigned long *)(addr))
  220. #define ext2_test_bit(nr,addr) \
  221. test_le_bit((nr),(unsigned long *)(addr))
  222. #define ext2_find_first_zero_bit(addr, size) \
  223. find_first_zero_le_bit((unsigned long *)(addr), (size))
  224. #define ext2_find_next_zero_bit(addr, size, off) \
  225. find_next_zero_le_bit((unsigned long *)(addr), (size), (off))
  226. /* Bitmap functions for the minix filesystem. */
  227. #define minix_test_and_set_bit(nr,addr) \
  228. test_and_set_bit((nr),(unsigned long *)(addr))
  229. #define minix_set_bit(nr,addr) \
  230. set_bit((nr),(unsigned long *)(addr))
  231. #define minix_test_and_clear_bit(nr,addr) \
  232. test_and_clear_bit((nr),(unsigned long *)(addr))
  233. #define minix_test_bit(nr,addr) \
  234. test_bit((nr),(unsigned long *)(addr))
  235. #define minix_find_first_zero_bit(addr,size) \
  236. find_first_zero_bit((unsigned long *)(addr),(size))
  237. #endif /* __KERNEL__ */
  238. #endif /* defined(_SPARC64_BITOPS_H) */