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