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