summaryrefslogtreecommitdiff
path: root/include/asm-generic/bitops/fls64.h
diff options
context:
space:
mode:
authorStefano Babic <sbabic@denx.de>2015-11-12 17:13:26 +0100
committerStefano Babic <sbabic@denx.de>2015-11-12 17:13:26 +0100
commit5f5620ab2679608f94b3a77e51c77d0a770103bd (patch)
treeec983c06d2f62384909968bb870add121b8a1502 /include/asm-generic/bitops/fls64.h
parent78e9ca52edaab74ad645d719676ff4c24d2f462c (diff)
parent038be18fd95aa6283eafb85ceabc0b880976424b (diff)
downloadu-boot-5f5620ab2679608f94b3a77e51c77d0a770103bd.tar.gz
Merge git://git.denx.de/u-boot
Diffstat (limited to 'include/asm-generic/bitops/fls64.h')
-rw-r--r--include/asm-generic/bitops/fls64.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/include/asm-generic/bitops/fls64.h b/include/asm-generic/bitops/fls64.h
new file mode 100644
index 0000000000..b097cf8444
--- /dev/null
+++ b/include/asm-generic/bitops/fls64.h
@@ -0,0 +1,36 @@
+#ifndef _ASM_GENERIC_BITOPS_FLS64_H_
+#define _ASM_GENERIC_BITOPS_FLS64_H_
+
+#include <asm/types.h>
+
+/**
+ * fls64 - find last set bit in a 64-bit word
+ * @x: the word to search
+ *
+ * This is defined in a similar way as the libc and compiler builtin
+ * ffsll, but returns the position of the most significant set bit.
+ *
+ * fls64(value) returns 0 if value is 0 or the position of the last
+ * set bit if value is nonzero. The last (most significant) bit is
+ * at position 64.
+ */
+#if BITS_PER_LONG == 32
+static __always_inline int fls64(__u64 x)
+{
+ __u32 h = x >> 32;
+ if (h)
+ return fls(h) + 32;
+ return fls(x);
+}
+#elif BITS_PER_LONG == 64
+static __always_inline int fls64(__u64 x)
+{
+ if (x == 0)
+ return 0;
+ return __fls(x) + 1;
+}
+#else
+#error BITS_PER_LONG not 32 or 64
+#endif
+
+#endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */