[backport] fix #12395 (#12590)

'countBits32' is now fixed in the same way that
'countBits64' was already patched earlier (by adding 'u32
where needed).
This commit is contained in:
Miran 2019-11-04 15:02:36 +01:00 • committed by GitHub
commit ae32d637f7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -17,9 +17,9 @@ type
proc countBits32(n: uint32): int {.compilerproc.} = proc countBits32(n: uint32): int {.compilerproc.} =
# generic formula is from: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel # generic formula is from: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
var v = uint32(n) var v = uint32(n)
v = v - ((v shr 1) and 0x55555555) v = v - ((v shr 1'u32) and 0x55555555'u32)
v = (v and 0x33333333) + ((v shr 2) and 0x33333333) v = (v and 0x33333333'u32) + ((v shr 2'u32) and 0x33333333'u32)
result = (((v + (v shr 4) and 0xF0F0F0F) * 0x1010101) shr 24).int result = (((v + (v shr 4'u32) and 0xF0F0F0F'u32) * 0x1010101) shr 24'u32).int
proc countBits64(n: uint64): int {.compilerproc, inline.} = proc countBits64(n: uint64): int {.compilerproc, inline.} =
# generic formula is from: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel # generic formula is from: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel