3 // Copyright 2018 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
11 // ----------------------- //
12 // bits.LeadingZeros //
13 // ----------------------- //
15 func LeadingZeros(n uint) int {
18 // arm:"CLZ" arm64:"CLZ"
20 return bits.LeadingZeros(n)
23 func LeadingZeros64(n uint64) int {
26 // arm:"CLZ" arm64:"CLZ"
28 return bits.LeadingZeros64(n)
31 func LeadingZeros32(n uint32) int {
32 // amd64:"BSRQ","LEAQ",-"CMOVQEQ"
34 // arm:"CLZ" arm64:"CLZ"
36 return bits.LeadingZeros32(n)
39 func LeadingZeros16(n uint16) int {
40 // amd64:"BSRL","LEAL",-"CMOVQEQ"
42 // arm:"CLZ" arm64:"CLZ"
44 return bits.LeadingZeros16(n)
47 func LeadingZeros8(n uint8) int {
48 // amd64:"BSRL","LEAL",-"CMOVQEQ"
50 // arm:"CLZ" arm64:"CLZ"
52 return bits.LeadingZeros8(n)
59 func Len(n uint) int {
62 // arm:"CLZ" arm64:"CLZ"
67 func Len64(n uint64) int {
70 // arm:"CLZ" arm64:"CLZ"
75 func Len32(n uint32) int {
76 // amd64:"BSRQ","LEAQ",-"CMOVQEQ"
78 // arm:"CLZ" arm64:"CLZ"
83 func Len16(n uint16) int {
84 // amd64:"BSRL","LEAL",-"CMOVQEQ"
86 // arm:"CLZ" arm64:"CLZ"
91 func Len8(n uint8) int {
92 // amd64:"BSRL","LEAL",-"CMOVQEQ"
94 // arm:"CLZ" arm64:"CLZ"
99 // -------------------- //
101 // -------------------- //
103 func OnesCount(n uint) int {
104 // amd64:"POPCNTQ",".*support_popcnt"
105 // arm64:"VCNT","VUADDLV"
107 return bits.OnesCount(n)
110 func OnesCount64(n uint64) int {
111 // amd64:"POPCNTQ",".*support_popcnt"
112 // arm64:"VCNT","VUADDLV"
114 return bits.OnesCount64(n)
117 func OnesCount32(n uint32) int {
118 // amd64:"POPCNTL",".*support_popcnt"
119 // arm64:"VCNT","VUADDLV"
121 return bits.OnesCount32(n)
124 func OnesCount16(n uint16) int {
125 // amd64:"POPCNTL",".*support_popcnt"
126 // arm64:"VCNT","VUADDLV"
128 return bits.OnesCount16(n)
131 func OnesCount8(n uint8) int {
133 return bits.OnesCount8(n)
136 // ----------------------- //
137 // bits.ReverseBytes //
138 // ----------------------- //
140 func ReverseBytes(n uint) uint {
144 return bits.ReverseBytes(n)
147 func ReverseBytes64(n uint64) uint64 {
151 return bits.ReverseBytes64(n)
154 func ReverseBytes32(n uint32) uint32 {
158 return bits.ReverseBytes32(n)
161 func ReverseBytes16(n uint16) uint16 {
163 return bits.ReverseBytes16(n)
166 // --------------------- //
167 // bits.RotateLeft //
168 // --------------------- //
170 func RotateLeft64(n uint64) uint64 {
175 return bits.RotateLeft64(n, 37)
178 func RotateLeft32(n uint32) uint32 {
179 // amd64:"ROLL" 386:"ROLL"
183 return bits.RotateLeft32(n, 9)
186 func RotateLeft16(n uint16) uint16 {
187 // amd64:"ROLW" 386:"ROLW"
188 return bits.RotateLeft16(n, 5)
191 func RotateLeft8(n uint8) uint8 {
192 // amd64:"ROLB" 386:"ROLB"
193 return bits.RotateLeft8(n, 5)
196 func RotateLeftVariable(n uint, m int) uint {
201 return bits.RotateLeft(n, m)
204 func RotateLeftVariable64(n uint64, m int) uint64 {
209 return bits.RotateLeft64(n, m)
212 func RotateLeftVariable32(n uint32, m int) uint32 {
217 return bits.RotateLeft32(n, m)
220 // ------------------------ //
221 // bits.TrailingZeros //
222 // ------------------------ //
224 func TrailingZeros(n uint) int {
225 // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ"
227 return bits.TrailingZeros(n)
230 func TrailingZeros64(n uint64) int {
231 // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ"
233 return bits.TrailingZeros64(n)
236 func TrailingZeros32(n uint32) int {
237 // amd64:"BTSQ\\t\\$32","BSFQ"
238 // s390x:"FLOGR","MOVWZ"
239 return bits.TrailingZeros32(n)
242 func TrailingZeros16(n uint16) int {
243 // amd64:"BSFL","BTSL\\t\\$16"
244 // s390x:"FLOGR","OR\t\\$65536"
245 return bits.TrailingZeros16(n)
248 func TrailingZeros8(n uint8) int {
249 // amd64:"BSFL","BTSL\\t\\$8"
250 // s390x:"FLOGR","OR\t\\$256"
251 return bits.TrailingZeros8(n)
254 // IterateBitsNN checks special handling of TrailingZerosNN when the input is known to be non-zero.
256 func IterateBits(n uint) int {
259 // amd64:"BSFQ",-"CMOVEQ"
260 i += bits.TrailingZeros(n)
266 func IterateBits64(n uint64) int {
269 // amd64:"BSFQ",-"CMOVEQ"
270 i += bits.TrailingZeros64(n)
276 func IterateBits32(n uint32) int {
279 // amd64:"BSFL",-"BTSQ"
280 i += bits.TrailingZeros32(n)
286 func IterateBits16(n uint16) int {
289 // amd64:"BSFL",-"BTSL"
290 i += bits.TrailingZeros16(n)
296 func IterateBits8(n uint8) int {
299 // amd64:"BSFL",-"BTSL"
300 i += bits.TrailingZeros8(n)