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