| // asmcheck | |
| // Copyright 2018 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package codegen | |
| import "math/bits" | |
| // ----------------------- // | |
| // bits.LeadingZeros // | |
| // ----------------------- // | |
| func LeadingZeros(n uint) int { | |
| // amd64:"BSRQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.LeadingZeros(n) | |
| } | |
| func LeadingZeros64(n uint64) int { | |
| // amd64:"BSRQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.LeadingZeros64(n) | |
| } | |
| func LeadingZeros32(n uint32) int { | |
| // amd64:"BSRQ","LEAQ",-"CMOVQEQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.LeadingZeros32(n) | |
| } | |
| func LeadingZeros16(n uint16) int { | |
| // amd64:"BSRL","LEAL",-"CMOVQEQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.LeadingZeros16(n) | |
| } | |
| func LeadingZeros8(n uint8) int { | |
| // amd64:"BSRL","LEAL",-"CMOVQEQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.LeadingZeros8(n) | |
| } | |
| // --------------- // | |
| // bits.Len* // | |
| // --------------- // | |
| func Len(n uint) int { | |
| // amd64:"BSRQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.Len(n) | |
| } | |
| func Len64(n uint64) int { | |
| // amd64:"BSRQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.Len64(n) | |
| } | |
| func Len32(n uint32) int { | |
| // amd64:"BSRQ","LEAQ",-"CMOVQEQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.Len32(n) | |
| } | |
| func Len16(n uint16) int { | |
| // amd64:"BSRL","LEAL",-"CMOVQEQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.Len16(n) | |
| } | |
| func Len8(n uint8) int { | |
| // amd64:"BSRL","LEAL",-"CMOVQEQ" | |
| // s390x:"FLOGR" | |
| // arm:"CLZ" arm64:"CLZ" | |
| // mips:"CLZ" | |
| return bits.Len8(n) | |
| } | |
| // -------------------- // | |
| // bits.OnesCount // | |
| // -------------------- // | |
| func OnesCount(n uint) int { | |
| // amd64:"POPCNTQ",".*support_popcnt" | |
| // arm64:"VCNT","VUADDLV" | |
| return bits.OnesCount(n) | |
| } | |
| func OnesCount64(n uint64) int { | |
| // amd64:"POPCNTQ",".*support_popcnt" | |
| // arm64:"VCNT","VUADDLV" | |
| return bits.OnesCount64(n) | |
| } | |
| func OnesCount32(n uint32) int { | |
| // amd64:"POPCNTL",".*support_popcnt" | |
| // arm64:"VCNT","VUADDLV" | |
| return bits.OnesCount32(n) | |
| } | |
| func OnesCount16(n uint16) int { | |
| // amd64:"POPCNTL",".*support_popcnt" | |
| // arm64:"VCNT","VUADDLV" | |
| return bits.OnesCount16(n) | |
| } | |
| // ----------------------- // | |
| // bits.ReverseBytes // | |
| // ----------------------- // | |
| func ReverseBytes(n uint) uint { | |
| // amd64:"BSWAPQ" | |
| // s390x:"MOVDBR" | |
| // arm64:"REV" | |
| return bits.ReverseBytes(n) | |
| } | |
| func ReverseBytes64(n uint64) uint64 { | |
| // amd64:"BSWAPQ" | |
| // s390x:"MOVDBR" | |
| // arm64:"REV" | |
| return bits.ReverseBytes64(n) | |
| } | |
| func ReverseBytes32(n uint32) uint32 { | |
| // amd64:"BSWAPL" | |
| // s390x:"MOVWBR" | |
| // arm64:"REVW" | |
| return bits.ReverseBytes32(n) | |
| } | |
| func ReverseBytes16(n uint16) uint16 { | |
| // amd64:"ROLW" | |
| return bits.ReverseBytes16(n) | |
| } | |
| // --------------------- // | |
| // bits.RotateLeft // | |
| // --------------------- // | |
| func RotateLeft64(n uint64) uint64 { | |
| // amd64:"ROLQ" | |
| // arm64:"ROR" | |
| // ppc64:"ROTL" | |
| return bits.RotateLeft64(n, 37) | |
| } | |
| func RotateLeft32(n uint32) uint32 { | |
| // amd64:"ROLL" 386:"ROLL" | |
| // arm64:"RORW" | |
| // ppc64:"ROTLW" | |
| return bits.RotateLeft32(n, 9) | |
| } | |
| func RotateLeft16(n uint16) uint16 { | |
| // amd64:"ROLW" 386:"ROLW" | |
| return bits.RotateLeft16(n, 5) | |
| } | |
| func RotateLeft8(n uint8) uint8 { | |
| // amd64:"ROLB" 386:"ROLB" | |
| return bits.RotateLeft8(n, 5) | |
| } | |
| // ------------------------ // | |
| // bits.TrailingZeros // | |
| // ------------------------ // | |
| func TrailingZeros(n uint) int { | |
| // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" | |
| // s390x:"FLOGR" | |
| return bits.TrailingZeros(n) | |
| } | |
| func TrailingZeros64(n uint64) int { | |
| // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" | |
| // s390x:"FLOGR" | |
| return bits.TrailingZeros64(n) | |
| } | |
| func TrailingZeros32(n uint32) int { | |
| // amd64:"BTSQ\\t\\$32","BSFQ" | |
| // s390x:"FLOGR","MOVWZ" | |
| return bits.TrailingZeros32(n) | |
| } | |
| func TrailingZeros16(n uint16) int { | |
| // amd64:"BSFL","BTSL\\t\\$16" | |
| // s390x:"FLOGR","OR\t\\$65536" | |
| return bits.TrailingZeros16(n) | |
| } | |
| func TrailingZeros8(n uint8) int { | |
| // amd64:"BSFL","BTSL\\t\\$8" | |
| // s390x:"FLOGR","OR\t\\$256" | |
| return bits.TrailingZeros8(n) | |
| } | |
| // IterateBitsNN checks special handling of TrailingZerosNN when the input is known to be non-zero. | |
| func IterateBits(n uint) int { | |
| i := 0 | |
| for n != 0 { | |
| // amd64:"BSFQ",-"CMOVEQ" | |
| i += bits.TrailingZeros(n) | |
| n &= n - 1 | |
| } | |
| return i | |
| } | |
| func IterateBits64(n uint64) int { | |
| i := 0 | |
| for n != 0 { | |
| // amd64:"BSFQ",-"CMOVEQ" | |
| i += bits.TrailingZeros64(n) | |
| n &= n - 1 | |
| } | |
| return i | |
| } | |
| func IterateBits32(n uint32) int { | |
| i := 0 | |
| for n != 0 { | |
| // amd64:"BSFL",-"BTSQ" | |
| i += bits.TrailingZeros32(n) | |
| n &= n - 1 | |
| } | |
| return i | |
| } | |
| func IterateBits16(n uint16) int { | |
| i := 0 | |
| for n != 0 { | |
| // amd64:"BSFL",-"BTSL" | |
| i += bits.TrailingZeros16(n) | |
| n &= n - 1 | |
| } | |
| return i | |
| } | |
| func IterateBits8(n uint8) int { | |
| i := 0 | |
| for n != 0 { | |
| // amd64:"BSFL",-"BTSL" | |
| i += bits.TrailingZeros8(n) | |
| n &= n - 1 | |
| } | |
| return i | |
| } |