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