| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- //go:build !go1.9 && amd64 && !appengine
- // +build !go1.9,amd64,!appengine
- package bitset
- // *** the following functions are defined in popcnt_amd64.s
- //go:noescape
- func hasAsm() bool
- // useAsm is a flag used to select the GO or ASM implementation of the popcnt function
- var useAsm = hasAsm()
- //go:noescape
- func popcntSliceAsm(s []uint64) uint64
- //go:noescape
- func popcntMaskSliceAsm(s, m []uint64) uint64
- //go:noescape
- func popcntAndSliceAsm(s, m []uint64) uint64
- //go:noescape
- func popcntOrSliceAsm(s, m []uint64) uint64
- //go:noescape
- func popcntXorSliceAsm(s, m []uint64) uint64
- func popcntSlice(s []uint64) uint64 {
- if useAsm {
- return popcntSliceAsm(s)
- }
- return popcntSliceGo(s)
- }
- func popcntMaskSlice(s, m []uint64) uint64 {
- if useAsm {
- return popcntMaskSliceAsm(s, m)
- }
- return popcntMaskSliceGo(s, m)
- }
- func popcntAndSlice(s, m []uint64) uint64 {
- if useAsm {
- return popcntAndSliceAsm(s, m)
- }
- return popcntAndSliceGo(s, m)
- }
- func popcntOrSlice(s, m []uint64) uint64 {
- if useAsm {
- return popcntOrSliceAsm(s, m)
- }
- return popcntOrSliceGo(s, m)
- }
- func popcntXorSlice(s, m []uint64) uint64 {
- if useAsm {
- return popcntXorSliceAsm(s, m)
- }
- return popcntXorSliceGo(s, m)
- }
|