1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "textflag.h"
6
7// castagnoliUpdate updates the non-inverted crc with the given data.
8
9// func castagnoliUpdate(crc uint32, p []byte) uint32
10TEXT ·castagnoliUpdate(SB),NOSPLIT,$0-36
11	MOVWU	crc+0(FP), R9  // CRC value
12	MOVD	p+8(FP), R13  // data pointer
13	MOVD	p_len+16(FP), R11  // len(p)
14
15update:
16	CMP	$16, R11
17	BLT	less_than_16
18	LDP.P	16(R13), (R8, R10)
19	CRC32CX	R8, R9
20	CRC32CX	R10, R9
21	SUB	$16, R11
22
23	JMP	update
24
25less_than_16:
26	TBZ	$3, R11, less_than_8
27
28	MOVD.P	8(R13), R10
29	CRC32CX	R10, R9
30
31less_than_8:
32	TBZ	$2, R11, less_than_4
33
34	MOVWU.P	4(R13), R10
35	CRC32CW	R10, R9
36
37less_than_4:
38	TBZ	$1, R11, less_than_2
39
40	MOVHU.P	2(R13), R10
41	CRC32CH	R10, R9
42
43less_than_2:
44	TBZ	$0, R11, done
45
46	MOVBU	(R13), R10
47	CRC32CB	R10, R9
48
49done:
50	MOVWU	R9, ret+32(FP)
51	RET
52
53// ieeeUpdate updates the non-inverted crc with the given data.
54
55// func ieeeUpdate(crc uint32, p []byte) uint32
56TEXT ·ieeeUpdate(SB),NOSPLIT,$0-36
57	MOVWU	crc+0(FP), R9  // CRC value
58	MOVD	p+8(FP), R13  // data pointer
59	MOVD	p_len+16(FP), R11  // len(p)
60
61update:
62	CMP	$16, R11
63	BLT	less_than_16
64	LDP.P	16(R13), (R8, R10)
65	CRC32X	R8, R9
66	CRC32X	R10, R9
67	SUB	$16, R11
68
69	JMP	update
70
71less_than_16:
72	TBZ $3, R11, less_than_8
73
74	MOVD.P	8(R13), R10
75	CRC32X	R10, R9
76
77less_than_8:
78	TBZ	$2, R11, less_than_4
79
80	MOVWU.P	4(R13), R10
81	CRC32W	R10, R9
82
83less_than_4:
84	TBZ	$1, R11, less_than_2
85
86	MOVHU.P	2(R13), R10
87	CRC32H	R10, R9
88
89less_than_2:
90	TBZ	$0, R11, done
91
92	MOVBU	(R13), R10
93	CRC32B	R10, R9
94
95done:
96	MOVWU	R9, ret+32(FP)
97	RET
98