cntlz fix

This commit is contained in:
Nekotekina 2015-01-13 00:32:53 +03:00
parent 7372583cab
commit 25672cdc47

View File

@ -289,9 +289,7 @@ static __forceinline uint64_t InterlockedXor(volatile uint64_t* dest, uint64_t v
static __forceinline uint32_t cntlz32(uint32_t arg) static __forceinline uint32_t cntlz32(uint32_t arg)
{ {
#if defined(__GNUG__) #if defined(_MSC_VER)
return __builtin_clzl(arg);
#else
unsigned long res; unsigned long res;
if (!_BitScanReverse(&res, arg)) if (!_BitScanReverse(&res, arg))
{ {
@ -301,14 +299,21 @@ static __forceinline uint32_t cntlz32(uint32_t arg)
{ {
return res ^ 31; return res ^ 31;
} }
#else
if (arg)
{
return __builtin_clzll((uint64_t)arg) - 32;
}
else
{
return 32;
}
#endif #endif
} }
static __forceinline uint64_t cntlz64(uint64_t arg) static __forceinline uint64_t cntlz64(uint64_t arg)
{ {
#if defined(__GNUG__) #if defined(_MSC_VER)
return __builtin_clzll(arg);
#else
unsigned long res; unsigned long res;
if (!_BitScanReverse64(&res, arg)) if (!_BitScanReverse64(&res, arg))
{ {
@ -318,6 +323,15 @@ static __forceinline uint64_t cntlz64(uint64_t arg)
{ {
return res ^ 63; return res ^ 63;
} }
#else
if (arg)
{
return __builtin_clzll(arg);
}
else
{
return 64;
}
#endif #endif
} }