// Copyright 2015 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. | |
// +build amd64,!appengine,!gccgo | |
#include "textflag.h" | |
// func havePOPCNT() bool | |
TEXT ·havePOPCNT(SB),4,$0 | |
MOVQ $1, AX | |
CPUID | |
SHRQ $23, CX | |
ANDQ $1, CX | |
MOVB CX, ret+0(FP) | |
RET | |
// func popcnt(word) int | |
TEXT ·popcnt(SB),NOSPLIT,$0-8 | |
XORQ AX, AX | |
MOVQ x+0(FP), SI | |
// POPCNT (SI), AX is not recognized by Go assembler, | |
// so we assemble it ourselves. | |
BYTE $0xf3 | |
BYTE $0x48 | |
BYTE $0x0f | |
BYTE $0xb8 | |
BYTE $0xc6 | |
MOVQ AX, ret+8(FP) | |
RET |