diff --git a/format.h b/format.h index 7a71ddc1e6c5..47f77da2283f 100644 --- a/format.h +++ b/format.h @@ -56,15 +56,22 @@ inline uint32_t clz(uint32_t x) { return 31 - r; } # define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) -# ifdef _WIN64 -# pragma intrinsic(_BitScanReverse64) inline uint32_t clzll(uint64_t n) { unsigned long r = 0; +# ifdef _WIN64 +# pragma intrinsic(_BitScanReverse64) _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(n >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(n)); +# endif return 63 - r; } # define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) -# endif } } #endif