string.c (popcount): support when sizeof(int) == 4

This function is used when the compiler does not support builtin
popcount operation (namely VC++).
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-05-23 23:10:45 +09:00
parent ca526044d3
commit 0c51a72bfe
+2 -1
View File
@@ -407,12 +407,13 @@ mrb_utf8len(const char* p, const char* e)
# define popcount(x) __builtin_popcountl(x)
# endif
#else
#define POPC_SHIFT (8 * sizeof(bitint) - 8)
static inline uint32_t popcount(bitint x)
{
x = (x & (MASK01*0x55)) + ((x >> 1) & (MASK01*0x55));
x = (x & (MASK01*0x33)) + ((x >> 2) & (MASK01*0x33));
x = (x & (MASK01*0x0F)) + ((x >> 4) & (MASK01*0x0F));
return (x * MASK01) >> 56;
return (uint32_t)((x * MASK01) >> POPC_SHIFT);
}
#endif