| 77 | } |
| 78 | |
| 79 | unsigned long bitmap_ffs(const bitmap *b, |
| 80 | unsigned long n, unsigned long m) |
| 81 | { |
| 82 | unsigned long an = BIT_ALIGN_UP(n); |
| 83 | unsigned long am = BIT_ALIGN_DOWN(m); |
| 84 | bitmap_word headmask = BITMAP_WORD_1 >> (n % BITMAP_WORD_BITS); |
| 85 | bitmap_word tailmask = ~(BITMAP_WORD_1 >> (m % BITMAP_WORD_BITS)); |
| 86 | |
| 87 | assert(m >= n); |
| 88 | |
| 89 | if (am < an) { |
| 90 | bitmap_word w = bitmap_bswap(BITMAP_WORD(b, n)); |
| 91 | |
| 92 | w &= (headmask & tailmask); |
| 93 | |
| 94 | return w ? am + bitmap_clz(w) : m; |
| 95 | } |
| 96 | |
| 97 | if (an > n) { |
| 98 | bitmap_word w = bitmap_bswap(BITMAP_WORD(b, n)); |
| 99 | |
| 100 | w &= headmask; |
| 101 | |
| 102 | if (w) |
| 103 | return BIT_ALIGN_DOWN(n) + bitmap_clz(w); |
| 104 | } |
| 105 | |
| 106 | while (an < am) { |
| 107 | bitmap_word w = bitmap_bswap(BITMAP_WORD(b, an)); |
| 108 | |
| 109 | if (w) |
| 110 | return an + bitmap_clz(w); |
| 111 | |
| 112 | an += BITMAP_WORD_BITS; |
| 113 | } |
| 114 | |
| 115 | if (m > am) { |
| 116 | bitmap_word w = bitmap_bswap(BITMAP_WORD(b, m)); |
| 117 | |
| 118 | w &= tailmask; |
| 119 | |
| 120 | if (w) |
| 121 | return am + bitmap_clz(w); |
| 122 | } |
| 123 | |
| 124 | return m; |
| 125 | } |