|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/bitops: Clean up ffs64()/fls64() definitions
commit 04e70af5f240965ec0475caef813653e06782273
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Sat Mar 9 02:44:56 2024 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Sat Jun 1 02:28:14 2024 +0100
xen/bitops: Clean up ffs64()/fls64() definitions
Implement ffs64() and fls64() as plain static inlines, dropping the ifdefary
and intermediate generic_f?s64() forms.
Add tests for all interesting bit positions at 32bit boundaries.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Release-acked-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
xen/common/bitops.c | 32 ++++++++++++++++++++++++++++++++
xen/include/xen/bitops.h | 42 ++++++++++++++++++++----------------------
2 files changed, 52 insertions(+), 22 deletions(-)
diff --git a/xen/common/bitops.c b/xen/common/bitops.c
index 0e1cc1f509..94a8983af9 100644
--- a/xen/common/bitops.c
+++ b/xen/common/bitops.c
@@ -26,6 +26,22 @@ static void __init test_ffs(void)
CHECK(ffsl, 1UL << 32, 33);
CHECK(ffsl, 1UL << 63, 64);
#endif
+
+ /*
+ * unsigned int ffs64(uint64_t)
+ *
+ * 32-bit builds of Xen have to split this into two adjacent operations,
+ * so test all interesting bit positions across the divide.
+ */
+ CHECK(ffs64, 0, 0);
+ CHECK(ffs64, 1, 1);
+ CHECK(ffs64, 3, 1);
+ CHECK(ffs64, 7, 1);
+ CHECK(ffs64, 6, 2);
+
+ CHECK(ffs64, 0x8000000080000000ULL, 32);
+ CHECK(ffs64, 0x8000000100000000ULL, 33);
+ CHECK(ffs64, 0x8000000000000000ULL, 64);
}
static void __init test_fls(void)
@@ -50,6 +66,22 @@ static void __init test_fls(void)
CHECK(flsl, 1 | (1UL << 32), 33);
CHECK(flsl, 1 | (1UL << 63), 64);
#endif
+
+ /*
+ * unsigned int fls64(uint64_t)
+ *
+ * 32-bit builds of Xen have to split this into two adjacent operations,
+ * so test all interesting bit positions across the divide.
+ */
+ CHECK(fls64, 0, 0);
+ CHECK(fls64, 1, 1);
+ CHECK(fls64, 3, 2);
+ CHECK(fls64, 7, 3);
+ CHECK(fls64, 6, 3);
+
+ CHECK(fls64, 0x0000000080000001ULL, 32);
+ CHECK(fls64, 0x0000000100000001ULL, 33);
+ CHECK(fls64, 0x8000000000000001ULL, 64);
}
static void __init __constructor test_bitops(void)
diff --git a/xen/include/xen/bitops.h b/xen/include/xen/bitops.h
index 9f8d9eff11..d216fead17 100644
--- a/xen/include/xen/bitops.h
+++ b/xen/include/xen/bitops.h
@@ -60,6 +60,14 @@ static always_inline __pure unsigned int ffsl(unsigned long
x)
#endif
}
+static always_inline __pure unsigned int ffs64(uint64_t x)
+{
+ if ( BITS_PER_LONG == 64 )
+ return ffsl(x);
+ else
+ return !x || (uint32_t)x ? ffs(x) : ffs(x >> 32) + 32;
+}
+
static always_inline __pure unsigned int fls(unsigned int x)
{
if ( __builtin_constant_p(x) )
@@ -84,6 +92,18 @@ static always_inline __pure unsigned int flsl(unsigned long
x)
#endif
}
+static always_inline __pure unsigned int fls64(uint64_t x)
+{
+ if ( BITS_PER_LONG == 64 )
+ return flsl(x);
+ else
+ {
+ uint32_t h = x >> 32;
+
+ return h ? fls(h) + 32 : fls(x);
+ }
+}
+
/* --------------------- Please tidy below here --------------------- */
#ifndef find_next_bit
@@ -134,28 +154,6 @@ extern unsigned long find_first_zero_bit(const unsigned
long *addr,
unsigned long size);
#endif
-#if BITS_PER_LONG == 64
-# define fls64 flsl
-# define ffs64 ffsl
-#else
-# ifndef ffs64
-static inline int generic_ffs64(__u64 x)
-{
- return !x || (__u32)x ? ffs(x) : ffs(x >> 32) + 32;
-}
-# define ffs64 generic_ffs64
-# endif
-# ifndef fls64
-static inline int generic_fls64(__u64 x)
-{
- __u32 h = x >> 32;
-
- return h ? fls(h) + 32 : fls(x);
-}
-# define fls64 generic_fls64
-# endif
-#endif
-
static inline int get_bitmask_order(unsigned int count)
{
int order;
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |