-// Bit manipulation functions. These functions are not privileged.
-
#ifndef _LL_ARCH_BITOPS_H
#define _LL_ARCH_BITOPS_H
-// Find First (least-significant) Set, counting from 0,
-// undefined if no bits set
-
-static inline int ll_ffs(unsigned long val)
-{
- unsigned long ret;
- asm("bsfq %1, %0" : "=r" (ret) : "r" (val));
- return ret;
-}
-
-// Find Last (most-significant) Set, counting from 0,
-// undefined if no bits set
-
-static inline int ll_fls(unsigned long val)
-{
- unsigned long ret;
- asm("bsrq %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)
-{
- return ll_ffs(val);
-}
-
-static inline int ll_fls64(uint64_t val)
-{
- return ll_fls(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");
-}
+#include <lowlevel/arch-x86-common/bitops.h>
#endif
--- /dev/null
+// Bit manipulation functions. These functions are not privileged.
+
+#ifndef _LL_ARCH_X86C_BITOPS_H
+#define _LL_ARCH_X86C_BITOPS_H
+
+// 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");
+}
+
+#endif
-// Bit manipulation functions. These functions are not privileged.
-
#ifndef _LL_ARCH_BITOPS_H
#define _LL_ARCH_BITOPS_H
-// 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");
-}
+#include <lowlevel/arch-x86-common/bitops.h>
#endif
#include <lowlevel/types.h>
#include _LL_INC(bitops.h)
+// Find First (least-significant) Set, counting from 0,
+// undefined if no bits set
+
+static inline int ll_ffs(unsigned long val)
+{
+ return __builtin_ctzl(val);
+}
+
+// Find Last (most-significant) Set, counting from 0,
+// undefined if no bits set
+
+static inline int ll_fls(unsigned long val)
+{
+ return (sizeof(unsigned long)*8 - 1) ^ __builtin_clzl(val);
+}
+
+// As above, except on 64-bit values regardless of sizeof(long).
+static inline int ll_ffs64(uint64_t val)
+{
+ return __builtin_ctzll(val);
+}
+
+// Find Last (most-significant) Set, counting from 0,
+// undefined if no bits set
+
+static inline int ll_fls64(unsigned long val)
+{
+ return (sizeof(unsigned long long)*8 - 1) ^ __builtin_clzll(val);
+}
+
static inline int ll_get_order_round_up(unsigned long val)
{
- return val != 1 ? ll_fls(val - 1) + 1 : 0;
+ return val > 1 ? ll_fls(val - 1) + 1 : 0;
}
static inline int ll_get_order_round_down(unsigned long val)