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:"CLZW"
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",".*x86HasPOPCNT"
105 // arm64:"VCNT","VUADDLV"
109 return bits.OnesCount(n)
112 func OnesCount64(n uint64) int {
113 // amd64:"POPCNTQ",".*x86HasPOPCNT"
114 // arm64:"VCNT","VUADDLV"
118 return bits.OnesCount64(n)
121 func OnesCount32(n uint32) int {
122 // amd64:"POPCNTL",".*x86HasPOPCNT"
123 // arm64:"VCNT","VUADDLV"
127 return bits.OnesCount32(n)
130 func OnesCount16(n uint16) int {
131 // amd64:"POPCNTL",".*x86HasPOPCNT"
132 // arm64:"VCNT","VUADDLV"
136 return bits.OnesCount16(n)
139 func OnesCount8(n uint8) int {
143 return bits.OnesCount8(n)
146 // ----------------------- //
147 // bits.ReverseBytes //
148 // ----------------------- //
150 func ReverseBytes(n uint) uint {
154 return bits.ReverseBytes(n)
157 func ReverseBytes64(n uint64) uint64 {
161 return bits.ReverseBytes64(n)
164 func ReverseBytes32(n uint32) uint32 {
168 return bits.ReverseBytes32(n)
171 func ReverseBytes16(n uint16) uint16 {
173 // arm64:"REV16W",-"UBFX",-"ORR"
174 return bits.ReverseBytes16(n)
177 // --------------------- //
178 // bits.RotateLeft //
179 // --------------------- //
181 func RotateLeft64(n uint64) uint64 {
187 return bits.RotateLeft64(n, 37)
190 func RotateLeft32(n uint32) uint32 {
191 // amd64:"ROLL" 386:"ROLL"
196 return bits.RotateLeft32(n, 9)
199 func RotateLeft16(n uint16) uint16 {
200 // amd64:"ROLW" 386:"ROLW"
201 return bits.RotateLeft16(n, 5)
204 func RotateLeft8(n uint8) uint8 {
205 // amd64:"ROLB" 386:"ROLB"
206 return bits.RotateLeft8(n, 5)
209 func RotateLeftVariable(n uint, m int) uint {
215 return bits.RotateLeft(n, m)
218 func RotateLeftVariable64(n uint64, m int) uint64 {
224 return bits.RotateLeft64(n, m)
227 func RotateLeftVariable32(n uint32, m int) uint32 {
233 return bits.RotateLeft32(n, m)
236 // ------------------------ //
237 // bits.TrailingZeros //
238 // ------------------------ //
240 func TrailingZeros(n uint) int {
241 // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ"
243 // ppc64:"ANDN","POPCNTD"
244 // ppc64le:"ANDN","POPCNTD"
245 return bits.TrailingZeros(n)
248 func TrailingZeros64(n uint64) int {
249 // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ"
251 // ppc64:"ANDN","POPCNTD"
252 // ppc64le:"ANDN","POPCNTD"
253 return bits.TrailingZeros64(n)
256 func TrailingZeros32(n uint32) int {
257 // amd64:"BTSQ\\t\\$32","BSFQ"
258 // s390x:"FLOGR","MOVWZ"
259 // ppc64:"ANDN","POPCNTW"
260 // ppc64le:"ANDN","POPCNTW"
261 return bits.TrailingZeros32(n)
264 func TrailingZeros16(n uint16) int {
265 // amd64:"BSFL","BTSL\\t\\$16"
266 // s390x:"FLOGR","OR\t\\$65536"
267 // ppc64:"POPCNTD","OR\\t\\$65536"
268 // ppc64le:"POPCNTD","OR\\t\\$65536"
269 return bits.TrailingZeros16(n)
272 func TrailingZeros8(n uint8) int {
273 // amd64:"BSFL","BTSL\\t\\$8"
274 // s390x:"FLOGR","OR\t\\$256"
275 return bits.TrailingZeros8(n)
278 // IterateBitsNN checks special handling of TrailingZerosNN when the input is known to be non-zero.
280 func IterateBits(n uint) int {
283 // amd64:"BSFQ",-"CMOVEQ"
284 i += bits.TrailingZeros(n)
290 func IterateBits64(n uint64) int {
293 // amd64:"BSFQ",-"CMOVEQ"
294 i += bits.TrailingZeros64(n)
300 func IterateBits32(n uint32) int {
303 // amd64:"BSFL",-"BTSQ"
304 i += bits.TrailingZeros32(n)
310 func IterateBits16(n uint16) int {
313 // amd64:"BSFL",-"BTSL"
314 i += bits.TrailingZeros16(n)
320 func IterateBits8(n uint8) int {
323 // amd64:"BSFL",-"BTSL"
324 i += bits.TrailingZeros8(n)
330 // --------------- //
332 // --------------- //
334 func Add(x, y, ci uint) (r, co uint) {
335 // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
336 return bits.Add(x, y, ci)
339 func AddC(x, ci uint) (r, co uint) {
340 // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
341 return bits.Add(x, 7, ci)
344 func AddZ(x, y uint) (r, co uint) {
345 // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
346 return bits.Add(x, y, 0)
349 func AddR(x, y, ci uint) uint {
350 // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
351 r, _ := bits.Add(x, y, ci)
354 func AddM(p, q, r *[3]uint) {
356 r[0], c = bits.Add(p[0], q[0], c)
357 // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
358 r[1], c = bits.Add(p[1], q[1], c)
359 r[2], c = bits.Add(p[2], q[2], c)
362 func Add64(x, y, ci uint64) (r, co uint64) {
363 // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
364 return bits.Add64(x, y, ci)
367 func Add64C(x, ci uint64) (r, co uint64) {
368 // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
369 return bits.Add64(x, 7, ci)
372 func Add64Z(x, y uint64) (r, co uint64) {
373 // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
374 return bits.Add64(x, y, 0)
377 func Add64R(x, y, ci uint64) uint64 {
378 // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
379 r, _ := bits.Add64(x, y, ci)
382 func Add64M(p, q, r *[3]uint64) {
384 r[0], c = bits.Add64(p[0], q[0], c)
385 // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
386 r[1], c = bits.Add64(p[1], q[1], c)
387 r[2], c = bits.Add64(p[2], q[2], c)
390 // --------------- //
392 // --------------- //
394 func Sub(x, y, ci uint) (r, co uint) {
395 // amd64:"NEGL","SBBQ","NEGQ"
396 return bits.Sub(x, y, ci)
399 func SubC(x, ci uint) (r, co uint) {
400 // amd64:"NEGL","SBBQ","NEGQ"
401 return bits.Sub(x, 7, ci)
404 func SubZ(x, y uint) (r, co uint) {
405 // amd64:"SUBQ","SBBQ","NEGQ",-"NEGL"
406 return bits.Sub(x, y, 0)
409 func SubR(x, y, ci uint) uint {
410 // amd64:"NEGL","SBBQ",-"NEGQ"
411 r, _ := bits.Sub(x, y, ci)
414 func SubM(p, q, r *[3]uint) {
416 r[0], c = bits.Sub(p[0], q[0], c)
417 // amd64:"SBBQ",-"NEGL",-"NEGQ"
418 r[1], c = bits.Sub(p[1], q[1], c)
419 r[2], c = bits.Sub(p[2], q[2], c)
422 func Sub64(x, y, ci uint64) (r, co uint64) {
423 // amd64:"NEGL","SBBQ","NEGQ"
424 return bits.Sub64(x, y, ci)
427 func Sub64C(x, ci uint64) (r, co uint64) {
428 // amd64:"NEGL","SBBQ","NEGQ"
429 return bits.Sub64(x, 7, ci)
432 func Sub64Z(x, y uint64) (r, co uint64) {
433 // amd64:"SUBQ","SBBQ","NEGQ",-"NEGL"
434 return bits.Sub64(x, y, 0)
437 func Sub64R(x, y, ci uint64) uint64 {
438 // amd64:"NEGL","SBBQ",-"NEGQ"
439 r, _ := bits.Sub64(x, y, ci)
442 func Sub64M(p, q, r *[3]uint64) {
444 r[0], c = bits.Sub64(p[0], q[0], c)
445 // amd64:"SBBQ",-"NEGL",-"NEGQ"
446 r[1], c = bits.Sub64(p[1], q[1], c)
447 r[2], c = bits.Sub64(p[2], q[2], c)
450 // --------------- //
452 // --------------- //
454 func Mul(x, y uint) (hi, lo uint) {
456 // arm64:"UMULH","MUL"
457 // ppc64:"MULHDU","MULLD"
458 // ppc64le:"MULHDU","MULLD"
459 return bits.Mul(x, y)
462 func Mul64(x, y uint64) (hi, lo uint64) {
464 // arm64:"UMULH","MUL"
465 // ppc64:"MULHDU","MULLD"
466 // ppc64le:"MULHDU","MULLD"
467 return bits.Mul64(x, y)
470 // --------------- //
472 // --------------- //
474 func Div(hi, lo, x uint) (q, r uint) {
476 return bits.Div(hi, lo, x)
479 func Div32(hi, lo, x uint32) (q, r uint32) {
480 // arm64:"ORR","UDIV","MSUB",-"UREM"
481 return bits.Div32(hi, lo, x)
484 func Div64(hi, lo, x uint64) (q, r uint64) {
486 return bits.Div64(hi, lo, x)