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