1// +build !go1.9
2// +build amd64,!appengine
3
4TEXT ·hasAsm(SB),4,$0-1
5MOVQ $1, AX
6CPUID
7SHRQ $23, CX
8ANDQ $1, CX
9MOVB CX, ret+0(FP)
10RET
11
12#define POPCNTQ_DX_DX BYTE $0xf3; BYTE $0x48; BYTE $0x0f; BYTE $0xb8; BYTE $0xd2
13
14TEXT ·popcntSliceAsm(SB),4,$0-32
15XORQ AX, AX
16MOVQ s+0(FP), SI
17MOVQ s_len+8(FP), CX
18TESTQ CX, CX
19JZ popcntSliceEnd
20popcntSliceLoop:
21BYTE $0xf3; BYTE $0x48; BYTE $0x0f; BYTE $0xb8; BYTE $0x16 // POPCNTQ (SI), DX
22ADDQ DX, AX
23ADDQ $8, SI
24LOOP popcntSliceLoop
25popcntSliceEnd:
26MOVQ AX, ret+24(FP)
27RET
28
29TEXT ·popcntMaskSliceAsm(SB),4,$0-56
30XORQ AX, AX
31MOVQ s+0(FP), SI
32MOVQ s_len+8(FP), CX
33TESTQ CX, CX
34JZ popcntMaskSliceEnd
35MOVQ m+24(FP), DI
36popcntMaskSliceLoop:
37MOVQ (DI), DX
38NOTQ DX
39ANDQ (SI), DX
40POPCNTQ_DX_DX
41ADDQ DX, AX
42ADDQ $8, SI
43ADDQ $8, DI
44LOOP popcntMaskSliceLoop
45popcntMaskSliceEnd:
46MOVQ AX, ret+48(FP)
47RET
48
49TEXT ·popcntAndSliceAsm(SB),4,$0-56
50XORQ AX, AX
51MOVQ s+0(FP), SI
52MOVQ s_len+8(FP), CX
53TESTQ CX, CX
54JZ popcntAndSliceEnd
55MOVQ m+24(FP), DI
56popcntAndSliceLoop:
57MOVQ (DI), DX
58ANDQ (SI), DX
59POPCNTQ_DX_DX
60ADDQ DX, AX
61ADDQ $8, SI
62ADDQ $8, DI
63LOOP popcntAndSliceLoop
64popcntAndSliceEnd:
65MOVQ AX, ret+48(FP)
66RET
67
68TEXT ·popcntOrSliceAsm(SB),4,$0-56
69XORQ AX, AX
70MOVQ s+0(FP), SI
71MOVQ s_len+8(FP), CX
72TESTQ CX, CX
73JZ popcntOrSliceEnd
74MOVQ m+24(FP), DI
75popcntOrSliceLoop:
76MOVQ (DI), DX
77ORQ (SI), DX
78POPCNTQ_DX_DX
79ADDQ DX, AX
80ADDQ $8, SI
81ADDQ $8, DI
82LOOP popcntOrSliceLoop
83popcntOrSliceEnd:
84MOVQ AX, ret+48(FP)
85RET
86
87TEXT ·popcntXorSliceAsm(SB),4,$0-56
88XORQ AX, AX
89MOVQ s+0(FP), SI
90MOVQ s_len+8(FP), CX
91TESTQ CX, CX
92JZ popcntXorSliceEnd
93MOVQ m+24(FP), DI
94popcntXorSliceLoop:
95MOVQ (DI), DX
96XORQ (SI), DX
97POPCNTQ_DX_DX
98ADDQ DX, AX
99ADDQ $8, SI
100ADDQ $8, DI
101LOOP popcntXorSliceLoop
102popcntXorSliceEnd:
103MOVQ AX, ret+48(FP)
104RET
View as plain text