mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
include system/countbits_impl
This commit is contained in:
@@ -491,7 +491,7 @@ func countSetBits*(x: SomeInteger): int {.inline.} =
|
||||
doAssert countSetBits(0b0000_0011'u8) == 2
|
||||
doAssert countSetBits(0b1010_1010'u8) == 4
|
||||
|
||||
result = countSetBitsImpl(x)
|
||||
result = countSetBitsSysimpl(x)
|
||||
|
||||
func popcount*(x: SomeInteger): int {.inline.} =
|
||||
## Alias for `countSetBits <#countSetBits,SomeInteger>`_ (Hamming weight).
|
||||
|
||||
@@ -58,7 +58,6 @@ import std/private/since
|
||||
# of the standard library!
|
||||
|
||||
import std/[bitops, fenv]
|
||||
import system/countbits_impl
|
||||
|
||||
when defined(nimPreviewSlimSystem):
|
||||
import std/assertions
|
||||
@@ -1302,7 +1301,7 @@ func gcd*[T](x, y: T): T =
|
||||
swap x, y
|
||||
abs x
|
||||
|
||||
when useBuiltins:
|
||||
when not defined(noIntrinsicsBitOpts):
|
||||
## this func uses bitwise comparisons from C compilers, which are not always available.
|
||||
func gcd*(x, y: SomeInteger): SomeInteger =
|
||||
## Computes the greatest common (positive) divisor of `x` and `y`,
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
const useBuiltins = not defined(noIntrinsicsBitOpts)
|
||||
const noUndefined = defined(noUndefinedBitOpts)
|
||||
const useGCC_builtins = (defined(gcc) or defined(llvm_gcc) or
|
||||
defined(clang)) and useBuiltins
|
||||
const useICC_builtins = defined(icc) and useBuiltins
|
||||
const useVCC_builtins = defined(vcc) and useBuiltins
|
||||
|
||||
template forwardImpl(impl, arg) {.dirty.} =
|
||||
when sizeof(x) <= 4:
|
||||
when x is SomeSignedInt:
|
||||
|
||||
@@ -2340,7 +2340,7 @@ when not defined(js):
|
||||
|
||||
|
||||
when notJSnotNims:
|
||||
import system/countbits_impl
|
||||
include system/countbits_impl
|
||||
include "system/sets"
|
||||
|
||||
when defined(gogc):
|
||||
|
||||
@@ -11,13 +11,7 @@
|
||||
|
||||
include std/private/bitops_utils
|
||||
|
||||
const useBuiltins* = not defined(noIntrinsicsBitOpts)
|
||||
const noUndefined* = defined(noUndefinedBitOpts)
|
||||
const useGCC_builtins* = (defined(gcc) or defined(llvm_gcc) or
|
||||
defined(clang)) and useBuiltins
|
||||
const useICC_builtins* = defined(icc) and useBuiltins
|
||||
const useVCC_builtins* = defined(vcc) and useBuiltins
|
||||
const arch64* = sizeof(int) == 8
|
||||
const arch64 = sizeof(int) == 8
|
||||
|
||||
template countBitsImpl(n: uint32): int =
|
||||
# generic formula is from: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
|
||||
@@ -60,7 +54,7 @@ elif useICC_builtins:
|
||||
importc: "_popcnt64", header: "<immintrin.h>".}
|
||||
|
||||
|
||||
func countSetBitsImpl*(x: SomeInteger): int {.inline.} =
|
||||
func countSetBitsImpl(x: SomeInteger): int {.inline.} =
|
||||
## Counts the set bits in an integer (also called `Hamming weight`:idx:).
|
||||
# TODO: figure out if ICC support _popcnt32/_popcnt64 on platform without POPCNT.
|
||||
# like GCC and MSVC
|
||||
@@ -85,3 +79,6 @@ func countSetBitsImpl*(x: SomeInteger): int {.inline.} =
|
||||
else:
|
||||
when sizeof(x) <= 4: result = countBitsImpl(x.uint32)
|
||||
else: result = countBitsImpl(x.uint64)
|
||||
|
||||
func countSetBitsSysimpl*(x: SomeInteger): int {.inline.} =
|
||||
result = countSetBitsImpl(x)
|
||||
|
||||
Reference in New Issue
Block a user