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