This commit is contained in:
Бранимир Караџић
2023-11-18 14:43:35 -08:00
parent 4c87a58af0
commit fe540e7657
3 changed files with 32 additions and 28 deletions

View File

@@ -544,32 +544,6 @@ namespace bx
return result;
}
inline BX_CONSTEXPR_FUNC uint32_t uint64_cntbits(uint64_t _val)
{
const uint32_t lo = uint32_t(_val&UINT32_MAX);
const uint32_t hi = uint32_t(_val>>32);
const uint32_t total = bx::uint32_cntbits(lo)
+ bx::uint32_cntbits(hi);
return total;
}
inline BX_CONSTEXPR_FUNC uint32_t uint64_cntlz(uint64_t _val)
{
return _val & UINT64_C(0xffffffff00000000)
? uint32_cntlz(uint32_t(_val>>32) )
: uint32_cntlz(uint32_t(_val) ) + 32
;
}
inline BX_CONSTEXPR_FUNC uint32_t uint64_cnttz(uint64_t _val)
{
return _val & UINT64_C(0xffffffff)
? uint32_cnttz(uint32_t(_val) )
: uint32_cnttz(uint32_t(_val>>32) ) + 32
;
}
inline BX_CONSTEXPR_FUNC uint64_t uint64_li(uint64_t _a)
{
return _a;
@@ -670,6 +644,21 @@ namespace bx
return _a * _b;
}
inline BX_CONSTEXPR_FUNC uint32_t uint64_cntbits(uint64_t _val)
{
return uint32_cntbits(_val);
}
inline BX_CONSTEXPR_FUNC uint32_t uint64_cntlz(uint64_t _val)
{
return uint32_cntlz(_val);
}
inline BX_CONSTEXPR_FUNC uint32_t uint64_cnttz(uint64_t _val)
{
return uint32_cnttz(_val);
}
inline BX_CONSTEXPR_FUNC uint32_t uint32_gcd(uint32_t _a, uint32_t _b)
{
do

View File

@@ -239,6 +239,15 @@ namespace bx
///
BX_CONSTEXPR_FUNC uint64_t uint64_mul(uint64_t _a, uint64_t _b);
///
BX_CONSTEXPR_FUNC uint32_t uint64_cntbits(uint64_t _val);
///
BX_CONSTEXPR_FUNC uint32_t uint64_cntlz(uint64_t _val);
///
BX_CONSTEXPR_FUNC uint32_t uint64_cnttz(uint64_t _val);
/// Greatest common divisor.
///
BX_CONSTEXPR_FUNC uint32_t uint32_gcd(uint32_t _a, uint32_t _b);

View File

@@ -124,16 +124,22 @@ TEST_CASE("halfTo/FromFloat", "[uint32_t]")
}
}
TEST_CASE("uint32_testpow2")
TEST_CASE("uint32_testpow2", "[uint32_t]")
{
uint32_t shift = 0;
uint32_t nextpow2 = bx::uint32_nextpow2(1);
for (uint32_t ii = 0; ii < UINT32_MAX; ++ii)
for (uint32_t ii = 1; ii < 1<<24; ++ii)
{
REQUIRE(nextpow2 == bx::uint32_nextpow2(ii) );
if (bx::uint32_testpow2(ii) )
{
REQUIRE(ii == 1u << shift);
++shift;
REQUIRE(ii == nextpow2);
nextpow2 = bx::uint32_nextpow2(ii+1);
}
}
}