xref: /freebsd/sys/contrib/openzfs/module/icp/asm-aarch64/sha2/sha256-armv8.S (revision 02e9120893770924227138ba49df1edb3896112a)
1/*
2 * Copyright 2004-2022 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*
18 * Portions Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
19 * - modified assembly to fit into OpenZFS
20 */
21
22#if defined(__aarch64__)
23
24.text
25
26.align	6
27.type	.LK256,%object
28.LK256:
29	.long	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
30	.long	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
31	.long	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
32	.long	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
33	.long	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
34	.long	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
35	.long	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
36	.long	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
37	.long	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
38	.long	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
39	.long	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
40	.long	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
41	.long	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
42	.long	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
43	.long	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
44	.long	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
45	.long	0	//terminator
46.size	.LK256,.-.LK256
47
48.globl	zfs_sha256_block_armv7
49.type	zfs_sha256_block_armv7,%function
50.align	6
51zfs_sha256_block_armv7:
52	hint	#34					// bti c
53	stp	x29,x30,[sp,#-128]!
54	add	x29,sp,#0
55
56	stp	x19,x20,[sp,#16]
57	stp	x21,x22,[sp,#32]
58	stp	x23,x24,[sp,#48]
59	stp	x25,x26,[sp,#64]
60	stp	x27,x28,[sp,#80]
61	sub	sp,sp,#4*4
62
63	ldp	w20,w21,[x0]				// load context
64	ldp	w22,w23,[x0,#2*4]
65	ldp	w24,w25,[x0,#4*4]
66	add	x2,x1,x2,lsl#6	// end of input
67	ldp	w26,w27,[x0,#6*4]
68	adr	x30,.LK256
69	stp	x0,x2,[x29,#96]
70
71.Loop:
72	ldp	w3,w4,[x1],#2*4
73	ldr	w19,[x30],#4			// *K++
74	eor	w28,w21,w22				// magic seed
75	str	x1,[x29,#112]
76#ifndef	__AARCH64EB__
77	rev	w3,w3			// 0
78#endif
79	ror	w16,w24,#6
80	add	w27,w27,w19			// h+=K[i]
81	eor	w6,w24,w24,ror#14
82	and	w17,w25,w24
83	bic	w19,w26,w24
84	add	w27,w27,w3			// h+=X[i]
85	orr	w17,w17,w19			// Ch(e,f,g)
86	eor	w19,w20,w21			// a^b, b^c in next round
87	eor	w16,w16,w6,ror#11	// Sigma1(e)
88	ror	w6,w20,#2
89	add	w27,w27,w17			// h+=Ch(e,f,g)
90	eor	w17,w20,w20,ror#9
91	add	w27,w27,w16			// h+=Sigma1(e)
92	and	w28,w28,w19			// (b^c)&=(a^b)
93	add	w23,w23,w27			// d+=h
94	eor	w28,w28,w21			// Maj(a,b,c)
95	eor	w17,w6,w17,ror#13	// Sigma0(a)
96	add	w27,w27,w28			// h+=Maj(a,b,c)
97	ldr	w28,[x30],#4		// *K++, w19 in next round
98	//add	w27,w27,w17			// h+=Sigma0(a)
99#ifndef	__AARCH64EB__
100	rev	w4,w4			// 1
101#endif
102	ldp	w5,w6,[x1],#2*4
103	add	w27,w27,w17			// h+=Sigma0(a)
104	ror	w16,w23,#6
105	add	w26,w26,w28			// h+=K[i]
106	eor	w7,w23,w23,ror#14
107	and	w17,w24,w23
108	bic	w28,w25,w23
109	add	w26,w26,w4			// h+=X[i]
110	orr	w17,w17,w28			// Ch(e,f,g)
111	eor	w28,w27,w20			// a^b, b^c in next round
112	eor	w16,w16,w7,ror#11	// Sigma1(e)
113	ror	w7,w27,#2
114	add	w26,w26,w17			// h+=Ch(e,f,g)
115	eor	w17,w27,w27,ror#9
116	add	w26,w26,w16			// h+=Sigma1(e)
117	and	w19,w19,w28			// (b^c)&=(a^b)
118	add	w22,w22,w26			// d+=h
119	eor	w19,w19,w20			// Maj(a,b,c)
120	eor	w17,w7,w17,ror#13	// Sigma0(a)
121	add	w26,w26,w19			// h+=Maj(a,b,c)
122	ldr	w19,[x30],#4		// *K++, w28 in next round
123	//add	w26,w26,w17			// h+=Sigma0(a)
124#ifndef	__AARCH64EB__
125	rev	w5,w5			// 2
126#endif
127	add	w26,w26,w17			// h+=Sigma0(a)
128	ror	w16,w22,#6
129	add	w25,w25,w19			// h+=K[i]
130	eor	w8,w22,w22,ror#14
131	and	w17,w23,w22
132	bic	w19,w24,w22
133	add	w25,w25,w5			// h+=X[i]
134	orr	w17,w17,w19			// Ch(e,f,g)
135	eor	w19,w26,w27			// a^b, b^c in next round
136	eor	w16,w16,w8,ror#11	// Sigma1(e)
137	ror	w8,w26,#2
138	add	w25,w25,w17			// h+=Ch(e,f,g)
139	eor	w17,w26,w26,ror#9
140	add	w25,w25,w16			// h+=Sigma1(e)
141	and	w28,w28,w19			// (b^c)&=(a^b)
142	add	w21,w21,w25			// d+=h
143	eor	w28,w28,w27			// Maj(a,b,c)
144	eor	w17,w8,w17,ror#13	// Sigma0(a)
145	add	w25,w25,w28			// h+=Maj(a,b,c)
146	ldr	w28,[x30],#4		// *K++, w19 in next round
147	//add	w25,w25,w17			// h+=Sigma0(a)
148#ifndef	__AARCH64EB__
149	rev	w6,w6			// 3
150#endif
151	ldp	w7,w8,[x1],#2*4
152	add	w25,w25,w17			// h+=Sigma0(a)
153	ror	w16,w21,#6
154	add	w24,w24,w28			// h+=K[i]
155	eor	w9,w21,w21,ror#14
156	and	w17,w22,w21
157	bic	w28,w23,w21
158	add	w24,w24,w6			// h+=X[i]
159	orr	w17,w17,w28			// Ch(e,f,g)
160	eor	w28,w25,w26			// a^b, b^c in next round
161	eor	w16,w16,w9,ror#11	// Sigma1(e)
162	ror	w9,w25,#2
163	add	w24,w24,w17			// h+=Ch(e,f,g)
164	eor	w17,w25,w25,ror#9
165	add	w24,w24,w16			// h+=Sigma1(e)
166	and	w19,w19,w28			// (b^c)&=(a^b)
167	add	w20,w20,w24			// d+=h
168	eor	w19,w19,w26			// Maj(a,b,c)
169	eor	w17,w9,w17,ror#13	// Sigma0(a)
170	add	w24,w24,w19			// h+=Maj(a,b,c)
171	ldr	w19,[x30],#4		// *K++, w28 in next round
172	//add	w24,w24,w17			// h+=Sigma0(a)
173#ifndef	__AARCH64EB__
174	rev	w7,w7			// 4
175#endif
176	add	w24,w24,w17			// h+=Sigma0(a)
177	ror	w16,w20,#6
178	add	w23,w23,w19			// h+=K[i]
179	eor	w10,w20,w20,ror#14
180	and	w17,w21,w20
181	bic	w19,w22,w20
182	add	w23,w23,w7			// h+=X[i]
183	orr	w17,w17,w19			// Ch(e,f,g)
184	eor	w19,w24,w25			// a^b, b^c in next round
185	eor	w16,w16,w10,ror#11	// Sigma1(e)
186	ror	w10,w24,#2
187	add	w23,w23,w17			// h+=Ch(e,f,g)
188	eor	w17,w24,w24,ror#9
189	add	w23,w23,w16			// h+=Sigma1(e)
190	and	w28,w28,w19			// (b^c)&=(a^b)
191	add	w27,w27,w23			// d+=h
192	eor	w28,w28,w25			// Maj(a,b,c)
193	eor	w17,w10,w17,ror#13	// Sigma0(a)
194	add	w23,w23,w28			// h+=Maj(a,b,c)
195	ldr	w28,[x30],#4		// *K++, w19 in next round
196	//add	w23,w23,w17			// h+=Sigma0(a)
197#ifndef	__AARCH64EB__
198	rev	w8,w8			// 5
199#endif
200	ldp	w9,w10,[x1],#2*4
201	add	w23,w23,w17			// h+=Sigma0(a)
202	ror	w16,w27,#6
203	add	w22,w22,w28			// h+=K[i]
204	eor	w11,w27,w27,ror#14
205	and	w17,w20,w27
206	bic	w28,w21,w27
207	add	w22,w22,w8			// h+=X[i]
208	orr	w17,w17,w28			// Ch(e,f,g)
209	eor	w28,w23,w24			// a^b, b^c in next round
210	eor	w16,w16,w11,ror#11	// Sigma1(e)
211	ror	w11,w23,#2
212	add	w22,w22,w17			// h+=Ch(e,f,g)
213	eor	w17,w23,w23,ror#9
214	add	w22,w22,w16			// h+=Sigma1(e)
215	and	w19,w19,w28			// (b^c)&=(a^b)
216	add	w26,w26,w22			// d+=h
217	eor	w19,w19,w24			// Maj(a,b,c)
218	eor	w17,w11,w17,ror#13	// Sigma0(a)
219	add	w22,w22,w19			// h+=Maj(a,b,c)
220	ldr	w19,[x30],#4		// *K++, w28 in next round
221	//add	w22,w22,w17			// h+=Sigma0(a)
222#ifndef	__AARCH64EB__
223	rev	w9,w9			// 6
224#endif
225	add	w22,w22,w17			// h+=Sigma0(a)
226	ror	w16,w26,#6
227	add	w21,w21,w19			// h+=K[i]
228	eor	w12,w26,w26,ror#14
229	and	w17,w27,w26
230	bic	w19,w20,w26
231	add	w21,w21,w9			// h+=X[i]
232	orr	w17,w17,w19			// Ch(e,f,g)
233	eor	w19,w22,w23			// a^b, b^c in next round
234	eor	w16,w16,w12,ror#11	// Sigma1(e)
235	ror	w12,w22,#2
236	add	w21,w21,w17			// h+=Ch(e,f,g)
237	eor	w17,w22,w22,ror#9
238	add	w21,w21,w16			// h+=Sigma1(e)
239	and	w28,w28,w19			// (b^c)&=(a^b)
240	add	w25,w25,w21			// d+=h
241	eor	w28,w28,w23			// Maj(a,b,c)
242	eor	w17,w12,w17,ror#13	// Sigma0(a)
243	add	w21,w21,w28			// h+=Maj(a,b,c)
244	ldr	w28,[x30],#4		// *K++, w19 in next round
245	//add	w21,w21,w17			// h+=Sigma0(a)
246#ifndef	__AARCH64EB__
247	rev	w10,w10			// 7
248#endif
249	ldp	w11,w12,[x1],#2*4
250	add	w21,w21,w17			// h+=Sigma0(a)
251	ror	w16,w25,#6
252	add	w20,w20,w28			// h+=K[i]
253	eor	w13,w25,w25,ror#14
254	and	w17,w26,w25
255	bic	w28,w27,w25
256	add	w20,w20,w10			// h+=X[i]
257	orr	w17,w17,w28			// Ch(e,f,g)
258	eor	w28,w21,w22			// a^b, b^c in next round
259	eor	w16,w16,w13,ror#11	// Sigma1(e)
260	ror	w13,w21,#2
261	add	w20,w20,w17			// h+=Ch(e,f,g)
262	eor	w17,w21,w21,ror#9
263	add	w20,w20,w16			// h+=Sigma1(e)
264	and	w19,w19,w28			// (b^c)&=(a^b)
265	add	w24,w24,w20			// d+=h
266	eor	w19,w19,w22			// Maj(a,b,c)
267	eor	w17,w13,w17,ror#13	// Sigma0(a)
268	add	w20,w20,w19			// h+=Maj(a,b,c)
269	ldr	w19,[x30],#4		// *K++, w28 in next round
270	//add	w20,w20,w17			// h+=Sigma0(a)
271#ifndef	__AARCH64EB__
272	rev	w11,w11			// 8
273#endif
274	add	w20,w20,w17			// h+=Sigma0(a)
275	ror	w16,w24,#6
276	add	w27,w27,w19			// h+=K[i]
277	eor	w14,w24,w24,ror#14
278	and	w17,w25,w24
279	bic	w19,w26,w24
280	add	w27,w27,w11			// h+=X[i]
281	orr	w17,w17,w19			// Ch(e,f,g)
282	eor	w19,w20,w21			// a^b, b^c in next round
283	eor	w16,w16,w14,ror#11	// Sigma1(e)
284	ror	w14,w20,#2
285	add	w27,w27,w17			// h+=Ch(e,f,g)
286	eor	w17,w20,w20,ror#9
287	add	w27,w27,w16			// h+=Sigma1(e)
288	and	w28,w28,w19			// (b^c)&=(a^b)
289	add	w23,w23,w27			// d+=h
290	eor	w28,w28,w21			// Maj(a,b,c)
291	eor	w17,w14,w17,ror#13	// Sigma0(a)
292	add	w27,w27,w28			// h+=Maj(a,b,c)
293	ldr	w28,[x30],#4		// *K++, w19 in next round
294	//add	w27,w27,w17			// h+=Sigma0(a)
295#ifndef	__AARCH64EB__
296	rev	w12,w12			// 9
297#endif
298	ldp	w13,w14,[x1],#2*4
299	add	w27,w27,w17			// h+=Sigma0(a)
300	ror	w16,w23,#6
301	add	w26,w26,w28			// h+=K[i]
302	eor	w15,w23,w23,ror#14
303	and	w17,w24,w23
304	bic	w28,w25,w23
305	add	w26,w26,w12			// h+=X[i]
306	orr	w17,w17,w28			// Ch(e,f,g)
307	eor	w28,w27,w20			// a^b, b^c in next round
308	eor	w16,w16,w15,ror#11	// Sigma1(e)
309	ror	w15,w27,#2
310	add	w26,w26,w17			// h+=Ch(e,f,g)
311	eor	w17,w27,w27,ror#9
312	add	w26,w26,w16			// h+=Sigma1(e)
313	and	w19,w19,w28			// (b^c)&=(a^b)
314	add	w22,w22,w26			// d+=h
315	eor	w19,w19,w20			// Maj(a,b,c)
316	eor	w17,w15,w17,ror#13	// Sigma0(a)
317	add	w26,w26,w19			// h+=Maj(a,b,c)
318	ldr	w19,[x30],#4		// *K++, w28 in next round
319	//add	w26,w26,w17			// h+=Sigma0(a)
320#ifndef	__AARCH64EB__
321	rev	w13,w13			// 10
322#endif
323	add	w26,w26,w17			// h+=Sigma0(a)
324	ror	w16,w22,#6
325	add	w25,w25,w19			// h+=K[i]
326	eor	w0,w22,w22,ror#14
327	and	w17,w23,w22
328	bic	w19,w24,w22
329	add	w25,w25,w13			// h+=X[i]
330	orr	w17,w17,w19			// Ch(e,f,g)
331	eor	w19,w26,w27			// a^b, b^c in next round
332	eor	w16,w16,w0,ror#11	// Sigma1(e)
333	ror	w0,w26,#2
334	add	w25,w25,w17			// h+=Ch(e,f,g)
335	eor	w17,w26,w26,ror#9
336	add	w25,w25,w16			// h+=Sigma1(e)
337	and	w28,w28,w19			// (b^c)&=(a^b)
338	add	w21,w21,w25			// d+=h
339	eor	w28,w28,w27			// Maj(a,b,c)
340	eor	w17,w0,w17,ror#13	// Sigma0(a)
341	add	w25,w25,w28			// h+=Maj(a,b,c)
342	ldr	w28,[x30],#4		// *K++, w19 in next round
343	//add	w25,w25,w17			// h+=Sigma0(a)
344#ifndef	__AARCH64EB__
345	rev	w14,w14			// 11
346#endif
347	ldp	w15,w0,[x1],#2*4
348	add	w25,w25,w17			// h+=Sigma0(a)
349	str	w6,[sp,#12]
350	ror	w16,w21,#6
351	add	w24,w24,w28			// h+=K[i]
352	eor	w6,w21,w21,ror#14
353	and	w17,w22,w21
354	bic	w28,w23,w21
355	add	w24,w24,w14			// h+=X[i]
356	orr	w17,w17,w28			// Ch(e,f,g)
357	eor	w28,w25,w26			// a^b, b^c in next round
358	eor	w16,w16,w6,ror#11	// Sigma1(e)
359	ror	w6,w25,#2
360	add	w24,w24,w17			// h+=Ch(e,f,g)
361	eor	w17,w25,w25,ror#9
362	add	w24,w24,w16			// h+=Sigma1(e)
363	and	w19,w19,w28			// (b^c)&=(a^b)
364	add	w20,w20,w24			// d+=h
365	eor	w19,w19,w26			// Maj(a,b,c)
366	eor	w17,w6,w17,ror#13	// Sigma0(a)
367	add	w24,w24,w19			// h+=Maj(a,b,c)
368	ldr	w19,[x30],#4		// *K++, w28 in next round
369	//add	w24,w24,w17			// h+=Sigma0(a)
370#ifndef	__AARCH64EB__
371	rev	w15,w15			// 12
372#endif
373	add	w24,w24,w17			// h+=Sigma0(a)
374	str	w7,[sp,#0]
375	ror	w16,w20,#6
376	add	w23,w23,w19			// h+=K[i]
377	eor	w7,w20,w20,ror#14
378	and	w17,w21,w20
379	bic	w19,w22,w20
380	add	w23,w23,w15			// h+=X[i]
381	orr	w17,w17,w19			// Ch(e,f,g)
382	eor	w19,w24,w25			// a^b, b^c in next round
383	eor	w16,w16,w7,ror#11	// Sigma1(e)
384	ror	w7,w24,#2
385	add	w23,w23,w17			// h+=Ch(e,f,g)
386	eor	w17,w24,w24,ror#9
387	add	w23,w23,w16			// h+=Sigma1(e)
388	and	w28,w28,w19			// (b^c)&=(a^b)
389	add	w27,w27,w23			// d+=h
390	eor	w28,w28,w25			// Maj(a,b,c)
391	eor	w17,w7,w17,ror#13	// Sigma0(a)
392	add	w23,w23,w28			// h+=Maj(a,b,c)
393	ldr	w28,[x30],#4		// *K++, w19 in next round
394	//add	w23,w23,w17			// h+=Sigma0(a)
395#ifndef	__AARCH64EB__
396	rev	w0,w0			// 13
397#endif
398	ldp	w1,w2,[x1]
399	add	w23,w23,w17			// h+=Sigma0(a)
400	str	w8,[sp,#4]
401	ror	w16,w27,#6
402	add	w22,w22,w28			// h+=K[i]
403	eor	w8,w27,w27,ror#14
404	and	w17,w20,w27
405	bic	w28,w21,w27
406	add	w22,w22,w0			// h+=X[i]
407	orr	w17,w17,w28			// Ch(e,f,g)
408	eor	w28,w23,w24			// a^b, b^c in next round
409	eor	w16,w16,w8,ror#11	// Sigma1(e)
410	ror	w8,w23,#2
411	add	w22,w22,w17			// h+=Ch(e,f,g)
412	eor	w17,w23,w23,ror#9
413	add	w22,w22,w16			// h+=Sigma1(e)
414	and	w19,w19,w28			// (b^c)&=(a^b)
415	add	w26,w26,w22			// d+=h
416	eor	w19,w19,w24			// Maj(a,b,c)
417	eor	w17,w8,w17,ror#13	// Sigma0(a)
418	add	w22,w22,w19			// h+=Maj(a,b,c)
419	ldr	w19,[x30],#4		// *K++, w28 in next round
420	//add	w22,w22,w17			// h+=Sigma0(a)
421#ifndef	__AARCH64EB__
422	rev	w1,w1			// 14
423#endif
424	ldr	w6,[sp,#12]
425	add	w22,w22,w17			// h+=Sigma0(a)
426	str	w9,[sp,#8]
427	ror	w16,w26,#6
428	add	w21,w21,w19			// h+=K[i]
429	eor	w9,w26,w26,ror#14
430	and	w17,w27,w26
431	bic	w19,w20,w26
432	add	w21,w21,w1			// h+=X[i]
433	orr	w17,w17,w19			// Ch(e,f,g)
434	eor	w19,w22,w23			// a^b, b^c in next round
435	eor	w16,w16,w9,ror#11	// Sigma1(e)
436	ror	w9,w22,#2
437	add	w21,w21,w17			// h+=Ch(e,f,g)
438	eor	w17,w22,w22,ror#9
439	add	w21,w21,w16			// h+=Sigma1(e)
440	and	w28,w28,w19			// (b^c)&=(a^b)
441	add	w25,w25,w21			// d+=h
442	eor	w28,w28,w23			// Maj(a,b,c)
443	eor	w17,w9,w17,ror#13	// Sigma0(a)
444	add	w21,w21,w28			// h+=Maj(a,b,c)
445	ldr	w28,[x30],#4		// *K++, w19 in next round
446	//add	w21,w21,w17			// h+=Sigma0(a)
447#ifndef	__AARCH64EB__
448	rev	w2,w2			// 15
449#endif
450	ldr	w7,[sp,#0]
451	add	w21,w21,w17			// h+=Sigma0(a)
452	str	w10,[sp,#12]
453	ror	w16,w25,#6
454	add	w20,w20,w28			// h+=K[i]
455	ror	w9,w4,#7
456	and	w17,w26,w25
457	ror	w8,w1,#17
458	bic	w28,w27,w25
459	ror	w10,w21,#2
460	add	w20,w20,w2			// h+=X[i]
461	eor	w16,w16,w25,ror#11
462	eor	w9,w9,w4,ror#18
463	orr	w17,w17,w28			// Ch(e,f,g)
464	eor	w28,w21,w22			// a^b, b^c in next round
465	eor	w16,w16,w25,ror#25	// Sigma1(e)
466	eor	w10,w10,w21,ror#13
467	add	w20,w20,w17			// h+=Ch(e,f,g)
468	and	w19,w19,w28			// (b^c)&=(a^b)
469	eor	w8,w8,w1,ror#19
470	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
471	add	w20,w20,w16			// h+=Sigma1(e)
472	eor	w19,w19,w22			// Maj(a,b,c)
473	eor	w17,w10,w21,ror#22	// Sigma0(a)
474	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
475	add	w3,w3,w12
476	add	w24,w24,w20			// d+=h
477	add	w20,w20,w19			// h+=Maj(a,b,c)
478	ldr	w19,[x30],#4		// *K++, w28 in next round
479	add	w3,w3,w9
480	add	w20,w20,w17			// h+=Sigma0(a)
481	add	w3,w3,w8
482.Loop_16_xx:
483	ldr	w8,[sp,#4]
484	str	w11,[sp,#0]
485	ror	w16,w24,#6
486	add	w27,w27,w19			// h+=K[i]
487	ror	w10,w5,#7
488	and	w17,w25,w24
489	ror	w9,w2,#17
490	bic	w19,w26,w24
491	ror	w11,w20,#2
492	add	w27,w27,w3			// h+=X[i]
493	eor	w16,w16,w24,ror#11
494	eor	w10,w10,w5,ror#18
495	orr	w17,w17,w19			// Ch(e,f,g)
496	eor	w19,w20,w21			// a^b, b^c in next round
497	eor	w16,w16,w24,ror#25	// Sigma1(e)
498	eor	w11,w11,w20,ror#13
499	add	w27,w27,w17			// h+=Ch(e,f,g)
500	and	w28,w28,w19			// (b^c)&=(a^b)
501	eor	w9,w9,w2,ror#19
502	eor	w10,w10,w5,lsr#3	// sigma0(X[i+1])
503	add	w27,w27,w16			// h+=Sigma1(e)
504	eor	w28,w28,w21			// Maj(a,b,c)
505	eor	w17,w11,w20,ror#22	// Sigma0(a)
506	eor	w9,w9,w2,lsr#10	// sigma1(X[i+14])
507	add	w4,w4,w13
508	add	w23,w23,w27			// d+=h
509	add	w27,w27,w28			// h+=Maj(a,b,c)
510	ldr	w28,[x30],#4		// *K++, w19 in next round
511	add	w4,w4,w10
512	add	w27,w27,w17			// h+=Sigma0(a)
513	add	w4,w4,w9
514	ldr	w9,[sp,#8]
515	str	w12,[sp,#4]
516	ror	w16,w23,#6
517	add	w26,w26,w28			// h+=K[i]
518	ror	w11,w6,#7
519	and	w17,w24,w23
520	ror	w10,w3,#17
521	bic	w28,w25,w23
522	ror	w12,w27,#2
523	add	w26,w26,w4			// h+=X[i]
524	eor	w16,w16,w23,ror#11
525	eor	w11,w11,w6,ror#18
526	orr	w17,w17,w28			// Ch(e,f,g)
527	eor	w28,w27,w20			// a^b, b^c in next round
528	eor	w16,w16,w23,ror#25	// Sigma1(e)
529	eor	w12,w12,w27,ror#13
530	add	w26,w26,w17			// h+=Ch(e,f,g)
531	and	w19,w19,w28			// (b^c)&=(a^b)
532	eor	w10,w10,w3,ror#19
533	eor	w11,w11,w6,lsr#3	// sigma0(X[i+1])
534	add	w26,w26,w16			// h+=Sigma1(e)
535	eor	w19,w19,w20			// Maj(a,b,c)
536	eor	w17,w12,w27,ror#22	// Sigma0(a)
537	eor	w10,w10,w3,lsr#10	// sigma1(X[i+14])
538	add	w5,w5,w14
539	add	w22,w22,w26			// d+=h
540	add	w26,w26,w19			// h+=Maj(a,b,c)
541	ldr	w19,[x30],#4		// *K++, w28 in next round
542	add	w5,w5,w11
543	add	w26,w26,w17			// h+=Sigma0(a)
544	add	w5,w5,w10
545	ldr	w10,[sp,#12]
546	str	w13,[sp,#8]
547	ror	w16,w22,#6
548	add	w25,w25,w19			// h+=K[i]
549	ror	w12,w7,#7
550	and	w17,w23,w22
551	ror	w11,w4,#17
552	bic	w19,w24,w22
553	ror	w13,w26,#2
554	add	w25,w25,w5			// h+=X[i]
555	eor	w16,w16,w22,ror#11
556	eor	w12,w12,w7,ror#18
557	orr	w17,w17,w19			// Ch(e,f,g)
558	eor	w19,w26,w27			// a^b, b^c in next round
559	eor	w16,w16,w22,ror#25	// Sigma1(e)
560	eor	w13,w13,w26,ror#13
561	add	w25,w25,w17			// h+=Ch(e,f,g)
562	and	w28,w28,w19			// (b^c)&=(a^b)
563	eor	w11,w11,w4,ror#19
564	eor	w12,w12,w7,lsr#3	// sigma0(X[i+1])
565	add	w25,w25,w16			// h+=Sigma1(e)
566	eor	w28,w28,w27			// Maj(a,b,c)
567	eor	w17,w13,w26,ror#22	// Sigma0(a)
568	eor	w11,w11,w4,lsr#10	// sigma1(X[i+14])
569	add	w6,w6,w15
570	add	w21,w21,w25			// d+=h
571	add	w25,w25,w28			// h+=Maj(a,b,c)
572	ldr	w28,[x30],#4		// *K++, w19 in next round
573	add	w6,w6,w12
574	add	w25,w25,w17			// h+=Sigma0(a)
575	add	w6,w6,w11
576	ldr	w11,[sp,#0]
577	str	w14,[sp,#12]
578	ror	w16,w21,#6
579	add	w24,w24,w28			// h+=K[i]
580	ror	w13,w8,#7
581	and	w17,w22,w21
582	ror	w12,w5,#17
583	bic	w28,w23,w21
584	ror	w14,w25,#2
585	add	w24,w24,w6			// h+=X[i]
586	eor	w16,w16,w21,ror#11
587	eor	w13,w13,w8,ror#18
588	orr	w17,w17,w28			// Ch(e,f,g)
589	eor	w28,w25,w26			// a^b, b^c in next round
590	eor	w16,w16,w21,ror#25	// Sigma1(e)
591	eor	w14,w14,w25,ror#13
592	add	w24,w24,w17			// h+=Ch(e,f,g)
593	and	w19,w19,w28			// (b^c)&=(a^b)
594	eor	w12,w12,w5,ror#19
595	eor	w13,w13,w8,lsr#3	// sigma0(X[i+1])
596	add	w24,w24,w16			// h+=Sigma1(e)
597	eor	w19,w19,w26			// Maj(a,b,c)
598	eor	w17,w14,w25,ror#22	// Sigma0(a)
599	eor	w12,w12,w5,lsr#10	// sigma1(X[i+14])
600	add	w7,w7,w0
601	add	w20,w20,w24			// d+=h
602	add	w24,w24,w19			// h+=Maj(a,b,c)
603	ldr	w19,[x30],#4		// *K++, w28 in next round
604	add	w7,w7,w13
605	add	w24,w24,w17			// h+=Sigma0(a)
606	add	w7,w7,w12
607	ldr	w12,[sp,#4]
608	str	w15,[sp,#0]
609	ror	w16,w20,#6
610	add	w23,w23,w19			// h+=K[i]
611	ror	w14,w9,#7
612	and	w17,w21,w20
613	ror	w13,w6,#17
614	bic	w19,w22,w20
615	ror	w15,w24,#2
616	add	w23,w23,w7			// h+=X[i]
617	eor	w16,w16,w20,ror#11
618	eor	w14,w14,w9,ror#18
619	orr	w17,w17,w19			// Ch(e,f,g)
620	eor	w19,w24,w25			// a^b, b^c in next round
621	eor	w16,w16,w20,ror#25	// Sigma1(e)
622	eor	w15,w15,w24,ror#13
623	add	w23,w23,w17			// h+=Ch(e,f,g)
624	and	w28,w28,w19			// (b^c)&=(a^b)
625	eor	w13,w13,w6,ror#19
626	eor	w14,w14,w9,lsr#3	// sigma0(X[i+1])
627	add	w23,w23,w16			// h+=Sigma1(e)
628	eor	w28,w28,w25			// Maj(a,b,c)
629	eor	w17,w15,w24,ror#22	// Sigma0(a)
630	eor	w13,w13,w6,lsr#10	// sigma1(X[i+14])
631	add	w8,w8,w1
632	add	w27,w27,w23			// d+=h
633	add	w23,w23,w28			// h+=Maj(a,b,c)
634	ldr	w28,[x30],#4		// *K++, w19 in next round
635	add	w8,w8,w14
636	add	w23,w23,w17			// h+=Sigma0(a)
637	add	w8,w8,w13
638	ldr	w13,[sp,#8]
639	str	w0,[sp,#4]
640	ror	w16,w27,#6
641	add	w22,w22,w28			// h+=K[i]
642	ror	w15,w10,#7
643	and	w17,w20,w27
644	ror	w14,w7,#17
645	bic	w28,w21,w27
646	ror	w0,w23,#2
647	add	w22,w22,w8			// h+=X[i]
648	eor	w16,w16,w27,ror#11
649	eor	w15,w15,w10,ror#18
650	orr	w17,w17,w28			// Ch(e,f,g)
651	eor	w28,w23,w24			// a^b, b^c in next round
652	eor	w16,w16,w27,ror#25	// Sigma1(e)
653	eor	w0,w0,w23,ror#13
654	add	w22,w22,w17			// h+=Ch(e,f,g)
655	and	w19,w19,w28			// (b^c)&=(a^b)
656	eor	w14,w14,w7,ror#19
657	eor	w15,w15,w10,lsr#3	// sigma0(X[i+1])
658	add	w22,w22,w16			// h+=Sigma1(e)
659	eor	w19,w19,w24			// Maj(a,b,c)
660	eor	w17,w0,w23,ror#22	// Sigma0(a)
661	eor	w14,w14,w7,lsr#10	// sigma1(X[i+14])
662	add	w9,w9,w2
663	add	w26,w26,w22			// d+=h
664	add	w22,w22,w19			// h+=Maj(a,b,c)
665	ldr	w19,[x30],#4		// *K++, w28 in next round
666	add	w9,w9,w15
667	add	w22,w22,w17			// h+=Sigma0(a)
668	add	w9,w9,w14
669	ldr	w14,[sp,#12]
670	str	w1,[sp,#8]
671	ror	w16,w26,#6
672	add	w21,w21,w19			// h+=K[i]
673	ror	w0,w11,#7
674	and	w17,w27,w26
675	ror	w15,w8,#17
676	bic	w19,w20,w26
677	ror	w1,w22,#2
678	add	w21,w21,w9			// h+=X[i]
679	eor	w16,w16,w26,ror#11
680	eor	w0,w0,w11,ror#18
681	orr	w17,w17,w19			// Ch(e,f,g)
682	eor	w19,w22,w23			// a^b, b^c in next round
683	eor	w16,w16,w26,ror#25	// Sigma1(e)
684	eor	w1,w1,w22,ror#13
685	add	w21,w21,w17			// h+=Ch(e,f,g)
686	and	w28,w28,w19			// (b^c)&=(a^b)
687	eor	w15,w15,w8,ror#19
688	eor	w0,w0,w11,lsr#3	// sigma0(X[i+1])
689	add	w21,w21,w16			// h+=Sigma1(e)
690	eor	w28,w28,w23			// Maj(a,b,c)
691	eor	w17,w1,w22,ror#22	// Sigma0(a)
692	eor	w15,w15,w8,lsr#10	// sigma1(X[i+14])
693	add	w10,w10,w3
694	add	w25,w25,w21			// d+=h
695	add	w21,w21,w28			// h+=Maj(a,b,c)
696	ldr	w28,[x30],#4		// *K++, w19 in next round
697	add	w10,w10,w0
698	add	w21,w21,w17			// h+=Sigma0(a)
699	add	w10,w10,w15
700	ldr	w15,[sp,#0]
701	str	w2,[sp,#12]
702	ror	w16,w25,#6
703	add	w20,w20,w28			// h+=K[i]
704	ror	w1,w12,#7
705	and	w17,w26,w25
706	ror	w0,w9,#17
707	bic	w28,w27,w25
708	ror	w2,w21,#2
709	add	w20,w20,w10			// h+=X[i]
710	eor	w16,w16,w25,ror#11
711	eor	w1,w1,w12,ror#18
712	orr	w17,w17,w28			// Ch(e,f,g)
713	eor	w28,w21,w22			// a^b, b^c in next round
714	eor	w16,w16,w25,ror#25	// Sigma1(e)
715	eor	w2,w2,w21,ror#13
716	add	w20,w20,w17			// h+=Ch(e,f,g)
717	and	w19,w19,w28			// (b^c)&=(a^b)
718	eor	w0,w0,w9,ror#19
719	eor	w1,w1,w12,lsr#3	// sigma0(X[i+1])
720	add	w20,w20,w16			// h+=Sigma1(e)
721	eor	w19,w19,w22			// Maj(a,b,c)
722	eor	w17,w2,w21,ror#22	// Sigma0(a)
723	eor	w0,w0,w9,lsr#10	// sigma1(X[i+14])
724	add	w11,w11,w4
725	add	w24,w24,w20			// d+=h
726	add	w20,w20,w19			// h+=Maj(a,b,c)
727	ldr	w19,[x30],#4		// *K++, w28 in next round
728	add	w11,w11,w1
729	add	w20,w20,w17			// h+=Sigma0(a)
730	add	w11,w11,w0
731	ldr	w0,[sp,#4]
732	str	w3,[sp,#0]
733	ror	w16,w24,#6
734	add	w27,w27,w19			// h+=K[i]
735	ror	w2,w13,#7
736	and	w17,w25,w24
737	ror	w1,w10,#17
738	bic	w19,w26,w24
739	ror	w3,w20,#2
740	add	w27,w27,w11			// h+=X[i]
741	eor	w16,w16,w24,ror#11
742	eor	w2,w2,w13,ror#18
743	orr	w17,w17,w19			// Ch(e,f,g)
744	eor	w19,w20,w21			// a^b, b^c in next round
745	eor	w16,w16,w24,ror#25	// Sigma1(e)
746	eor	w3,w3,w20,ror#13
747	add	w27,w27,w17			// h+=Ch(e,f,g)
748	and	w28,w28,w19			// (b^c)&=(a^b)
749	eor	w1,w1,w10,ror#19
750	eor	w2,w2,w13,lsr#3	// sigma0(X[i+1])
751	add	w27,w27,w16			// h+=Sigma1(e)
752	eor	w28,w28,w21			// Maj(a,b,c)
753	eor	w17,w3,w20,ror#22	// Sigma0(a)
754	eor	w1,w1,w10,lsr#10	// sigma1(X[i+14])
755	add	w12,w12,w5
756	add	w23,w23,w27			// d+=h
757	add	w27,w27,w28			// h+=Maj(a,b,c)
758	ldr	w28,[x30],#4		// *K++, w19 in next round
759	add	w12,w12,w2
760	add	w27,w27,w17			// h+=Sigma0(a)
761	add	w12,w12,w1
762	ldr	w1,[sp,#8]
763	str	w4,[sp,#4]
764	ror	w16,w23,#6
765	add	w26,w26,w28			// h+=K[i]
766	ror	w3,w14,#7
767	and	w17,w24,w23
768	ror	w2,w11,#17
769	bic	w28,w25,w23
770	ror	w4,w27,#2
771	add	w26,w26,w12			// h+=X[i]
772	eor	w16,w16,w23,ror#11
773	eor	w3,w3,w14,ror#18
774	orr	w17,w17,w28			// Ch(e,f,g)
775	eor	w28,w27,w20			// a^b, b^c in next round
776	eor	w16,w16,w23,ror#25	// Sigma1(e)
777	eor	w4,w4,w27,ror#13
778	add	w26,w26,w17			// h+=Ch(e,f,g)
779	and	w19,w19,w28			// (b^c)&=(a^b)
780	eor	w2,w2,w11,ror#19
781	eor	w3,w3,w14,lsr#3	// sigma0(X[i+1])
782	add	w26,w26,w16			// h+=Sigma1(e)
783	eor	w19,w19,w20			// Maj(a,b,c)
784	eor	w17,w4,w27,ror#22	// Sigma0(a)
785	eor	w2,w2,w11,lsr#10	// sigma1(X[i+14])
786	add	w13,w13,w6
787	add	w22,w22,w26			// d+=h
788	add	w26,w26,w19			// h+=Maj(a,b,c)
789	ldr	w19,[x30],#4		// *K++, w28 in next round
790	add	w13,w13,w3
791	add	w26,w26,w17			// h+=Sigma0(a)
792	add	w13,w13,w2
793	ldr	w2,[sp,#12]
794	str	w5,[sp,#8]
795	ror	w16,w22,#6
796	add	w25,w25,w19			// h+=K[i]
797	ror	w4,w15,#7
798	and	w17,w23,w22
799	ror	w3,w12,#17
800	bic	w19,w24,w22
801	ror	w5,w26,#2
802	add	w25,w25,w13			// h+=X[i]
803	eor	w16,w16,w22,ror#11
804	eor	w4,w4,w15,ror#18
805	orr	w17,w17,w19			// Ch(e,f,g)
806	eor	w19,w26,w27			// a^b, b^c in next round
807	eor	w16,w16,w22,ror#25	// Sigma1(e)
808	eor	w5,w5,w26,ror#13
809	add	w25,w25,w17			// h+=Ch(e,f,g)
810	and	w28,w28,w19			// (b^c)&=(a^b)
811	eor	w3,w3,w12,ror#19
812	eor	w4,w4,w15,lsr#3	// sigma0(X[i+1])
813	add	w25,w25,w16			// h+=Sigma1(e)
814	eor	w28,w28,w27			// Maj(a,b,c)
815	eor	w17,w5,w26,ror#22	// Sigma0(a)
816	eor	w3,w3,w12,lsr#10	// sigma1(X[i+14])
817	add	w14,w14,w7
818	add	w21,w21,w25			// d+=h
819	add	w25,w25,w28			// h+=Maj(a,b,c)
820	ldr	w28,[x30],#4		// *K++, w19 in next round
821	add	w14,w14,w4
822	add	w25,w25,w17			// h+=Sigma0(a)
823	add	w14,w14,w3
824	ldr	w3,[sp,#0]
825	str	w6,[sp,#12]
826	ror	w16,w21,#6
827	add	w24,w24,w28			// h+=K[i]
828	ror	w5,w0,#7
829	and	w17,w22,w21
830	ror	w4,w13,#17
831	bic	w28,w23,w21
832	ror	w6,w25,#2
833	add	w24,w24,w14			// h+=X[i]
834	eor	w16,w16,w21,ror#11
835	eor	w5,w5,w0,ror#18
836	orr	w17,w17,w28			// Ch(e,f,g)
837	eor	w28,w25,w26			// a^b, b^c in next round
838	eor	w16,w16,w21,ror#25	// Sigma1(e)
839	eor	w6,w6,w25,ror#13
840	add	w24,w24,w17			// h+=Ch(e,f,g)
841	and	w19,w19,w28			// (b^c)&=(a^b)
842	eor	w4,w4,w13,ror#19
843	eor	w5,w5,w0,lsr#3	// sigma0(X[i+1])
844	add	w24,w24,w16			// h+=Sigma1(e)
845	eor	w19,w19,w26			// Maj(a,b,c)
846	eor	w17,w6,w25,ror#22	// Sigma0(a)
847	eor	w4,w4,w13,lsr#10	// sigma1(X[i+14])
848	add	w15,w15,w8
849	add	w20,w20,w24			// d+=h
850	add	w24,w24,w19			// h+=Maj(a,b,c)
851	ldr	w19,[x30],#4		// *K++, w28 in next round
852	add	w15,w15,w5
853	add	w24,w24,w17			// h+=Sigma0(a)
854	add	w15,w15,w4
855	ldr	w4,[sp,#4]
856	str	w7,[sp,#0]
857	ror	w16,w20,#6
858	add	w23,w23,w19			// h+=K[i]
859	ror	w6,w1,#7
860	and	w17,w21,w20
861	ror	w5,w14,#17
862	bic	w19,w22,w20
863	ror	w7,w24,#2
864	add	w23,w23,w15			// h+=X[i]
865	eor	w16,w16,w20,ror#11
866	eor	w6,w6,w1,ror#18
867	orr	w17,w17,w19			// Ch(e,f,g)
868	eor	w19,w24,w25			// a^b, b^c in next round
869	eor	w16,w16,w20,ror#25	// Sigma1(e)
870	eor	w7,w7,w24,ror#13
871	add	w23,w23,w17			// h+=Ch(e,f,g)
872	and	w28,w28,w19			// (b^c)&=(a^b)
873	eor	w5,w5,w14,ror#19
874	eor	w6,w6,w1,lsr#3	// sigma0(X[i+1])
875	add	w23,w23,w16			// h+=Sigma1(e)
876	eor	w28,w28,w25			// Maj(a,b,c)
877	eor	w17,w7,w24,ror#22	// Sigma0(a)
878	eor	w5,w5,w14,lsr#10	// sigma1(X[i+14])
879	add	w0,w0,w9
880	add	w27,w27,w23			// d+=h
881	add	w23,w23,w28			// h+=Maj(a,b,c)
882	ldr	w28,[x30],#4		// *K++, w19 in next round
883	add	w0,w0,w6
884	add	w23,w23,w17			// h+=Sigma0(a)
885	add	w0,w0,w5
886	ldr	w5,[sp,#8]
887	str	w8,[sp,#4]
888	ror	w16,w27,#6
889	add	w22,w22,w28			// h+=K[i]
890	ror	w7,w2,#7
891	and	w17,w20,w27
892	ror	w6,w15,#17
893	bic	w28,w21,w27
894	ror	w8,w23,#2
895	add	w22,w22,w0			// h+=X[i]
896	eor	w16,w16,w27,ror#11
897	eor	w7,w7,w2,ror#18
898	orr	w17,w17,w28			// Ch(e,f,g)
899	eor	w28,w23,w24			// a^b, b^c in next round
900	eor	w16,w16,w27,ror#25	// Sigma1(e)
901	eor	w8,w8,w23,ror#13
902	add	w22,w22,w17			// h+=Ch(e,f,g)
903	and	w19,w19,w28			// (b^c)&=(a^b)
904	eor	w6,w6,w15,ror#19
905	eor	w7,w7,w2,lsr#3	// sigma0(X[i+1])
906	add	w22,w22,w16			// h+=Sigma1(e)
907	eor	w19,w19,w24			// Maj(a,b,c)
908	eor	w17,w8,w23,ror#22	// Sigma0(a)
909	eor	w6,w6,w15,lsr#10	// sigma1(X[i+14])
910	add	w1,w1,w10
911	add	w26,w26,w22			// d+=h
912	add	w22,w22,w19			// h+=Maj(a,b,c)
913	ldr	w19,[x30],#4		// *K++, w28 in next round
914	add	w1,w1,w7
915	add	w22,w22,w17			// h+=Sigma0(a)
916	add	w1,w1,w6
917	ldr	w6,[sp,#12]
918	str	w9,[sp,#8]
919	ror	w16,w26,#6
920	add	w21,w21,w19			// h+=K[i]
921	ror	w8,w3,#7
922	and	w17,w27,w26
923	ror	w7,w0,#17
924	bic	w19,w20,w26
925	ror	w9,w22,#2
926	add	w21,w21,w1			// h+=X[i]
927	eor	w16,w16,w26,ror#11
928	eor	w8,w8,w3,ror#18
929	orr	w17,w17,w19			// Ch(e,f,g)
930	eor	w19,w22,w23			// a^b, b^c in next round
931	eor	w16,w16,w26,ror#25	// Sigma1(e)
932	eor	w9,w9,w22,ror#13
933	add	w21,w21,w17			// h+=Ch(e,f,g)
934	and	w28,w28,w19			// (b^c)&=(a^b)
935	eor	w7,w7,w0,ror#19
936	eor	w8,w8,w3,lsr#3	// sigma0(X[i+1])
937	add	w21,w21,w16			// h+=Sigma1(e)
938	eor	w28,w28,w23			// Maj(a,b,c)
939	eor	w17,w9,w22,ror#22	// Sigma0(a)
940	eor	w7,w7,w0,lsr#10	// sigma1(X[i+14])
941	add	w2,w2,w11
942	add	w25,w25,w21			// d+=h
943	add	w21,w21,w28			// h+=Maj(a,b,c)
944	ldr	w28,[x30],#4		// *K++, w19 in next round
945	add	w2,w2,w8
946	add	w21,w21,w17			// h+=Sigma0(a)
947	add	w2,w2,w7
948	ldr	w7,[sp,#0]
949	str	w10,[sp,#12]
950	ror	w16,w25,#6
951	add	w20,w20,w28			// h+=K[i]
952	ror	w9,w4,#7
953	and	w17,w26,w25
954	ror	w8,w1,#17
955	bic	w28,w27,w25
956	ror	w10,w21,#2
957	add	w20,w20,w2			// h+=X[i]
958	eor	w16,w16,w25,ror#11
959	eor	w9,w9,w4,ror#18
960	orr	w17,w17,w28			// Ch(e,f,g)
961	eor	w28,w21,w22			// a^b, b^c in next round
962	eor	w16,w16,w25,ror#25	// Sigma1(e)
963	eor	w10,w10,w21,ror#13
964	add	w20,w20,w17			// h+=Ch(e,f,g)
965	and	w19,w19,w28			// (b^c)&=(a^b)
966	eor	w8,w8,w1,ror#19
967	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
968	add	w20,w20,w16			// h+=Sigma1(e)
969	eor	w19,w19,w22			// Maj(a,b,c)
970	eor	w17,w10,w21,ror#22	// Sigma0(a)
971	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
972	add	w3,w3,w12
973	add	w24,w24,w20			// d+=h
974	add	w20,w20,w19			// h+=Maj(a,b,c)
975	ldr	w19,[x30],#4		// *K++, w28 in next round
976	add	w3,w3,w9
977	add	w20,w20,w17			// h+=Sigma0(a)
978	add	w3,w3,w8
979	cbnz	w19,.Loop_16_xx
980
981	ldp	x0,x2,[x29,#96]
982	ldr	x1,[x29,#112]
983	sub	x30,x30,#260		// rewind
984
985	ldp	w3,w4,[x0]
986	ldp	w5,w6,[x0,#2*4]
987	add	x1,x1,#14*4			// advance input pointer
988	ldp	w7,w8,[x0,#4*4]
989	add	w20,w20,w3
990	ldp	w9,w10,[x0,#6*4]
991	add	w21,w21,w4
992	add	w22,w22,w5
993	add	w23,w23,w6
994	stp	w20,w21,[x0]
995	add	w24,w24,w7
996	add	w25,w25,w8
997	stp	w22,w23,[x0,#2*4]
998	add	w26,w26,w9
999	add	w27,w27,w10
1000	cmp	x1,x2
1001	stp	w24,w25,[x0,#4*4]
1002	stp	w26,w27,[x0,#6*4]
1003	b.ne	.Loop
1004
1005	ldp	x19,x20,[x29,#16]
1006	add	sp,sp,#4*4
1007	ldp	x21,x22,[x29,#32]
1008	ldp	x23,x24,[x29,#48]
1009	ldp	x25,x26,[x29,#64]
1010	ldp	x27,x28,[x29,#80]
1011	ldp	x29,x30,[sp],#128
1012	ret
1013.size	zfs_sha256_block_armv7,.-zfs_sha256_block_armv7
1014
1015.globl	zfs_sha256_block_armv8
1016.type	zfs_sha256_block_armv8,%function
1017.align	6
1018zfs_sha256_block_armv8:
1019	hint		#34				// bti c
1020.Lv8_entry:
1021	stp		x29,x30,[sp,#-16]!
1022	add		x29,sp,#0
1023
1024	ld1		{v0.4s,v1.4s},[x0]
1025	adr		x3,.LK256
1026
1027.Loop_hw:
1028	ld1		{v4.16b-v7.16b},[x1],#64
1029	sub		x2,x2,#1
1030	ld1		{v16.4s},[x3],#16
1031	rev32		v4.16b,v4.16b
1032	rev32		v5.16b,v5.16b
1033	rev32		v6.16b,v6.16b
1034	rev32		v7.16b,v7.16b
1035	orr		v18.16b,v0.16b,v0.16b		// offload
1036	orr		v19.16b,v1.16b,v1.16b
1037	ld1		{v17.4s},[x3],#16
1038	add		v16.4s,v16.4s,v4.4s
1039	.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1040	orr		v2.16b,v0.16b,v0.16b
1041	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1042	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1043	.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1044	ld1		{v16.4s},[x3],#16
1045	add		v17.4s,v17.4s,v5.4s
1046	.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1047	orr		v2.16b,v0.16b,v0.16b
1048	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1049	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1050	.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1051	ld1		{v17.4s},[x3],#16
1052	add		v16.4s,v16.4s,v6.4s
1053	.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1054	orr		v2.16b,v0.16b,v0.16b
1055	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1056	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1057	.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1058	ld1		{v16.4s},[x3],#16
1059	add		v17.4s,v17.4s,v7.4s
1060	.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1061	orr		v2.16b,v0.16b,v0.16b
1062	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1063	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1064	.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1065	ld1		{v17.4s},[x3],#16
1066	add		v16.4s,v16.4s,v4.4s
1067	.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1068	orr		v2.16b,v0.16b,v0.16b
1069	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1070	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1071	.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1072	ld1		{v16.4s},[x3],#16
1073	add		v17.4s,v17.4s,v5.4s
1074	.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1075	orr		v2.16b,v0.16b,v0.16b
1076	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1077	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1078	.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1079	ld1		{v17.4s},[x3],#16
1080	add		v16.4s,v16.4s,v6.4s
1081	.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1082	orr		v2.16b,v0.16b,v0.16b
1083	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1084	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1085	.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1086	ld1		{v16.4s},[x3],#16
1087	add		v17.4s,v17.4s,v7.4s
1088	.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1089	orr		v2.16b,v0.16b,v0.16b
1090	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1091	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1092	.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1093	ld1		{v17.4s},[x3],#16
1094	add		v16.4s,v16.4s,v4.4s
1095	.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1096	orr		v2.16b,v0.16b,v0.16b
1097	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1098	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1099	.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1100	ld1		{v16.4s},[x3],#16
1101	add		v17.4s,v17.4s,v5.4s
1102	.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1103	orr		v2.16b,v0.16b,v0.16b
1104	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1105	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1106	.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1107	ld1		{v17.4s},[x3],#16
1108	add		v16.4s,v16.4s,v6.4s
1109	.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1110	orr		v2.16b,v0.16b,v0.16b
1111	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1112	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1113	.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1114	ld1		{v16.4s},[x3],#16
1115	add		v17.4s,v17.4s,v7.4s
1116	.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1117	orr		v2.16b,v0.16b,v0.16b
1118	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1119	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1120	.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1121	ld1		{v17.4s},[x3],#16
1122	add		v16.4s,v16.4s,v4.4s
1123	orr		v2.16b,v0.16b,v0.16b
1124	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1125	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1126
1127	ld1		{v16.4s},[x3],#16
1128	add		v17.4s,v17.4s,v5.4s
1129	orr		v2.16b,v0.16b,v0.16b
1130	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1131	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1132
1133	ld1		{v17.4s},[x3]
1134	add		v16.4s,v16.4s,v6.4s
1135	sub		x3,x3,#64*4-16	// rewind
1136	orr		v2.16b,v0.16b,v0.16b
1137	.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1138	.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1139
1140	add		v17.4s,v17.4s,v7.4s
1141	orr		v2.16b,v0.16b,v0.16b
1142	.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1143	.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1144
1145	add		v0.4s,v0.4s,v18.4s
1146	add		v1.4s,v1.4s,v19.4s
1147
1148	cbnz		x2,.Loop_hw
1149
1150	st1		{v0.4s,v1.4s},[x0]
1151
1152	ldr		x29,[sp],#16
1153	ret
1154.size	zfs_sha256_block_armv8,.-zfs_sha256_block_armv8
1155
1156.globl	zfs_sha256_block_neon
1157.type	zfs_sha256_block_neon,%function
1158.align	4
1159zfs_sha256_block_neon:
1160	hint	#34					// bti c
1161.Lneon_entry:
1162	stp	x29, x30, [sp, #-16]!
1163	mov	x29, sp
1164	sub	sp,sp,#16*4
1165
1166	adr	x16,.LK256
1167	add	x2,x1,x2,lsl#6	// len to point at the end of inp
1168
1169	ld1	{v0.16b},[x1], #16
1170	ld1	{v1.16b},[x1], #16
1171	ld1	{v2.16b},[x1], #16
1172	ld1	{v3.16b},[x1], #16
1173	ld1	{v4.4s},[x16], #16
1174	ld1	{v5.4s},[x16], #16
1175	ld1	{v6.4s},[x16], #16
1176	ld1	{v7.4s},[x16], #16
1177	rev32	v0.16b,v0.16b		// yes, even on
1178	rev32	v1.16b,v1.16b		// big-endian
1179	rev32	v2.16b,v2.16b
1180	rev32	v3.16b,v3.16b
1181	mov	x17,sp
1182	add	v4.4s,v4.4s,v0.4s
1183	add	v5.4s,v5.4s,v1.4s
1184	add	v6.4s,v6.4s,v2.4s
1185	st1	{v4.4s-v5.4s},[x17], #32
1186	add	v7.4s,v7.4s,v3.4s
1187	st1	{v6.4s-v7.4s},[x17]
1188	sub	x17,x17,#32
1189
1190	ldp	w3,w4,[x0]
1191	ldp	w5,w6,[x0,#8]
1192	ldp	w7,w8,[x0,#16]
1193	ldp	w9,w10,[x0,#24]
1194	ldr	w12,[sp,#0]
1195	mov	w13,wzr
1196	eor	w14,w4,w5
1197	mov	w15,wzr
1198	b	.L_00_48
1199
1200.align	4
1201.L_00_48:
1202	ext	v4.16b,v0.16b,v1.16b,#4
1203	add	w10,w10,w12
1204	add	w3,w3,w15
1205	and	w12,w8,w7
1206	bic	w15,w9,w7
1207	ext	v7.16b,v2.16b,v3.16b,#4
1208	eor	w11,w7,w7,ror#5
1209	add	w3,w3,w13
1210	mov	d19,v3.d[1]
1211	orr	w12,w12,w15
1212	eor	w11,w11,w7,ror#19
1213	ushr	v6.4s,v4.4s,#7
1214	eor	w15,w3,w3,ror#11
1215	ushr	v5.4s,v4.4s,#3
1216	add	w10,w10,w12
1217	add	v0.4s,v0.4s,v7.4s
1218	ror	w11,w11,#6
1219	sli	v6.4s,v4.4s,#25
1220	eor	w13,w3,w4
1221	eor	w15,w15,w3,ror#20
1222	ushr	v7.4s,v4.4s,#18
1223	add	w10,w10,w11
1224	ldr	w12,[sp,#4]
1225	and	w14,w14,w13
1226	eor	v5.16b,v5.16b,v6.16b
1227	ror	w15,w15,#2
1228	add	w6,w6,w10
1229	sli	v7.4s,v4.4s,#14
1230	eor	w14,w14,w4
1231	ushr	v16.4s,v19.4s,#17
1232	add	w9,w9,w12
1233	add	w10,w10,w15
1234	and	w12,w7,w6
1235	eor	v5.16b,v5.16b,v7.16b
1236	bic	w15,w8,w6
1237	eor	w11,w6,w6,ror#5
1238	sli	v16.4s,v19.4s,#15
1239	add	w10,w10,w14
1240	orr	w12,w12,w15
1241	ushr	v17.4s,v19.4s,#10
1242	eor	w11,w11,w6,ror#19
1243	eor	w15,w10,w10,ror#11
1244	ushr	v7.4s,v19.4s,#19
1245	add	w9,w9,w12
1246	ror	w11,w11,#6
1247	add	v0.4s,v0.4s,v5.4s
1248	eor	w14,w10,w3
1249	eor	w15,w15,w10,ror#20
1250	sli	v7.4s,v19.4s,#13
1251	add	w9,w9,w11
1252	ldr	w12,[sp,#8]
1253	and	w13,w13,w14
1254	eor	v17.16b,v17.16b,v16.16b
1255	ror	w15,w15,#2
1256	add	w5,w5,w9
1257	eor	w13,w13,w3
1258	eor	v17.16b,v17.16b,v7.16b
1259	add	w8,w8,w12
1260	add	w9,w9,w15
1261	and	w12,w6,w5
1262	add	v0.4s,v0.4s,v17.4s
1263	bic	w15,w7,w5
1264	eor	w11,w5,w5,ror#5
1265	add	w9,w9,w13
1266	ushr	v18.4s,v0.4s,#17
1267	orr	w12,w12,w15
1268	ushr	v19.4s,v0.4s,#10
1269	eor	w11,w11,w5,ror#19
1270	eor	w15,w9,w9,ror#11
1271	sli	v18.4s,v0.4s,#15
1272	add	w8,w8,w12
1273	ushr	v17.4s,v0.4s,#19
1274	ror	w11,w11,#6
1275	eor	w13,w9,w10
1276	eor	v19.16b,v19.16b,v18.16b
1277	eor	w15,w15,w9,ror#20
1278	add	w8,w8,w11
1279	sli	v17.4s,v0.4s,#13
1280	ldr	w12,[sp,#12]
1281	and	w14,w14,w13
1282	ror	w15,w15,#2
1283	ld1	{v4.4s},[x16], #16
1284	add	w4,w4,w8
1285	eor	v19.16b,v19.16b,v17.16b
1286	eor	w14,w14,w10
1287	eor	v17.16b,v17.16b,v17.16b
1288	add	w7,w7,w12
1289	add	w8,w8,w15
1290	and	w12,w5,w4
1291	mov	v17.d[1],v19.d[0]
1292	bic	w15,w6,w4
1293	eor	w11,w4,w4,ror#5
1294	add	w8,w8,w14
1295	add	v0.4s,v0.4s,v17.4s
1296	orr	w12,w12,w15
1297	eor	w11,w11,w4,ror#19
1298	eor	w15,w8,w8,ror#11
1299	add	v4.4s,v4.4s,v0.4s
1300	add	w7,w7,w12
1301	ror	w11,w11,#6
1302	eor	w14,w8,w9
1303	eor	w15,w15,w8,ror#20
1304	add	w7,w7,w11
1305	ldr	w12,[sp,#16]
1306	and	w13,w13,w14
1307	ror	w15,w15,#2
1308	add	w3,w3,w7
1309	eor	w13,w13,w9
1310	st1	{v4.4s},[x17], #16
1311	ext	v4.16b,v1.16b,v2.16b,#4
1312	add	w6,w6,w12
1313	add	w7,w7,w15
1314	and	w12,w4,w3
1315	bic	w15,w5,w3
1316	ext	v7.16b,v3.16b,v0.16b,#4
1317	eor	w11,w3,w3,ror#5
1318	add	w7,w7,w13
1319	mov	d19,v0.d[1]
1320	orr	w12,w12,w15
1321	eor	w11,w11,w3,ror#19
1322	ushr	v6.4s,v4.4s,#7
1323	eor	w15,w7,w7,ror#11
1324	ushr	v5.4s,v4.4s,#3
1325	add	w6,w6,w12
1326	add	v1.4s,v1.4s,v7.4s
1327	ror	w11,w11,#6
1328	sli	v6.4s,v4.4s,#25
1329	eor	w13,w7,w8
1330	eor	w15,w15,w7,ror#20
1331	ushr	v7.4s,v4.4s,#18
1332	add	w6,w6,w11
1333	ldr	w12,[sp,#20]
1334	and	w14,w14,w13
1335	eor	v5.16b,v5.16b,v6.16b
1336	ror	w15,w15,#2
1337	add	w10,w10,w6
1338	sli	v7.4s,v4.4s,#14
1339	eor	w14,w14,w8
1340	ushr	v16.4s,v19.4s,#17
1341	add	w5,w5,w12
1342	add	w6,w6,w15
1343	and	w12,w3,w10
1344	eor	v5.16b,v5.16b,v7.16b
1345	bic	w15,w4,w10
1346	eor	w11,w10,w10,ror#5
1347	sli	v16.4s,v19.4s,#15
1348	add	w6,w6,w14
1349	orr	w12,w12,w15
1350	ushr	v17.4s,v19.4s,#10
1351	eor	w11,w11,w10,ror#19
1352	eor	w15,w6,w6,ror#11
1353	ushr	v7.4s,v19.4s,#19
1354	add	w5,w5,w12
1355	ror	w11,w11,#6
1356	add	v1.4s,v1.4s,v5.4s
1357	eor	w14,w6,w7
1358	eor	w15,w15,w6,ror#20
1359	sli	v7.4s,v19.4s,#13
1360	add	w5,w5,w11
1361	ldr	w12,[sp,#24]
1362	and	w13,w13,w14
1363	eor	v17.16b,v17.16b,v16.16b
1364	ror	w15,w15,#2
1365	add	w9,w9,w5
1366	eor	w13,w13,w7
1367	eor	v17.16b,v17.16b,v7.16b
1368	add	w4,w4,w12
1369	add	w5,w5,w15
1370	and	w12,w10,w9
1371	add	v1.4s,v1.4s,v17.4s
1372	bic	w15,w3,w9
1373	eor	w11,w9,w9,ror#5
1374	add	w5,w5,w13
1375	ushr	v18.4s,v1.4s,#17
1376	orr	w12,w12,w15
1377	ushr	v19.4s,v1.4s,#10
1378	eor	w11,w11,w9,ror#19
1379	eor	w15,w5,w5,ror#11
1380	sli	v18.4s,v1.4s,#15
1381	add	w4,w4,w12
1382	ushr	v17.4s,v1.4s,#19
1383	ror	w11,w11,#6
1384	eor	w13,w5,w6
1385	eor	v19.16b,v19.16b,v18.16b
1386	eor	w15,w15,w5,ror#20
1387	add	w4,w4,w11
1388	sli	v17.4s,v1.4s,#13
1389	ldr	w12,[sp,#28]
1390	and	w14,w14,w13
1391	ror	w15,w15,#2
1392	ld1	{v4.4s},[x16], #16
1393	add	w8,w8,w4
1394	eor	v19.16b,v19.16b,v17.16b
1395	eor	w14,w14,w6
1396	eor	v17.16b,v17.16b,v17.16b
1397	add	w3,w3,w12
1398	add	w4,w4,w15
1399	and	w12,w9,w8
1400	mov	v17.d[1],v19.d[0]
1401	bic	w15,w10,w8
1402	eor	w11,w8,w8,ror#5
1403	add	w4,w4,w14
1404	add	v1.4s,v1.4s,v17.4s
1405	orr	w12,w12,w15
1406	eor	w11,w11,w8,ror#19
1407	eor	w15,w4,w4,ror#11
1408	add	v4.4s,v4.4s,v1.4s
1409	add	w3,w3,w12
1410	ror	w11,w11,#6
1411	eor	w14,w4,w5
1412	eor	w15,w15,w4,ror#20
1413	add	w3,w3,w11
1414	ldr	w12,[sp,#32]
1415	and	w13,w13,w14
1416	ror	w15,w15,#2
1417	add	w7,w7,w3
1418	eor	w13,w13,w5
1419	st1	{v4.4s},[x17], #16
1420	ext	v4.16b,v2.16b,v3.16b,#4
1421	add	w10,w10,w12
1422	add	w3,w3,w15
1423	and	w12,w8,w7
1424	bic	w15,w9,w7
1425	ext	v7.16b,v0.16b,v1.16b,#4
1426	eor	w11,w7,w7,ror#5
1427	add	w3,w3,w13
1428	mov	d19,v1.d[1]
1429	orr	w12,w12,w15
1430	eor	w11,w11,w7,ror#19
1431	ushr	v6.4s,v4.4s,#7
1432	eor	w15,w3,w3,ror#11
1433	ushr	v5.4s,v4.4s,#3
1434	add	w10,w10,w12
1435	add	v2.4s,v2.4s,v7.4s
1436	ror	w11,w11,#6
1437	sli	v6.4s,v4.4s,#25
1438	eor	w13,w3,w4
1439	eor	w15,w15,w3,ror#20
1440	ushr	v7.4s,v4.4s,#18
1441	add	w10,w10,w11
1442	ldr	w12,[sp,#36]
1443	and	w14,w14,w13
1444	eor	v5.16b,v5.16b,v6.16b
1445	ror	w15,w15,#2
1446	add	w6,w6,w10
1447	sli	v7.4s,v4.4s,#14
1448	eor	w14,w14,w4
1449	ushr	v16.4s,v19.4s,#17
1450	add	w9,w9,w12
1451	add	w10,w10,w15
1452	and	w12,w7,w6
1453	eor	v5.16b,v5.16b,v7.16b
1454	bic	w15,w8,w6
1455	eor	w11,w6,w6,ror#5
1456	sli	v16.4s,v19.4s,#15
1457	add	w10,w10,w14
1458	orr	w12,w12,w15
1459	ushr	v17.4s,v19.4s,#10
1460	eor	w11,w11,w6,ror#19
1461	eor	w15,w10,w10,ror#11
1462	ushr	v7.4s,v19.4s,#19
1463	add	w9,w9,w12
1464	ror	w11,w11,#6
1465	add	v2.4s,v2.4s,v5.4s
1466	eor	w14,w10,w3
1467	eor	w15,w15,w10,ror#20
1468	sli	v7.4s,v19.4s,#13
1469	add	w9,w9,w11
1470	ldr	w12,[sp,#40]
1471	and	w13,w13,w14
1472	eor	v17.16b,v17.16b,v16.16b
1473	ror	w15,w15,#2
1474	add	w5,w5,w9
1475	eor	w13,w13,w3
1476	eor	v17.16b,v17.16b,v7.16b
1477	add	w8,w8,w12
1478	add	w9,w9,w15
1479	and	w12,w6,w5
1480	add	v2.4s,v2.4s,v17.4s
1481	bic	w15,w7,w5
1482	eor	w11,w5,w5,ror#5
1483	add	w9,w9,w13
1484	ushr	v18.4s,v2.4s,#17
1485	orr	w12,w12,w15
1486	ushr	v19.4s,v2.4s,#10
1487	eor	w11,w11,w5,ror#19
1488	eor	w15,w9,w9,ror#11
1489	sli	v18.4s,v2.4s,#15
1490	add	w8,w8,w12
1491	ushr	v17.4s,v2.4s,#19
1492	ror	w11,w11,#6
1493	eor	w13,w9,w10
1494	eor	v19.16b,v19.16b,v18.16b
1495	eor	w15,w15,w9,ror#20
1496	add	w8,w8,w11
1497	sli	v17.4s,v2.4s,#13
1498	ldr	w12,[sp,#44]
1499	and	w14,w14,w13
1500	ror	w15,w15,#2
1501	ld1	{v4.4s},[x16], #16
1502	add	w4,w4,w8
1503	eor	v19.16b,v19.16b,v17.16b
1504	eor	w14,w14,w10
1505	eor	v17.16b,v17.16b,v17.16b
1506	add	w7,w7,w12
1507	add	w8,w8,w15
1508	and	w12,w5,w4
1509	mov	v17.d[1],v19.d[0]
1510	bic	w15,w6,w4
1511	eor	w11,w4,w4,ror#5
1512	add	w8,w8,w14
1513	add	v2.4s,v2.4s,v17.4s
1514	orr	w12,w12,w15
1515	eor	w11,w11,w4,ror#19
1516	eor	w15,w8,w8,ror#11
1517	add	v4.4s,v4.4s,v2.4s
1518	add	w7,w7,w12
1519	ror	w11,w11,#6
1520	eor	w14,w8,w9
1521	eor	w15,w15,w8,ror#20
1522	add	w7,w7,w11
1523	ldr	w12,[sp,#48]
1524	and	w13,w13,w14
1525	ror	w15,w15,#2
1526	add	w3,w3,w7
1527	eor	w13,w13,w9
1528	st1	{v4.4s},[x17], #16
1529	ext	v4.16b,v3.16b,v0.16b,#4
1530	add	w6,w6,w12
1531	add	w7,w7,w15
1532	and	w12,w4,w3
1533	bic	w15,w5,w3
1534	ext	v7.16b,v1.16b,v2.16b,#4
1535	eor	w11,w3,w3,ror#5
1536	add	w7,w7,w13
1537	mov	d19,v2.d[1]
1538	orr	w12,w12,w15
1539	eor	w11,w11,w3,ror#19
1540	ushr	v6.4s,v4.4s,#7
1541	eor	w15,w7,w7,ror#11
1542	ushr	v5.4s,v4.4s,#3
1543	add	w6,w6,w12
1544	add	v3.4s,v3.4s,v7.4s
1545	ror	w11,w11,#6
1546	sli	v6.4s,v4.4s,#25
1547	eor	w13,w7,w8
1548	eor	w15,w15,w7,ror#20
1549	ushr	v7.4s,v4.4s,#18
1550	add	w6,w6,w11
1551	ldr	w12,[sp,#52]
1552	and	w14,w14,w13
1553	eor	v5.16b,v5.16b,v6.16b
1554	ror	w15,w15,#2
1555	add	w10,w10,w6
1556	sli	v7.4s,v4.4s,#14
1557	eor	w14,w14,w8
1558	ushr	v16.4s,v19.4s,#17
1559	add	w5,w5,w12
1560	add	w6,w6,w15
1561	and	w12,w3,w10
1562	eor	v5.16b,v5.16b,v7.16b
1563	bic	w15,w4,w10
1564	eor	w11,w10,w10,ror#5
1565	sli	v16.4s,v19.4s,#15
1566	add	w6,w6,w14
1567	orr	w12,w12,w15
1568	ushr	v17.4s,v19.4s,#10
1569	eor	w11,w11,w10,ror#19
1570	eor	w15,w6,w6,ror#11
1571	ushr	v7.4s,v19.4s,#19
1572	add	w5,w5,w12
1573	ror	w11,w11,#6
1574	add	v3.4s,v3.4s,v5.4s
1575	eor	w14,w6,w7
1576	eor	w15,w15,w6,ror#20
1577	sli	v7.4s,v19.4s,#13
1578	add	w5,w5,w11
1579	ldr	w12,[sp,#56]
1580	and	w13,w13,w14
1581	eor	v17.16b,v17.16b,v16.16b
1582	ror	w15,w15,#2
1583	add	w9,w9,w5
1584	eor	w13,w13,w7
1585	eor	v17.16b,v17.16b,v7.16b
1586	add	w4,w4,w12
1587	add	w5,w5,w15
1588	and	w12,w10,w9
1589	add	v3.4s,v3.4s,v17.4s
1590	bic	w15,w3,w9
1591	eor	w11,w9,w9,ror#5
1592	add	w5,w5,w13
1593	ushr	v18.4s,v3.4s,#17
1594	orr	w12,w12,w15
1595	ushr	v19.4s,v3.4s,#10
1596	eor	w11,w11,w9,ror#19
1597	eor	w15,w5,w5,ror#11
1598	sli	v18.4s,v3.4s,#15
1599	add	w4,w4,w12
1600	ushr	v17.4s,v3.4s,#19
1601	ror	w11,w11,#6
1602	eor	w13,w5,w6
1603	eor	v19.16b,v19.16b,v18.16b
1604	eor	w15,w15,w5,ror#20
1605	add	w4,w4,w11
1606	sli	v17.4s,v3.4s,#13
1607	ldr	w12,[sp,#60]
1608	and	w14,w14,w13
1609	ror	w15,w15,#2
1610	ld1	{v4.4s},[x16], #16
1611	add	w8,w8,w4
1612	eor	v19.16b,v19.16b,v17.16b
1613	eor	w14,w14,w6
1614	eor	v17.16b,v17.16b,v17.16b
1615	add	w3,w3,w12
1616	add	w4,w4,w15
1617	and	w12,w9,w8
1618	mov	v17.d[1],v19.d[0]
1619	bic	w15,w10,w8
1620	eor	w11,w8,w8,ror#5
1621	add	w4,w4,w14
1622	add	v3.4s,v3.4s,v17.4s
1623	orr	w12,w12,w15
1624	eor	w11,w11,w8,ror#19
1625	eor	w15,w4,w4,ror#11
1626	add	v4.4s,v4.4s,v3.4s
1627	add	w3,w3,w12
1628	ror	w11,w11,#6
1629	eor	w14,w4,w5
1630	eor	w15,w15,w4,ror#20
1631	add	w3,w3,w11
1632	ldr	w12,[x16]
1633	and	w13,w13,w14
1634	ror	w15,w15,#2
1635	add	w7,w7,w3
1636	eor	w13,w13,w5
1637	st1	{v4.4s},[x17], #16
1638	cmp	w12,#0				// check for K256 terminator
1639	ldr	w12,[sp,#0]
1640	sub	x17,x17,#64
1641	bne	.L_00_48
1642
1643	sub	x16,x16,#256		// rewind x16
1644	cmp	x1,x2
1645	mov	x17, #64
1646	csel	x17, x17, xzr, eq
1647	sub	x1,x1,x17			// avoid SEGV
1648	mov	x17,sp
1649	add	w10,w10,w12
1650	add	w3,w3,w15
1651	and	w12,w8,w7
1652	ld1	{v0.16b},[x1],#16
1653	bic	w15,w9,w7
1654	eor	w11,w7,w7,ror#5
1655	ld1	{v4.4s},[x16],#16
1656	add	w3,w3,w13
1657	orr	w12,w12,w15
1658	eor	w11,w11,w7,ror#19
1659	eor	w15,w3,w3,ror#11
1660	rev32	v0.16b,v0.16b
1661	add	w10,w10,w12
1662	ror	w11,w11,#6
1663	eor	w13,w3,w4
1664	eor	w15,w15,w3,ror#20
1665	add	v4.4s,v4.4s,v0.4s
1666	add	w10,w10,w11
1667	ldr	w12,[sp,#4]
1668	and	w14,w14,w13
1669	ror	w15,w15,#2
1670	add	w6,w6,w10
1671	eor	w14,w14,w4
1672	add	w9,w9,w12
1673	add	w10,w10,w15
1674	and	w12,w7,w6
1675	bic	w15,w8,w6
1676	eor	w11,w6,w6,ror#5
1677	add	w10,w10,w14
1678	orr	w12,w12,w15
1679	eor	w11,w11,w6,ror#19
1680	eor	w15,w10,w10,ror#11
1681	add	w9,w9,w12
1682	ror	w11,w11,#6
1683	eor	w14,w10,w3
1684	eor	w15,w15,w10,ror#20
1685	add	w9,w9,w11
1686	ldr	w12,[sp,#8]
1687	and	w13,w13,w14
1688	ror	w15,w15,#2
1689	add	w5,w5,w9
1690	eor	w13,w13,w3
1691	add	w8,w8,w12
1692	add	w9,w9,w15
1693	and	w12,w6,w5
1694	bic	w15,w7,w5
1695	eor	w11,w5,w5,ror#5
1696	add	w9,w9,w13
1697	orr	w12,w12,w15
1698	eor	w11,w11,w5,ror#19
1699	eor	w15,w9,w9,ror#11
1700	add	w8,w8,w12
1701	ror	w11,w11,#6
1702	eor	w13,w9,w10
1703	eor	w15,w15,w9,ror#20
1704	add	w8,w8,w11
1705	ldr	w12,[sp,#12]
1706	and	w14,w14,w13
1707	ror	w15,w15,#2
1708	add	w4,w4,w8
1709	eor	w14,w14,w10
1710	add	w7,w7,w12
1711	add	w8,w8,w15
1712	and	w12,w5,w4
1713	bic	w15,w6,w4
1714	eor	w11,w4,w4,ror#5
1715	add	w8,w8,w14
1716	orr	w12,w12,w15
1717	eor	w11,w11,w4,ror#19
1718	eor	w15,w8,w8,ror#11
1719	add	w7,w7,w12
1720	ror	w11,w11,#6
1721	eor	w14,w8,w9
1722	eor	w15,w15,w8,ror#20
1723	add	w7,w7,w11
1724	ldr	w12,[sp,#16]
1725	and	w13,w13,w14
1726	ror	w15,w15,#2
1727	add	w3,w3,w7
1728	eor	w13,w13,w9
1729	st1	{v4.4s},[x17], #16
1730	add	w6,w6,w12
1731	add	w7,w7,w15
1732	and	w12,w4,w3
1733	ld1	{v1.16b},[x1],#16
1734	bic	w15,w5,w3
1735	eor	w11,w3,w3,ror#5
1736	ld1	{v4.4s},[x16],#16
1737	add	w7,w7,w13
1738	orr	w12,w12,w15
1739	eor	w11,w11,w3,ror#19
1740	eor	w15,w7,w7,ror#11
1741	rev32	v1.16b,v1.16b
1742	add	w6,w6,w12
1743	ror	w11,w11,#6
1744	eor	w13,w7,w8
1745	eor	w15,w15,w7,ror#20
1746	add	v4.4s,v4.4s,v1.4s
1747	add	w6,w6,w11
1748	ldr	w12,[sp,#20]
1749	and	w14,w14,w13
1750	ror	w15,w15,#2
1751	add	w10,w10,w6
1752	eor	w14,w14,w8
1753	add	w5,w5,w12
1754	add	w6,w6,w15
1755	and	w12,w3,w10
1756	bic	w15,w4,w10
1757	eor	w11,w10,w10,ror#5
1758	add	w6,w6,w14
1759	orr	w12,w12,w15
1760	eor	w11,w11,w10,ror#19
1761	eor	w15,w6,w6,ror#11
1762	add	w5,w5,w12
1763	ror	w11,w11,#6
1764	eor	w14,w6,w7
1765	eor	w15,w15,w6,ror#20
1766	add	w5,w5,w11
1767	ldr	w12,[sp,#24]
1768	and	w13,w13,w14
1769	ror	w15,w15,#2
1770	add	w9,w9,w5
1771	eor	w13,w13,w7
1772	add	w4,w4,w12
1773	add	w5,w5,w15
1774	and	w12,w10,w9
1775	bic	w15,w3,w9
1776	eor	w11,w9,w9,ror#5
1777	add	w5,w5,w13
1778	orr	w12,w12,w15
1779	eor	w11,w11,w9,ror#19
1780	eor	w15,w5,w5,ror#11
1781	add	w4,w4,w12
1782	ror	w11,w11,#6
1783	eor	w13,w5,w6
1784	eor	w15,w15,w5,ror#20
1785	add	w4,w4,w11
1786	ldr	w12,[sp,#28]
1787	and	w14,w14,w13
1788	ror	w15,w15,#2
1789	add	w8,w8,w4
1790	eor	w14,w14,w6
1791	add	w3,w3,w12
1792	add	w4,w4,w15
1793	and	w12,w9,w8
1794	bic	w15,w10,w8
1795	eor	w11,w8,w8,ror#5
1796	add	w4,w4,w14
1797	orr	w12,w12,w15
1798	eor	w11,w11,w8,ror#19
1799	eor	w15,w4,w4,ror#11
1800	add	w3,w3,w12
1801	ror	w11,w11,#6
1802	eor	w14,w4,w5
1803	eor	w15,w15,w4,ror#20
1804	add	w3,w3,w11
1805	ldr	w12,[sp,#32]
1806	and	w13,w13,w14
1807	ror	w15,w15,#2
1808	add	w7,w7,w3
1809	eor	w13,w13,w5
1810	st1	{v4.4s},[x17], #16
1811	add	w10,w10,w12
1812	add	w3,w3,w15
1813	and	w12,w8,w7
1814	ld1	{v2.16b},[x1],#16
1815	bic	w15,w9,w7
1816	eor	w11,w7,w7,ror#5
1817	ld1	{v4.4s},[x16],#16
1818	add	w3,w3,w13
1819	orr	w12,w12,w15
1820	eor	w11,w11,w7,ror#19
1821	eor	w15,w3,w3,ror#11
1822	rev32	v2.16b,v2.16b
1823	add	w10,w10,w12
1824	ror	w11,w11,#6
1825	eor	w13,w3,w4
1826	eor	w15,w15,w3,ror#20
1827	add	v4.4s,v4.4s,v2.4s
1828	add	w10,w10,w11
1829	ldr	w12,[sp,#36]
1830	and	w14,w14,w13
1831	ror	w15,w15,#2
1832	add	w6,w6,w10
1833	eor	w14,w14,w4
1834	add	w9,w9,w12
1835	add	w10,w10,w15
1836	and	w12,w7,w6
1837	bic	w15,w8,w6
1838	eor	w11,w6,w6,ror#5
1839	add	w10,w10,w14
1840	orr	w12,w12,w15
1841	eor	w11,w11,w6,ror#19
1842	eor	w15,w10,w10,ror#11
1843	add	w9,w9,w12
1844	ror	w11,w11,#6
1845	eor	w14,w10,w3
1846	eor	w15,w15,w10,ror#20
1847	add	w9,w9,w11
1848	ldr	w12,[sp,#40]
1849	and	w13,w13,w14
1850	ror	w15,w15,#2
1851	add	w5,w5,w9
1852	eor	w13,w13,w3
1853	add	w8,w8,w12
1854	add	w9,w9,w15
1855	and	w12,w6,w5
1856	bic	w15,w7,w5
1857	eor	w11,w5,w5,ror#5
1858	add	w9,w9,w13
1859	orr	w12,w12,w15
1860	eor	w11,w11,w5,ror#19
1861	eor	w15,w9,w9,ror#11
1862	add	w8,w8,w12
1863	ror	w11,w11,#6
1864	eor	w13,w9,w10
1865	eor	w15,w15,w9,ror#20
1866	add	w8,w8,w11
1867	ldr	w12,[sp,#44]
1868	and	w14,w14,w13
1869	ror	w15,w15,#2
1870	add	w4,w4,w8
1871	eor	w14,w14,w10
1872	add	w7,w7,w12
1873	add	w8,w8,w15
1874	and	w12,w5,w4
1875	bic	w15,w6,w4
1876	eor	w11,w4,w4,ror#5
1877	add	w8,w8,w14
1878	orr	w12,w12,w15
1879	eor	w11,w11,w4,ror#19
1880	eor	w15,w8,w8,ror#11
1881	add	w7,w7,w12
1882	ror	w11,w11,#6
1883	eor	w14,w8,w9
1884	eor	w15,w15,w8,ror#20
1885	add	w7,w7,w11
1886	ldr	w12,[sp,#48]
1887	and	w13,w13,w14
1888	ror	w15,w15,#2
1889	add	w3,w3,w7
1890	eor	w13,w13,w9
1891	st1	{v4.4s},[x17], #16
1892	add	w6,w6,w12
1893	add	w7,w7,w15
1894	and	w12,w4,w3
1895	ld1	{v3.16b},[x1],#16
1896	bic	w15,w5,w3
1897	eor	w11,w3,w3,ror#5
1898	ld1	{v4.4s},[x16],#16
1899	add	w7,w7,w13
1900	orr	w12,w12,w15
1901	eor	w11,w11,w3,ror#19
1902	eor	w15,w7,w7,ror#11
1903	rev32	v3.16b,v3.16b
1904	add	w6,w6,w12
1905	ror	w11,w11,#6
1906	eor	w13,w7,w8
1907	eor	w15,w15,w7,ror#20
1908	add	v4.4s,v4.4s,v3.4s
1909	add	w6,w6,w11
1910	ldr	w12,[sp,#52]
1911	and	w14,w14,w13
1912	ror	w15,w15,#2
1913	add	w10,w10,w6
1914	eor	w14,w14,w8
1915	add	w5,w5,w12
1916	add	w6,w6,w15
1917	and	w12,w3,w10
1918	bic	w15,w4,w10
1919	eor	w11,w10,w10,ror#5
1920	add	w6,w6,w14
1921	orr	w12,w12,w15
1922	eor	w11,w11,w10,ror#19
1923	eor	w15,w6,w6,ror#11
1924	add	w5,w5,w12
1925	ror	w11,w11,#6
1926	eor	w14,w6,w7
1927	eor	w15,w15,w6,ror#20
1928	add	w5,w5,w11
1929	ldr	w12,[sp,#56]
1930	and	w13,w13,w14
1931	ror	w15,w15,#2
1932	add	w9,w9,w5
1933	eor	w13,w13,w7
1934	add	w4,w4,w12
1935	add	w5,w5,w15
1936	and	w12,w10,w9
1937	bic	w15,w3,w9
1938	eor	w11,w9,w9,ror#5
1939	add	w5,w5,w13
1940	orr	w12,w12,w15
1941	eor	w11,w11,w9,ror#19
1942	eor	w15,w5,w5,ror#11
1943	add	w4,w4,w12
1944	ror	w11,w11,#6
1945	eor	w13,w5,w6
1946	eor	w15,w15,w5,ror#20
1947	add	w4,w4,w11
1948	ldr	w12,[sp,#60]
1949	and	w14,w14,w13
1950	ror	w15,w15,#2
1951	add	w8,w8,w4
1952	eor	w14,w14,w6
1953	add	w3,w3,w12
1954	add	w4,w4,w15
1955	and	w12,w9,w8
1956	bic	w15,w10,w8
1957	eor	w11,w8,w8,ror#5
1958	add	w4,w4,w14
1959	orr	w12,w12,w15
1960	eor	w11,w11,w8,ror#19
1961	eor	w15,w4,w4,ror#11
1962	add	w3,w3,w12
1963	ror	w11,w11,#6
1964	eor	w14,w4,w5
1965	eor	w15,w15,w4,ror#20
1966	add	w3,w3,w11
1967	and	w13,w13,w14
1968	ror	w15,w15,#2
1969	add	w7,w7,w3
1970	eor	w13,w13,w5
1971	st1	{v4.4s},[x17], #16
1972	add	w3,w3,w15			// h+=Sigma0(a) from the past
1973	ldp	w11,w12,[x0,#0]
1974	add	w3,w3,w13			// h+=Maj(a,b,c) from the past
1975	ldp	w13,w14,[x0,#8]
1976	add	w3,w3,w11			// accumulate
1977	add	w4,w4,w12
1978	ldp	w11,w12,[x0,#16]
1979	add	w5,w5,w13
1980	add	w6,w6,w14
1981	ldp	w13,w14,[x0,#24]
1982	add	w7,w7,w11
1983	add	w8,w8,w12
1984	 ldr	w12,[sp,#0]
1985	stp	w3,w4,[x0,#0]
1986	add	w9,w9,w13
1987	 mov	w13,wzr
1988	stp	w5,w6,[x0,#8]
1989	add	w10,w10,w14
1990	stp	w7,w8,[x0,#16]
1991	 eor	w14,w4,w5
1992	stp	w9,w10,[x0,#24]
1993	 mov	w15,wzr
1994	 mov	x17,sp
1995	b.ne	.L_00_48
1996
1997	ldr	x29,[x29]
1998	add	sp,sp,#16*4+16
1999	ret
2000.size	zfs_sha256_block_neon,.-zfs_sha256_block_neon
2001
2002#endif
2003