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