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