From 1eec9694480eeeff3f139df5b0d91fed400b1814 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 21 Sep 2024 22:46:35 +0200 Subject: [PATCH] [util] Add 64-bit lzcnt --- src/util/util_bit.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/util/util_bit.h b/src/util/util_bit.h index 1df6c17fe..8f7b17dc6 100644 --- a/src/util/util_bit.h +++ b/src/util/util_bit.h @@ -152,6 +152,18 @@ namespace dxvk::bit { #endif } + inline uint32_t lzcnt(uint64_t n) { + #if defined(DXVK_ARCH_X86_64) && ((defined(_MSC_VER) && !defined(__clang__)) || defined(__LZCNT__)) + return _lzcnt_u64(n); + #elif defined(DXVK_ARCH_X86_64) && (defined(__GNUC__) || defined(__clang__)) + return n != 0 ? __builtin_clzll(n) : 64; + #else + uint32_t lo = uint32_t(n); + uint32_t hi = uint32_t(n >> 32u); + return hi ? lzcnt(hi) : lzcnt(lo) + 32u; + #endif + } + template uint32_t pack(T& dst, uint32_t& shift, T src, uint32_t count) { constexpr uint32_t Bits = 8 * sizeof(T);