compat: Fix the fallback definition of stdc_trailing_zeros

While shifting "value" to left, we would iterate through all bits
of an unsigned long long, while we only expect to count through
"size * CHAR_BIT" bits; instead shift bits to the right and just
count the trailing zeros.

This fixes fate with MSVC.

Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
Martin Storsjö 2024-09-24 11:44:19 +03:00
parent e18b46d95f
commit b4d9fa6cb9
1 changed files with 7 additions and 4 deletions

View File

@ -178,11 +178,14 @@ static inline unsigned int stdc_trailing_zeros_uc(unsigned char value)
static inline unsigned int __stdc_trailing_zeros(unsigned long long value, static inline unsigned int __stdc_trailing_zeros(unsigned long long value,
unsigned int size) unsigned int size)
{ {
unsigned int zeros = size * CHAR_BIT; unsigned int zeros = 0;
while (value != 0) { if (!value)
value <<= 1; return size * CHAR_BIT;
zeros--;
while ((value & 1) == 0) {
value >>= 1;
zeros++;
} }
return zeros; return zeros;