1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 13:54:16 +01:00

[util] Remove duplicate tzcnt function

This commit is contained in:
Philip Rebohle 2018-05-09 20:09:09 +02:00
parent 37456d583e
commit c7d2957d8f
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 24 additions and 33 deletions

View File

@ -1970,7 +1970,7 @@ namespace dxvk {
uint32_t bindingsSet = bindingMask;
while (bindingsSet != bindingsUsed) {
uint32_t binding = tzcnt(~bindingsSet);
uint32_t binding = bit::tzcnt(~bindingsSet);
buffers[binding] = m_device->dummyBufferHandle();
offsets[binding] = 0;

View File

@ -14,13 +14,29 @@ namespace dxvk::bit {
: 0;
}
template<typename T>
T tzcnt(T value) {
uint32_t result = 0;
while ((result < sizeof(T) * 8)
&& (((value >> result) & 1) == 0))
result += 1;
return result;
inline uint32_t tzcnt(uint32_t n) {
#if defined(__BMI__)
return __tzcnt_u32(n);
#elif defined(__GNUC__)
uint32_t res;
uint32_t tmp;
asm (
"xor %1, %1;"
"bsf %2, %0;"
"cmovz %1, %0;"
: "=&r" (res), "=&r" (tmp)
: "r" (n));
return res;
#else
uint32_t r = 31;
n &= -n;
r -= (n & 0x0000FFFF) ? 16 : 0;
r -= (n & 0x00FF00FF) ? 8 : 0;
r -= (n & 0x0F0F0F0F) ? 4 : 0;
r -= (n & 0x33333333) ? 2 : 0;
r -= (n & 0x55555555) ? 1 : 0;
return n != 0 ? r : 32;
#endif
}
}

View File

@ -18,29 +18,4 @@ namespace dxvk {
return (what + to - 1) & ~(to - 1);
}
inline uint32_t tzcnt(uint32_t n) {
#if defined(__BMI__)
return __tzcnt_u32(n);
#elif defined(__GNUC__)
uint32_t res;
uint32_t tmp;
asm (
"xor %1, %1;"
"bsf %2, %0;"
"cmovz %1, %0;"
: "=&r" (res), "=&r" (tmp)
: "r" (n));
return res;
#else
uint32_t r = 31;
n &= -n;
r -= (n & 0x0000FFFF) ? 16 : 0;
r -= (n & 0x00FF00FF) ? 8 : 0;
r -= (n & 0x0F0F0F0F) ? 4 : 0;
r -= (n & 0x33333333) ? 2 : 0;
r -= (n & 0x55555555) ? 1 : 0;
return n != 0 ? r : 32;
#endif
}
}