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