From dcd75a4f09839e727598e5001bed4330e3e55500 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 9 May 2019 16:37:45 +0200 Subject: [PATCH] [util] Optimize popcnt operation --- src/util/util_bit.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/util/util_bit.h b/src/util/util_bit.h index 9d9cdfc3..7a6fe347 100644 --- a/src/util/util_bit.h +++ b/src/util/util_bit.h @@ -14,12 +14,18 @@ namespace dxvk::bit { T extract(T value, uint32_t fst, uint32_t lst) { return (value >> fst) & ~(~T(0) << (lst - fst + 1)); } + + inline uint32_t popcntStep(uint32_t n, uint32_t mask, uint32_t shift) { + return (n & mask) + ((n & ~mask) >> shift); + } - template - T popcnt(T value) { - return value != 0 - ? (value & 1) + popcnt(value >> 1) - : 0; + inline uint32_t popcnt(uint32_t n) { + n = popcntStep(n, 0x55555555, 1); + n = popcntStep(n, 0x33333333, 2); + n = popcntStep(n, 0x0F0F0F0F, 4); + n = popcntStep(n, 0x00FF00FF, 8); + n = popcntStep(n, 0x0000FFFF, 16); + return n; } inline uint32_t tzcnt(uint32_t n) {