bit_util: Add fls_ functions; "find last set".

These simplify a lot of the bit_util module, which had grown bits and pieces of
this functionality across a variety of places over the years.

While we're here, kill off BIT_UTIL_INLINE and don't do reentrancy testing for
bit_util.
This commit is contained in:
David Goldblatt
2020-07-22 07:10:06 -07:00
committed by David Goldblatt
parent 1ed0288d9c
commit 22da836094
3 changed files with 292 additions and 133 deletions

View File

@@ -120,7 +120,6 @@ TEST_BEGIN(test_ffs_u) {
}
TEST_END
TEST_BEGIN(test_ffs_lu) {
TEST_FFS(unsigned long, lu, lu, "lu");
}
@@ -136,7 +135,6 @@ TEST_BEGIN(test_ffs_u32) {
}
TEST_END
TEST_BEGIN(test_ffs_u64) {
TEST_FFS(uint64_t, u64, u64, FMTu64);
}
@@ -147,9 +145,69 @@ TEST_BEGIN(test_ffs_zu) {
}
TEST_END
#define TEST_FLS(t, suf, test_suf, pri) do { \
for (unsigned i = 0; i < sizeof(t) * 8; i++) { \
for (unsigned j = 0; j <= i; j++) { \
for (unsigned k = 0; k <= j; k++) { \
t x = (t)1 << i; \
x |= (t)1 << j; \
x |= (t)1 << k; \
expect_##test_suf##_eq(fls_##suf(x), i, \
"Unexpected result, x=%"pri, x); \
} \
} \
} \
} while(0)
TEST_BEGIN(test_fls_u) {
TEST_FLS(unsigned, u, u,"u");
}
TEST_END
TEST_BEGIN(test_fls_lu) {
TEST_FLS(unsigned long, lu, lu, "lu");
}
TEST_END
TEST_BEGIN(test_fls_llu) {
TEST_FLS(unsigned long long, llu, qd, "llu");
}
TEST_END
TEST_BEGIN(test_fls_u32) {
TEST_FLS(uint32_t, u32, u32, FMTu32);
}
TEST_END
TEST_BEGIN(test_fls_u64) {
TEST_FLS(uint64_t, u64, u64, FMTu64);
}
TEST_END
TEST_BEGIN(test_fls_zu) {
TEST_FLS(size_t, zu, zu, "zu");
}
TEST_END
TEST_BEGIN(test_fls_u_slow) {
TEST_FLS(unsigned, u_slow, u,"u");
}
TEST_END
TEST_BEGIN(test_fls_lu_slow) {
TEST_FLS(unsigned long, lu_slow, lu, "lu");
}
TEST_END
TEST_BEGIN(test_fls_llu_slow) {
TEST_FLS(unsigned long long, llu_slow, qd, "llu");
}
TEST_END
int
main(void) {
return test(
return test_no_reentrancy(
test_pow2_ceil_u64,
test_pow2_ceil_u32,
test_pow2_ceil_zu,
@@ -159,5 +217,14 @@ main(void) {
test_ffs_llu,
test_ffs_u32,
test_ffs_u64,
test_ffs_zu);
test_ffs_zu,
test_fls_u,
test_fls_lu,
test_fls_llu,
test_fls_u32,
test_fls_u64,
test_fls_zu,
test_fls_u_slow,
test_fls_lu_slow,
test_fls_llu_slow);
}