-// Find First Set, counting from 0, undefined if no bits set
-static inline int ll_ffs(unsigned long val)
-{
- unsigned long ret;
- asm("bsfl %1, %0" : "=r" (ret) : "r" (val));
- return ret;
-}
-
-// Find Last Set, counting from 0, undefined if no bits set
-static inline int ll_fls(unsigned long val)
-{
- unsigned long ret;
- asm("bsrl %1, %0" : "=r" (ret) : "r" (val));
- return ret;
-}
-
-// As above, but on 64-bit values, regardless of sizeof(long)
-static inline int ll_ffs64(uint64_t val)
-{
- if ((uint32_t)val)
- return ll_ffs((uint32_t)val);
- else
- return ll_ffs((uint32_t)(val >> 32));
-}
-
-static inline int ll_fls64(uint64_t val)
-{
- if ((uint32_t)(val >> 32))
- return ll_ffs((uint32_t)(val >> 32));
- else
- return ll_ffs((uint32_t)val);
-}
-
-// Set/Clear the nth bit in a multiword bitmap. These functions
-// are endian and word-size dependent.
-
-static inline void ll_multiword_set_bit(unsigned long *bitmap, int bit)
-{
- asm("bts %1, %0" : "=m" (bitmap[0]) : "r" (bit) : "memory");
-}
-
-static inline void ll_multiword_clear_bit(unsigned long *bitmap, int bit)
-{
- asm("btr %1, %0" : "=m" (bitmap[0]) : "r" (bit) : "memory");
-}