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