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