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