aboutsummaryrefslogtreecommitdiffstats
path: root/internal
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-09-19 11:07:20 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-10-05 20:03:54 +0900
commit54f1d398d9a8e91d64aaa739c666292f3ff3f867 (patch)
tree983da4c64365b644d55a26ecea95a6a2274a5328 /internal
parentf087f2c74c99ec5fed04896d3dc91ff76c2b16b8 (diff)
downloadruby-54f1d398d9a8e91d64aaa739c666292f3ff3f867.tar.gz
Make popcount bit-masks stricter
Each bit run is upto the right shift count, so the each mask does not need more upper bits.
Diffstat (limited to 'internal')
-rw-r--r--internal/bits.h12
1 files changed, 6 insertions, 6 deletions
diff --git a/internal/bits.h b/internal/bits.h
index 538e6c11ae..1fe98fa430 100644
--- a/internal/bits.h
+++ b/internal/bits.h
@@ -398,9 +398,9 @@ rb_popcount32(uint32_t x)
#else
x = (x & 0x55555555) + (x >> 1 & 0x55555555);
x = (x & 0x33333333) + (x >> 2 & 0x33333333);
- x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
- x = (x & 0x001f001f) + (x >> 8 & 0x001f001f);
- x = (x & 0x0000003f) + (x >>16 & 0x0000003f);
+ x = (x & 0x07070707) + (x >> 4 & 0x07070707);
+ x = (x & 0x000f000f) + (x >> 8 & 0x000f000f);
+ x = (x & 0x0000001f) + (x >>16 & 0x0000001f);
return (unsigned int)x;
#endif
@@ -428,9 +428,9 @@ rb_popcount64(uint64_t x)
x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
x = (x & 0x0707070707070707) + (x >> 4 & 0x0707070707070707);
- x = (x & 0x001f001f001f001f) + (x >> 8 & 0x001f001f001f001f);
- x = (x & 0x0000003f0000003f) + (x >>16 & 0x0000003f0000003f);
- x = (x & 0x000000000000007f) + (x >>32 & 0x000000000000007f);
+ x = (x & 0x000f000f000f000f) + (x >> 8 & 0x000f000f000f000f);
+ x = (x & 0x0000001f0000001f) + (x >>16 & 0x0000001f0000001f);
+ x = (x & 0x000000000000003f) + (x >>32 & 0x000000000000003f);
return (unsigned int)x;
#endif