mirror of https://github.com/F-Stack/f-stack.git
137 lines
2.2 KiB
C
137 lines
2.2 KiB
C
|
/* SPDX-License-Identifier: BSD-3-Clause
|
||
|
* Copyright (C) 2023 Microsoft Corporation
|
||
|
*/
|
||
|
|
||
|
#include <limits.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include <rte_bitops.h>
|
||
|
#include <rte_debug.h>
|
||
|
|
||
|
#include "test.h"
|
||
|
|
||
|
RTE_LOG_REGISTER(bitcount_logtype_test, test.bitcount, INFO);
|
||
|
|
||
|
static int
|
||
|
test_clz32(void)
|
||
|
{
|
||
|
size_t leading;
|
||
|
uint32_t v = 0xffffffff;
|
||
|
|
||
|
for (leading = 0; v; leading++) {
|
||
|
RTE_TEST_ASSERT(rte_clz32(v) == leading,
|
||
|
"Unexpected count.");
|
||
|
v >>= 1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
test_clz64(void)
|
||
|
{
|
||
|
size_t leading;
|
||
|
uint64_t v = 0xffffffffffffffff;
|
||
|
|
||
|
for (leading = 0; v; leading++) {
|
||
|
RTE_TEST_ASSERT(rte_clz64(v) == leading,
|
||
|
"Unexpected count.");
|
||
|
v >>= 1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
test_ctz32(void)
|
||
|
{
|
||
|
size_t trailing;
|
||
|
uint32_t v = 1;
|
||
|
|
||
|
for (trailing = 0; v; trailing++) {
|
||
|
RTE_TEST_ASSERT(rte_ctz32(v) == trailing,
|
||
|
"Unexpected count.");
|
||
|
v <<= 1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
test_ctz64(void)
|
||
|
{
|
||
|
size_t trailing;
|
||
|
uint64_t v = 1;
|
||
|
|
||
|
for (trailing = 0; v; trailing++) {
|
||
|
RTE_TEST_ASSERT(rte_ctz64(v) == trailing,
|
||
|
"Unexpected count.");
|
||
|
v <<= 1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
test_popcount32(void)
|
||
|
{
|
||
|
size_t shift;
|
||
|
uint32_t v = 0;
|
||
|
const size_t bits = sizeof(v) * CHAR_BIT;
|
||
|
|
||
|
for (shift = 0; shift < bits; shift++) {
|
||
|
RTE_TEST_ASSERT(rte_popcount32(v) == shift,
|
||
|
"Unexpected count.");
|
||
|
v <<= 1;
|
||
|
v |= 1;
|
||
|
}
|
||
|
|
||
|
RTE_TEST_ASSERT(rte_popcount32(v) == bits,
|
||
|
"Unexpected count.");
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
test_popcount64(void)
|
||
|
{
|
||
|
size_t shift;
|
||
|
uint64_t v = 0;
|
||
|
const size_t bits = sizeof(v) * CHAR_BIT;
|
||
|
|
||
|
for (shift = 0; shift < bits; shift++) {
|
||
|
RTE_TEST_ASSERT(rte_popcount64(v) == shift,
|
||
|
"Unexpected count.");
|
||
|
v <<= 1;
|
||
|
v |= 1;
|
||
|
}
|
||
|
|
||
|
RTE_TEST_ASSERT(rte_popcount64(v) == bits,
|
||
|
"Unexpected count.");
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static struct unit_test_suite bitcount_test_suite = {
|
||
|
.suite_name = "bitcount autotest",
|
||
|
.setup = NULL,
|
||
|
.teardown = NULL,
|
||
|
.unit_test_cases = {
|
||
|
TEST_CASE(test_clz32),
|
||
|
TEST_CASE(test_clz64),
|
||
|
TEST_CASE(test_ctz32),
|
||
|
TEST_CASE(test_ctz64),
|
||
|
TEST_CASE(test_popcount32),
|
||
|
TEST_CASE(test_popcount64),
|
||
|
TEST_CASES_END()
|
||
|
}
|
||
|
};
|
||
|
|
||
|
static int
|
||
|
test_bitcount(void)
|
||
|
{
|
||
|
return unit_test_suite_runner(&bitcount_test_suite);
|
||
|
}
|
||
|
|
||
|
REGISTER_FAST_TEST(bitcount_autotest, true, true, test_bitcount);
|