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