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