1 // Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License 2.0 (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 // Kryo		1.92		17.4 (+30%)	11.2 (+8%)
30 // ThunderX2	2.54		13.2 (+40%)	8.40 (+18%)
31 //
32 // (*)	Software SHA256 results are of lesser relevance, presented
33 //	mostly for informational purposes.
34 // (**)	The result is a trade-off: it's possible to improve it by
35 //	10% (or by 1 cycle per round), but at the cost of 20% loss
36 //	on Cortex-A53 (or by 4 cycles per round).
37 // (***)	Super-impressive coefficients over gcc-generated code are
38 //	indication of some compiler "pathology", most notably code
39 //	generated with -mgeneral-regs-only is significantly faster
40 //	and the gap is only 40-90%.
41 //
42 // October 2016.
43 //
44 // Originally it was reckoned that it makes no sense to implement NEON
45 // version of SHA256 for 64-bit processors. This is because performance
46 // improvement on most wide-spread Cortex-A5x processors was observed
47 // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
48 // observed that 32-bit NEON SHA256 performs significantly better than
49 // 64-bit scalar version on *some* of the more recent processors. As
50 // result 64-bit NEON version of SHA256 was added to provide best
51 // all-round performance. For example it executes ~30% faster on X-Gene
52 // and Mongoose. [For reference, NEON version of SHA512 is bound to
53 // deliver much less improvement, likely *negative* on Cortex-A5x.
54 // Which is why NEON support is limited to SHA256.]
55 
56 // $output is the last argument if it looks like a file (it has an extension)
57 // $flavour is the first argument if it doesn't look like a file
58 #ifndef	__KERNEL__
59 # include "arm_arch.h"
60 
61 .hidden	OPENSSL_armcap_P
62 #endif
63 
64 .text
65 
66 .globl	sha256_block_data_order
67 .type	sha256_block_data_order,%function
68 .align	6
69 sha256_block_data_order:
70 #ifndef	__KERNEL__
71 	adrp	x16,OPENSSL_armcap_P
72 	ldr	w16,[x16,#:lo12:OPENSSL_armcap_P]
73 	tst	w16,#ARMV8_SHA256
74 	b.ne	.Lv8_entry
75 	tst	w16,#ARMV7_NEON
76 	b.ne	.Lneon_entry
77 #endif
78 .inst	0xd503233f				// paciasp
79 	stp	x29,x30,[sp,#-128]!
80 	add	x29,sp,#0
81 
82 	stp	x19,x20,[sp,#16]
83 	stp	x21,x22,[sp,#32]
84 	stp	x23,x24,[sp,#48]
85 	stp	x25,x26,[sp,#64]
86 	stp	x27,x28,[sp,#80]
87 	sub	sp,sp,#4*4
88 
89 	ldp	w20,w21,[x0]				// load context
90 	ldp	w22,w23,[x0,#2*4]
91 	ldp	w24,w25,[x0,#4*4]
92 	add	x2,x1,x2,lsl#6	// end of input
93 	ldp	w26,w27,[x0,#6*4]
94 	adr	x30,.LK256
95 	stp	x0,x2,[x29,#96]
96 
97 .Loop:
98 	ldp	w3,w4,[x1],#2*4
99 	ldr	w19,[x30],#4			// *K++
100 	eor	w28,w21,w22				// magic seed
101 	str	x1,[x29,#112]
102 #ifndef	__AARCH64EB__
103 	rev	w3,w3			// 0
104 #endif
105 	ror	w16,w24,#6
106 	add	w27,w27,w19			// h+=K[i]
107 	eor	w6,w24,w24,ror#14
108 	and	w17,w25,w24
109 	bic	w19,w26,w24
110 	add	w27,w27,w3			// h+=X[i]
111 	orr	w17,w17,w19			// Ch(e,f,g)
112 	eor	w19,w20,w21			// a^b, b^c in next round
113 	eor	w16,w16,w6,ror#11	// Sigma1(e)
114 	ror	w6,w20,#2
115 	add	w27,w27,w17			// h+=Ch(e,f,g)
116 	eor	w17,w20,w20,ror#9
117 	add	w27,w27,w16			// h+=Sigma1(e)
118 	and	w28,w28,w19			// (b^c)&=(a^b)
119 	add	w23,w23,w27			// d+=h
120 	eor	w28,w28,w21			// Maj(a,b,c)
121 	eor	w17,w6,w17,ror#13	// Sigma0(a)
122 	add	w27,w27,w28			// h+=Maj(a,b,c)
123 	ldr	w28,[x30],#4		// *K++, w19 in next round
124 	//add	w27,w27,w17			// h+=Sigma0(a)
125 #ifndef	__AARCH64EB__
126 	rev	w4,w4			// 1
127 #endif
128 	ldp	w5,w6,[x1],#2*4
129 	add	w27,w27,w17			// h+=Sigma0(a)
130 	ror	w16,w23,#6
131 	add	w26,w26,w28			// h+=K[i]
132 	eor	w7,w23,w23,ror#14
133 	and	w17,w24,w23
134 	bic	w28,w25,w23
135 	add	w26,w26,w4			// h+=X[i]
136 	orr	w17,w17,w28			// Ch(e,f,g)
137 	eor	w28,w27,w20			// a^b, b^c in next round
138 	eor	w16,w16,w7,ror#11	// Sigma1(e)
139 	ror	w7,w27,#2
140 	add	w26,w26,w17			// h+=Ch(e,f,g)
141 	eor	w17,w27,w27,ror#9
142 	add	w26,w26,w16			// h+=Sigma1(e)
143 	and	w19,w19,w28			// (b^c)&=(a^b)
144 	add	w22,w22,w26			// d+=h
145 	eor	w19,w19,w20			// Maj(a,b,c)
146 	eor	w17,w7,w17,ror#13	// Sigma0(a)
147 	add	w26,w26,w19			// h+=Maj(a,b,c)
148 	ldr	w19,[x30],#4		// *K++, w28 in next round
149 	//add	w26,w26,w17			// h+=Sigma0(a)
150 #ifndef	__AARCH64EB__
151 	rev	w5,w5			// 2
152 #endif
153 	add	w26,w26,w17			// h+=Sigma0(a)
154 	ror	w16,w22,#6
155 	add	w25,w25,w19			// h+=K[i]
156 	eor	w8,w22,w22,ror#14
157 	and	w17,w23,w22
158 	bic	w19,w24,w22
159 	add	w25,w25,w5			// h+=X[i]
160 	orr	w17,w17,w19			// Ch(e,f,g)
161 	eor	w19,w26,w27			// a^b, b^c in next round
162 	eor	w16,w16,w8,ror#11	// Sigma1(e)
163 	ror	w8,w26,#2
164 	add	w25,w25,w17			// h+=Ch(e,f,g)
165 	eor	w17,w26,w26,ror#9
166 	add	w25,w25,w16			// h+=Sigma1(e)
167 	and	w28,w28,w19			// (b^c)&=(a^b)
168 	add	w21,w21,w25			// d+=h
169 	eor	w28,w28,w27			// Maj(a,b,c)
170 	eor	w17,w8,w17,ror#13	// Sigma0(a)
171 	add	w25,w25,w28			// h+=Maj(a,b,c)
172 	ldr	w28,[x30],#4		// *K++, w19 in next round
173 	//add	w25,w25,w17			// h+=Sigma0(a)
174 #ifndef	__AARCH64EB__
175 	rev	w6,w6			// 3
176 #endif
177 	ldp	w7,w8,[x1],#2*4
178 	add	w25,w25,w17			// h+=Sigma0(a)
179 	ror	w16,w21,#6
180 	add	w24,w24,w28			// h+=K[i]
181 	eor	w9,w21,w21,ror#14
182 	and	w17,w22,w21
183 	bic	w28,w23,w21
184 	add	w24,w24,w6			// h+=X[i]
185 	orr	w17,w17,w28			// Ch(e,f,g)
186 	eor	w28,w25,w26			// a^b, b^c in next round
187 	eor	w16,w16,w9,ror#11	// Sigma1(e)
188 	ror	w9,w25,#2
189 	add	w24,w24,w17			// h+=Ch(e,f,g)
190 	eor	w17,w25,w25,ror#9
191 	add	w24,w24,w16			// h+=Sigma1(e)
192 	and	w19,w19,w28			// (b^c)&=(a^b)
193 	add	w20,w20,w24			// d+=h
194 	eor	w19,w19,w26			// Maj(a,b,c)
195 	eor	w17,w9,w17,ror#13	// Sigma0(a)
196 	add	w24,w24,w19			// h+=Maj(a,b,c)
197 	ldr	w19,[x30],#4		// *K++, w28 in next round
198 	//add	w24,w24,w17			// h+=Sigma0(a)
199 #ifndef	__AARCH64EB__
200 	rev	w7,w7			// 4
201 #endif
202 	add	w24,w24,w17			// h+=Sigma0(a)
203 	ror	w16,w20,#6
204 	add	w23,w23,w19			// h+=K[i]
205 	eor	w10,w20,w20,ror#14
206 	and	w17,w21,w20
207 	bic	w19,w22,w20
208 	add	w23,w23,w7			// h+=X[i]
209 	orr	w17,w17,w19			// Ch(e,f,g)
210 	eor	w19,w24,w25			// a^b, b^c in next round
211 	eor	w16,w16,w10,ror#11	// Sigma1(e)
212 	ror	w10,w24,#2
213 	add	w23,w23,w17			// h+=Ch(e,f,g)
214 	eor	w17,w24,w24,ror#9
215 	add	w23,w23,w16			// h+=Sigma1(e)
216 	and	w28,w28,w19			// (b^c)&=(a^b)
217 	add	w27,w27,w23			// d+=h
218 	eor	w28,w28,w25			// Maj(a,b,c)
219 	eor	w17,w10,w17,ror#13	// Sigma0(a)
220 	add	w23,w23,w28			// h+=Maj(a,b,c)
221 	ldr	w28,[x30],#4		// *K++, w19 in next round
222 	//add	w23,w23,w17			// h+=Sigma0(a)
223 #ifndef	__AARCH64EB__
224 	rev	w8,w8			// 5
225 #endif
226 	ldp	w9,w10,[x1],#2*4
227 	add	w23,w23,w17			// h+=Sigma0(a)
228 	ror	w16,w27,#6
229 	add	w22,w22,w28			// h+=K[i]
230 	eor	w11,w27,w27,ror#14
231 	and	w17,w20,w27
232 	bic	w28,w21,w27
233 	add	w22,w22,w8			// h+=X[i]
234 	orr	w17,w17,w28			// Ch(e,f,g)
235 	eor	w28,w23,w24			// a^b, b^c in next round
236 	eor	w16,w16,w11,ror#11	// Sigma1(e)
237 	ror	w11,w23,#2
238 	add	w22,w22,w17			// h+=Ch(e,f,g)
239 	eor	w17,w23,w23,ror#9
240 	add	w22,w22,w16			// h+=Sigma1(e)
241 	and	w19,w19,w28			// (b^c)&=(a^b)
242 	add	w26,w26,w22			// d+=h
243 	eor	w19,w19,w24			// Maj(a,b,c)
244 	eor	w17,w11,w17,ror#13	// Sigma0(a)
245 	add	w22,w22,w19			// h+=Maj(a,b,c)
246 	ldr	w19,[x30],#4		// *K++, w28 in next round
247 	//add	w22,w22,w17			// h+=Sigma0(a)
248 #ifndef	__AARCH64EB__
249 	rev	w9,w9			// 6
250 #endif
251 	add	w22,w22,w17			// h+=Sigma0(a)
252 	ror	w16,w26,#6
253 	add	w21,w21,w19			// h+=K[i]
254 	eor	w12,w26,w26,ror#14
255 	and	w17,w27,w26
256 	bic	w19,w20,w26
257 	add	w21,w21,w9			// h+=X[i]
258 	orr	w17,w17,w19			// Ch(e,f,g)
259 	eor	w19,w22,w23			// a^b, b^c in next round
260 	eor	w16,w16,w12,ror#11	// Sigma1(e)
261 	ror	w12,w22,#2
262 	add	w21,w21,w17			// h+=Ch(e,f,g)
263 	eor	w17,w22,w22,ror#9
264 	add	w21,w21,w16			// h+=Sigma1(e)
265 	and	w28,w28,w19			// (b^c)&=(a^b)
266 	add	w25,w25,w21			// d+=h
267 	eor	w28,w28,w23			// Maj(a,b,c)
268 	eor	w17,w12,w17,ror#13	// Sigma0(a)
269 	add	w21,w21,w28			// h+=Maj(a,b,c)
270 	ldr	w28,[x30],#4		// *K++, w19 in next round
271 	//add	w21,w21,w17			// h+=Sigma0(a)
272 #ifndef	__AARCH64EB__
273 	rev	w10,w10			// 7
274 #endif
275 	ldp	w11,w12,[x1],#2*4
276 	add	w21,w21,w17			// h+=Sigma0(a)
277 	ror	w16,w25,#6
278 	add	w20,w20,w28			// h+=K[i]
279 	eor	w13,w25,w25,ror#14
280 	and	w17,w26,w25
281 	bic	w28,w27,w25
282 	add	w20,w20,w10			// h+=X[i]
283 	orr	w17,w17,w28			// Ch(e,f,g)
284 	eor	w28,w21,w22			// a^b, b^c in next round
285 	eor	w16,w16,w13,ror#11	// Sigma1(e)
286 	ror	w13,w21,#2
287 	add	w20,w20,w17			// h+=Ch(e,f,g)
288 	eor	w17,w21,w21,ror#9
289 	add	w20,w20,w16			// h+=Sigma1(e)
290 	and	w19,w19,w28			// (b^c)&=(a^b)
291 	add	w24,w24,w20			// d+=h
292 	eor	w19,w19,w22			// Maj(a,b,c)
293 	eor	w17,w13,w17,ror#13	// Sigma0(a)
294 	add	w20,w20,w19			// h+=Maj(a,b,c)
295 	ldr	w19,[x30],#4		// *K++, w28 in next round
296 	//add	w20,w20,w17			// h+=Sigma0(a)
297 #ifndef	__AARCH64EB__
298 	rev	w11,w11			// 8
299 #endif
300 	add	w20,w20,w17			// h+=Sigma0(a)
301 	ror	w16,w24,#6
302 	add	w27,w27,w19			// h+=K[i]
303 	eor	w14,w24,w24,ror#14
304 	and	w17,w25,w24
305 	bic	w19,w26,w24
306 	add	w27,w27,w11			// h+=X[i]
307 	orr	w17,w17,w19			// Ch(e,f,g)
308 	eor	w19,w20,w21			// a^b, b^c in next round
309 	eor	w16,w16,w14,ror#11	// Sigma1(e)
310 	ror	w14,w20,#2
311 	add	w27,w27,w17			// h+=Ch(e,f,g)
312 	eor	w17,w20,w20,ror#9
313 	add	w27,w27,w16			// h+=Sigma1(e)
314 	and	w28,w28,w19			// (b^c)&=(a^b)
315 	add	w23,w23,w27			// d+=h
316 	eor	w28,w28,w21			// Maj(a,b,c)
317 	eor	w17,w14,w17,ror#13	// Sigma0(a)
318 	add	w27,w27,w28			// h+=Maj(a,b,c)
319 	ldr	w28,[x30],#4		// *K++, w19 in next round
320 	//add	w27,w27,w17			// h+=Sigma0(a)
321 #ifndef	__AARCH64EB__
322 	rev	w12,w12			// 9
323 #endif
324 	ldp	w13,w14,[x1],#2*4
325 	add	w27,w27,w17			// h+=Sigma0(a)
326 	ror	w16,w23,#6
327 	add	w26,w26,w28			// h+=K[i]
328 	eor	w15,w23,w23,ror#14
329 	and	w17,w24,w23
330 	bic	w28,w25,w23
331 	add	w26,w26,w12			// h+=X[i]
332 	orr	w17,w17,w28			// Ch(e,f,g)
333 	eor	w28,w27,w20			// a^b, b^c in next round
334 	eor	w16,w16,w15,ror#11	// Sigma1(e)
335 	ror	w15,w27,#2
336 	add	w26,w26,w17			// h+=Ch(e,f,g)
337 	eor	w17,w27,w27,ror#9
338 	add	w26,w26,w16			// h+=Sigma1(e)
339 	and	w19,w19,w28			// (b^c)&=(a^b)
340 	add	w22,w22,w26			// d+=h
341 	eor	w19,w19,w20			// Maj(a,b,c)
342 	eor	w17,w15,w17,ror#13	// Sigma0(a)
343 	add	w26,w26,w19			// h+=Maj(a,b,c)
344 	ldr	w19,[x30],#4		// *K++, w28 in next round
345 	//add	w26,w26,w17			// h+=Sigma0(a)
346 #ifndef	__AARCH64EB__
347 	rev	w13,w13			// 10
348 #endif
349 	add	w26,w26,w17			// h+=Sigma0(a)
350 	ror	w16,w22,#6
351 	add	w25,w25,w19			// h+=K[i]
352 	eor	w0,w22,w22,ror#14
353 	and	w17,w23,w22
354 	bic	w19,w24,w22
355 	add	w25,w25,w13			// h+=X[i]
356 	orr	w17,w17,w19			// Ch(e,f,g)
357 	eor	w19,w26,w27			// a^b, b^c in next round
358 	eor	w16,w16,w0,ror#11	// Sigma1(e)
359 	ror	w0,w26,#2
360 	add	w25,w25,w17			// h+=Ch(e,f,g)
361 	eor	w17,w26,w26,ror#9
362 	add	w25,w25,w16			// h+=Sigma1(e)
363 	and	w28,w28,w19			// (b^c)&=(a^b)
364 	add	w21,w21,w25			// d+=h
365 	eor	w28,w28,w27			// Maj(a,b,c)
366 	eor	w17,w0,w17,ror#13	// Sigma0(a)
367 	add	w25,w25,w28			// h+=Maj(a,b,c)
368 	ldr	w28,[x30],#4		// *K++, w19 in next round
369 	//add	w25,w25,w17			// h+=Sigma0(a)
370 #ifndef	__AARCH64EB__
371 	rev	w14,w14			// 11
372 #endif
373 	ldp	w15,w0,[x1],#2*4
374 	add	w25,w25,w17			// h+=Sigma0(a)
375 	str	w6,[sp,#12]
376 	ror	w16,w21,#6
377 	add	w24,w24,w28			// h+=K[i]
378 	eor	w6,w21,w21,ror#14
379 	and	w17,w22,w21
380 	bic	w28,w23,w21
381 	add	w24,w24,w14			// h+=X[i]
382 	orr	w17,w17,w28			// Ch(e,f,g)
383 	eor	w28,w25,w26			// a^b, b^c in next round
384 	eor	w16,w16,w6,ror#11	// Sigma1(e)
385 	ror	w6,w25,#2
386 	add	w24,w24,w17			// h+=Ch(e,f,g)
387 	eor	w17,w25,w25,ror#9
388 	add	w24,w24,w16			// h+=Sigma1(e)
389 	and	w19,w19,w28			// (b^c)&=(a^b)
390 	add	w20,w20,w24			// d+=h
391 	eor	w19,w19,w26			// Maj(a,b,c)
392 	eor	w17,w6,w17,ror#13	// Sigma0(a)
393 	add	w24,w24,w19			// h+=Maj(a,b,c)
394 	ldr	w19,[x30],#4		// *K++, w28 in next round
395 	//add	w24,w24,w17			// h+=Sigma0(a)
396 #ifndef	__AARCH64EB__
397 	rev	w15,w15			// 12
398 #endif
399 	add	w24,w24,w17			// h+=Sigma0(a)
400 	str	w7,[sp,#0]
401 	ror	w16,w20,#6
402 	add	w23,w23,w19			// h+=K[i]
403 	eor	w7,w20,w20,ror#14
404 	and	w17,w21,w20
405 	bic	w19,w22,w20
406 	add	w23,w23,w15			// h+=X[i]
407 	orr	w17,w17,w19			// Ch(e,f,g)
408 	eor	w19,w24,w25			// a^b, b^c in next round
409 	eor	w16,w16,w7,ror#11	// Sigma1(e)
410 	ror	w7,w24,#2
411 	add	w23,w23,w17			// h+=Ch(e,f,g)
412 	eor	w17,w24,w24,ror#9
413 	add	w23,w23,w16			// h+=Sigma1(e)
414 	and	w28,w28,w19			// (b^c)&=(a^b)
415 	add	w27,w27,w23			// d+=h
416 	eor	w28,w28,w25			// Maj(a,b,c)
417 	eor	w17,w7,w17,ror#13	// Sigma0(a)
418 	add	w23,w23,w28			// h+=Maj(a,b,c)
419 	ldr	w28,[x30],#4		// *K++, w19 in next round
420 	//add	w23,w23,w17			// h+=Sigma0(a)
421 #ifndef	__AARCH64EB__
422 	rev	w0,w0			// 13
423 #endif
424 	ldp	w1,w2,[x1]
425 	add	w23,w23,w17			// h+=Sigma0(a)
426 	str	w8,[sp,#4]
427 	ror	w16,w27,#6
428 	add	w22,w22,w28			// h+=K[i]
429 	eor	w8,w27,w27,ror#14
430 	and	w17,w20,w27
431 	bic	w28,w21,w27
432 	add	w22,w22,w0			// h+=X[i]
433 	orr	w17,w17,w28			// Ch(e,f,g)
434 	eor	w28,w23,w24			// a^b, b^c in next round
435 	eor	w16,w16,w8,ror#11	// Sigma1(e)
436 	ror	w8,w23,#2
437 	add	w22,w22,w17			// h+=Ch(e,f,g)
438 	eor	w17,w23,w23,ror#9
439 	add	w22,w22,w16			// h+=Sigma1(e)
440 	and	w19,w19,w28			// (b^c)&=(a^b)
441 	add	w26,w26,w22			// d+=h
442 	eor	w19,w19,w24			// Maj(a,b,c)
443 	eor	w17,w8,w17,ror#13	// Sigma0(a)
444 	add	w22,w22,w19			// h+=Maj(a,b,c)
445 	ldr	w19,[x30],#4		// *K++, w28 in next round
446 	//add	w22,w22,w17			// h+=Sigma0(a)
447 #ifndef	__AARCH64EB__
448 	rev	w1,w1			// 14
449 #endif
450 	ldr	w6,[sp,#12]
451 	add	w22,w22,w17			// h+=Sigma0(a)
452 	str	w9,[sp,#8]
453 	ror	w16,w26,#6
454 	add	w21,w21,w19			// h+=K[i]
455 	eor	w9,w26,w26,ror#14
456 	and	w17,w27,w26
457 	bic	w19,w20,w26
458 	add	w21,w21,w1			// h+=X[i]
459 	orr	w17,w17,w19			// Ch(e,f,g)
460 	eor	w19,w22,w23			// a^b, b^c in next round
461 	eor	w16,w16,w9,ror#11	// Sigma1(e)
462 	ror	w9,w22,#2
463 	add	w21,w21,w17			// h+=Ch(e,f,g)
464 	eor	w17,w22,w22,ror#9
465 	add	w21,w21,w16			// h+=Sigma1(e)
466 	and	w28,w28,w19			// (b^c)&=(a^b)
467 	add	w25,w25,w21			// d+=h
468 	eor	w28,w28,w23			// Maj(a,b,c)
469 	eor	w17,w9,w17,ror#13	// Sigma0(a)
470 	add	w21,w21,w28			// h+=Maj(a,b,c)
471 	ldr	w28,[x30],#4		// *K++, w19 in next round
472 	//add	w21,w21,w17			// h+=Sigma0(a)
473 #ifndef	__AARCH64EB__
474 	rev	w2,w2			// 15
475 #endif
476 	ldr	w7,[sp,#0]
477 	add	w21,w21,w17			// h+=Sigma0(a)
478 	str	w10,[sp,#12]
479 	ror	w16,w25,#6
480 	add	w20,w20,w28			// h+=K[i]
481 	ror	w9,w4,#7
482 	and	w17,w26,w25
483 	ror	w8,w1,#17
484 	bic	w28,w27,w25
485 	ror	w10,w21,#2
486 	add	w20,w20,w2			// h+=X[i]
487 	eor	w16,w16,w25,ror#11
488 	eor	w9,w9,w4,ror#18
489 	orr	w17,w17,w28			// Ch(e,f,g)
490 	eor	w28,w21,w22			// a^b, b^c in next round
491 	eor	w16,w16,w25,ror#25	// Sigma1(e)
492 	eor	w10,w10,w21,ror#13
493 	add	w20,w20,w17			// h+=Ch(e,f,g)
494 	and	w19,w19,w28			// (b^c)&=(a^b)
495 	eor	w8,w8,w1,ror#19
496 	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
497 	add	w20,w20,w16			// h+=Sigma1(e)
498 	eor	w19,w19,w22			// Maj(a,b,c)
499 	eor	w17,w10,w21,ror#22	// Sigma0(a)
500 	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
501 	add	w3,w3,w12
502 	add	w24,w24,w20			// d+=h
503 	add	w20,w20,w19			// h+=Maj(a,b,c)
504 	ldr	w19,[x30],#4		// *K++, w28 in next round
505 	add	w3,w3,w9
506 	add	w20,w20,w17			// h+=Sigma0(a)
507 	add	w3,w3,w8
508 .Loop_16_xx:
509 	ldr	w8,[sp,#4]
510 	str	w11,[sp,#0]
511 	ror	w16,w24,#6
512 	add	w27,w27,w19			// h+=K[i]
513 	ror	w10,w5,#7
514 	and	w17,w25,w24
515 	ror	w9,w2,#17
516 	bic	w19,w26,w24
517 	ror	w11,w20,#2
518 	add	w27,w27,w3			// h+=X[i]
519 	eor	w16,w16,w24,ror#11
520 	eor	w10,w10,w5,ror#18
521 	orr	w17,w17,w19			// Ch(e,f,g)
522 	eor	w19,w20,w21			// a^b, b^c in next round
523 	eor	w16,w16,w24,ror#25	// Sigma1(e)
524 	eor	w11,w11,w20,ror#13
525 	add	w27,w27,w17			// h+=Ch(e,f,g)
526 	and	w28,w28,w19			// (b^c)&=(a^b)
527 	eor	w9,w9,w2,ror#19
528 	eor	w10,w10,w5,lsr#3	// sigma0(X[i+1])
529 	add	w27,w27,w16			// h+=Sigma1(e)
530 	eor	w28,w28,w21			// Maj(a,b,c)
531 	eor	w17,w11,w20,ror#22	// Sigma0(a)
532 	eor	w9,w9,w2,lsr#10	// sigma1(X[i+14])
533 	add	w4,w4,w13
534 	add	w23,w23,w27			// d+=h
535 	add	w27,w27,w28			// h+=Maj(a,b,c)
536 	ldr	w28,[x30],#4		// *K++, w19 in next round
537 	add	w4,w4,w10
538 	add	w27,w27,w17			// h+=Sigma0(a)
539 	add	w4,w4,w9
540 	ldr	w9,[sp,#8]
541 	str	w12,[sp,#4]
542 	ror	w16,w23,#6
543 	add	w26,w26,w28			// h+=K[i]
544 	ror	w11,w6,#7
545 	and	w17,w24,w23
546 	ror	w10,w3,#17
547 	bic	w28,w25,w23
548 	ror	w12,w27,#2
549 	add	w26,w26,w4			// h+=X[i]
550 	eor	w16,w16,w23,ror#11
551 	eor	w11,w11,w6,ror#18
552 	orr	w17,w17,w28			// Ch(e,f,g)
553 	eor	w28,w27,w20			// a^b, b^c in next round
554 	eor	w16,w16,w23,ror#25	// Sigma1(e)
555 	eor	w12,w12,w27,ror#13
556 	add	w26,w26,w17			// h+=Ch(e,f,g)
557 	and	w19,w19,w28			// (b^c)&=(a^b)
558 	eor	w10,w10,w3,ror#19
559 	eor	w11,w11,w6,lsr#3	// sigma0(X[i+1])
560 	add	w26,w26,w16			// h+=Sigma1(e)
561 	eor	w19,w19,w20			// Maj(a,b,c)
562 	eor	w17,w12,w27,ror#22	// Sigma0(a)
563 	eor	w10,w10,w3,lsr#10	// sigma1(X[i+14])
564 	add	w5,w5,w14
565 	add	w22,w22,w26			// d+=h
566 	add	w26,w26,w19			// h+=Maj(a,b,c)
567 	ldr	w19,[x30],#4		// *K++, w28 in next round
568 	add	w5,w5,w11
569 	add	w26,w26,w17			// h+=Sigma0(a)
570 	add	w5,w5,w10
571 	ldr	w10,[sp,#12]
572 	str	w13,[sp,#8]
573 	ror	w16,w22,#6
574 	add	w25,w25,w19			// h+=K[i]
575 	ror	w12,w7,#7
576 	and	w17,w23,w22
577 	ror	w11,w4,#17
578 	bic	w19,w24,w22
579 	ror	w13,w26,#2
580 	add	w25,w25,w5			// h+=X[i]
581 	eor	w16,w16,w22,ror#11
582 	eor	w12,w12,w7,ror#18
583 	orr	w17,w17,w19			// Ch(e,f,g)
584 	eor	w19,w26,w27			// a^b, b^c in next round
585 	eor	w16,w16,w22,ror#25	// Sigma1(e)
586 	eor	w13,w13,w26,ror#13
587 	add	w25,w25,w17			// h+=Ch(e,f,g)
588 	and	w28,w28,w19			// (b^c)&=(a^b)
589 	eor	w11,w11,w4,ror#19
590 	eor	w12,w12,w7,lsr#3	// sigma0(X[i+1])
591 	add	w25,w25,w16			// h+=Sigma1(e)
592 	eor	w28,w28,w27			// Maj(a,b,c)
593 	eor	w17,w13,w26,ror#22	// Sigma0(a)
594 	eor	w11,w11,w4,lsr#10	// sigma1(X[i+14])
595 	add	w6,w6,w15
596 	add	w21,w21,w25			// d+=h
597 	add	w25,w25,w28			// h+=Maj(a,b,c)
598 	ldr	w28,[x30],#4		// *K++, w19 in next round
599 	add	w6,w6,w12
600 	add	w25,w25,w17			// h+=Sigma0(a)
601 	add	w6,w6,w11
602 	ldr	w11,[sp,#0]
603 	str	w14,[sp,#12]
604 	ror	w16,w21,#6
605 	add	w24,w24,w28			// h+=K[i]
606 	ror	w13,w8,#7
607 	and	w17,w22,w21
608 	ror	w12,w5,#17
609 	bic	w28,w23,w21
610 	ror	w14,w25,#2
611 	add	w24,w24,w6			// h+=X[i]
612 	eor	w16,w16,w21,ror#11
613 	eor	w13,w13,w8,ror#18
614 	orr	w17,w17,w28			// Ch(e,f,g)
615 	eor	w28,w25,w26			// a^b, b^c in next round
616 	eor	w16,w16,w21,ror#25	// Sigma1(e)
617 	eor	w14,w14,w25,ror#13
618 	add	w24,w24,w17			// h+=Ch(e,f,g)
619 	and	w19,w19,w28			// (b^c)&=(a^b)
620 	eor	w12,w12,w5,ror#19
621 	eor	w13,w13,w8,lsr#3	// sigma0(X[i+1])
622 	add	w24,w24,w16			// h+=Sigma1(e)
623 	eor	w19,w19,w26			// Maj(a,b,c)
624 	eor	w17,w14,w25,ror#22	// Sigma0(a)
625 	eor	w12,w12,w5,lsr#10	// sigma1(X[i+14])
626 	add	w7,w7,w0
627 	add	w20,w20,w24			// d+=h
628 	add	w24,w24,w19			// h+=Maj(a,b,c)
629 	ldr	w19,[x30],#4		// *K++, w28 in next round
630 	add	w7,w7,w13
631 	add	w24,w24,w17			// h+=Sigma0(a)
632 	add	w7,w7,w12
633 	ldr	w12,[sp,#4]
634 	str	w15,[sp,#0]
635 	ror	w16,w20,#6
636 	add	w23,w23,w19			// h+=K[i]
637 	ror	w14,w9,#7
638 	and	w17,w21,w20
639 	ror	w13,w6,#17
640 	bic	w19,w22,w20
641 	ror	w15,w24,#2
642 	add	w23,w23,w7			// h+=X[i]
643 	eor	w16,w16,w20,ror#11
644 	eor	w14,w14,w9,ror#18
645 	orr	w17,w17,w19			// Ch(e,f,g)
646 	eor	w19,w24,w25			// a^b, b^c in next round
647 	eor	w16,w16,w20,ror#25	// Sigma1(e)
648 	eor	w15,w15,w24,ror#13
649 	add	w23,w23,w17			// h+=Ch(e,f,g)
650 	and	w28,w28,w19			// (b^c)&=(a^b)
651 	eor	w13,w13,w6,ror#19
652 	eor	w14,w14,w9,lsr#3	// sigma0(X[i+1])
653 	add	w23,w23,w16			// h+=Sigma1(e)
654 	eor	w28,w28,w25			// Maj(a,b,c)
655 	eor	w17,w15,w24,ror#22	// Sigma0(a)
656 	eor	w13,w13,w6,lsr#10	// sigma1(X[i+14])
657 	add	w8,w8,w1
658 	add	w27,w27,w23			// d+=h
659 	add	w23,w23,w28			// h+=Maj(a,b,c)
660 	ldr	w28,[x30],#4		// *K++, w19 in next round
661 	add	w8,w8,w14
662 	add	w23,w23,w17			// h+=Sigma0(a)
663 	add	w8,w8,w13
664 	ldr	w13,[sp,#8]
665 	str	w0,[sp,#4]
666 	ror	w16,w27,#6
667 	add	w22,w22,w28			// h+=K[i]
668 	ror	w15,w10,#7
669 	and	w17,w20,w27
670 	ror	w14,w7,#17
671 	bic	w28,w21,w27
672 	ror	w0,w23,#2
673 	add	w22,w22,w8			// h+=X[i]
674 	eor	w16,w16,w27,ror#11
675 	eor	w15,w15,w10,ror#18
676 	orr	w17,w17,w28			// Ch(e,f,g)
677 	eor	w28,w23,w24			// a^b, b^c in next round
678 	eor	w16,w16,w27,ror#25	// Sigma1(e)
679 	eor	w0,w0,w23,ror#13
680 	add	w22,w22,w17			// h+=Ch(e,f,g)
681 	and	w19,w19,w28			// (b^c)&=(a^b)
682 	eor	w14,w14,w7,ror#19
683 	eor	w15,w15,w10,lsr#3	// sigma0(X[i+1])
684 	add	w22,w22,w16			// h+=Sigma1(e)
685 	eor	w19,w19,w24			// Maj(a,b,c)
686 	eor	w17,w0,w23,ror#22	// Sigma0(a)
687 	eor	w14,w14,w7,lsr#10	// sigma1(X[i+14])
688 	add	w9,w9,w2
689 	add	w26,w26,w22			// d+=h
690 	add	w22,w22,w19			// h+=Maj(a,b,c)
691 	ldr	w19,[x30],#4		// *K++, w28 in next round
692 	add	w9,w9,w15
693 	add	w22,w22,w17			// h+=Sigma0(a)
694 	add	w9,w9,w14
695 	ldr	w14,[sp,#12]
696 	str	w1,[sp,#8]
697 	ror	w16,w26,#6
698 	add	w21,w21,w19			// h+=K[i]
699 	ror	w0,w11,#7
700 	and	w17,w27,w26
701 	ror	w15,w8,#17
702 	bic	w19,w20,w26
703 	ror	w1,w22,#2
704 	add	w21,w21,w9			// h+=X[i]
705 	eor	w16,w16,w26,ror#11
706 	eor	w0,w0,w11,ror#18
707 	orr	w17,w17,w19			// Ch(e,f,g)
708 	eor	w19,w22,w23			// a^b, b^c in next round
709 	eor	w16,w16,w26,ror#25	// Sigma1(e)
710 	eor	w1,w1,w22,ror#13
711 	add	w21,w21,w17			// h+=Ch(e,f,g)
712 	and	w28,w28,w19			// (b^c)&=(a^b)
713 	eor	w15,w15,w8,ror#19
714 	eor	w0,w0,w11,lsr#3	// sigma0(X[i+1])
715 	add	w21,w21,w16			// h+=Sigma1(e)
716 	eor	w28,w28,w23			// Maj(a,b,c)
717 	eor	w17,w1,w22,ror#22	// Sigma0(a)
718 	eor	w15,w15,w8,lsr#10	// sigma1(X[i+14])
719 	add	w10,w10,w3
720 	add	w25,w25,w21			// d+=h
721 	add	w21,w21,w28			// h+=Maj(a,b,c)
722 	ldr	w28,[x30],#4		// *K++, w19 in next round
723 	add	w10,w10,w0
724 	add	w21,w21,w17			// h+=Sigma0(a)
725 	add	w10,w10,w15
726 	ldr	w15,[sp,#0]
727 	str	w2,[sp,#12]
728 	ror	w16,w25,#6
729 	add	w20,w20,w28			// h+=K[i]
730 	ror	w1,w12,#7
731 	and	w17,w26,w25
732 	ror	w0,w9,#17
733 	bic	w28,w27,w25
734 	ror	w2,w21,#2
735 	add	w20,w20,w10			// h+=X[i]
736 	eor	w16,w16,w25,ror#11
737 	eor	w1,w1,w12,ror#18
738 	orr	w17,w17,w28			// Ch(e,f,g)
739 	eor	w28,w21,w22			// a^b, b^c in next round
740 	eor	w16,w16,w25,ror#25	// Sigma1(e)
741 	eor	w2,w2,w21,ror#13
742 	add	w20,w20,w17			// h+=Ch(e,f,g)
743 	and	w19,w19,w28			// (b^c)&=(a^b)
744 	eor	w0,w0,w9,ror#19
745 	eor	w1,w1,w12,lsr#3	// sigma0(X[i+1])
746 	add	w20,w20,w16			// h+=Sigma1(e)
747 	eor	w19,w19,w22			// Maj(a,b,c)
748 	eor	w17,w2,w21,ror#22	// Sigma0(a)
749 	eor	w0,w0,w9,lsr#10	// sigma1(X[i+14])
750 	add	w11,w11,w4
751 	add	w24,w24,w20			// d+=h
752 	add	w20,w20,w19			// h+=Maj(a,b,c)
753 	ldr	w19,[x30],#4		// *K++, w28 in next round
754 	add	w11,w11,w1
755 	add	w20,w20,w17			// h+=Sigma0(a)
756 	add	w11,w11,w0
757 	ldr	w0,[sp,#4]
758 	str	w3,[sp,#0]
759 	ror	w16,w24,#6
760 	add	w27,w27,w19			// h+=K[i]
761 	ror	w2,w13,#7
762 	and	w17,w25,w24
763 	ror	w1,w10,#17
764 	bic	w19,w26,w24
765 	ror	w3,w20,#2
766 	add	w27,w27,w11			// h+=X[i]
767 	eor	w16,w16,w24,ror#11
768 	eor	w2,w2,w13,ror#18
769 	orr	w17,w17,w19			// Ch(e,f,g)
770 	eor	w19,w20,w21			// a^b, b^c in next round
771 	eor	w16,w16,w24,ror#25	// Sigma1(e)
772 	eor	w3,w3,w20,ror#13
773 	add	w27,w27,w17			// h+=Ch(e,f,g)
774 	and	w28,w28,w19			// (b^c)&=(a^b)
775 	eor	w1,w1,w10,ror#19
776 	eor	w2,w2,w13,lsr#3	// sigma0(X[i+1])
777 	add	w27,w27,w16			// h+=Sigma1(e)
778 	eor	w28,w28,w21			// Maj(a,b,c)
779 	eor	w17,w3,w20,ror#22	// Sigma0(a)
780 	eor	w1,w1,w10,lsr#10	// sigma1(X[i+14])
781 	add	w12,w12,w5
782 	add	w23,w23,w27			// d+=h
783 	add	w27,w27,w28			// h+=Maj(a,b,c)
784 	ldr	w28,[x30],#4		// *K++, w19 in next round
785 	add	w12,w12,w2
786 	add	w27,w27,w17			// h+=Sigma0(a)
787 	add	w12,w12,w1
788 	ldr	w1,[sp,#8]
789 	str	w4,[sp,#4]
790 	ror	w16,w23,#6
791 	add	w26,w26,w28			// h+=K[i]
792 	ror	w3,w14,#7
793 	and	w17,w24,w23
794 	ror	w2,w11,#17
795 	bic	w28,w25,w23
796 	ror	w4,w27,#2
797 	add	w26,w26,w12			// h+=X[i]
798 	eor	w16,w16,w23,ror#11
799 	eor	w3,w3,w14,ror#18
800 	orr	w17,w17,w28			// Ch(e,f,g)
801 	eor	w28,w27,w20			// a^b, b^c in next round
802 	eor	w16,w16,w23,ror#25	// Sigma1(e)
803 	eor	w4,w4,w27,ror#13
804 	add	w26,w26,w17			// h+=Ch(e,f,g)
805 	and	w19,w19,w28			// (b^c)&=(a^b)
806 	eor	w2,w2,w11,ror#19
807 	eor	w3,w3,w14,lsr#3	// sigma0(X[i+1])
808 	add	w26,w26,w16			// h+=Sigma1(e)
809 	eor	w19,w19,w20			// Maj(a,b,c)
810 	eor	w17,w4,w27,ror#22	// Sigma0(a)
811 	eor	w2,w2,w11,lsr#10	// sigma1(X[i+14])
812 	add	w13,w13,w6
813 	add	w22,w22,w26			// d+=h
814 	add	w26,w26,w19			// h+=Maj(a,b,c)
815 	ldr	w19,[x30],#4		// *K++, w28 in next round
816 	add	w13,w13,w3
817 	add	w26,w26,w17			// h+=Sigma0(a)
818 	add	w13,w13,w2
819 	ldr	w2,[sp,#12]
820 	str	w5,[sp,#8]
821 	ror	w16,w22,#6
822 	add	w25,w25,w19			// h+=K[i]
823 	ror	w4,w15,#7
824 	and	w17,w23,w22
825 	ror	w3,w12,#17
826 	bic	w19,w24,w22
827 	ror	w5,w26,#2
828 	add	w25,w25,w13			// h+=X[i]
829 	eor	w16,w16,w22,ror#11
830 	eor	w4,w4,w15,ror#18
831 	orr	w17,w17,w19			// Ch(e,f,g)
832 	eor	w19,w26,w27			// a^b, b^c in next round
833 	eor	w16,w16,w22,ror#25	// Sigma1(e)
834 	eor	w5,w5,w26,ror#13
835 	add	w25,w25,w17			// h+=Ch(e,f,g)
836 	and	w28,w28,w19			// (b^c)&=(a^b)
837 	eor	w3,w3,w12,ror#19
838 	eor	w4,w4,w15,lsr#3	// sigma0(X[i+1])
839 	add	w25,w25,w16			// h+=Sigma1(e)
840 	eor	w28,w28,w27			// Maj(a,b,c)
841 	eor	w17,w5,w26,ror#22	// Sigma0(a)
842 	eor	w3,w3,w12,lsr#10	// sigma1(X[i+14])
843 	add	w14,w14,w7
844 	add	w21,w21,w25			// d+=h
845 	add	w25,w25,w28			// h+=Maj(a,b,c)
846 	ldr	w28,[x30],#4		// *K++, w19 in next round
847 	add	w14,w14,w4
848 	add	w25,w25,w17			// h+=Sigma0(a)
849 	add	w14,w14,w3
850 	ldr	w3,[sp,#0]
851 	str	w6,[sp,#12]
852 	ror	w16,w21,#6
853 	add	w24,w24,w28			// h+=K[i]
854 	ror	w5,w0,#7
855 	and	w17,w22,w21
856 	ror	w4,w13,#17
857 	bic	w28,w23,w21
858 	ror	w6,w25,#2
859 	add	w24,w24,w14			// h+=X[i]
860 	eor	w16,w16,w21,ror#11
861 	eor	w5,w5,w0,ror#18
862 	orr	w17,w17,w28			// Ch(e,f,g)
863 	eor	w28,w25,w26			// a^b, b^c in next round
864 	eor	w16,w16,w21,ror#25	// Sigma1(e)
865 	eor	w6,w6,w25,ror#13
866 	add	w24,w24,w17			// h+=Ch(e,f,g)
867 	and	w19,w19,w28			// (b^c)&=(a^b)
868 	eor	w4,w4,w13,ror#19
869 	eor	w5,w5,w0,lsr#3	// sigma0(X[i+1])
870 	add	w24,w24,w16			// h+=Sigma1(e)
871 	eor	w19,w19,w26			// Maj(a,b,c)
872 	eor	w17,w6,w25,ror#22	// Sigma0(a)
873 	eor	w4,w4,w13,lsr#10	// sigma1(X[i+14])
874 	add	w15,w15,w8
875 	add	w20,w20,w24			// d+=h
876 	add	w24,w24,w19			// h+=Maj(a,b,c)
877 	ldr	w19,[x30],#4		// *K++, w28 in next round
878 	add	w15,w15,w5
879 	add	w24,w24,w17			// h+=Sigma0(a)
880 	add	w15,w15,w4
881 	ldr	w4,[sp,#4]
882 	str	w7,[sp,#0]
883 	ror	w16,w20,#6
884 	add	w23,w23,w19			// h+=K[i]
885 	ror	w6,w1,#7
886 	and	w17,w21,w20
887 	ror	w5,w14,#17
888 	bic	w19,w22,w20
889 	ror	w7,w24,#2
890 	add	w23,w23,w15			// h+=X[i]
891 	eor	w16,w16,w20,ror#11
892 	eor	w6,w6,w1,ror#18
893 	orr	w17,w17,w19			// Ch(e,f,g)
894 	eor	w19,w24,w25			// a^b, b^c in next round
895 	eor	w16,w16,w20,ror#25	// Sigma1(e)
896 	eor	w7,w7,w24,ror#13
897 	add	w23,w23,w17			// h+=Ch(e,f,g)
898 	and	w28,w28,w19			// (b^c)&=(a^b)
899 	eor	w5,w5,w14,ror#19
900 	eor	w6,w6,w1,lsr#3	// sigma0(X[i+1])
901 	add	w23,w23,w16			// h+=Sigma1(e)
902 	eor	w28,w28,w25			// Maj(a,b,c)
903 	eor	w17,w7,w24,ror#22	// Sigma0(a)
904 	eor	w5,w5,w14,lsr#10	// sigma1(X[i+14])
905 	add	w0,w0,w9
906 	add	w27,w27,w23			// d+=h
907 	add	w23,w23,w28			// h+=Maj(a,b,c)
908 	ldr	w28,[x30],#4		// *K++, w19 in next round
909 	add	w0,w0,w6
910 	add	w23,w23,w17			// h+=Sigma0(a)
911 	add	w0,w0,w5
912 	ldr	w5,[sp,#8]
913 	str	w8,[sp,#4]
914 	ror	w16,w27,#6
915 	add	w22,w22,w28			// h+=K[i]
916 	ror	w7,w2,#7
917 	and	w17,w20,w27
918 	ror	w6,w15,#17
919 	bic	w28,w21,w27
920 	ror	w8,w23,#2
921 	add	w22,w22,w0			// h+=X[i]
922 	eor	w16,w16,w27,ror#11
923 	eor	w7,w7,w2,ror#18
924 	orr	w17,w17,w28			// Ch(e,f,g)
925 	eor	w28,w23,w24			// a^b, b^c in next round
926 	eor	w16,w16,w27,ror#25	// Sigma1(e)
927 	eor	w8,w8,w23,ror#13
928 	add	w22,w22,w17			// h+=Ch(e,f,g)
929 	and	w19,w19,w28			// (b^c)&=(a^b)
930 	eor	w6,w6,w15,ror#19
931 	eor	w7,w7,w2,lsr#3	// sigma0(X[i+1])
932 	add	w22,w22,w16			// h+=Sigma1(e)
933 	eor	w19,w19,w24			// Maj(a,b,c)
934 	eor	w17,w8,w23,ror#22	// Sigma0(a)
935 	eor	w6,w6,w15,lsr#10	// sigma1(X[i+14])
936 	add	w1,w1,w10
937 	add	w26,w26,w22			// d+=h
938 	add	w22,w22,w19			// h+=Maj(a,b,c)
939 	ldr	w19,[x30],#4		// *K++, w28 in next round
940 	add	w1,w1,w7
941 	add	w22,w22,w17			// h+=Sigma0(a)
942 	add	w1,w1,w6
943 	ldr	w6,[sp,#12]
944 	str	w9,[sp,#8]
945 	ror	w16,w26,#6
946 	add	w21,w21,w19			// h+=K[i]
947 	ror	w8,w3,#7
948 	and	w17,w27,w26
949 	ror	w7,w0,#17
950 	bic	w19,w20,w26
951 	ror	w9,w22,#2
952 	add	w21,w21,w1			// h+=X[i]
953 	eor	w16,w16,w26,ror#11
954 	eor	w8,w8,w3,ror#18
955 	orr	w17,w17,w19			// Ch(e,f,g)
956 	eor	w19,w22,w23			// a^b, b^c in next round
957 	eor	w16,w16,w26,ror#25	// Sigma1(e)
958 	eor	w9,w9,w22,ror#13
959 	add	w21,w21,w17			// h+=Ch(e,f,g)
960 	and	w28,w28,w19			// (b^c)&=(a^b)
961 	eor	w7,w7,w0,ror#19
962 	eor	w8,w8,w3,lsr#3	// sigma0(X[i+1])
963 	add	w21,w21,w16			// h+=Sigma1(e)
964 	eor	w28,w28,w23			// Maj(a,b,c)
965 	eor	w17,w9,w22,ror#22	// Sigma0(a)
966 	eor	w7,w7,w0,lsr#10	// sigma1(X[i+14])
967 	add	w2,w2,w11
968 	add	w25,w25,w21			// d+=h
969 	add	w21,w21,w28			// h+=Maj(a,b,c)
970 	ldr	w28,[x30],#4		// *K++, w19 in next round
971 	add	w2,w2,w8
972 	add	w21,w21,w17			// h+=Sigma0(a)
973 	add	w2,w2,w7
974 	ldr	w7,[sp,#0]
975 	str	w10,[sp,#12]
976 	ror	w16,w25,#6
977 	add	w20,w20,w28			// h+=K[i]
978 	ror	w9,w4,#7
979 	and	w17,w26,w25
980 	ror	w8,w1,#17
981 	bic	w28,w27,w25
982 	ror	w10,w21,#2
983 	add	w20,w20,w2			// h+=X[i]
984 	eor	w16,w16,w25,ror#11
985 	eor	w9,w9,w4,ror#18
986 	orr	w17,w17,w28			// Ch(e,f,g)
987 	eor	w28,w21,w22			// a^b, b^c in next round
988 	eor	w16,w16,w25,ror#25	// Sigma1(e)
989 	eor	w10,w10,w21,ror#13
990 	add	w20,w20,w17			// h+=Ch(e,f,g)
991 	and	w19,w19,w28			// (b^c)&=(a^b)
992 	eor	w8,w8,w1,ror#19
993 	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
994 	add	w20,w20,w16			// h+=Sigma1(e)
995 	eor	w19,w19,w22			// Maj(a,b,c)
996 	eor	w17,w10,w21,ror#22	// Sigma0(a)
997 	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
998 	add	w3,w3,w12
999 	add	w24,w24,w20			// d+=h
1000 	add	w20,w20,w19			// h+=Maj(a,b,c)
1001 	ldr	w19,[x30],#4		// *K++, w28 in next round
1002 	add	w3,w3,w9
1003 	add	w20,w20,w17			// h+=Sigma0(a)
1004 	add	w3,w3,w8
1005 	cbnz	w19,.Loop_16_xx
1006 
1007 	ldp	x0,x2,[x29,#96]
1008 	ldr	x1,[x29,#112]
1009 	sub	x30,x30,#260		// rewind
1010 
1011 	ldp	w3,w4,[x0]
1012 	ldp	w5,w6,[x0,#2*4]
1013 	add	x1,x1,#14*4			// advance input pointer
1014 	ldp	w7,w8,[x0,#4*4]
1015 	add	w20,w20,w3
1016 	ldp	w9,w10,[x0,#6*4]
1017 	add	w21,w21,w4
1018 	add	w22,w22,w5
1019 	add	w23,w23,w6
1020 	stp	w20,w21,[x0]
1021 	add	w24,w24,w7
1022 	add	w25,w25,w8
1023 	stp	w22,w23,[x0,#2*4]
1024 	add	w26,w26,w9
1025 	add	w27,w27,w10
1026 	cmp	x1,x2
1027 	stp	w24,w25,[x0,#4*4]
1028 	stp	w26,w27,[x0,#6*4]
1029 	b.ne	.Loop
1030 
1031 	ldp	x19,x20,[x29,#16]
1032 	add	sp,sp,#4*4
1033 	ldp	x21,x22,[x29,#32]
1034 	ldp	x23,x24,[x29,#48]
1035 	ldp	x25,x26,[x29,#64]
1036 	ldp	x27,x28,[x29,#80]
1037 	ldp	x29,x30,[sp],#128
1038 .inst	0xd50323bf				// autiasp
1039 	ret
1040 .size	sha256_block_data_order,.-sha256_block_data_order
1041 
1042 .align	6
1043 .type	.LK256,%object
1044 .LK256:
1045 .long	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1046 .long	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1047 .long	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1048 .long	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1049 .long	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1050 .long	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1051 .long	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1052 .long	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1053 .long	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1054 .long	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1055 .long	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1056 .long	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1057 .long	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1058 .long	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1059 .long	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1060 .long	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1061 .long	0	//terminator
1062 .size	.LK256,.-.LK256
1063 .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
1064 .align	2
1065 .align	2
1066 #ifndef	__KERNEL__
1067 .type	sha256_block_armv8,%function
1068 .align	6
1069 sha256_block_armv8:
1070 .Lv8_entry:
1071 	stp	x29,x30,[sp,#-16]!
1072 	add	x29,sp,#0
1073 
1074 	ld1	{v0.4s,v1.4s},[x0]
1075 	adr	x3,.LK256
1076 
1077 .Loop_hw:
1078 	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1079 	sub	x2,x2,#1
1080 	ld1	{v16.4s},[x3],#16
1081 	rev32	v4.16b,v4.16b
1082 	rev32	v5.16b,v5.16b
1083 	rev32	v6.16b,v6.16b
1084 	rev32	v7.16b,v7.16b
1085 	orr	v18.16b,v0.16b,v0.16b		// offload
1086 	orr	v19.16b,v1.16b,v1.16b
1087 	ld1	{v17.4s},[x3],#16
1088 	add	v16.4s,v16.4s,v4.4s
1089 .inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1090 	orr	v2.16b,v0.16b,v0.16b
1091 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1092 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1093 .inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1094 	ld1	{v16.4s},[x3],#16
1095 	add	v17.4s,v17.4s,v5.4s
1096 .inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1097 	orr	v2.16b,v0.16b,v0.16b
1098 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1099 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1100 .inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1101 	ld1	{v17.4s},[x3],#16
1102 	add	v16.4s,v16.4s,v6.4s
1103 .inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1104 	orr	v2.16b,v0.16b,v0.16b
1105 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1106 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1107 .inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1108 	ld1	{v16.4s},[x3],#16
1109 	add	v17.4s,v17.4s,v7.4s
1110 .inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1111 	orr	v2.16b,v0.16b,v0.16b
1112 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1113 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1114 .inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1115 	ld1	{v17.4s},[x3],#16
1116 	add	v16.4s,v16.4s,v4.4s
1117 .inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1118 	orr	v2.16b,v0.16b,v0.16b
1119 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1120 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1121 .inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1122 	ld1	{v16.4s},[x3],#16
1123 	add	v17.4s,v17.4s,v5.4s
1124 .inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1125 	orr	v2.16b,v0.16b,v0.16b
1126 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1127 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1128 .inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1129 	ld1	{v17.4s},[x3],#16
1130 	add	v16.4s,v16.4s,v6.4s
1131 .inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1132 	orr	v2.16b,v0.16b,v0.16b
1133 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1134 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1135 .inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1136 	ld1	{v16.4s},[x3],#16
1137 	add	v17.4s,v17.4s,v7.4s
1138 .inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1139 	orr	v2.16b,v0.16b,v0.16b
1140 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1141 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1142 .inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1143 	ld1	{v17.4s},[x3],#16
1144 	add	v16.4s,v16.4s,v4.4s
1145 .inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1146 	orr	v2.16b,v0.16b,v0.16b
1147 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1148 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1149 .inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1150 	ld1	{v16.4s},[x3],#16
1151 	add	v17.4s,v17.4s,v5.4s
1152 .inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1153 	orr	v2.16b,v0.16b,v0.16b
1154 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1155 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1156 .inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1157 	ld1	{v17.4s},[x3],#16
1158 	add	v16.4s,v16.4s,v6.4s
1159 .inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1160 	orr	v2.16b,v0.16b,v0.16b
1161 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1162 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1163 .inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1164 	ld1	{v16.4s},[x3],#16
1165 	add	v17.4s,v17.4s,v7.4s
1166 .inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1167 	orr	v2.16b,v0.16b,v0.16b
1168 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1169 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1170 .inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1171 	ld1	{v17.4s},[x3],#16
1172 	add	v16.4s,v16.4s,v4.4s
1173 	orr	v2.16b,v0.16b,v0.16b
1174 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1175 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1176 
1177 	ld1	{v16.4s},[x3],#16
1178 	add	v17.4s,v17.4s,v5.4s
1179 	orr	v2.16b,v0.16b,v0.16b
1180 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1181 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1182 
1183 	ld1	{v17.4s},[x3]
1184 	add	v16.4s,v16.4s,v6.4s
1185 	sub	x3,x3,#64*4-16	// rewind
1186 	orr	v2.16b,v0.16b,v0.16b
1187 .inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1188 .inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1189 
1190 	add	v17.4s,v17.4s,v7.4s
1191 	orr	v2.16b,v0.16b,v0.16b
1192 .inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1193 .inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1194 
1195 	add	v0.4s,v0.4s,v18.4s
1196 	add	v1.4s,v1.4s,v19.4s
1197 
1198 	cbnz	x2,.Loop_hw
1199 
1200 	st1	{v0.4s,v1.4s},[x0]
1201 
1202 	ldr	x29,[sp],#16
1203 	ret
1204 .size	sha256_block_armv8,.-sha256_block_armv8
1205 #endif
1206 #ifdef	__KERNEL__
1207 .globl	sha256_block_neon
1208 #endif
1209 .type	sha256_block_neon,%function
1210 .align	4
1211 sha256_block_neon:
1212 .Lneon_entry:
1213 	stp	x29, x30, [sp, #-16]!
1214 	mov	x29, sp
1215 	sub	sp,sp,#16*4
1216 
1217 	adr	x16,.LK256
1218 	add	x2,x1,x2,lsl#6	// len to point at the end of inp
1219 
1220 	ld1	{v0.16b},[x1], #16
1221 	ld1	{v1.16b},[x1], #16
1222 	ld1	{v2.16b},[x1], #16
1223 	ld1	{v3.16b},[x1], #16
1224 	ld1	{v4.4s},[x16], #16
1225 	ld1	{v5.4s},[x16], #16
1226 	ld1	{v6.4s},[x16], #16
1227 	ld1	{v7.4s},[x16], #16
1228 	rev32	v0.16b,v0.16b		// yes, even on
1229 	rev32	v1.16b,v1.16b		// big-endian
1230 	rev32	v2.16b,v2.16b
1231 	rev32	v3.16b,v3.16b
1232 	mov	x17,sp
1233 	add	v4.4s,v4.4s,v0.4s
1234 	add	v5.4s,v5.4s,v1.4s
1235 	add	v6.4s,v6.4s,v2.4s
1236 	st1	{v4.4s,v5.4s},[x17], #32
1237 	add	v7.4s,v7.4s,v3.4s
1238 	st1	{v6.4s,v7.4s},[x17]
1239 	sub	x17,x17,#32
1240 
1241 	ldp	w3,w4,[x0]
1242 	ldp	w5,w6,[x0,#8]
1243 	ldp	w7,w8,[x0,#16]
1244 	ldp	w9,w10,[x0,#24]
1245 	ldr	w12,[sp,#0]
1246 	mov	w13,wzr
1247 	eor	w14,w4,w5
1248 	mov	w15,wzr
1249 	b	.L_00_48
1250 
1251 .align	4
1252 .L_00_48:
1253 	ext	v4.16b,v0.16b,v1.16b,#4
1254 	add	w10,w10,w12
1255 	add	w3,w3,w15
1256 	and	w12,w8,w7
1257 	bic	w15,w9,w7
1258 	ext	v7.16b,v2.16b,v3.16b,#4
1259 	eor	w11,w7,w7,ror#5
1260 	add	w3,w3,w13
1261 	mov	d19,v3.d[1]
1262 	orr	w12,w12,w15
1263 	eor	w11,w11,w7,ror#19
1264 	ushr	v6.4s,v4.4s,#7
1265 	eor	w15,w3,w3,ror#11
1266 	ushr	v5.4s,v4.4s,#3
1267 	add	w10,w10,w12
1268 	add	v0.4s,v0.4s,v7.4s
1269 	ror	w11,w11,#6
1270 	sli	v6.4s,v4.4s,#25
1271 	eor	w13,w3,w4
1272 	eor	w15,w15,w3,ror#20
1273 	ushr	v7.4s,v4.4s,#18
1274 	add	w10,w10,w11
1275 	ldr	w12,[sp,#4]
1276 	and	w14,w14,w13
1277 	eor	v5.16b,v5.16b,v6.16b
1278 	ror	w15,w15,#2
1279 	add	w6,w6,w10
1280 	sli	v7.4s,v4.4s,#14
1281 	eor	w14,w14,w4
1282 	ushr	v16.4s,v19.4s,#17
1283 	add	w9,w9,w12
1284 	add	w10,w10,w15
1285 	and	w12,w7,w6
1286 	eor	v5.16b,v5.16b,v7.16b
1287 	bic	w15,w8,w6
1288 	eor	w11,w6,w6,ror#5
1289 	sli	v16.4s,v19.4s,#15
1290 	add	w10,w10,w14
1291 	orr	w12,w12,w15
1292 	ushr	v17.4s,v19.4s,#10
1293 	eor	w11,w11,w6,ror#19
1294 	eor	w15,w10,w10,ror#11
1295 	ushr	v7.4s,v19.4s,#19
1296 	add	w9,w9,w12
1297 	ror	w11,w11,#6
1298 	add	v0.4s,v0.4s,v5.4s
1299 	eor	w14,w10,w3
1300 	eor	w15,w15,w10,ror#20
1301 	sli	v7.4s,v19.4s,#13
1302 	add	w9,w9,w11
1303 	ldr	w12,[sp,#8]
1304 	and	w13,w13,w14
1305 	eor	v17.16b,v17.16b,v16.16b
1306 	ror	w15,w15,#2
1307 	add	w5,w5,w9
1308 	eor	w13,w13,w3
1309 	eor	v17.16b,v17.16b,v7.16b
1310 	add	w8,w8,w12
1311 	add	w9,w9,w15
1312 	and	w12,w6,w5
1313 	add	v0.4s,v0.4s,v17.4s
1314 	bic	w15,w7,w5
1315 	eor	w11,w5,w5,ror#5
1316 	add	w9,w9,w13
1317 	ushr	v18.4s,v0.4s,#17
1318 	orr	w12,w12,w15
1319 	ushr	v19.4s,v0.4s,#10
1320 	eor	w11,w11,w5,ror#19
1321 	eor	w15,w9,w9,ror#11
1322 	sli	v18.4s,v0.4s,#15
1323 	add	w8,w8,w12
1324 	ushr	v17.4s,v0.4s,#19
1325 	ror	w11,w11,#6
1326 	eor	w13,w9,w10
1327 	eor	v19.16b,v19.16b,v18.16b
1328 	eor	w15,w15,w9,ror#20
1329 	add	w8,w8,w11
1330 	sli	v17.4s,v0.4s,#13
1331 	ldr	w12,[sp,#12]
1332 	and	w14,w14,w13
1333 	ror	w15,w15,#2
1334 	ld1	{v4.4s},[x16], #16
1335 	add	w4,w4,w8
1336 	eor	v19.16b,v19.16b,v17.16b
1337 	eor	w14,w14,w10
1338 	eor	v17.16b,v17.16b,v17.16b
1339 	add	w7,w7,w12
1340 	add	w8,w8,w15
1341 	and	w12,w5,w4
1342 	mov	v17.d[1],v19.d[0]
1343 	bic	w15,w6,w4
1344 	eor	w11,w4,w4,ror#5
1345 	add	w8,w8,w14
1346 	add	v0.4s,v0.4s,v17.4s
1347 	orr	w12,w12,w15
1348 	eor	w11,w11,w4,ror#19
1349 	eor	w15,w8,w8,ror#11
1350 	add	v4.4s,v4.4s,v0.4s
1351 	add	w7,w7,w12
1352 	ror	w11,w11,#6
1353 	eor	w14,w8,w9
1354 	eor	w15,w15,w8,ror#20
1355 	add	w7,w7,w11
1356 	ldr	w12,[sp,#16]
1357 	and	w13,w13,w14
1358 	ror	w15,w15,#2
1359 	add	w3,w3,w7
1360 	eor	w13,w13,w9
1361 	st1	{v4.4s},[x17], #16
1362 	ext	v4.16b,v1.16b,v2.16b,#4
1363 	add	w6,w6,w12
1364 	add	w7,w7,w15
1365 	and	w12,w4,w3
1366 	bic	w15,w5,w3
1367 	ext	v7.16b,v3.16b,v0.16b,#4
1368 	eor	w11,w3,w3,ror#5
1369 	add	w7,w7,w13
1370 	mov	d19,v0.d[1]
1371 	orr	w12,w12,w15
1372 	eor	w11,w11,w3,ror#19
1373 	ushr	v6.4s,v4.4s,#7
1374 	eor	w15,w7,w7,ror#11
1375 	ushr	v5.4s,v4.4s,#3
1376 	add	w6,w6,w12
1377 	add	v1.4s,v1.4s,v7.4s
1378 	ror	w11,w11,#6
1379 	sli	v6.4s,v4.4s,#25
1380 	eor	w13,w7,w8
1381 	eor	w15,w15,w7,ror#20
1382 	ushr	v7.4s,v4.4s,#18
1383 	add	w6,w6,w11
1384 	ldr	w12,[sp,#20]
1385 	and	w14,w14,w13
1386 	eor	v5.16b,v5.16b,v6.16b
1387 	ror	w15,w15,#2
1388 	add	w10,w10,w6
1389 	sli	v7.4s,v4.4s,#14
1390 	eor	w14,w14,w8
1391 	ushr	v16.4s,v19.4s,#17
1392 	add	w5,w5,w12
1393 	add	w6,w6,w15
1394 	and	w12,w3,w10
1395 	eor	v5.16b,v5.16b,v7.16b
1396 	bic	w15,w4,w10
1397 	eor	w11,w10,w10,ror#5
1398 	sli	v16.4s,v19.4s,#15
1399 	add	w6,w6,w14
1400 	orr	w12,w12,w15
1401 	ushr	v17.4s,v19.4s,#10
1402 	eor	w11,w11,w10,ror#19
1403 	eor	w15,w6,w6,ror#11
1404 	ushr	v7.4s,v19.4s,#19
1405 	add	w5,w5,w12
1406 	ror	w11,w11,#6
1407 	add	v1.4s,v1.4s,v5.4s
1408 	eor	w14,w6,w7
1409 	eor	w15,w15,w6,ror#20
1410 	sli	v7.4s,v19.4s,#13
1411 	add	w5,w5,w11
1412 	ldr	w12,[sp,#24]
1413 	and	w13,w13,w14
1414 	eor	v17.16b,v17.16b,v16.16b
1415 	ror	w15,w15,#2
1416 	add	w9,w9,w5
1417 	eor	w13,w13,w7
1418 	eor	v17.16b,v17.16b,v7.16b
1419 	add	w4,w4,w12
1420 	add	w5,w5,w15
1421 	and	w12,w10,w9
1422 	add	v1.4s,v1.4s,v17.4s
1423 	bic	w15,w3,w9
1424 	eor	w11,w9,w9,ror#5
1425 	add	w5,w5,w13
1426 	ushr	v18.4s,v1.4s,#17
1427 	orr	w12,w12,w15
1428 	ushr	v19.4s,v1.4s,#10
1429 	eor	w11,w11,w9,ror#19
1430 	eor	w15,w5,w5,ror#11
1431 	sli	v18.4s,v1.4s,#15
1432 	add	w4,w4,w12
1433 	ushr	v17.4s,v1.4s,#19
1434 	ror	w11,w11,#6
1435 	eor	w13,w5,w6
1436 	eor	v19.16b,v19.16b,v18.16b
1437 	eor	w15,w15,w5,ror#20
1438 	add	w4,w4,w11
1439 	sli	v17.4s,v1.4s,#13
1440 	ldr	w12,[sp,#28]
1441 	and	w14,w14,w13
1442 	ror	w15,w15,#2
1443 	ld1	{v4.4s},[x16], #16
1444 	add	w8,w8,w4
1445 	eor	v19.16b,v19.16b,v17.16b
1446 	eor	w14,w14,w6
1447 	eor	v17.16b,v17.16b,v17.16b
1448 	add	w3,w3,w12
1449 	add	w4,w4,w15
1450 	and	w12,w9,w8
1451 	mov	v17.d[1],v19.d[0]
1452 	bic	w15,w10,w8
1453 	eor	w11,w8,w8,ror#5
1454 	add	w4,w4,w14
1455 	add	v1.4s,v1.4s,v17.4s
1456 	orr	w12,w12,w15
1457 	eor	w11,w11,w8,ror#19
1458 	eor	w15,w4,w4,ror#11
1459 	add	v4.4s,v4.4s,v1.4s
1460 	add	w3,w3,w12
1461 	ror	w11,w11,#6
1462 	eor	w14,w4,w5
1463 	eor	w15,w15,w4,ror#20
1464 	add	w3,w3,w11
1465 	ldr	w12,[sp,#32]
1466 	and	w13,w13,w14
1467 	ror	w15,w15,#2
1468 	add	w7,w7,w3
1469 	eor	w13,w13,w5
1470 	st1	{v4.4s},[x17], #16
1471 	ext	v4.16b,v2.16b,v3.16b,#4
1472 	add	w10,w10,w12
1473 	add	w3,w3,w15
1474 	and	w12,w8,w7
1475 	bic	w15,w9,w7
1476 	ext	v7.16b,v0.16b,v1.16b,#4
1477 	eor	w11,w7,w7,ror#5
1478 	add	w3,w3,w13
1479 	mov	d19,v1.d[1]
1480 	orr	w12,w12,w15
1481 	eor	w11,w11,w7,ror#19
1482 	ushr	v6.4s,v4.4s,#7
1483 	eor	w15,w3,w3,ror#11
1484 	ushr	v5.4s,v4.4s,#3
1485 	add	w10,w10,w12
1486 	add	v2.4s,v2.4s,v7.4s
1487 	ror	w11,w11,#6
1488 	sli	v6.4s,v4.4s,#25
1489 	eor	w13,w3,w4
1490 	eor	w15,w15,w3,ror#20
1491 	ushr	v7.4s,v4.4s,#18
1492 	add	w10,w10,w11
1493 	ldr	w12,[sp,#36]
1494 	and	w14,w14,w13
1495 	eor	v5.16b,v5.16b,v6.16b
1496 	ror	w15,w15,#2
1497 	add	w6,w6,w10
1498 	sli	v7.4s,v4.4s,#14
1499 	eor	w14,w14,w4
1500 	ushr	v16.4s,v19.4s,#17
1501 	add	w9,w9,w12
1502 	add	w10,w10,w15
1503 	and	w12,w7,w6
1504 	eor	v5.16b,v5.16b,v7.16b
1505 	bic	w15,w8,w6
1506 	eor	w11,w6,w6,ror#5
1507 	sli	v16.4s,v19.4s,#15
1508 	add	w10,w10,w14
1509 	orr	w12,w12,w15
1510 	ushr	v17.4s,v19.4s,#10
1511 	eor	w11,w11,w6,ror#19
1512 	eor	w15,w10,w10,ror#11
1513 	ushr	v7.4s,v19.4s,#19
1514 	add	w9,w9,w12
1515 	ror	w11,w11,#6
1516 	add	v2.4s,v2.4s,v5.4s
1517 	eor	w14,w10,w3
1518 	eor	w15,w15,w10,ror#20
1519 	sli	v7.4s,v19.4s,#13
1520 	add	w9,w9,w11
1521 	ldr	w12,[sp,#40]
1522 	and	w13,w13,w14
1523 	eor	v17.16b,v17.16b,v16.16b
1524 	ror	w15,w15,#2
1525 	add	w5,w5,w9
1526 	eor	w13,w13,w3
1527 	eor	v17.16b,v17.16b,v7.16b
1528 	add	w8,w8,w12
1529 	add	w9,w9,w15
1530 	and	w12,w6,w5
1531 	add	v2.4s,v2.4s,v17.4s
1532 	bic	w15,w7,w5
1533 	eor	w11,w5,w5,ror#5
1534 	add	w9,w9,w13
1535 	ushr	v18.4s,v2.4s,#17
1536 	orr	w12,w12,w15
1537 	ushr	v19.4s,v2.4s,#10
1538 	eor	w11,w11,w5,ror#19
1539 	eor	w15,w9,w9,ror#11
1540 	sli	v18.4s,v2.4s,#15
1541 	add	w8,w8,w12
1542 	ushr	v17.4s,v2.4s,#19
1543 	ror	w11,w11,#6
1544 	eor	w13,w9,w10
1545 	eor	v19.16b,v19.16b,v18.16b
1546 	eor	w15,w15,w9,ror#20
1547 	add	w8,w8,w11
1548 	sli	v17.4s,v2.4s,#13
1549 	ldr	w12,[sp,#44]
1550 	and	w14,w14,w13
1551 	ror	w15,w15,#2
1552 	ld1	{v4.4s},[x16], #16
1553 	add	w4,w4,w8
1554 	eor	v19.16b,v19.16b,v17.16b
1555 	eor	w14,w14,w10
1556 	eor	v17.16b,v17.16b,v17.16b
1557 	add	w7,w7,w12
1558 	add	w8,w8,w15
1559 	and	w12,w5,w4
1560 	mov	v17.d[1],v19.d[0]
1561 	bic	w15,w6,w4
1562 	eor	w11,w4,w4,ror#5
1563 	add	w8,w8,w14
1564 	add	v2.4s,v2.4s,v17.4s
1565 	orr	w12,w12,w15
1566 	eor	w11,w11,w4,ror#19
1567 	eor	w15,w8,w8,ror#11
1568 	add	v4.4s,v4.4s,v2.4s
1569 	add	w7,w7,w12
1570 	ror	w11,w11,#6
1571 	eor	w14,w8,w9
1572 	eor	w15,w15,w8,ror#20
1573 	add	w7,w7,w11
1574 	ldr	w12,[sp,#48]
1575 	and	w13,w13,w14
1576 	ror	w15,w15,#2
1577 	add	w3,w3,w7
1578 	eor	w13,w13,w9
1579 	st1	{v4.4s},[x17], #16
1580 	ext	v4.16b,v3.16b,v0.16b,#4
1581 	add	w6,w6,w12
1582 	add	w7,w7,w15
1583 	and	w12,w4,w3
1584 	bic	w15,w5,w3
1585 	ext	v7.16b,v1.16b,v2.16b,#4
1586 	eor	w11,w3,w3,ror#5
1587 	add	w7,w7,w13
1588 	mov	d19,v2.d[1]
1589 	orr	w12,w12,w15
1590 	eor	w11,w11,w3,ror#19
1591 	ushr	v6.4s,v4.4s,#7
1592 	eor	w15,w7,w7,ror#11
1593 	ushr	v5.4s,v4.4s,#3
1594 	add	w6,w6,w12
1595 	add	v3.4s,v3.4s,v7.4s
1596 	ror	w11,w11,#6
1597 	sli	v6.4s,v4.4s,#25
1598 	eor	w13,w7,w8
1599 	eor	w15,w15,w7,ror#20
1600 	ushr	v7.4s,v4.4s,#18
1601 	add	w6,w6,w11
1602 	ldr	w12,[sp,#52]
1603 	and	w14,w14,w13
1604 	eor	v5.16b,v5.16b,v6.16b
1605 	ror	w15,w15,#2
1606 	add	w10,w10,w6
1607 	sli	v7.4s,v4.4s,#14
1608 	eor	w14,w14,w8
1609 	ushr	v16.4s,v19.4s,#17
1610 	add	w5,w5,w12
1611 	add	w6,w6,w15
1612 	and	w12,w3,w10
1613 	eor	v5.16b,v5.16b,v7.16b
1614 	bic	w15,w4,w10
1615 	eor	w11,w10,w10,ror#5
1616 	sli	v16.4s,v19.4s,#15
1617 	add	w6,w6,w14
1618 	orr	w12,w12,w15
1619 	ushr	v17.4s,v19.4s,#10
1620 	eor	w11,w11,w10,ror#19
1621 	eor	w15,w6,w6,ror#11
1622 	ushr	v7.4s,v19.4s,#19
1623 	add	w5,w5,w12
1624 	ror	w11,w11,#6
1625 	add	v3.4s,v3.4s,v5.4s
1626 	eor	w14,w6,w7
1627 	eor	w15,w15,w6,ror#20
1628 	sli	v7.4s,v19.4s,#13
1629 	add	w5,w5,w11
1630 	ldr	w12,[sp,#56]
1631 	and	w13,w13,w14
1632 	eor	v17.16b,v17.16b,v16.16b
1633 	ror	w15,w15,#2
1634 	add	w9,w9,w5
1635 	eor	w13,w13,w7
1636 	eor	v17.16b,v17.16b,v7.16b
1637 	add	w4,w4,w12
1638 	add	w5,w5,w15
1639 	and	w12,w10,w9
1640 	add	v3.4s,v3.4s,v17.4s
1641 	bic	w15,w3,w9
1642 	eor	w11,w9,w9,ror#5
1643 	add	w5,w5,w13
1644 	ushr	v18.4s,v3.4s,#17
1645 	orr	w12,w12,w15
1646 	ushr	v19.4s,v3.4s,#10
1647 	eor	w11,w11,w9,ror#19
1648 	eor	w15,w5,w5,ror#11
1649 	sli	v18.4s,v3.4s,#15
1650 	add	w4,w4,w12
1651 	ushr	v17.4s,v3.4s,#19
1652 	ror	w11,w11,#6
1653 	eor	w13,w5,w6
1654 	eor	v19.16b,v19.16b,v18.16b
1655 	eor	w15,w15,w5,ror#20
1656 	add	w4,w4,w11
1657 	sli	v17.4s,v3.4s,#13
1658 	ldr	w12,[sp,#60]
1659 	and	w14,w14,w13
1660 	ror	w15,w15,#2
1661 	ld1	{v4.4s},[x16], #16
1662 	add	w8,w8,w4
1663 	eor	v19.16b,v19.16b,v17.16b
1664 	eor	w14,w14,w6
1665 	eor	v17.16b,v17.16b,v17.16b
1666 	add	w3,w3,w12
1667 	add	w4,w4,w15
1668 	and	w12,w9,w8
1669 	mov	v17.d[1],v19.d[0]
1670 	bic	w15,w10,w8
1671 	eor	w11,w8,w8,ror#5
1672 	add	w4,w4,w14
1673 	add	v3.4s,v3.4s,v17.4s
1674 	orr	w12,w12,w15
1675 	eor	w11,w11,w8,ror#19
1676 	eor	w15,w4,w4,ror#11
1677 	add	v4.4s,v4.4s,v3.4s
1678 	add	w3,w3,w12
1679 	ror	w11,w11,#6
1680 	eor	w14,w4,w5
1681 	eor	w15,w15,w4,ror#20
1682 	add	w3,w3,w11
1683 	ldr	w12,[x16]
1684 	and	w13,w13,w14
1685 	ror	w15,w15,#2
1686 	add	w7,w7,w3
1687 	eor	w13,w13,w5
1688 	st1	{v4.4s},[x17], #16
1689 	cmp	w12,#0				// check for K256 terminator
1690 	ldr	w12,[sp,#0]
1691 	sub	x17,x17,#64
1692 	bne	.L_00_48
1693 
1694 	sub	x16,x16,#256		// rewind x16
1695 	cmp	x1,x2
1696 	mov	x17, #64
1697 	csel	x17, x17, xzr, eq
1698 	sub	x1,x1,x17			// avoid SEGV
1699 	mov	x17,sp
1700 	add	w10,w10,w12
1701 	add	w3,w3,w15
1702 	and	w12,w8,w7
1703 	ld1	{v0.16b},[x1],#16
1704 	bic	w15,w9,w7
1705 	eor	w11,w7,w7,ror#5
1706 	ld1	{v4.4s},[x16],#16
1707 	add	w3,w3,w13
1708 	orr	w12,w12,w15
1709 	eor	w11,w11,w7,ror#19
1710 	eor	w15,w3,w3,ror#11
1711 	rev32	v0.16b,v0.16b
1712 	add	w10,w10,w12
1713 	ror	w11,w11,#6
1714 	eor	w13,w3,w4
1715 	eor	w15,w15,w3,ror#20
1716 	add	v4.4s,v4.4s,v0.4s
1717 	add	w10,w10,w11
1718 	ldr	w12,[sp,#4]
1719 	and	w14,w14,w13
1720 	ror	w15,w15,#2
1721 	add	w6,w6,w10
1722 	eor	w14,w14,w4
1723 	add	w9,w9,w12
1724 	add	w10,w10,w15
1725 	and	w12,w7,w6
1726 	bic	w15,w8,w6
1727 	eor	w11,w6,w6,ror#5
1728 	add	w10,w10,w14
1729 	orr	w12,w12,w15
1730 	eor	w11,w11,w6,ror#19
1731 	eor	w15,w10,w10,ror#11
1732 	add	w9,w9,w12
1733 	ror	w11,w11,#6
1734 	eor	w14,w10,w3
1735 	eor	w15,w15,w10,ror#20
1736 	add	w9,w9,w11
1737 	ldr	w12,[sp,#8]
1738 	and	w13,w13,w14
1739 	ror	w15,w15,#2
1740 	add	w5,w5,w9
1741 	eor	w13,w13,w3
1742 	add	w8,w8,w12
1743 	add	w9,w9,w15
1744 	and	w12,w6,w5
1745 	bic	w15,w7,w5
1746 	eor	w11,w5,w5,ror#5
1747 	add	w9,w9,w13
1748 	orr	w12,w12,w15
1749 	eor	w11,w11,w5,ror#19
1750 	eor	w15,w9,w9,ror#11
1751 	add	w8,w8,w12
1752 	ror	w11,w11,#6
1753 	eor	w13,w9,w10
1754 	eor	w15,w15,w9,ror#20
1755 	add	w8,w8,w11
1756 	ldr	w12,[sp,#12]
1757 	and	w14,w14,w13
1758 	ror	w15,w15,#2
1759 	add	w4,w4,w8
1760 	eor	w14,w14,w10
1761 	add	w7,w7,w12
1762 	add	w8,w8,w15
1763 	and	w12,w5,w4
1764 	bic	w15,w6,w4
1765 	eor	w11,w4,w4,ror#5
1766 	add	w8,w8,w14
1767 	orr	w12,w12,w15
1768 	eor	w11,w11,w4,ror#19
1769 	eor	w15,w8,w8,ror#11
1770 	add	w7,w7,w12
1771 	ror	w11,w11,#6
1772 	eor	w14,w8,w9
1773 	eor	w15,w15,w8,ror#20
1774 	add	w7,w7,w11
1775 	ldr	w12,[sp,#16]
1776 	and	w13,w13,w14
1777 	ror	w15,w15,#2
1778 	add	w3,w3,w7
1779 	eor	w13,w13,w9
1780 	st1	{v4.4s},[x17], #16
1781 	add	w6,w6,w12
1782 	add	w7,w7,w15
1783 	and	w12,w4,w3
1784 	ld1	{v1.16b},[x1],#16
1785 	bic	w15,w5,w3
1786 	eor	w11,w3,w3,ror#5
1787 	ld1	{v4.4s},[x16],#16
1788 	add	w7,w7,w13
1789 	orr	w12,w12,w15
1790 	eor	w11,w11,w3,ror#19
1791 	eor	w15,w7,w7,ror#11
1792 	rev32	v1.16b,v1.16b
1793 	add	w6,w6,w12
1794 	ror	w11,w11,#6
1795 	eor	w13,w7,w8
1796 	eor	w15,w15,w7,ror#20
1797 	add	v4.4s,v4.4s,v1.4s
1798 	add	w6,w6,w11
1799 	ldr	w12,[sp,#20]
1800 	and	w14,w14,w13
1801 	ror	w15,w15,#2
1802 	add	w10,w10,w6
1803 	eor	w14,w14,w8
1804 	add	w5,w5,w12
1805 	add	w6,w6,w15
1806 	and	w12,w3,w10
1807 	bic	w15,w4,w10
1808 	eor	w11,w10,w10,ror#5
1809 	add	w6,w6,w14
1810 	orr	w12,w12,w15
1811 	eor	w11,w11,w10,ror#19
1812 	eor	w15,w6,w6,ror#11
1813 	add	w5,w5,w12
1814 	ror	w11,w11,#6
1815 	eor	w14,w6,w7
1816 	eor	w15,w15,w6,ror#20
1817 	add	w5,w5,w11
1818 	ldr	w12,[sp,#24]
1819 	and	w13,w13,w14
1820 	ror	w15,w15,#2
1821 	add	w9,w9,w5
1822 	eor	w13,w13,w7
1823 	add	w4,w4,w12
1824 	add	w5,w5,w15
1825 	and	w12,w10,w9
1826 	bic	w15,w3,w9
1827 	eor	w11,w9,w9,ror#5
1828 	add	w5,w5,w13
1829 	orr	w12,w12,w15
1830 	eor	w11,w11,w9,ror#19
1831 	eor	w15,w5,w5,ror#11
1832 	add	w4,w4,w12
1833 	ror	w11,w11,#6
1834 	eor	w13,w5,w6
1835 	eor	w15,w15,w5,ror#20
1836 	add	w4,w4,w11
1837 	ldr	w12,[sp,#28]
1838 	and	w14,w14,w13
1839 	ror	w15,w15,#2
1840 	add	w8,w8,w4
1841 	eor	w14,w14,w6
1842 	add	w3,w3,w12
1843 	add	w4,w4,w15
1844 	and	w12,w9,w8
1845 	bic	w15,w10,w8
1846 	eor	w11,w8,w8,ror#5
1847 	add	w4,w4,w14
1848 	orr	w12,w12,w15
1849 	eor	w11,w11,w8,ror#19
1850 	eor	w15,w4,w4,ror#11
1851 	add	w3,w3,w12
1852 	ror	w11,w11,#6
1853 	eor	w14,w4,w5
1854 	eor	w15,w15,w4,ror#20
1855 	add	w3,w3,w11
1856 	ldr	w12,[sp,#32]
1857 	and	w13,w13,w14
1858 	ror	w15,w15,#2
1859 	add	w7,w7,w3
1860 	eor	w13,w13,w5
1861 	st1	{v4.4s},[x17], #16
1862 	add	w10,w10,w12
1863 	add	w3,w3,w15
1864 	and	w12,w8,w7
1865 	ld1	{v2.16b},[x1],#16
1866 	bic	w15,w9,w7
1867 	eor	w11,w7,w7,ror#5
1868 	ld1	{v4.4s},[x16],#16
1869 	add	w3,w3,w13
1870 	orr	w12,w12,w15
1871 	eor	w11,w11,w7,ror#19
1872 	eor	w15,w3,w3,ror#11
1873 	rev32	v2.16b,v2.16b
1874 	add	w10,w10,w12
1875 	ror	w11,w11,#6
1876 	eor	w13,w3,w4
1877 	eor	w15,w15,w3,ror#20
1878 	add	v4.4s,v4.4s,v2.4s
1879 	add	w10,w10,w11
1880 	ldr	w12,[sp,#36]
1881 	and	w14,w14,w13
1882 	ror	w15,w15,#2
1883 	add	w6,w6,w10
1884 	eor	w14,w14,w4
1885 	add	w9,w9,w12
1886 	add	w10,w10,w15
1887 	and	w12,w7,w6
1888 	bic	w15,w8,w6
1889 	eor	w11,w6,w6,ror#5
1890 	add	w10,w10,w14
1891 	orr	w12,w12,w15
1892 	eor	w11,w11,w6,ror#19
1893 	eor	w15,w10,w10,ror#11
1894 	add	w9,w9,w12
1895 	ror	w11,w11,#6
1896 	eor	w14,w10,w3
1897 	eor	w15,w15,w10,ror#20
1898 	add	w9,w9,w11
1899 	ldr	w12,[sp,#40]
1900 	and	w13,w13,w14
1901 	ror	w15,w15,#2
1902 	add	w5,w5,w9
1903 	eor	w13,w13,w3
1904 	add	w8,w8,w12
1905 	add	w9,w9,w15
1906 	and	w12,w6,w5
1907 	bic	w15,w7,w5
1908 	eor	w11,w5,w5,ror#5
1909 	add	w9,w9,w13
1910 	orr	w12,w12,w15
1911 	eor	w11,w11,w5,ror#19
1912 	eor	w15,w9,w9,ror#11
1913 	add	w8,w8,w12
1914 	ror	w11,w11,#6
1915 	eor	w13,w9,w10
1916 	eor	w15,w15,w9,ror#20
1917 	add	w8,w8,w11
1918 	ldr	w12,[sp,#44]
1919 	and	w14,w14,w13
1920 	ror	w15,w15,#2
1921 	add	w4,w4,w8
1922 	eor	w14,w14,w10
1923 	add	w7,w7,w12
1924 	add	w8,w8,w15
1925 	and	w12,w5,w4
1926 	bic	w15,w6,w4
1927 	eor	w11,w4,w4,ror#5
1928 	add	w8,w8,w14
1929 	orr	w12,w12,w15
1930 	eor	w11,w11,w4,ror#19
1931 	eor	w15,w8,w8,ror#11
1932 	add	w7,w7,w12
1933 	ror	w11,w11,#6
1934 	eor	w14,w8,w9
1935 	eor	w15,w15,w8,ror#20
1936 	add	w7,w7,w11
1937 	ldr	w12,[sp,#48]
1938 	and	w13,w13,w14
1939 	ror	w15,w15,#2
1940 	add	w3,w3,w7
1941 	eor	w13,w13,w9
1942 	st1	{v4.4s},[x17], #16
1943 	add	w6,w6,w12
1944 	add	w7,w7,w15
1945 	and	w12,w4,w3
1946 	ld1	{v3.16b},[x1],#16
1947 	bic	w15,w5,w3
1948 	eor	w11,w3,w3,ror#5
1949 	ld1	{v4.4s},[x16],#16
1950 	add	w7,w7,w13
1951 	orr	w12,w12,w15
1952 	eor	w11,w11,w3,ror#19
1953 	eor	w15,w7,w7,ror#11
1954 	rev32	v3.16b,v3.16b
1955 	add	w6,w6,w12
1956 	ror	w11,w11,#6
1957 	eor	w13,w7,w8
1958 	eor	w15,w15,w7,ror#20
1959 	add	v4.4s,v4.4s,v3.4s
1960 	add	w6,w6,w11
1961 	ldr	w12,[sp,#52]
1962 	and	w14,w14,w13
1963 	ror	w15,w15,#2
1964 	add	w10,w10,w6
1965 	eor	w14,w14,w8
1966 	add	w5,w5,w12
1967 	add	w6,w6,w15
1968 	and	w12,w3,w10
1969 	bic	w15,w4,w10
1970 	eor	w11,w10,w10,ror#5
1971 	add	w6,w6,w14
1972 	orr	w12,w12,w15
1973 	eor	w11,w11,w10,ror#19
1974 	eor	w15,w6,w6,ror#11
1975 	add	w5,w5,w12
1976 	ror	w11,w11,#6
1977 	eor	w14,w6,w7
1978 	eor	w15,w15,w6,ror#20
1979 	add	w5,w5,w11
1980 	ldr	w12,[sp,#56]
1981 	and	w13,w13,w14
1982 	ror	w15,w15,#2
1983 	add	w9,w9,w5
1984 	eor	w13,w13,w7
1985 	add	w4,w4,w12
1986 	add	w5,w5,w15
1987 	and	w12,w10,w9
1988 	bic	w15,w3,w9
1989 	eor	w11,w9,w9,ror#5
1990 	add	w5,w5,w13
1991 	orr	w12,w12,w15
1992 	eor	w11,w11,w9,ror#19
1993 	eor	w15,w5,w5,ror#11
1994 	add	w4,w4,w12
1995 	ror	w11,w11,#6
1996 	eor	w13,w5,w6
1997 	eor	w15,w15,w5,ror#20
1998 	add	w4,w4,w11
1999 	ldr	w12,[sp,#60]
2000 	and	w14,w14,w13
2001 	ror	w15,w15,#2
2002 	add	w8,w8,w4
2003 	eor	w14,w14,w6
2004 	add	w3,w3,w12
2005 	add	w4,w4,w15
2006 	and	w12,w9,w8
2007 	bic	w15,w10,w8
2008 	eor	w11,w8,w8,ror#5
2009 	add	w4,w4,w14
2010 	orr	w12,w12,w15
2011 	eor	w11,w11,w8,ror#19
2012 	eor	w15,w4,w4,ror#11
2013 	add	w3,w3,w12
2014 	ror	w11,w11,#6
2015 	eor	w14,w4,w5
2016 	eor	w15,w15,w4,ror#20
2017 	add	w3,w3,w11
2018 	and	w13,w13,w14
2019 	ror	w15,w15,#2
2020 	add	w7,w7,w3
2021 	eor	w13,w13,w5
2022 	st1	{v4.4s},[x17], #16
2023 	add	w3,w3,w15			// h+=Sigma0(a) from the past
2024 	ldp	w11,w12,[x0,#0]
2025 	add	w3,w3,w13			// h+=Maj(a,b,c) from the past
2026 	ldp	w13,w14,[x0,#8]
2027 	add	w3,w3,w11			// accumulate
2028 	add	w4,w4,w12
2029 	ldp	w11,w12,[x0,#16]
2030 	add	w5,w5,w13
2031 	add	w6,w6,w14
2032 	ldp	w13,w14,[x0,#24]
2033 	add	w7,w7,w11
2034 	add	w8,w8,w12
2035 	ldr	w12,[sp,#0]
2036 	stp	w3,w4,[x0,#0]
2037 	add	w9,w9,w13
2038 	mov	w13,wzr
2039 	stp	w5,w6,[x0,#8]
2040 	add	w10,w10,w14
2041 	stp	w7,w8,[x0,#16]
2042 	eor	w14,w4,w5
2043 	stp	w9,w10,[x0,#24]
2044 	mov	w15,wzr
2045 	mov	x17,sp
2046 	b.ne	.L_00_48
2047 
2048 	ldr	x29,[x29]
2049 	add	sp,sp,#16*4+16
2050 	ret
2051 .size	sha256_block_neon,.-sha256_block_neon
2052