From e930ad8fa183310e0afb4a47df646e9cc9796c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 30 May 2018 12:58:47 -0700 Subject: [PATCH] Added testpow2 test, and use improved version. Issue #184. --- include/bx/inline/uint32_t.inl | 10 ++++------ tests/uint32_test.cpp | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/bx/inline/uint32_t.inl b/include/bx/inline/uint32_t.inl index 8b85bbe..a707521 100644 --- a/include/bx/inline/uint32_t.inl +++ b/include/bx/inline/uint32_t.inl @@ -453,12 +453,10 @@ namespace bx inline uint32_t uint32_testpow2(uint32_t _a) { - const uint32_t tmp0 = uint32_not(_a); - const uint32_t tmp1 = uint32_inc(tmp0); - const uint32_t tmp2 = uint32_and(_a, tmp1); - const uint32_t tmp3 = uint32_cmpeq(tmp2, _a); - const uint32_t tmp4 = uint32_cmpneq(_a, 0); - const uint32_t result = uint32_and(tmp3, tmp4); + const uint32_t tmp0 = uint32_dec(_a); + const uint32_t tmp1 = uint32_xor(_a, tmp0); + const uint32_t tmp2 = uint32_srl(tmp1, 1); + const uint32_t result = uint32_cmpeq(tmp2, tmp0); return result; } diff --git a/tests/uint32_test.cpp b/tests/uint32_test.cpp index ee0e53b..07c7213 100644 --- a/tests/uint32_test.cpp +++ b/tests/uint32_test.cpp @@ -69,3 +69,17 @@ TEST_CASE("halfTo/FromFloat", "") REQUIRE(orig == hff); } } + +TEST_CASE("uint32_testpow2", "") +{ + uint32_t shift = 0; + + for (uint32_t ii = 0; ii < UINT32_MAX; ++ii) + { + if (bx::uint32_testpow2(ii) ) + { + REQUIRE(ii == 1 << shift); + ++shift; + } + } +}