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//go:build !purego
6
7#include "textflag.h"
8
9#define HASHUPDATECHOOSE \
10	SHA1C	V16.S4, V1, V2 \
11	SHA1H	V3, V1 \
12	VMOV	V2.B16, V3.B16
13
14#define HASHUPDATEPARITY \
15	SHA1P	V16.S4, V1, V2 \
16	SHA1H	V3, V1 \
17	VMOV	V2.B16, V3.B16
18
19#define HASHUPDATEMAJ \
20	SHA1M	V16.S4, V1, V2 \
21	SHA1H	V3, V1 \
22	VMOV	V2.B16, V3.B16
23
24// func sha1block(h []uint32, p []byte, k []uint32)
25TEXT ·sha1block(SB),NOSPLIT,$0
26	MOVD	h_base+0(FP), R0                             // hash value first address
27	MOVD	p_base+24(FP), R1                            // message first address
28	MOVD	k_base+48(FP), R2                            // k constants first address
29	MOVD	p_len+32(FP), R3                             // message length
30	VLD1.P	16(R0), [V0.S4]
31	FMOVS	(R0), F20
32	SUB	$16, R0, R0
33
34blockloop:
35
36	VLD1.P	16(R1), [V4.B16]                             // load message
37	VLD1.P	16(R1), [V5.B16]
38	VLD1.P	16(R1), [V6.B16]
39	VLD1.P	16(R1), [V7.B16]
40	VLD1	(R2), [V19.S4]                               // load constant k0-k79
41	VMOV	V0.B16, V2.B16
42	VMOV	V20.S[0], V1
43	VMOV	V2.B16, V3.B16
44	VDUP	V19.S[0], V17.S4
45	VREV32	V4.B16, V4.B16                               // prepare for using message in Byte format
46	VREV32	V5.B16, V5.B16
47	VREV32	V6.B16, V6.B16
48	VREV32	V7.B16, V7.B16
49
50
51	VDUP	V19.S[1], V18.S4
52	VADD	V17.S4, V4.S4, V16.S4
53	SHA1SU0	V6.S4, V5.S4, V4.S4
54	HASHUPDATECHOOSE
55	SHA1SU1	V7.S4, V4.S4
56
57	VADD	V17.S4, V5.S4, V16.S4
58	SHA1SU0	V7.S4, V6.S4, V5.S4
59	HASHUPDATECHOOSE
60	SHA1SU1	V4.S4, V5.S4
61	VADD	V17.S4, V6.S4, V16.S4
62	SHA1SU0	V4.S4, V7.S4, V6.S4
63	HASHUPDATECHOOSE
64	SHA1SU1	V5.S4, V6.S4
65
66	VADD	V17.S4, V7.S4, V16.S4
67	SHA1SU0	V5.S4, V4.S4, V7.S4
68	HASHUPDATECHOOSE
69	SHA1SU1	V6.S4, V7.S4
70
71	VADD	V17.S4, V4.S4, V16.S4
72	SHA1SU0	V6.S4, V5.S4, V4.S4
73	HASHUPDATECHOOSE
74	SHA1SU1	V7.S4, V4.S4
75
76	VDUP	V19.S[2], V17.S4
77	VADD	V18.S4, V5.S4, V16.S4
78	SHA1SU0	V7.S4, V6.S4, V5.S4
79	HASHUPDATEPARITY
80	SHA1SU1	V4.S4, V5.S4
81
82	VADD	V18.S4, V6.S4, V16.S4
83	SHA1SU0	V4.S4, V7.S4, V6.S4
84	HASHUPDATEPARITY
85	SHA1SU1	V5.S4, V6.S4
86
87	VADD	V18.S4, V7.S4, V16.S4
88	SHA1SU0	V5.S4, V4.S4, V7.S4
89	HASHUPDATEPARITY
90	SHA1SU1	V6.S4, V7.S4
91
92	VADD	V18.S4, V4.S4, V16.S4
93	SHA1SU0	V6.S4, V5.S4, V4.S4
94	HASHUPDATEPARITY
95	SHA1SU1	V7.S4, V4.S4
96
97	VADD	V18.S4, V5.S4, V16.S4
98	SHA1SU0	V7.S4, V6.S4, V5.S4
99	HASHUPDATEPARITY
100	SHA1SU1	V4.S4, V5.S4
101
102	VDUP	V19.S[3], V18.S4
103	VADD	V17.S4, V6.S4, V16.S4
104	SHA1SU0	V4.S4, V7.S4, V6.S4
105	HASHUPDATEMAJ
106	SHA1SU1	V5.S4, V6.S4
107
108	VADD	V17.S4, V7.S4, V16.S4
109	SHA1SU0	V5.S4, V4.S4, V7.S4
110	HASHUPDATEMAJ
111	SHA1SU1	V6.S4, V7.S4
112
113	VADD	V17.S4, V4.S4, V16.S4
114	SHA1SU0	V6.S4, V5.S4, V4.S4
115	HASHUPDATEMAJ
116	SHA1SU1	V7.S4, V4.S4
117
118	VADD	V17.S4, V5.S4, V16.S4
119	SHA1SU0	V7.S4, V6.S4, V5.S4
120	HASHUPDATEMAJ
121	SHA1SU1	V4.S4, V5.S4
122
123	VADD	V17.S4, V6.S4, V16.S4
124	SHA1SU0	V4.S4, V7.S4, V6.S4
125	HASHUPDATEMAJ
126	SHA1SU1	V5.S4, V6.S4
127
128	VADD	V18.S4, V7.S4, V16.S4
129	SHA1SU0	V5.S4, V4.S4, V7.S4
130	HASHUPDATEPARITY
131	SHA1SU1	V6.S4, V7.S4
132
133	VADD	V18.S4, V4.S4, V16.S4
134	HASHUPDATEPARITY
135
136	VADD	V18.S4, V5.S4, V16.S4
137	HASHUPDATEPARITY
138
139	VADD	V18.S4, V6.S4, V16.S4
140	HASHUPDATEPARITY
141
142	VADD	V18.S4, V7.S4, V16.S4
143	HASHUPDATEPARITY
144
145	SUB	$64, R3, R3                                  // message length - 64bytes, then compare with 64bytes
146	VADD	V2.S4, V0.S4, V0.S4
147	VADD	V1.S4, V20.S4, V20.S4
148	CBNZ	R3, blockloop
149
150sha1ret:
151
152	VST1.P	[V0.S4], 16(R0)                               // store hash value H(dcba)
153	FMOVS	F20, (R0)                                     // store hash value H(e)
154	RET
155