aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s
blob: 9a7655c0f7665c3e6b4a5d37699b246cb6b99555 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Copied from S2 implementation.

//go:build !appengine && !noasm && gc && !noasm

#include "textflag.h"

// func matchLen(a []byte, b []byte) int
// Requires: BMI
TEXT ·matchLen(SB), NOSPLIT, $0-56
	MOVQ a_base+0(FP), AX
	MOVQ b_base+24(FP), CX
	MOVQ a_len+8(FP), DX

	// matchLen
	XORL SI, SI
	CMPL DX, $0x08
	JB   matchlen_match4_standalone

matchlen_loopback_standalone:
	MOVQ  (AX)(SI*1), BX
	XORQ  (CX)(SI*1), BX
	TESTQ BX, BX
	JZ    matchlen_loop_standalone

#ifdef GOAMD64_v3
	TZCNTQ BX, BX
#else
	BSFQ BX, BX
#endif
	SARQ $0x03, BX
	LEAL (SI)(BX*1), SI
	JMP  gen_match_len_end

matchlen_loop_standalone:
	LEAL -8(DX), DX
	LEAL 8(SI), SI
	CMPL DX, $0x08
	JAE  matchlen_loopback_standalone

matchlen_match4_standalone:
	CMPL DX, $0x04
	JB   matchlen_match2_standalone
	MOVL (AX)(SI*1), BX
	CMPL (CX)(SI*1), BX
	JNE  matchlen_match2_standalone
	LEAL -4(DX), DX
	LEAL 4(SI), SI

matchlen_match2_standalone:
	CMPL DX, $0x02
	JB   matchlen_match1_standalone
	MOVW (AX)(SI*1), BX
	CMPW (CX)(SI*1), BX
	JNE  matchlen_match1_standalone
	LEAL -2(DX), DX
	LEAL 2(SI), SI

matchlen_match1_standalone:
	CMPL DX, $0x01
	JB   gen_match_len_end
	MOVB (AX)(SI*1), BL
	CMPB (CX)(SI*1), BL
	JNE  gen_match_len_end
	INCL SI

gen_match_len_end:
	MOVQ SI, ret+48(FP)
	RET