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