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