mirror of
https://github.com/bkaradzic/bx.git
synced 2026-02-17 20:52:37 +01:00
Implemented 64-bit reference cntlz/cnttz.
This commit is contained in:
@@ -35,9 +35,11 @@
|
||||
// must be included before intrin.h.
|
||||
# include <intrin.h>
|
||||
# pragma intrinsic(_BitScanForward)
|
||||
# pragma intrinsic(_BitScanForward64)
|
||||
# pragma intrinsic(_BitScanReverse)
|
||||
# pragma intrinsic(_BitScanReverse64)
|
||||
# if BX_ARCH_64BIT
|
||||
# pragma intrinsic(_BitScanForward64)
|
||||
# pragma intrinsic(_BitScanReverse64)
|
||||
# endif // BX_ARCH_64BIT
|
||||
# endif // BX_PLATFORM_WINDOWS
|
||||
#endif // BX_COMPILER_MSVC
|
||||
|
||||
@@ -580,30 +582,46 @@ namespace bx
|
||||
return _a < _b ? _b : _a;
|
||||
}
|
||||
|
||||
inline uint64_t uint64_cntlz_ref(uint64_t _val)
|
||||
{
|
||||
return _val & UINT64_C(0xffffffff00000000)
|
||||
? uint32_cntlz(uint32_t(_val>>32) ) + 32
|
||||
: uint32_cntlz(uint32_t(_val) )
|
||||
;
|
||||
}
|
||||
|
||||
/// Count number of leading zeros.
|
||||
inline uint64_t uint64_cntlz(uint64_t _val)
|
||||
{
|
||||
#if BX_COMPILER_GCC
|
||||
return __builtin_clz(_val);
|
||||
#elif BX_COMPILER_MSVC && BX_PLATFORM_WINDOWS
|
||||
#elif BX_COMPILER_MSVC && BX_PLATFORM_WINDOWS && BX_ARCH_64BIT
|
||||
unsigned long index;
|
||||
_BitScanReverse64(&index, _val);
|
||||
return 63 - index;
|
||||
#else
|
||||
return uint32_cntlz_ref(_val);
|
||||
return uint64_cntlz_ref(_val);
|
||||
#endif // BX_COMPILER_
|
||||
}
|
||||
|
||||
inline uint64_t uint64_cnttz_ref(uint64_t _val)
|
||||
{
|
||||
return _val & UINT64_C(0xffffffff)
|
||||
? uint32_cnttz(uint32_t(_val) )
|
||||
: uint32_cnttz(uint32_t(_val>>32) ) + 32
|
||||
;
|
||||
}
|
||||
|
||||
inline uint64_t uint64_cnttz(uint64_t _val)
|
||||
{
|
||||
#if BX_COMPILER_GCC
|
||||
return __builtin_ctz(_val);
|
||||
#elif BX_COMPILER_MSVC && BX_PLATFORM_WINDOWS
|
||||
#elif BX_COMPILER_MSVC && BX_PLATFORM_WINDOWS && BX_ARCH_64BIT
|
||||
unsigned long index;
|
||||
_BitScanForward64(&index, _val);
|
||||
return index;
|
||||
#else
|
||||
# error "not implemented" // return uint64_cnttz_ref(_val);
|
||||
return uint64_cnttz_ref(_val);
|
||||
#endif // BX_COMPILER_
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user