From 000d864cac218c7724ab70d70dbf4ba0d4e03604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 15 Oct 2022 07:44:54 -0700 Subject: [PATCH] Fixed cnt* overloads when uint64_t and size_t are not the same type. --- include/bx/inline/uint32_t.inl | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/include/bx/inline/uint32_t.inl b/include/bx/inline/uint32_t.inl index f2a6bc1..5cd3c21 100644 --- a/include/bx/inline/uint32_t.inl +++ b/include/bx/inline/uint32_t.inl @@ -336,7 +336,7 @@ namespace bx } template<> - inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint64_t _val) + inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(unsigned long long _val) { #if BX_COMPILER_GCC || BX_COMPILER_CLANG return __builtin_popcountll(_val); @@ -344,12 +344,18 @@ namespace bx const uint32_t lo = uint32_t(_val&UINT32_MAX); const uint32_t hi = uint32_t(_val>>32); - const uint32_t total = uint32_cntbits(lo) - + uint32_cntbits(hi); - return total; + return uint32_cntbits(lo) + + uint32_cntbits(hi) + ; #endif // BX_COMPILER_* } + template<> + inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(unsigned long _val) + { + return uint32_cntbits(_val); + } + template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint8_t _val) { return uint32_cntbits(_val); } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(int8_t _val) { return uint32_cntbits(_val); } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint16_t _val) { return uint32_cntbits(_val); } @@ -381,7 +387,7 @@ namespace bx } template<> - inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint64_t _val) + inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(unsigned long long _val) { #if BX_COMPILER_GCC || BX_COMPILER_CLANG return 0 == _val ? 64 : __builtin_clzll(_val); @@ -393,6 +399,12 @@ namespace bx #endif // BX_COMPILER_* } + template<> + inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(unsigned long _val) + { + return uint32_cntlz(_val); + } + template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint8_t _val) { return uint32_cntlz(_val)-24; } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(int8_t _val) { return uint32_cntlz(_val); } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint16_t _val) { return uint32_cntlz(_val)-16; } @@ -416,7 +428,7 @@ namespace bx } template<> - inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint64_t _val) + inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(unsigned long long _val) { #if BX_COMPILER_GCC || BX_COMPILER_CLANG return 0 == _val ? 64 : __builtin_ctzll(_val); @@ -428,6 +440,12 @@ namespace bx #endif // BX_COMPILER_* } + template<> + inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(unsigned long _val) + { + return uint32_cnttz(_val); + } + template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint8_t _val) { return bx::min(8u, uint32_cnttz(_val) ); } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(int8_t _val) { return uint32_cnttz(_val); } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint16_t _val) { return bx::min(16u, uint32_cnttz(_val) ); }