|
@@ -336,7 +336,7 @@ namespace bx
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
template<>
|
|
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
|
|
#if BX_COMPILER_GCC || BX_COMPILER_CLANG
|
|
|
return __builtin_popcountll(_val);
|
|
return __builtin_popcountll(_val);
|
|
@@ -344,12 +344,18 @@ namespace bx
|
|
|
const uint32_t lo = uint32_t(_val&UINT32_MAX);
|
|
const uint32_t lo = uint32_t(_val&UINT32_MAX);
|
|
|
const uint32_t hi = uint32_t(_val>>32);
|
|
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_*
|
|
#endif // BX_COMPILER_*
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ template<>
|
|
|
|
|
+ inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(unsigned long _val)
|
|
|
|
|
+ {
|
|
|
|
|
+ return uint32_cntbits<unsigned long long>(_val);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint8_t _val) { return uint32_cntbits<uint32_t>(_val); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint8_t _val) { return uint32_cntbits<uint32_t>(_val); }
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(int8_t _val) { return uint32_cntbits<uint8_t >(_val); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(int8_t _val) { return uint32_cntbits<uint8_t >(_val); }
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint16_t _val) { return uint32_cntbits<uint32_t>(_val); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntbits(uint16_t _val) { return uint32_cntbits<uint32_t>(_val); }
|
|
@@ -381,7 +387,7 @@ namespace bx
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
template<>
|
|
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
|
|
#if BX_COMPILER_GCC || BX_COMPILER_CLANG
|
|
|
return 0 == _val ? 64 : __builtin_clzll(_val);
|
|
return 0 == _val ? 64 : __builtin_clzll(_val);
|
|
@@ -393,6 +399,12 @@ namespace bx
|
|
|
#endif // BX_COMPILER_*
|
|
#endif // BX_COMPILER_*
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ template<>
|
|
|
|
|
+ inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(unsigned long _val)
|
|
|
|
|
+ {
|
|
|
|
|
+ return uint32_cntlz<unsigned long long>(_val);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint8_t _val) { return uint32_cntlz<uint32_t>(_val)-24; }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint8_t _val) { return uint32_cntlz<uint32_t>(_val)-24; }
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(int8_t _val) { return uint32_cntlz<uint8_t >(_val); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(int8_t _val) { return uint32_cntlz<uint8_t >(_val); }
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint16_t _val) { return uint32_cntlz<uint32_t>(_val)-16; }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cntlz(uint16_t _val) { return uint32_cntlz<uint32_t>(_val)-16; }
|
|
@@ -416,7 +428,7 @@ namespace bx
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
template<>
|
|
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
|
|
#if BX_COMPILER_GCC || BX_COMPILER_CLANG
|
|
|
return 0 == _val ? 64 : __builtin_ctzll(_val);
|
|
return 0 == _val ? 64 : __builtin_ctzll(_val);
|
|
@@ -428,6 +440,12 @@ namespace bx
|
|
|
#endif // BX_COMPILER_*
|
|
#endif // BX_COMPILER_*
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ template<>
|
|
|
|
|
+ inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(unsigned long _val)
|
|
|
|
|
+ {
|
|
|
|
|
+ return uint32_cnttz<unsigned long long>(_val);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint8_t _val) { return bx::min(8u, uint32_cnttz<uint32_t>(_val) ); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint8_t _val) { return bx::min(8u, uint32_cnttz<uint32_t>(_val) ); }
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(int8_t _val) { return uint32_cnttz<uint8_t >(_val); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(int8_t _val) { return uint32_cnttz<uint8_t >(_val); }
|
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint16_t _val) { return bx::min(16u, uint32_cnttz<uint32_t>(_val) ); }
|
|
template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(uint16_t _val) { return bx::min(16u, uint32_cnttz<uint32_t>(_val) ); }
|