| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | // 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" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-05 19:46:18 +01:00
										 |  |  | // ----------------------- // | 
					
						
							|  |  |  | //    bits.LeadingZeros    // | 
					
						
							|  |  |  | // ----------------------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func LeadingZeros(n uint) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-05 19:46:18 +01:00
										 |  |  | 	return bits.LeadingZeros(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func LeadingZeros64(n uint64) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-05 19:46:18 +01:00
										 |  |  | 	return bits.LeadingZeros64(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func LeadingZeros32(n uint32) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-05 19:46:18 +01:00
										 |  |  | 	return bits.LeadingZeros32(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func LeadingZeros16(n uint16) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-05 19:46:18 +01:00
										 |  |  | 	return bits.LeadingZeros16(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func LeadingZeros8(n uint8) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64 LeadingZeros8 not intrinsified (see ssa.go) | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-05 19:46:18 +01:00
										 |  |  | 	return bits.LeadingZeros8(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | // --------------- // | 
					
						
							|  |  |  | //    bits.Len*    // | 
					
						
							|  |  |  | // --------------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Len(n uint) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | 	return bits.Len(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Len64(n uint64) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | 	return bits.Len64(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Len32(n uint32) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | 	return bits.Len32(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Len16(n uint16) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSRQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | 	return bits.Len16(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Len8(n uint8) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64 Len8 not intrisified (see ssa.go) | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							|  |  |  | 	// arm:"CLZ" arm64:"CLZ" | 
					
						
							|  |  |  | 	// mips:"CLZ" | 
					
						
							| 
									
										
										
										
											2018-03-02 15:16:27 +01:00
										 |  |  | 	return bits.Len8(n) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 12:55:41 +01:00
										 |  |  | // -------------------- // | 
					
						
							|  |  |  | //    bits.OnesCount    // | 
					
						
							|  |  |  | // -------------------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func OnesCount(n uint) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"POPCNTQ",".*support_popcnt" | 
					
						
							|  |  |  | 	// arm64:"VCNT","VUADDLV" | 
					
						
							| 
									
										
										
										
											2018-03-06 12:55:41 +01:00
										 |  |  | 	return bits.OnesCount(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func OnesCount64(n uint64) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"POPCNTQ",".*support_popcnt" | 
					
						
							|  |  |  | 	// arm64:"VCNT","VUADDLV" | 
					
						
							| 
									
										
										
										
											2018-03-06 12:55:41 +01:00
										 |  |  | 	return bits.OnesCount64(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func OnesCount32(n uint32) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"POPCNTL",".*support_popcnt" | 
					
						
							|  |  |  | 	// arm64:"VCNT","VUADDLV" | 
					
						
							| 
									
										
										
										
											2018-03-06 12:55:41 +01:00
										 |  |  | 	return bits.OnesCount32(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func OnesCount16(n uint16) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"POPCNTL",".*support_popcnt" | 
					
						
							|  |  |  | 	// arm64:"VCNT","VUADDLV" | 
					
						
							| 
									
										
										
										
											2018-03-06 12:55:41 +01:00
										 |  |  | 	return bits.OnesCount16(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 20:10:35 +01:00
										 |  |  | // ----------------------- // | 
					
						
							|  |  |  | //    bits.ReverseBytes    // | 
					
						
							|  |  |  | // ----------------------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ReverseBytes(n uint) uint { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSWAPQ" | 
					
						
							|  |  |  | 	// s390x:"MOVDBR" | 
					
						
							|  |  |  | 	// arm64:"REV" | 
					
						
							| 
									
										
										
										
											2018-03-06 20:10:35 +01:00
										 |  |  | 	return bits.ReverseBytes(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ReverseBytes64(n uint64) uint64 { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSWAPQ" | 
					
						
							|  |  |  | 	// s390x:"MOVDBR" | 
					
						
							|  |  |  | 	// arm64:"REV" | 
					
						
							| 
									
										
										
										
											2018-03-06 20:10:35 +01:00
										 |  |  | 	return bits.ReverseBytes64(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ReverseBytes32(n uint32) uint32 { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSWAPL" | 
					
						
							|  |  |  | 	// s390x:"MOVWBR" | 
					
						
							|  |  |  | 	// arm64:"REVW" | 
					
						
							| 
									
										
										
										
											2018-03-06 20:10:35 +01:00
										 |  |  | 	return bits.ReverseBytes32(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ReverseBytes16(n uint16) uint16 { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"ROLW" | 
					
						
							| 
									
										
										
										
											2018-03-06 20:10:35 +01:00
										 |  |  | 	return bits.ReverseBytes16(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | // --------------------- // | 
					
						
							|  |  |  | //    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) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | // ------------------------ // | 
					
						
							|  |  |  | //    bits.TrailingZeros    // | 
					
						
							|  |  |  | // ------------------------ // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TrailingZeros(n uint) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | 	return bits.TrailingZeros(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TrailingZeros64(n uint64) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR" | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | 	return bits.TrailingZeros64(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TrailingZeros32(n uint32) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"MOVQ\t\\$4294967296","ORQ\t[^$]","BSFQ" | 
					
						
							|  |  |  | 	// s390x:"FLOGR","MOVWZ" | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | 	return bits.TrailingZeros32(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TrailingZeros16(n uint16) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSFQ","ORQ\t\\$65536" | 
					
						
							|  |  |  | 	// s390x:"FLOGR","OR\t\\$65536" | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | 	return bits.TrailingZeros16(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TrailingZeros8(n uint8) int { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:43:55 +01:00
										 |  |  | 	// amd64:"BSFQ","ORQ\t\\$256" | 
					
						
							|  |  |  | 	// s390x:"FLOGR","OR\t\\$256" | 
					
						
							| 
									
										
										
										
											2018-03-06 09:39:14 +01:00
										 |  |  | 	return bits.TrailingZeros8(n) | 
					
						
							|  |  |  | } |