1// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
4#if !defined(__has_feature)
5#define __has_feature(x) 0
6#endif
7#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
8#define OPENSSL_NO_ASM
9#endif
10
11#if !defined(OPENSSL_NO_ASM)
12#if defined(__aarch64__)
13#if defined(BORINGSSL_PREFIX)
14#include <boringssl_prefix_symbols_asm.h>
15#endif
16// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
17//
18// Licensed under the OpenSSL license (the "License").  You may not use
19// this file except in compliance with the License.  You can obtain a copy
20// in the file LICENSE in the source distribution or at
21// https://www.openssl.org/source/license.html
22
23// ====================================================================
24// Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
25// project. The module is, however, dual licensed under OpenSSL and
26// CRYPTOGAMS licenses depending on where you obtain it. For further
27// details see http://www.openssl.org/~appro/cryptogams/.
28//
29// Permission to use under GPLv2 terms is granted.
30// ====================================================================
31//
32// SHA256/512 for ARMv8.
33//
34// Performance in cycles per processed byte and improvement coefficient
35// over code generated with "default" compiler:
36//
37//		SHA256-hw	SHA256(*)	SHA512
38// Apple A7	1.97		10.5 (+33%)	6.73 (-1%(**))
39// Cortex-A53	2.38		15.5 (+115%)	10.0 (+150%(***))
40// Cortex-A57	2.31		11.6 (+86%)	7.51 (+260%(***))
41// Denver	2.01		10.5 (+26%)	6.70 (+8%)
42// X-Gene			20.0 (+100%)	12.8 (+300%(***))
43// Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
44//
45// (*)	Software SHA256 results are of lesser relevance, presented
46//	mostly for informational purposes.
47// (**)	The result is a trade-off: it's possible to improve it by
48//	10% (or by 1 cycle per round), but at the cost of 20% loss
49//	on Cortex-A53 (or by 4 cycles per round).
50// (***)	Super-impressive coefficients over gcc-generated code are
51//	indication of some compiler "pathology", most notably code
52//	generated with -mgeneral-regs-only is significanty faster
53//	and the gap is only 40-90%.
54
55#ifndef	__KERNEL__
56# include <openssl/arm_arch.h>
57#endif
58
59.text
60
61
62.hidden	OPENSSL_armcap_P
63.globl	sha256_block_data_order
64.hidden	sha256_block_data_order
65.type	sha256_block_data_order,%function
66.align	6
67sha256_block_data_order:
68	AARCH64_VALID_CALL_TARGET
69#ifndef	__KERNEL__
70#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10
71	adrp	x16,:pg_hi21_nc:OPENSSL_armcap_P
72#else
73	adrp	x16,OPENSSL_armcap_P
74#endif
75	ldr	w16,[x16,:lo12:OPENSSL_armcap_P]
76	tst	w16,#ARMV8_SHA256
77	b.ne	.Lv8_entry
78#endif
79	AARCH64_SIGN_LINK_REGISTER
80	stp	x29,x30,[sp,#-128]!
81	add	x29,sp,#0
82
83	stp	x19,x20,[sp,#16]
84	stp	x21,x22,[sp,#32]
85	stp	x23,x24,[sp,#48]
86	stp	x25,x26,[sp,#64]
87	stp	x27,x28,[sp,#80]
88	sub	sp,sp,#4*4
89
90	ldp	w20,w21,[x0]				// load context
91	ldp	w22,w23,[x0,#2*4]
92	ldp	w24,w25,[x0,#4*4]
93	add	x2,x1,x2,lsl#6	// end of input
94	ldp	w26,w27,[x0,#6*4]
95	adrp	x30,.LK256
96	add	x30,x30,:lo12:.LK256
97	stp	x0,x2,[x29,#96]
98
99.Loop:
100	ldp	w3,w4,[x1],#2*4
101	ldr	w19,[x30],#4			// *K++
102	eor	w28,w21,w22				// magic seed
103	str	x1,[x29,#112]
104#ifndef	__ARMEB__
105	rev	w3,w3			// 0
106#endif
107	ror	w16,w24,#6
108	add	w27,w27,w19			// h+=K[i]
109	eor	w6,w24,w24,ror#14
110	and	w17,w25,w24
111	bic	w19,w26,w24
112	add	w27,w27,w3			// h+=X[i]
113	orr	w17,w17,w19			// Ch(e,f,g)
114	eor	w19,w20,w21			// a^b, b^c in next round
115	eor	w16,w16,w6,ror#11	// Sigma1(e)
116	ror	w6,w20,#2
117	add	w27,w27,w17			// h+=Ch(e,f,g)
118	eor	w17,w20,w20,ror#9
119	add	w27,w27,w16			// h+=Sigma1(e)
120	and	w28,w28,w19			// (b^c)&=(a^b)
121	add	w23,w23,w27			// d+=h
122	eor	w28,w28,w21			// Maj(a,b,c)
123	eor	w17,w6,w17,ror#13	// Sigma0(a)
124	add	w27,w27,w28			// h+=Maj(a,b,c)
125	ldr	w28,[x30],#4		// *K++, w19 in next round
126	//add	w27,w27,w17			// h+=Sigma0(a)
127#ifndef	__ARMEB__
128	rev	w4,w4			// 1
129#endif
130	ldp	w5,w6,[x1],#2*4
131	add	w27,w27,w17			// h+=Sigma0(a)
132	ror	w16,w23,#6
133	add	w26,w26,w28			// h+=K[i]
134	eor	w7,w23,w23,ror#14
135	and	w17,w24,w23
136	bic	w28,w25,w23
137	add	w26,w26,w4			// h+=X[i]
138	orr	w17,w17,w28			// Ch(e,f,g)
139	eor	w28,w27,w20			// a^b, b^c in next round
140	eor	w16,w16,w7,ror#11	// Sigma1(e)
141	ror	w7,w27,#2
142	add	w26,w26,w17			// h+=Ch(e,f,g)
143	eor	w17,w27,w27,ror#9
144	add	w26,w26,w16			// h+=Sigma1(e)
145	and	w19,w19,w28			// (b^c)&=(a^b)
146	add	w22,w22,w26			// d+=h
147	eor	w19,w19,w20			// Maj(a,b,c)
148	eor	w17,w7,w17,ror#13	// Sigma0(a)
149	add	w26,w26,w19			// h+=Maj(a,b,c)
150	ldr	w19,[x30],#4		// *K++, w28 in next round
151	//add	w26,w26,w17			// h+=Sigma0(a)
152#ifndef	__ARMEB__
153	rev	w5,w5			// 2
154#endif
155	add	w26,w26,w17			// h+=Sigma0(a)
156	ror	w16,w22,#6
157	add	w25,w25,w19			// h+=K[i]
158	eor	w8,w22,w22,ror#14
159	and	w17,w23,w22
160	bic	w19,w24,w22
161	add	w25,w25,w5			// h+=X[i]
162	orr	w17,w17,w19			// Ch(e,f,g)
163	eor	w19,w26,w27			// a^b, b^c in next round
164	eor	w16,w16,w8,ror#11	// Sigma1(e)
165	ror	w8,w26,#2
166	add	w25,w25,w17			// h+=Ch(e,f,g)
167	eor	w17,w26,w26,ror#9
168	add	w25,w25,w16			// h+=Sigma1(e)
169	and	w28,w28,w19			// (b^c)&=(a^b)
170	add	w21,w21,w25			// d+=h
171	eor	w28,w28,w27			// Maj(a,b,c)
172	eor	w17,w8,w17,ror#13	// Sigma0(a)
173	add	w25,w25,w28			// h+=Maj(a,b,c)
174	ldr	w28,[x30],#4		// *K++, w19 in next round
175	//add	w25,w25,w17			// h+=Sigma0(a)
176#ifndef	__ARMEB__
177	rev	w6,w6			// 3
178#endif
179	ldp	w7,w8,[x1],#2*4
180	add	w25,w25,w17			// h+=Sigma0(a)
181	ror	w16,w21,#6
182	add	w24,w24,w28			// h+=K[i]
183	eor	w9,w21,w21,ror#14
184	and	w17,w22,w21
185	bic	w28,w23,w21
186	add	w24,w24,w6			// h+=X[i]
187	orr	w17,w17,w28			// Ch(e,f,g)
188	eor	w28,w25,w26			// a^b, b^c in next round
189	eor	w16,w16,w9,ror#11	// Sigma1(e)
190	ror	w9,w25,#2
191	add	w24,w24,w17			// h+=Ch(e,f,g)
192	eor	w17,w25,w25,ror#9
193	add	w24,w24,w16			// h+=Sigma1(e)
194	and	w19,w19,w28			// (b^c)&=(a^b)
195	add	w20,w20,w24			// d+=h
196	eor	w19,w19,w26			// Maj(a,b,c)
197	eor	w17,w9,w17,ror#13	// Sigma0(a)
198	add	w24,w24,w19			// h+=Maj(a,b,c)
199	ldr	w19,[x30],#4		// *K++, w28 in next round
200	//add	w24,w24,w17			// h+=Sigma0(a)
201#ifndef	__ARMEB__
202	rev	w7,w7			// 4
203#endif
204	add	w24,w24,w17			// h+=Sigma0(a)
205	ror	w16,w20,#6
206	add	w23,w23,w19			// h+=K[i]
207	eor	w10,w20,w20,ror#14
208	and	w17,w21,w20
209	bic	w19,w22,w20
210	add	w23,w23,w7			// h+=X[i]
211	orr	w17,w17,w19			// Ch(e,f,g)
212	eor	w19,w24,w25			// a^b, b^c in next round
213	eor	w16,w16,w10,ror#11	// Sigma1(e)
214	ror	w10,w24,#2
215	add	w23,w23,w17			// h+=Ch(e,f,g)
216	eor	w17,w24,w24,ror#9
217	add	w23,w23,w16			// h+=Sigma1(e)
218	and	w28,w28,w19			// (b^c)&=(a^b)
219	add	w27,w27,w23			// d+=h
220	eor	w28,w28,w25			// Maj(a,b,c)
221	eor	w17,w10,w17,ror#13	// Sigma0(a)
222	add	w23,w23,w28			// h+=Maj(a,b,c)
223	ldr	w28,[x30],#4		// *K++, w19 in next round
224	//add	w23,w23,w17			// h+=Sigma0(a)
225#ifndef	__ARMEB__
226	rev	w8,w8			// 5
227#endif
228	ldp	w9,w10,[x1],#2*4
229	add	w23,w23,w17			// h+=Sigma0(a)
230	ror	w16,w27,#6
231	add	w22,w22,w28			// h+=K[i]
232	eor	w11,w27,w27,ror#14
233	and	w17,w20,w27
234	bic	w28,w21,w27
235	add	w22,w22,w8			// h+=X[i]
236	orr	w17,w17,w28			// Ch(e,f,g)
237	eor	w28,w23,w24			// a^b, b^c in next round
238	eor	w16,w16,w11,ror#11	// Sigma1(e)
239	ror	w11,w23,#2
240	add	w22,w22,w17			// h+=Ch(e,f,g)
241	eor	w17,w23,w23,ror#9
242	add	w22,w22,w16			// h+=Sigma1(e)
243	and	w19,w19,w28			// (b^c)&=(a^b)
244	add	w26,w26,w22			// d+=h
245	eor	w19,w19,w24			// Maj(a,b,c)
246	eor	w17,w11,w17,ror#13	// Sigma0(a)
247	add	w22,w22,w19			// h+=Maj(a,b,c)
248	ldr	w19,[x30],#4		// *K++, w28 in next round
249	//add	w22,w22,w17			// h+=Sigma0(a)
250#ifndef	__ARMEB__
251	rev	w9,w9			// 6
252#endif
253	add	w22,w22,w17			// h+=Sigma0(a)
254	ror	w16,w26,#6
255	add	w21,w21,w19			// h+=K[i]
256	eor	w12,w26,w26,ror#14
257	and	w17,w27,w26
258	bic	w19,w20,w26
259	add	w21,w21,w9			// h+=X[i]
260	orr	w17,w17,w19			// Ch(e,f,g)
261	eor	w19,w22,w23			// a^b, b^c in next round
262	eor	w16,w16,w12,ror#11	// Sigma1(e)
263	ror	w12,w22,#2
264	add	w21,w21,w17			// h+=Ch(e,f,g)
265	eor	w17,w22,w22,ror#9
266	add	w21,w21,w16			// h+=Sigma1(e)
267	and	w28,w28,w19			// (b^c)&=(a^b)
268	add	w25,w25,w21			// d+=h
269	eor	w28,w28,w23			// Maj(a,b,c)
270	eor	w17,w12,w17,ror#13	// Sigma0(a)
271	add	w21,w21,w28			// h+=Maj(a,b,c)
272	ldr	w28,[x30],#4		// *K++, w19 in next round
273	//add	w21,w21,w17			// h+=Sigma0(a)
274#ifndef	__ARMEB__
275	rev	w10,w10			// 7
276#endif
277	ldp	w11,w12,[x1],#2*4
278	add	w21,w21,w17			// h+=Sigma0(a)
279	ror	w16,w25,#6
280	add	w20,w20,w28			// h+=K[i]
281	eor	w13,w25,w25,ror#14
282	and	w17,w26,w25
283	bic	w28,w27,w25
284	add	w20,w20,w10			// h+=X[i]
285	orr	w17,w17,w28			// Ch(e,f,g)
286	eor	w28,w21,w22			// a^b, b^c in next round
287	eor	w16,w16,w13,ror#11	// Sigma1(e)
288	ror	w13,w21,#2
289	add	w20,w20,w17			// h+=Ch(e,f,g)
290	eor	w17,w21,w21,ror#9
291	add	w20,w20,w16			// h+=Sigma1(e)
292	and	w19,w19,w28			// (b^c)&=(a^b)
293	add	w24,w24,w20			// d+=h
294	eor	w19,w19,w22			// Maj(a,b,c)
295	eor	w17,w13,w17,ror#13	// Sigma0(a)
296	add	w20,w20,w19			// h+=Maj(a,b,c)
297	ldr	w19,[x30],#4		// *K++, w28 in next round
298	//add	w20,w20,w17			// h+=Sigma0(a)
299#ifndef	__ARMEB__
300	rev	w11,w11			// 8
301#endif
302	add	w20,w20,w17			// h+=Sigma0(a)
303	ror	w16,w24,#6
304	add	w27,w27,w19			// h+=K[i]
305	eor	w14,w24,w24,ror#14
306	and	w17,w25,w24
307	bic	w19,w26,w24
308	add	w27,w27,w11			// h+=X[i]
309	orr	w17,w17,w19			// Ch(e,f,g)
310	eor	w19,w20,w21			// a^b, b^c in next round
311	eor	w16,w16,w14,ror#11	// Sigma1(e)
312	ror	w14,w20,#2
313	add	w27,w27,w17			// h+=Ch(e,f,g)
314	eor	w17,w20,w20,ror#9
315	add	w27,w27,w16			// h+=Sigma1(e)
316	and	w28,w28,w19			// (b^c)&=(a^b)
317	add	w23,w23,w27			// d+=h
318	eor	w28,w28,w21			// Maj(a,b,c)
319	eor	w17,w14,w17,ror#13	// Sigma0(a)
320	add	w27,w27,w28			// h+=Maj(a,b,c)
321	ldr	w28,[x30],#4		// *K++, w19 in next round
322	//add	w27,w27,w17			// h+=Sigma0(a)
323#ifndef	__ARMEB__
324	rev	w12,w12			// 9
325#endif
326	ldp	w13,w14,[x1],#2*4
327	add	w27,w27,w17			// h+=Sigma0(a)
328	ror	w16,w23,#6
329	add	w26,w26,w28			// h+=K[i]
330	eor	w15,w23,w23,ror#14
331	and	w17,w24,w23
332	bic	w28,w25,w23
333	add	w26,w26,w12			// h+=X[i]
334	orr	w17,w17,w28			// Ch(e,f,g)
335	eor	w28,w27,w20			// a^b, b^c in next round
336	eor	w16,w16,w15,ror#11	// Sigma1(e)
337	ror	w15,w27,#2
338	add	w26,w26,w17			// h+=Ch(e,f,g)
339	eor	w17,w27,w27,ror#9
340	add	w26,w26,w16			// h+=Sigma1(e)
341	and	w19,w19,w28			// (b^c)&=(a^b)
342	add	w22,w22,w26			// d+=h
343	eor	w19,w19,w20			// Maj(a,b,c)
344	eor	w17,w15,w17,ror#13	// Sigma0(a)
345	add	w26,w26,w19			// h+=Maj(a,b,c)
346	ldr	w19,[x30],#4		// *K++, w28 in next round
347	//add	w26,w26,w17			// h+=Sigma0(a)
348#ifndef	__ARMEB__
349	rev	w13,w13			// 10
350#endif
351	add	w26,w26,w17			// h+=Sigma0(a)
352	ror	w16,w22,#6
353	add	w25,w25,w19			// h+=K[i]
354	eor	w0,w22,w22,ror#14
355	and	w17,w23,w22
356	bic	w19,w24,w22
357	add	w25,w25,w13			// h+=X[i]
358	orr	w17,w17,w19			// Ch(e,f,g)
359	eor	w19,w26,w27			// a^b, b^c in next round
360	eor	w16,w16,w0,ror#11	// Sigma1(e)
361	ror	w0,w26,#2
362	add	w25,w25,w17			// h+=Ch(e,f,g)
363	eor	w17,w26,w26,ror#9
364	add	w25,w25,w16			// h+=Sigma1(e)
365	and	w28,w28,w19			// (b^c)&=(a^b)
366	add	w21,w21,w25			// d+=h
367	eor	w28,w28,w27			// Maj(a,b,c)
368	eor	w17,w0,w17,ror#13	// Sigma0(a)
369	add	w25,w25,w28			// h+=Maj(a,b,c)
370	ldr	w28,[x30],#4		// *K++, w19 in next round
371	//add	w25,w25,w17			// h+=Sigma0(a)
372#ifndef	__ARMEB__
373	rev	w14,w14			// 11
374#endif
375	ldp	w15,w0,[x1],#2*4
376	add	w25,w25,w17			// h+=Sigma0(a)
377	str	w6,[sp,#12]
378	ror	w16,w21,#6
379	add	w24,w24,w28			// h+=K[i]
380	eor	w6,w21,w21,ror#14
381	and	w17,w22,w21
382	bic	w28,w23,w21
383	add	w24,w24,w14			// h+=X[i]
384	orr	w17,w17,w28			// Ch(e,f,g)
385	eor	w28,w25,w26			// a^b, b^c in next round
386	eor	w16,w16,w6,ror#11	// Sigma1(e)
387	ror	w6,w25,#2
388	add	w24,w24,w17			// h+=Ch(e,f,g)
389	eor	w17,w25,w25,ror#9
390	add	w24,w24,w16			// h+=Sigma1(e)
391	and	w19,w19,w28			// (b^c)&=(a^b)
392	add	w20,w20,w24			// d+=h
393	eor	w19,w19,w26			// Maj(a,b,c)
394	eor	w17,w6,w17,ror#13	// Sigma0(a)
395	add	w24,w24,w19			// h+=Maj(a,b,c)
396	ldr	w19,[x30],#4		// *K++, w28 in next round
397	//add	w24,w24,w17			// h+=Sigma0(a)
398#ifndef	__ARMEB__
399	rev	w15,w15			// 12
400#endif
401	add	w24,w24,w17			// h+=Sigma0(a)
402	str	w7,[sp,#0]
403	ror	w16,w20,#6
404	add	w23,w23,w19			// h+=K[i]
405	eor	w7,w20,w20,ror#14
406	and	w17,w21,w20
407	bic	w19,w22,w20
408	add	w23,w23,w15			// h+=X[i]
409	orr	w17,w17,w19			// Ch(e,f,g)
410	eor	w19,w24,w25			// a^b, b^c in next round
411	eor	w16,w16,w7,ror#11	// Sigma1(e)
412	ror	w7,w24,#2
413	add	w23,w23,w17			// h+=Ch(e,f,g)
414	eor	w17,w24,w24,ror#9
415	add	w23,w23,w16			// h+=Sigma1(e)
416	and	w28,w28,w19			// (b^c)&=(a^b)
417	add	w27,w27,w23			// d+=h
418	eor	w28,w28,w25			// Maj(a,b,c)
419	eor	w17,w7,w17,ror#13	// Sigma0(a)
420	add	w23,w23,w28			// h+=Maj(a,b,c)
421	ldr	w28,[x30],#4		// *K++, w19 in next round
422	//add	w23,w23,w17			// h+=Sigma0(a)
423#ifndef	__ARMEB__
424	rev	w0,w0			// 13
425#endif
426	ldp	w1,w2,[x1]
427	add	w23,w23,w17			// h+=Sigma0(a)
428	str	w8,[sp,#4]
429	ror	w16,w27,#6
430	add	w22,w22,w28			// h+=K[i]
431	eor	w8,w27,w27,ror#14
432	and	w17,w20,w27
433	bic	w28,w21,w27
434	add	w22,w22,w0			// h+=X[i]
435	orr	w17,w17,w28			// Ch(e,f,g)
436	eor	w28,w23,w24			// a^b, b^c in next round
437	eor	w16,w16,w8,ror#11	// Sigma1(e)
438	ror	w8,w23,#2
439	add	w22,w22,w17			// h+=Ch(e,f,g)
440	eor	w17,w23,w23,ror#9
441	add	w22,w22,w16			// h+=Sigma1(e)
442	and	w19,w19,w28			// (b^c)&=(a^b)
443	add	w26,w26,w22			// d+=h
444	eor	w19,w19,w24			// Maj(a,b,c)
445	eor	w17,w8,w17,ror#13	// Sigma0(a)
446	add	w22,w22,w19			// h+=Maj(a,b,c)
447	ldr	w19,[x30],#4		// *K++, w28 in next round
448	//add	w22,w22,w17			// h+=Sigma0(a)
449#ifndef	__ARMEB__
450	rev	w1,w1			// 14
451#endif
452	ldr	w6,[sp,#12]
453	add	w22,w22,w17			// h+=Sigma0(a)
454	str	w9,[sp,#8]
455	ror	w16,w26,#6
456	add	w21,w21,w19			// h+=K[i]
457	eor	w9,w26,w26,ror#14
458	and	w17,w27,w26
459	bic	w19,w20,w26
460	add	w21,w21,w1			// h+=X[i]
461	orr	w17,w17,w19			// Ch(e,f,g)
462	eor	w19,w22,w23			// a^b, b^c in next round
463	eor	w16,w16,w9,ror#11	// Sigma1(e)
464	ror	w9,w22,#2
465	add	w21,w21,w17			// h+=Ch(e,f,g)
466	eor	w17,w22,w22,ror#9
467	add	w21,w21,w16			// h+=Sigma1(e)
468	and	w28,w28,w19			// (b^c)&=(a^b)
469	add	w25,w25,w21			// d+=h
470	eor	w28,w28,w23			// Maj(a,b,c)
471	eor	w17,w9,w17,ror#13	// Sigma0(a)
472	add	w21,w21,w28			// h+=Maj(a,b,c)
473	ldr	w28,[x30],#4		// *K++, w19 in next round
474	//add	w21,w21,w17			// h+=Sigma0(a)
475#ifndef	__ARMEB__
476	rev	w2,w2			// 15
477#endif
478	ldr	w7,[sp,#0]
479	add	w21,w21,w17			// h+=Sigma0(a)
480	str	w10,[sp,#12]
481	ror	w16,w25,#6
482	add	w20,w20,w28			// h+=K[i]
483	ror	w9,w4,#7
484	and	w17,w26,w25
485	ror	w8,w1,#17
486	bic	w28,w27,w25
487	ror	w10,w21,#2
488	add	w20,w20,w2			// h+=X[i]
489	eor	w16,w16,w25,ror#11
490	eor	w9,w9,w4,ror#18
491	orr	w17,w17,w28			// Ch(e,f,g)
492	eor	w28,w21,w22			// a^b, b^c in next round
493	eor	w16,w16,w25,ror#25	// Sigma1(e)
494	eor	w10,w10,w21,ror#13
495	add	w20,w20,w17			// h+=Ch(e,f,g)
496	and	w19,w19,w28			// (b^c)&=(a^b)
497	eor	w8,w8,w1,ror#19
498	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
499	add	w20,w20,w16			// h+=Sigma1(e)
500	eor	w19,w19,w22			// Maj(a,b,c)
501	eor	w17,w10,w21,ror#22	// Sigma0(a)
502	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
503	add	w3,w3,w12
504	add	w24,w24,w20			// d+=h
505	add	w20,w20,w19			// h+=Maj(a,b,c)
506	ldr	w19,[x30],#4		// *K++, w28 in next round
507	add	w3,w3,w9
508	add	w20,w20,w17			// h+=Sigma0(a)
509	add	w3,w3,w8
510.Loop_16_xx:
511	ldr	w8,[sp,#4]
512	str	w11,[sp,#0]
513	ror	w16,w24,#6
514	add	w27,w27,w19			// h+=K[i]
515	ror	w10,w5,#7
516	and	w17,w25,w24
517	ror	w9,w2,#17
518	bic	w19,w26,w24
519	ror	w11,w20,#2
520	add	w27,w27,w3			// h+=X[i]
521	eor	w16,w16,w24,ror#11
522	eor	w10,w10,w5,ror#18
523	orr	w17,w17,w19			// Ch(e,f,g)
524	eor	w19,w20,w21			// a^b, b^c in next round
525	eor	w16,w16,w24,ror#25	// Sigma1(e)
526	eor	w11,w11,w20,ror#13
527	add	w27,w27,w17			// h+=Ch(e,f,g)
528	and	w28,w28,w19			// (b^c)&=(a^b)
529	eor	w9,w9,w2,ror#19
530	eor	w10,w10,w5,lsr#3	// sigma0(X[i+1])
531	add	w27,w27,w16			// h+=Sigma1(e)
532	eor	w28,w28,w21			// Maj(a,b,c)
533	eor	w17,w11,w20,ror#22	// Sigma0(a)
534	eor	w9,w9,w2,lsr#10	// sigma1(X[i+14])
535	add	w4,w4,w13
536	add	w23,w23,w27			// d+=h
537	add	w27,w27,w28			// h+=Maj(a,b,c)
538	ldr	w28,[x30],#4		// *K++, w19 in next round
539	add	w4,w4,w10
540	add	w27,w27,w17			// h+=Sigma0(a)
541	add	w4,w4,w9
542	ldr	w9,[sp,#8]
543	str	w12,[sp,#4]
544	ror	w16,w23,#6
545	add	w26,w26,w28			// h+=K[i]
546	ror	w11,w6,#7
547	and	w17,w24,w23
548	ror	w10,w3,#17
549	bic	w28,w25,w23
550	ror	w12,w27,#2
551	add	w26,w26,w4			// h+=X[i]
552	eor	w16,w16,w23,ror#11
553	eor	w11,w11,w6,ror#18
554	orr	w17,w17,w28			// Ch(e,f,g)
555	eor	w28,w27,w20			// a^b, b^c in next round
556	eor	w16,w16,w23,ror#25	// Sigma1(e)
557	eor	w12,w12,w27,ror#13
558	add	w26,w26,w17			// h+=Ch(e,f,g)
559	and	w19,w19,w28			// (b^c)&=(a^b)
560	eor	w10,w10,w3,ror#19
561	eor	w11,w11,w6,lsr#3	// sigma0(X[i+1])
562	add	w26,w26,w16			// h+=Sigma1(e)
563	eor	w19,w19,w20			// Maj(a,b,c)
564	eor	w17,w12,w27,ror#22	// Sigma0(a)
565	eor	w10,w10,w3,lsr#10	// sigma1(X[i+14])
566	add	w5,w5,w14
567	add	w22,w22,w26			// d+=h
568	add	w26,w26,w19			// h+=Maj(a,b,c)
569	ldr	w19,[x30],#4		// *K++, w28 in next round
570	add	w5,w5,w11
571	add	w26,w26,w17			// h+=Sigma0(a)
572	add	w5,w5,w10
573	ldr	w10,[sp,#12]
574	str	w13,[sp,#8]
575	ror	w16,w22,#6
576	add	w25,w25,w19			// h+=K[i]
577	ror	w12,w7,#7
578	and	w17,w23,w22
579	ror	w11,w4,#17
580	bic	w19,w24,w22
581	ror	w13,w26,#2
582	add	w25,w25,w5			// h+=X[i]
583	eor	w16,w16,w22,ror#11
584	eor	w12,w12,w7,ror#18
585	orr	w17,w17,w19			// Ch(e,f,g)
586	eor	w19,w26,w27			// a^b, b^c in next round
587	eor	w16,w16,w22,ror#25	// Sigma1(e)
588	eor	w13,w13,w26,ror#13
589	add	w25,w25,w17			// h+=Ch(e,f,g)
590	and	w28,w28,w19			// (b^c)&=(a^b)
591	eor	w11,w11,w4,ror#19
592	eor	w12,w12,w7,lsr#3	// sigma0(X[i+1])
593	add	w25,w25,w16			// h+=Sigma1(e)
594	eor	w28,w28,w27			// Maj(a,b,c)
595	eor	w17,w13,w26,ror#22	// Sigma0(a)
596	eor	w11,w11,w4,lsr#10	// sigma1(X[i+14])
597	add	w6,w6,w15
598	add	w21,w21,w25			// d+=h
599	add	w25,w25,w28			// h+=Maj(a,b,c)
600	ldr	w28,[x30],#4		// *K++, w19 in next round
601	add	w6,w6,w12
602	add	w25,w25,w17			// h+=Sigma0(a)
603	add	w6,w6,w11
604	ldr	w11,[sp,#0]
605	str	w14,[sp,#12]
606	ror	w16,w21,#6
607	add	w24,w24,w28			// h+=K[i]
608	ror	w13,w8,#7
609	and	w17,w22,w21
610	ror	w12,w5,#17
611	bic	w28,w23,w21
612	ror	w14,w25,#2
613	add	w24,w24,w6			// h+=X[i]
614	eor	w16,w16,w21,ror#11
615	eor	w13,w13,w8,ror#18
616	orr	w17,w17,w28			// Ch(e,f,g)
617	eor	w28,w25,w26			// a^b, b^c in next round
618	eor	w16,w16,w21,ror#25	// Sigma1(e)
619	eor	w14,w14,w25,ror#13
620	add	w24,w24,w17			// h+=Ch(e,f,g)
621	and	w19,w19,w28			// (b^c)&=(a^b)
622	eor	w12,w12,w5,ror#19
623	eor	w13,w13,w8,lsr#3	// sigma0(X[i+1])
624	add	w24,w24,w16			// h+=Sigma1(e)
625	eor	w19,w19,w26			// Maj(a,b,c)
626	eor	w17,w14,w25,ror#22	// Sigma0(a)
627	eor	w12,w12,w5,lsr#10	// sigma1(X[i+14])
628	add	w7,w7,w0
629	add	w20,w20,w24			// d+=h
630	add	w24,w24,w19			// h+=Maj(a,b,c)
631	ldr	w19,[x30],#4		// *K++, w28 in next round
632	add	w7,w7,w13
633	add	w24,w24,w17			// h+=Sigma0(a)
634	add	w7,w7,w12
635	ldr	w12,[sp,#4]
636	str	w15,[sp,#0]
637	ror	w16,w20,#6
638	add	w23,w23,w19			// h+=K[i]
639	ror	w14,w9,#7
640	and	w17,w21,w20
641	ror	w13,w6,#17
642	bic	w19,w22,w20
643	ror	w15,w24,#2
644	add	w23,w23,w7			// h+=X[i]
645	eor	w16,w16,w20,ror#11
646	eor	w14,w14,w9,ror#18
647	orr	w17,w17,w19			// Ch(e,f,g)
648	eor	w19,w24,w25			// a^b, b^c in next round
649	eor	w16,w16,w20,ror#25	// Sigma1(e)
650	eor	w15,w15,w24,ror#13
651	add	w23,w23,w17			// h+=Ch(e,f,g)
652	and	w28,w28,w19			// (b^c)&=(a^b)
653	eor	w13,w13,w6,ror#19
654	eor	w14,w14,w9,lsr#3	// sigma0(X[i+1])
655	add	w23,w23,w16			// h+=Sigma1(e)
656	eor	w28,w28,w25			// Maj(a,b,c)
657	eor	w17,w15,w24,ror#22	// Sigma0(a)
658	eor	w13,w13,w6,lsr#10	// sigma1(X[i+14])
659	add	w8,w8,w1
660	add	w27,w27,w23			// d+=h
661	add	w23,w23,w28			// h+=Maj(a,b,c)
662	ldr	w28,[x30],#4		// *K++, w19 in next round
663	add	w8,w8,w14
664	add	w23,w23,w17			// h+=Sigma0(a)
665	add	w8,w8,w13
666	ldr	w13,[sp,#8]
667	str	w0,[sp,#4]
668	ror	w16,w27,#6
669	add	w22,w22,w28			// h+=K[i]
670	ror	w15,w10,#7
671	and	w17,w20,w27
672	ror	w14,w7,#17
673	bic	w28,w21,w27
674	ror	w0,w23,#2
675	add	w22,w22,w8			// h+=X[i]
676	eor	w16,w16,w27,ror#11
677	eor	w15,w15,w10,ror#18
678	orr	w17,w17,w28			// Ch(e,f,g)
679	eor	w28,w23,w24			// a^b, b^c in next round
680	eor	w16,w16,w27,ror#25	// Sigma1(e)
681	eor	w0,w0,w23,ror#13
682	add	w22,w22,w17			// h+=Ch(e,f,g)
683	and	w19,w19,w28			// (b^c)&=(a^b)
684	eor	w14,w14,w7,ror#19
685	eor	w15,w15,w10,lsr#3	// sigma0(X[i+1])
686	add	w22,w22,w16			// h+=Sigma1(e)
687	eor	w19,w19,w24			// Maj(a,b,c)
688	eor	w17,w0,w23,ror#22	// Sigma0(a)
689	eor	w14,w14,w7,lsr#10	// sigma1(X[i+14])
690	add	w9,w9,w2
691	add	w26,w26,w22			// d+=h
692	add	w22,w22,w19			// h+=Maj(a,b,c)
693	ldr	w19,[x30],#4		// *K++, w28 in next round
694	add	w9,w9,w15
695	add	w22,w22,w17			// h+=Sigma0(a)
696	add	w9,w9,w14
697	ldr	w14,[sp,#12]
698	str	w1,[sp,#8]
699	ror	w16,w26,#6
700	add	w21,w21,w19			// h+=K[i]
701	ror	w0,w11,#7
702	and	w17,w27,w26
703	ror	w15,w8,#17
704	bic	w19,w20,w26
705	ror	w1,w22,#2
706	add	w21,w21,w9			// h+=X[i]
707	eor	w16,w16,w26,ror#11
708	eor	w0,w0,w11,ror#18
709	orr	w17,w17,w19			// Ch(e,f,g)
710	eor	w19,w22,w23			// a^b, b^c in next round
711	eor	w16,w16,w26,ror#25	// Sigma1(e)
712	eor	w1,w1,w22,ror#13
713	add	w21,w21,w17			// h+=Ch(e,f,g)
714	and	w28,w28,w19			// (b^c)&=(a^b)
715	eor	w15,w15,w8,ror#19
716	eor	w0,w0,w11,lsr#3	// sigma0(X[i+1])
717	add	w21,w21,w16			// h+=Sigma1(e)
718	eor	w28,w28,w23			// Maj(a,b,c)
719	eor	w17,w1,w22,ror#22	// Sigma0(a)
720	eor	w15,w15,w8,lsr#10	// sigma1(X[i+14])
721	add	w10,w10,w3
722	add	w25,w25,w21			// d+=h
723	add	w21,w21,w28			// h+=Maj(a,b,c)
724	ldr	w28,[x30],#4		// *K++, w19 in next round
725	add	w10,w10,w0
726	add	w21,w21,w17			// h+=Sigma0(a)
727	add	w10,w10,w15
728	ldr	w15,[sp,#0]
729	str	w2,[sp,#12]
730	ror	w16,w25,#6
731	add	w20,w20,w28			// h+=K[i]
732	ror	w1,w12,#7
733	and	w17,w26,w25
734	ror	w0,w9,#17
735	bic	w28,w27,w25
736	ror	w2,w21,#2
737	add	w20,w20,w10			// h+=X[i]
738	eor	w16,w16,w25,ror#11
739	eor	w1,w1,w12,ror#18
740	orr	w17,w17,w28			// Ch(e,f,g)
741	eor	w28,w21,w22			// a^b, b^c in next round
742	eor	w16,w16,w25,ror#25	// Sigma1(e)
743	eor	w2,w2,w21,ror#13
744	add	w20,w20,w17			// h+=Ch(e,f,g)
745	and	w19,w19,w28			// (b^c)&=(a^b)
746	eor	w0,w0,w9,ror#19
747	eor	w1,w1,w12,lsr#3	// sigma0(X[i+1])
748	add	w20,w20,w16			// h+=Sigma1(e)
749	eor	w19,w19,w22			// Maj(a,b,c)
750	eor	w17,w2,w21,ror#22	// Sigma0(a)
751	eor	w0,w0,w9,lsr#10	// sigma1(X[i+14])
752	add	w11,w11,w4
753	add	w24,w24,w20			// d+=h
754	add	w20,w20,w19			// h+=Maj(a,b,c)
755	ldr	w19,[x30],#4		// *K++, w28 in next round
756	add	w11,w11,w1
757	add	w20,w20,w17			// h+=Sigma0(a)
758	add	w11,w11,w0
759	ldr	w0,[sp,#4]
760	str	w3,[sp,#0]
761	ror	w16,w24,#6
762	add	w27,w27,w19			// h+=K[i]
763	ror	w2,w13,#7
764	and	w17,w25,w24
765	ror	w1,w10,#17
766	bic	w19,w26,w24
767	ror	w3,w20,#2
768	add	w27,w27,w11			// h+=X[i]
769	eor	w16,w16,w24,ror#11
770	eor	w2,w2,w13,ror#18
771	orr	w17,w17,w19			// Ch(e,f,g)
772	eor	w19,w20,w21			// a^b, b^c in next round
773	eor	w16,w16,w24,ror#25	// Sigma1(e)
774	eor	w3,w3,w20,ror#13
775	add	w27,w27,w17			// h+=Ch(e,f,g)
776	and	w28,w28,w19			// (b^c)&=(a^b)
777	eor	w1,w1,w10,ror#19
778	eor	w2,w2,w13,lsr#3	// sigma0(X[i+1])
779	add	w27,w27,w16			// h+=Sigma1(e)
780	eor	w28,w28,w21			// Maj(a,b,c)
781	eor	w17,w3,w20,ror#22	// Sigma0(a)
782	eor	w1,w1,w10,lsr#10	// sigma1(X[i+14])
783	add	w12,w12,w5
784	add	w23,w23,w27			// d+=h
785	add	w27,w27,w28			// h+=Maj(a,b,c)
786	ldr	w28,[x30],#4		// *K++, w19 in next round
787	add	w12,w12,w2
788	add	w27,w27,w17			// h+=Sigma0(a)
789	add	w12,w12,w1
790	ldr	w1,[sp,#8]
791	str	w4,[sp,#4]
792	ror	w16,w23,#6
793	add	w26,w26,w28			// h+=K[i]
794	ror	w3,w14,#7
795	and	w17,w24,w23
796	ror	w2,w11,#17
797	bic	w28,w25,w23
798	ror	w4,w27,#2
799	add	w26,w26,w12			// h+=X[i]
800	eor	w16,w16,w23,ror#11
801	eor	w3,w3,w14,ror#18
802	orr	w17,w17,w28			// Ch(e,f,g)
803	eor	w28,w27,w20			// a^b, b^c in next round
804	eor	w16,w16,w23,ror#25	// Sigma1(e)
805	eor	w4,w4,w27,ror#13
806	add	w26,w26,w17			// h+=Ch(e,f,g)
807	and	w19,w19,w28			// (b^c)&=(a^b)
808	eor	w2,w2,w11,ror#19
809	eor	w3,w3,w14,lsr#3	// sigma0(X[i+1])
810	add	w26,w26,w16			// h+=Sigma1(e)
811	eor	w19,w19,w20			// Maj(a,b,c)
812	eor	w17,w4,w27,ror#22	// Sigma0(a)
813	eor	w2,w2,w11,lsr#10	// sigma1(X[i+14])
814	add	w13,w13,w6
815	add	w22,w22,w26			// d+=h
816	add	w26,w26,w19			// h+=Maj(a,b,c)
817	ldr	w19,[x30],#4		// *K++, w28 in next round
818	add	w13,w13,w3
819	add	w26,w26,w17			// h+=Sigma0(a)
820	add	w13,w13,w2
821	ldr	w2,[sp,#12]
822	str	w5,[sp,#8]
823	ror	w16,w22,#6
824	add	w25,w25,w19			// h+=K[i]
825	ror	w4,w15,#7
826	and	w17,w23,w22
827	ror	w3,w12,#17
828	bic	w19,w24,w22
829	ror	w5,w26,#2
830	add	w25,w25,w13			// h+=X[i]
831	eor	w16,w16,w22,ror#11
832	eor	w4,w4,w15,ror#18
833	orr	w17,w17,w19			// Ch(e,f,g)
834	eor	w19,w26,w27			// a^b, b^c in next round
835	eor	w16,w16,w22,ror#25	// Sigma1(e)
836	eor	w5,w5,w26,ror#13
837	add	w25,w25,w17			// h+=Ch(e,f,g)
838	and	w28,w28,w19			// (b^c)&=(a^b)
839	eor	w3,w3,w12,ror#19
840	eor	w4,w4,w15,lsr#3	// sigma0(X[i+1])
841	add	w25,w25,w16			// h+=Sigma1(e)
842	eor	w28,w28,w27			// Maj(a,b,c)
843	eor	w17,w5,w26,ror#22	// Sigma0(a)
844	eor	w3,w3,w12,lsr#10	// sigma1(X[i+14])
845	add	w14,w14,w7
846	add	w21,w21,w25			// d+=h
847	add	w25,w25,w28			// h+=Maj(a,b,c)
848	ldr	w28,[x30],#4		// *K++, w19 in next round
849	add	w14,w14,w4
850	add	w25,w25,w17			// h+=Sigma0(a)
851	add	w14,w14,w3
852	ldr	w3,[sp,#0]
853	str	w6,[sp,#12]
854	ror	w16,w21,#6
855	add	w24,w24,w28			// h+=K[i]
856	ror	w5,w0,#7
857	and	w17,w22,w21
858	ror	w4,w13,#17
859	bic	w28,w23,w21
860	ror	w6,w25,#2
861	add	w24,w24,w14			// h+=X[i]
862	eor	w16,w16,w21,ror#11
863	eor	w5,w5,w0,ror#18
864	orr	w17,w17,w28			// Ch(e,f,g)
865	eor	w28,w25,w26			// a^b, b^c in next round
866	eor	w16,w16,w21,ror#25	// Sigma1(e)
867	eor	w6,w6,w25,ror#13
868	add	w24,w24,w17			// h+=Ch(e,f,g)
869	and	w19,w19,w28			// (b^c)&=(a^b)
870	eor	w4,w4,w13,ror#19
871	eor	w5,w5,w0,lsr#3	// sigma0(X[i+1])
872	add	w24,w24,w16			// h+=Sigma1(e)
873	eor	w19,w19,w26			// Maj(a,b,c)
874	eor	w17,w6,w25,ror#22	// Sigma0(a)
875	eor	w4,w4,w13,lsr#10	// sigma1(X[i+14])
876	add	w15,w15,w8
877	add	w20,w20,w24			// d+=h
878	add	w24,w24,w19			// h+=Maj(a,b,c)
879	ldr	w19,[x30],#4		// *K++, w28 in next round
880	add	w15,w15,w5
881	add	w24,w24,w17			// h+=Sigma0(a)
882	add	w15,w15,w4
883	ldr	w4,[sp,#4]
884	str	w7,[sp,#0]
885	ror	w16,w20,#6
886	add	w23,w23,w19			// h+=K[i]
887	ror	w6,w1,#7
888	and	w17,w21,w20
889	ror	w5,w14,#17
890	bic	w19,w22,w20
891	ror	w7,w24,#2
892	add	w23,w23,w15			// h+=X[i]
893	eor	w16,w16,w20,ror#11
894	eor	w6,w6,w1,ror#18
895	orr	w17,w17,w19			// Ch(e,f,g)
896	eor	w19,w24,w25			// a^b, b^c in next round
897	eor	w16,w16,w20,ror#25	// Sigma1(e)
898	eor	w7,w7,w24,ror#13
899	add	w23,w23,w17			// h+=Ch(e,f,g)
900	and	w28,w28,w19			// (b^c)&=(a^b)
901	eor	w5,w5,w14,ror#19
902	eor	w6,w6,w1,lsr#3	// sigma0(X[i+1])
903	add	w23,w23,w16			// h+=Sigma1(e)
904	eor	w28,w28,w25			// Maj(a,b,c)
905	eor	w17,w7,w24,ror#22	// Sigma0(a)
906	eor	w5,w5,w14,lsr#10	// sigma1(X[i+14])
907	add	w0,w0,w9
908	add	w27,w27,w23			// d+=h
909	add	w23,w23,w28			// h+=Maj(a,b,c)
910	ldr	w28,[x30],#4		// *K++, w19 in next round
911	add	w0,w0,w6
912	add	w23,w23,w17			// h+=Sigma0(a)
913	add	w0,w0,w5
914	ldr	w5,[sp,#8]
915	str	w8,[sp,#4]
916	ror	w16,w27,#6
917	add	w22,w22,w28			// h+=K[i]
918	ror	w7,w2,#7
919	and	w17,w20,w27
920	ror	w6,w15,#17
921	bic	w28,w21,w27
922	ror	w8,w23,#2
923	add	w22,w22,w0			// h+=X[i]
924	eor	w16,w16,w27,ror#11
925	eor	w7,w7,w2,ror#18
926	orr	w17,w17,w28			// Ch(e,f,g)
927	eor	w28,w23,w24			// a^b, b^c in next round
928	eor	w16,w16,w27,ror#25	// Sigma1(e)
929	eor	w8,w8,w23,ror#13
930	add	w22,w22,w17			// h+=Ch(e,f,g)
931	and	w19,w19,w28			// (b^c)&=(a^b)
932	eor	w6,w6,w15,ror#19
933	eor	w7,w7,w2,lsr#3	// sigma0(X[i+1])
934	add	w22,w22,w16			// h+=Sigma1(e)
935	eor	w19,w19,w24			// Maj(a,b,c)
936	eor	w17,w8,w23,ror#22	// Sigma0(a)
937	eor	w6,w6,w15,lsr#10	// sigma1(X[i+14])
938	add	w1,w1,w10
939	add	w26,w26,w22			// d+=h
940	add	w22,w22,w19			// h+=Maj(a,b,c)
941	ldr	w19,[x30],#4		// *K++, w28 in next round
942	add	w1,w1,w7
943	add	w22,w22,w17			// h+=Sigma0(a)
944	add	w1,w1,w6
945	ldr	w6,[sp,#12]
946	str	w9,[sp,#8]
947	ror	w16,w26,#6
948	add	w21,w21,w19			// h+=K[i]
949	ror	w8,w3,#7
950	and	w17,w27,w26
951	ror	w7,w0,#17
952	bic	w19,w20,w26
953	ror	w9,w22,#2
954	add	w21,w21,w1			// h+=X[i]
955	eor	w16,w16,w26,ror#11
956	eor	w8,w8,w3,ror#18
957	orr	w17,w17,w19			// Ch(e,f,g)
958	eor	w19,w22,w23			// a^b, b^c in next round
959	eor	w16,w16,w26,ror#25	// Sigma1(e)
960	eor	w9,w9,w22,ror#13
961	add	w21,w21,w17			// h+=Ch(e,f,g)
962	and	w28,w28,w19			// (b^c)&=(a^b)
963	eor	w7,w7,w0,ror#19
964	eor	w8,w8,w3,lsr#3	// sigma0(X[i+1])
965	add	w21,w21,w16			// h+=Sigma1(e)
966	eor	w28,w28,w23			// Maj(a,b,c)
967	eor	w17,w9,w22,ror#22	// Sigma0(a)
968	eor	w7,w7,w0,lsr#10	// sigma1(X[i+14])
969	add	w2,w2,w11
970	add	w25,w25,w21			// d+=h
971	add	w21,w21,w28			// h+=Maj(a,b,c)
972	ldr	w28,[x30],#4		// *K++, w19 in next round
973	add	w2,w2,w8
974	add	w21,w21,w17			// h+=Sigma0(a)
975	add	w2,w2,w7
976	ldr	w7,[sp,#0]
977	str	w10,[sp,#12]
978	ror	w16,w25,#6
979	add	w20,w20,w28			// h+=K[i]
980	ror	w9,w4,#7
981	and	w17,w26,w25
982	ror	w8,w1,#17
983	bic	w28,w27,w25
984	ror	w10,w21,#2
985	add	w20,w20,w2			// h+=X[i]
986	eor	w16,w16,w25,ror#11
987	eor	w9,w9,w4,ror#18
988	orr	w17,w17,w28			// Ch(e,f,g)
989	eor	w28,w21,w22			// a^b, b^c in next round
990	eor	w16,w16,w25,ror#25	// Sigma1(e)
991	eor	w10,w10,w21,ror#13
992	add	w20,w20,w17			// h+=Ch(e,f,g)
993	and	w19,w19,w28			// (b^c)&=(a^b)
994	eor	w8,w8,w1,ror#19
995	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
996	add	w20,w20,w16			// h+=Sigma1(e)
997	eor	w19,w19,w22			// Maj(a,b,c)
998	eor	w17,w10,w21,ror#22	// Sigma0(a)
999	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
1000	add	w3,w3,w12
1001	add	w24,w24,w20			// d+=h
1002	add	w20,w20,w19			// h+=Maj(a,b,c)
1003	ldr	w19,[x30],#4		// *K++, w28 in next round
1004	add	w3,w3,w9
1005	add	w20,w20,w17			// h+=Sigma0(a)
1006	add	w3,w3,w8
1007	cbnz	w19,.Loop_16_xx
1008
1009	ldp	x0,x2,[x29,#96]
1010	ldr	x1,[x29,#112]
1011	sub	x30,x30,#260		// rewind
1012
1013	ldp	w3,w4,[x0]
1014	ldp	w5,w6,[x0,#2*4]
1015	add	x1,x1,#14*4			// advance input pointer
1016	ldp	w7,w8,[x0,#4*4]
1017	add	w20,w20,w3
1018	ldp	w9,w10,[x0,#6*4]
1019	add	w21,w21,w4
1020	add	w22,w22,w5
1021	add	w23,w23,w6
1022	stp	w20,w21,[x0]
1023	add	w24,w24,w7
1024	add	w25,w25,w8
1025	stp	w22,w23,[x0,#2*4]
1026	add	w26,w26,w9
1027	add	w27,w27,w10
1028	cmp	x1,x2
1029	stp	w24,w25,[x0,#4*4]
1030	stp	w26,w27,[x0,#6*4]
1031	b.ne	.Loop
1032
1033	ldp	x19,x20,[x29,#16]
1034	add	sp,sp,#4*4
1035	ldp	x21,x22,[x29,#32]
1036	ldp	x23,x24,[x29,#48]
1037	ldp	x25,x26,[x29,#64]
1038	ldp	x27,x28,[x29,#80]
1039	ldp	x29,x30,[sp],#128
1040	AARCH64_VALIDATE_LINK_REGISTER
1041	ret
1042.size	sha256_block_data_order,.-sha256_block_data_order
1043
1044.section	.rodata
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.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
1067.align	2
1068.align	2
1069.text
1070#ifndef	__KERNEL__
1071.type	sha256_block_armv8,%function
1072.align	6
1073sha256_block_armv8:
1074.Lv8_entry:
1075	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
1076	stp	x29,x30,[sp,#-16]!
1077	add	x29,sp,#0
1078
1079	ld1	{v0.4s,v1.4s},[x0]
1080	adrp	x3,.LK256
1081	add	x3,x3,:lo12:.LK256
1082
1083.Loop_hw:
1084	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1085	sub	x2,x2,#1
1086	ld1	{v16.4s},[x3],#16
1087	rev32	v4.16b,v4.16b
1088	rev32	v5.16b,v5.16b
1089	rev32	v6.16b,v6.16b
1090	rev32	v7.16b,v7.16b
1091	orr	v18.16b,v0.16b,v0.16b		// offload
1092	orr	v19.16b,v1.16b,v1.16b
1093	ld1	{v17.4s},[x3],#16
1094	add	v16.4s,v16.4s,v4.4s
1095.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1096	orr	v2.16b,v0.16b,v0.16b
1097.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1098.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1099.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1100	ld1	{v16.4s},[x3],#16
1101	add	v17.4s,v17.4s,v5.4s
1102.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1103	orr	v2.16b,v0.16b,v0.16b
1104.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1105.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1106.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1107	ld1	{v17.4s},[x3],#16
1108	add	v16.4s,v16.4s,v6.4s
1109.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1110	orr	v2.16b,v0.16b,v0.16b
1111.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1112.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1113.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1114	ld1	{v16.4s},[x3],#16
1115	add	v17.4s,v17.4s,v7.4s
1116.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1117	orr	v2.16b,v0.16b,v0.16b
1118.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1119.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1120.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1121	ld1	{v17.4s},[x3],#16
1122	add	v16.4s,v16.4s,v4.4s
1123.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1124	orr	v2.16b,v0.16b,v0.16b
1125.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1126.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1127.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1128	ld1	{v16.4s},[x3],#16
1129	add	v17.4s,v17.4s,v5.4s
1130.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1131	orr	v2.16b,v0.16b,v0.16b
1132.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1133.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1134.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1135	ld1	{v17.4s},[x3],#16
1136	add	v16.4s,v16.4s,v6.4s
1137.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1138	orr	v2.16b,v0.16b,v0.16b
1139.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1140.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1141.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1142	ld1	{v16.4s},[x3],#16
1143	add	v17.4s,v17.4s,v7.4s
1144.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1145	orr	v2.16b,v0.16b,v0.16b
1146.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1147.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1148.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1149	ld1	{v17.4s},[x3],#16
1150	add	v16.4s,v16.4s,v4.4s
1151.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1152	orr	v2.16b,v0.16b,v0.16b
1153.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1154.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1155.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1156	ld1	{v16.4s},[x3],#16
1157	add	v17.4s,v17.4s,v5.4s
1158.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1159	orr	v2.16b,v0.16b,v0.16b
1160.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1161.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1162.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1163	ld1	{v17.4s},[x3],#16
1164	add	v16.4s,v16.4s,v6.4s
1165.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1166	orr	v2.16b,v0.16b,v0.16b
1167.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1168.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1169.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1170	ld1	{v16.4s},[x3],#16
1171	add	v17.4s,v17.4s,v7.4s
1172.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1173	orr	v2.16b,v0.16b,v0.16b
1174.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1175.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1176.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1177	ld1	{v17.4s},[x3],#16
1178	add	v16.4s,v16.4s,v4.4s
1179	orr	v2.16b,v0.16b,v0.16b
1180.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1181.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1182
1183	ld1	{v16.4s},[x3],#16
1184	add	v17.4s,v17.4s,v5.4s
1185	orr	v2.16b,v0.16b,v0.16b
1186.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1187.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1188
1189	ld1	{v17.4s},[x3]
1190	add	v16.4s,v16.4s,v6.4s
1191	sub	x3,x3,#64*4-16	// rewind
1192	orr	v2.16b,v0.16b,v0.16b
1193.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1194.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1195
1196	add	v17.4s,v17.4s,v7.4s
1197	orr	v2.16b,v0.16b,v0.16b
1198.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1199.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1200
1201	add	v0.4s,v0.4s,v18.4s
1202	add	v1.4s,v1.4s,v19.4s
1203
1204	cbnz	x2,.Loop_hw
1205
1206	st1	{v0.4s,v1.4s},[x0]
1207
1208	ldr	x29,[sp],#16
1209	ret
1210.size	sha256_block_armv8,.-sha256_block_armv8
1211#endif
1212#endif
1213#endif  // !OPENSSL_NO_ASM
1214.section	.note.GNU-stack,"",%progbits
1215