65 lines
1.4 KiB
ArmAsm
65 lines
1.4 KiB
ArmAsm
|
//
|
||
|
// hamming distance calculations in Go
|
||
|
//
|
||
|
// https://github.com/steakknife/hamming
|
||
|
//
|
||
|
// Copyright © 2014, 2015, 2016 Barry Allard
|
||
|
//
|
||
|
// MIT license
|
||
|
//
|
||
|
|
||
|
#include "textflag.h"
|
||
|
|
||
|
TEXT ·CountBitsInt8PopCnt(SB),NOSPLIT,$0
|
||
|
JMP ·CountBitsBytePopCnt(SB)
|
||
|
|
||
|
TEXT ·CountBitsInt16PopCnt(SB),NOSPLIT,$0
|
||
|
JMP ·CountBitsUint16PopCnt(SB)
|
||
|
|
||
|
TEXT ·CountBitsInt32PopCnt(SB),NOSPLIT,$0
|
||
|
JMP ·CountBitsUint32PopCnt(SB)
|
||
|
|
||
|
TEXT ·CountBitsInt64PopCnt(SB),NOSPLIT,$0
|
||
|
JMP ·CountBitsUint64PopCnt(SB)
|
||
|
|
||
|
TEXT ·CountBitsBytePopCnt(SB),NOSPLIT,$0
|
||
|
JMP ·CountBitsUint8PopCnt(SB)
|
||
|
|
||
|
TEXT ·CountBitsRunePopCnt(SB),NOSPLIT,$0
|
||
|
JMP ·CountBitsUint32PopCnt(SB)
|
||
|
|
||
|
TEXT ·CountBitsUint8PopCnt(SB),NOSPLIT,$0
|
||
|
XORQ AX, AX
|
||
|
MOVB x+0(FP), AX
|
||
|
POPCNTQ AX, AX
|
||
|
MOVQ AX, ret+8(FP)
|
||
|
RET
|
||
|
|
||
|
TEXT ·CountBitsUint16PopCnt(SB),NOSPLIT,$0
|
||
|
XORQ AX, AX
|
||
|
MOVW x+0(FP), AX
|
||
|
POPCNTQ AX, AX
|
||
|
MOVQ AX, ret+8(FP)
|
||
|
RET
|
||
|
|
||
|
TEXT ·CountBitsUint32PopCnt(SB),NOSPLIT,$0
|
||
|
XORQ AX, AX
|
||
|
MOVL x+0(FP), AX
|
||
|
POPCNTQ AX, AX
|
||
|
MOVQ AX, ret+8(FP)
|
||
|
RET
|
||
|
|
||
|
TEXT ·CountBitsUint64PopCnt(SB),NOSPLIT,$0
|
||
|
POPCNTQ x+0(FP), AX
|
||
|
MOVQ AX, ret+8(FP)
|
||
|
RET
|
||
|
|
||
|
// func hasPopCnt() (ret bool)
|
||
|
TEXT ·HasPopCnt(SB),NOSPLIT,$0
|
||
|
MOVL $1, AX
|
||
|
CPUID
|
||
|
SHRL $23, CX // bit 23: Advanced Bit Manipulation Bit (ABM) -> POPCNTQ
|
||
|
ANDL $1, CX
|
||
|
MOVB CX, ret+0(FP)
|
||
|
RET
|