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