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