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