string.c (popcount): support when sizeof(int) == 4
authorYukihiro "Matz" Matsumoto <[email protected]>
Fri, 23 May 2025 14:10:45 +0000 (23 23:10 +0900)
committerYukihiro "Matz" Matsumoto <[email protected]>
Fri, 23 May 2025 14:10:45 +0000 (23 23:10 +0900)
This function is used when the compiler does not support builtin
popcount operation (namely VC++).

src/string.c

index df7363d..7837d2e 100644 (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