|
4 | 4 | #include "internal/pystate.h" |
5 | 5 | #include "internal/hamt.h" |
6 | 6 |
|
7 | | -/* popcnt support in Visual Studio */ |
8 | | -#ifdef _MSC_VER |
9 | | -#include <intrin.h> |
10 | | -#endif |
11 | | - |
12 | 7 | /* |
13 | 8 | This file provides an implemention of an immutable mapping using the |
14 | 9 | Hash Array Mapped Trie (or HAMT) datastructure. |
@@ -440,18 +435,21 @@ hamt_bitpos(int32_t hash, uint32_t shift) |
440 | 435 | static inline uint32_t |
441 | 436 | hamt_bitcount(uint32_t i) |
442 | 437 | { |
443 | | -#if defined(__GNUC__) && (__GNUC__ > 4) |
444 | | - return (uint32_t)__builtin_popcountl(i); |
445 | | -#elif defined(__clang__) && (__clang_major__ > 3) |
446 | | - return (uint32_t)__builtin_popcountl(i); |
447 | | -#elif defined(_MSC_VER) |
448 | | - return (uint32_t)__popcnt(i); |
449 | | -#else |
450 | | - /* https://graphics.stanford.edu/~seander/bithacks.html */ |
| 438 | + /* We could use native popcount instruction but that would |
| 439 | + require to either add configure flags to enable SSE4.2 |
| 440 | + support or to detect it dynamically. Otherwise, we have |
| 441 | + a risk of CPython not working properly on older hardware. |
| 442 | +
|
| 443 | + In practice, there's no observable difference in |
| 444 | + performance between using a popcount instruction or the |
| 445 | + following fallback code. |
| 446 | +
|
| 447 | + The algorithm is copied from: |
| 448 | + https://graphics.stanford.edu/~seander/bithacks.html |
| 449 | + */ |
451 | 450 | i = i - ((i >> 1) & 0x55555555); |
452 | 451 | i = (i & 0x33333333) + ((i >> 2) & 0x33333333); |
453 | 452 | return ((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; |
454 | | -#endif |
455 | 453 | } |
456 | 454 |
|
457 | 455 | static inline uint32_t |
|
0 commit comments