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