2 /* Do not modify. This file is auto-generated from sha512-armv8.pl. */
3 // Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
5 // Licensed under the OpenSSL license (the "License"). You may not use
6 // this file except in compliance with the License. You can obtain a copy
7 // in the file LICENSE in the source distribution or at
8 // https://www.openssl.org/source/license.html
10 // ====================================================================
11 // Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12 // project. The module is, however, dual licensed under OpenSSL and
13 // CRYPTOGAMS licenses depending on where you obtain it. For further
14 // details see http://www.openssl.org/~appro/cryptogams/.
16 // Permission to use under GPLv2 terms is granted.
17 // ====================================================================
19 // SHA256/512 for ARMv8.
21 // Performance in cycles per processed byte and improvement coefficient
22 // over code generated with "default" compiler:
24 // SHA256-hw SHA256(*) SHA512
25 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**))
26 // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***))
27 // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***))
28 // Denver 2.01 10.5 (+26%) 6.70 (+8%)
29 // X-Gene 20.0 (+100%) 12.8 (+300%(***))
30 // Mongoose 2.36 13.0 (+50%) 8.36 (+33%)
31 // Kryo 1.92 17.4 (+30%) 11.2 (+8%)
33 // (*) Software SHA256 results are of lesser relevance, presented
34 // mostly for informational purposes.
35 // (**) The result is a trade-off: it's possible to improve it by
36 // 10% (or by 1 cycle per round), but at the cost of 20% loss
37 // on Cortex-A53 (or by 4 cycles per round).
38 // (***) Super-impressive coefficients over gcc-generated code are
39 // indication of some compiler "pathology", most notably code
40 // generated with -mgeneral-regs-only is significantly faster
41 // and the gap is only 40-90%.
45 // Originally it was reckoned that it makes no sense to implement NEON
46 // version of SHA256 for 64-bit processors. This is because performance
47 // improvement on most wide-spread Cortex-A5x processors was observed
48 // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
49 // observed that 32-bit NEON SHA256 performs significantly better than
50 // 64-bit scalar version on *some* of the more recent processors. As
51 // result 64-bit NEON version of SHA256 was added to provide best
52 // all-round performance. For example it executes ~30% faster on X-Gene
53 // and Mongoose. [For reference, NEON version of SHA512 is bound to
54 // deliver much less improvement, likely *negative* on Cortex-A5x.
55 // Which is why NEON support is limited to SHA256.]
58 # include "arm_arch.h"
64 .hidden OPENSSL_armcap_P
65 .globl sha256_block_data_order
66 .type sha256_block_data_order,%function
68 sha256_block_data_order:
71 ldrsw x16,.LOPENSSL_armcap_P
73 ldr x16,.LOPENSSL_armcap_P
75 adr x17,.LOPENSSL_armcap_P
83 .inst 0xd503233f // paciasp
84 stp x29,x30,[sp,#-128]!
94 ldp w20,w21,[x0] // load context
97 add x2,x1,x2,lsl#6 // end of input
104 ldr w19,[x30],#4 // *K++
105 eor w28,w21,w22 // magic seed
107 #ifndef __AARCH64EB__
111 add w27,w27,w19 // h+=K[i]
112 eor w6,w24,w24,ror#14
115 add w27,w27,w3 // h+=X[i]
116 orr w17,w17,w19 // Ch(e,f,g)
117 eor w19,w20,w21 // a^b, b^c in next round
118 eor w16,w16,w6,ror#11 // Sigma1(e)
120 add w27,w27,w17 // h+=Ch(e,f,g)
121 eor w17,w20,w20,ror#9
122 add w27,w27,w16 // h+=Sigma1(e)
123 and w28,w28,w19 // (b^c)&=(a^b)
124 add w23,w23,w27 // d+=h
125 eor w28,w28,w21 // Maj(a,b,c)
126 eor w17,w6,w17,ror#13 // Sigma0(a)
127 add w27,w27,w28 // h+=Maj(a,b,c)
128 ldr w28,[x30],#4 // *K++, w19 in next round
129 //add w27,w27,w17 // h+=Sigma0(a)
130 #ifndef __AARCH64EB__
134 add w27,w27,w17 // h+=Sigma0(a)
136 add w26,w26,w28 // h+=K[i]
137 eor w7,w23,w23,ror#14
140 add w26,w26,w4 // h+=X[i]
141 orr w17,w17,w28 // Ch(e,f,g)
142 eor w28,w27,w20 // a^b, b^c in next round
143 eor w16,w16,w7,ror#11 // Sigma1(e)
145 add w26,w26,w17 // h+=Ch(e,f,g)
146 eor w17,w27,w27,ror#9
147 add w26,w26,w16 // h+=Sigma1(e)
148 and w19,w19,w28 // (b^c)&=(a^b)
149 add w22,w22,w26 // d+=h
150 eor w19,w19,w20 // Maj(a,b,c)
151 eor w17,w7,w17,ror#13 // Sigma0(a)
152 add w26,w26,w19 // h+=Maj(a,b,c)
153 ldr w19,[x30],#4 // *K++, w28 in next round
154 //add w26,w26,w17 // h+=Sigma0(a)
155 #ifndef __AARCH64EB__
158 add w26,w26,w17 // h+=Sigma0(a)
160 add w25,w25,w19 // h+=K[i]
161 eor w8,w22,w22,ror#14
164 add w25,w25,w5 // h+=X[i]
165 orr w17,w17,w19 // Ch(e,f,g)
166 eor w19,w26,w27 // a^b, b^c in next round
167 eor w16,w16,w8,ror#11 // Sigma1(e)
169 add w25,w25,w17 // h+=Ch(e,f,g)
170 eor w17,w26,w26,ror#9
171 add w25,w25,w16 // h+=Sigma1(e)
172 and w28,w28,w19 // (b^c)&=(a^b)
173 add w21,w21,w25 // d+=h
174 eor w28,w28,w27 // Maj(a,b,c)
175 eor w17,w8,w17,ror#13 // Sigma0(a)
176 add w25,w25,w28 // h+=Maj(a,b,c)
177 ldr w28,[x30],#4 // *K++, w19 in next round
178 //add w25,w25,w17 // h+=Sigma0(a)
179 #ifndef __AARCH64EB__
183 add w25,w25,w17 // h+=Sigma0(a)
185 add w24,w24,w28 // h+=K[i]
186 eor w9,w21,w21,ror#14
189 add w24,w24,w6 // h+=X[i]
190 orr w17,w17,w28 // Ch(e,f,g)
191 eor w28,w25,w26 // a^b, b^c in next round
192 eor w16,w16,w9,ror#11 // Sigma1(e)
194 add w24,w24,w17 // h+=Ch(e,f,g)
195 eor w17,w25,w25,ror#9
196 add w24,w24,w16 // h+=Sigma1(e)
197 and w19,w19,w28 // (b^c)&=(a^b)
198 add w20,w20,w24 // d+=h
199 eor w19,w19,w26 // Maj(a,b,c)
200 eor w17,w9,w17,ror#13 // Sigma0(a)
201 add w24,w24,w19 // h+=Maj(a,b,c)
202 ldr w19,[x30],#4 // *K++, w28 in next round
203 //add w24,w24,w17 // h+=Sigma0(a)
204 #ifndef __AARCH64EB__
207 add w24,w24,w17 // h+=Sigma0(a)
209 add w23,w23,w19 // h+=K[i]
210 eor w10,w20,w20,ror#14
213 add w23,w23,w7 // h+=X[i]
214 orr w17,w17,w19 // Ch(e,f,g)
215 eor w19,w24,w25 // a^b, b^c in next round
216 eor w16,w16,w10,ror#11 // Sigma1(e)
218 add w23,w23,w17 // h+=Ch(e,f,g)
219 eor w17,w24,w24,ror#9
220 add w23,w23,w16 // h+=Sigma1(e)
221 and w28,w28,w19 // (b^c)&=(a^b)
222 add w27,w27,w23 // d+=h
223 eor w28,w28,w25 // Maj(a,b,c)
224 eor w17,w10,w17,ror#13 // Sigma0(a)
225 add w23,w23,w28 // h+=Maj(a,b,c)
226 ldr w28,[x30],#4 // *K++, w19 in next round
227 //add w23,w23,w17 // h+=Sigma0(a)
228 #ifndef __AARCH64EB__
232 add w23,w23,w17 // h+=Sigma0(a)
234 add w22,w22,w28 // h+=K[i]
235 eor w11,w27,w27,ror#14
238 add w22,w22,w8 // h+=X[i]
239 orr w17,w17,w28 // Ch(e,f,g)
240 eor w28,w23,w24 // a^b, b^c in next round
241 eor w16,w16,w11,ror#11 // Sigma1(e)
243 add w22,w22,w17 // h+=Ch(e,f,g)
244 eor w17,w23,w23,ror#9
245 add w22,w22,w16 // h+=Sigma1(e)
246 and w19,w19,w28 // (b^c)&=(a^b)
247 add w26,w26,w22 // d+=h
248 eor w19,w19,w24 // Maj(a,b,c)
249 eor w17,w11,w17,ror#13 // Sigma0(a)
250 add w22,w22,w19 // h+=Maj(a,b,c)
251 ldr w19,[x30],#4 // *K++, w28 in next round
252 //add w22,w22,w17 // h+=Sigma0(a)
253 #ifndef __AARCH64EB__
256 add w22,w22,w17 // h+=Sigma0(a)
258 add w21,w21,w19 // h+=K[i]
259 eor w12,w26,w26,ror#14
262 add w21,w21,w9 // h+=X[i]
263 orr w17,w17,w19 // Ch(e,f,g)
264 eor w19,w22,w23 // a^b, b^c in next round
265 eor w16,w16,w12,ror#11 // Sigma1(e)
267 add w21,w21,w17 // h+=Ch(e,f,g)
268 eor w17,w22,w22,ror#9
269 add w21,w21,w16 // h+=Sigma1(e)
270 and w28,w28,w19 // (b^c)&=(a^b)
271 add w25,w25,w21 // d+=h
272 eor w28,w28,w23 // Maj(a,b,c)
273 eor w17,w12,w17,ror#13 // Sigma0(a)
274 add w21,w21,w28 // h+=Maj(a,b,c)
275 ldr w28,[x30],#4 // *K++, w19 in next round
276 //add w21,w21,w17 // h+=Sigma0(a)
277 #ifndef __AARCH64EB__
280 ldp w11,w12,[x1],#2*4
281 add w21,w21,w17 // h+=Sigma0(a)
283 add w20,w20,w28 // h+=K[i]
284 eor w13,w25,w25,ror#14
287 add w20,w20,w10 // h+=X[i]
288 orr w17,w17,w28 // Ch(e,f,g)
289 eor w28,w21,w22 // a^b, b^c in next round
290 eor w16,w16,w13,ror#11 // Sigma1(e)
292 add w20,w20,w17 // h+=Ch(e,f,g)
293 eor w17,w21,w21,ror#9
294 add w20,w20,w16 // h+=Sigma1(e)
295 and w19,w19,w28 // (b^c)&=(a^b)
296 add w24,w24,w20 // d+=h
297 eor w19,w19,w22 // Maj(a,b,c)
298 eor w17,w13,w17,ror#13 // Sigma0(a)
299 add w20,w20,w19 // h+=Maj(a,b,c)
300 ldr w19,[x30],#4 // *K++, w28 in next round
301 //add w20,w20,w17 // h+=Sigma0(a)
302 #ifndef __AARCH64EB__
305 add w20,w20,w17 // h+=Sigma0(a)
307 add w27,w27,w19 // h+=K[i]
308 eor w14,w24,w24,ror#14
311 add w27,w27,w11 // h+=X[i]
312 orr w17,w17,w19 // Ch(e,f,g)
313 eor w19,w20,w21 // a^b, b^c in next round
314 eor w16,w16,w14,ror#11 // Sigma1(e)
316 add w27,w27,w17 // h+=Ch(e,f,g)
317 eor w17,w20,w20,ror#9
318 add w27,w27,w16 // h+=Sigma1(e)
319 and w28,w28,w19 // (b^c)&=(a^b)
320 add w23,w23,w27 // d+=h
321 eor w28,w28,w21 // Maj(a,b,c)
322 eor w17,w14,w17,ror#13 // Sigma0(a)
323 add w27,w27,w28 // h+=Maj(a,b,c)
324 ldr w28,[x30],#4 // *K++, w19 in next round
325 //add w27,w27,w17 // h+=Sigma0(a)
326 #ifndef __AARCH64EB__
329 ldp w13,w14,[x1],#2*4
330 add w27,w27,w17 // h+=Sigma0(a)
332 add w26,w26,w28 // h+=K[i]
333 eor w15,w23,w23,ror#14
336 add w26,w26,w12 // h+=X[i]
337 orr w17,w17,w28 // Ch(e,f,g)
338 eor w28,w27,w20 // a^b, b^c in next round
339 eor w16,w16,w15,ror#11 // Sigma1(e)
341 add w26,w26,w17 // h+=Ch(e,f,g)
342 eor w17,w27,w27,ror#9
343 add w26,w26,w16 // h+=Sigma1(e)
344 and w19,w19,w28 // (b^c)&=(a^b)
345 add w22,w22,w26 // d+=h
346 eor w19,w19,w20 // Maj(a,b,c)
347 eor w17,w15,w17,ror#13 // Sigma0(a)
348 add w26,w26,w19 // h+=Maj(a,b,c)
349 ldr w19,[x30],#4 // *K++, w28 in next round
350 //add w26,w26,w17 // h+=Sigma0(a)
351 #ifndef __AARCH64EB__
354 add w26,w26,w17 // h+=Sigma0(a)
356 add w25,w25,w19 // h+=K[i]
357 eor w0,w22,w22,ror#14
360 add w25,w25,w13 // h+=X[i]
361 orr w17,w17,w19 // Ch(e,f,g)
362 eor w19,w26,w27 // a^b, b^c in next round
363 eor w16,w16,w0,ror#11 // Sigma1(e)
365 add w25,w25,w17 // h+=Ch(e,f,g)
366 eor w17,w26,w26,ror#9
367 add w25,w25,w16 // h+=Sigma1(e)
368 and w28,w28,w19 // (b^c)&=(a^b)
369 add w21,w21,w25 // d+=h
370 eor w28,w28,w27 // Maj(a,b,c)
371 eor w17,w0,w17,ror#13 // Sigma0(a)
372 add w25,w25,w28 // h+=Maj(a,b,c)
373 ldr w28,[x30],#4 // *K++, w19 in next round
374 //add w25,w25,w17 // h+=Sigma0(a)
375 #ifndef __AARCH64EB__
379 add w25,w25,w17 // h+=Sigma0(a)
382 add w24,w24,w28 // h+=K[i]
383 eor w6,w21,w21,ror#14
386 add w24,w24,w14 // h+=X[i]
387 orr w17,w17,w28 // Ch(e,f,g)
388 eor w28,w25,w26 // a^b, b^c in next round
389 eor w16,w16,w6,ror#11 // Sigma1(e)
391 add w24,w24,w17 // h+=Ch(e,f,g)
392 eor w17,w25,w25,ror#9
393 add w24,w24,w16 // h+=Sigma1(e)
394 and w19,w19,w28 // (b^c)&=(a^b)
395 add w20,w20,w24 // d+=h
396 eor w19,w19,w26 // Maj(a,b,c)
397 eor w17,w6,w17,ror#13 // Sigma0(a)
398 add w24,w24,w19 // h+=Maj(a,b,c)
399 ldr w19,[x30],#4 // *K++, w28 in next round
400 //add w24,w24,w17 // h+=Sigma0(a)
401 #ifndef __AARCH64EB__
404 add w24,w24,w17 // h+=Sigma0(a)
407 add w23,w23,w19 // h+=K[i]
408 eor w7,w20,w20,ror#14
411 add w23,w23,w15 // h+=X[i]
412 orr w17,w17,w19 // Ch(e,f,g)
413 eor w19,w24,w25 // a^b, b^c in next round
414 eor w16,w16,w7,ror#11 // Sigma1(e)
416 add w23,w23,w17 // h+=Ch(e,f,g)
417 eor w17,w24,w24,ror#9
418 add w23,w23,w16 // h+=Sigma1(e)
419 and w28,w28,w19 // (b^c)&=(a^b)
420 add w27,w27,w23 // d+=h
421 eor w28,w28,w25 // Maj(a,b,c)
422 eor w17,w7,w17,ror#13 // Sigma0(a)
423 add w23,w23,w28 // h+=Maj(a,b,c)
424 ldr w28,[x30],#4 // *K++, w19 in next round
425 //add w23,w23,w17 // h+=Sigma0(a)
426 #ifndef __AARCH64EB__
430 add w23,w23,w17 // h+=Sigma0(a)
433 add w22,w22,w28 // h+=K[i]
434 eor w8,w27,w27,ror#14
437 add w22,w22,w0 // h+=X[i]
438 orr w17,w17,w28 // Ch(e,f,g)
439 eor w28,w23,w24 // a^b, b^c in next round
440 eor w16,w16,w8,ror#11 // Sigma1(e)
442 add w22,w22,w17 // h+=Ch(e,f,g)
443 eor w17,w23,w23,ror#9
444 add w22,w22,w16 // h+=Sigma1(e)
445 and w19,w19,w28 // (b^c)&=(a^b)
446 add w26,w26,w22 // d+=h
447 eor w19,w19,w24 // Maj(a,b,c)
448 eor w17,w8,w17,ror#13 // Sigma0(a)
449 add w22,w22,w19 // h+=Maj(a,b,c)
450 ldr w19,[x30],#4 // *K++, w28 in next round
451 //add w22,w22,w17 // h+=Sigma0(a)
452 #ifndef __AARCH64EB__
456 add w22,w22,w17 // h+=Sigma0(a)
459 add w21,w21,w19 // h+=K[i]
460 eor w9,w26,w26,ror#14
463 add w21,w21,w1 // h+=X[i]
464 orr w17,w17,w19 // Ch(e,f,g)
465 eor w19,w22,w23 // a^b, b^c in next round
466 eor w16,w16,w9,ror#11 // Sigma1(e)
468 add w21,w21,w17 // h+=Ch(e,f,g)
469 eor w17,w22,w22,ror#9
470 add w21,w21,w16 // h+=Sigma1(e)
471 and w28,w28,w19 // (b^c)&=(a^b)
472 add w25,w25,w21 // d+=h
473 eor w28,w28,w23 // Maj(a,b,c)
474 eor w17,w9,w17,ror#13 // Sigma0(a)
475 add w21,w21,w28 // h+=Maj(a,b,c)
476 ldr w28,[x30],#4 // *K++, w19 in next round
477 //add w21,w21,w17 // h+=Sigma0(a)
478 #ifndef __AARCH64EB__
482 add w21,w21,w17 // h+=Sigma0(a)
485 add w20,w20,w28 // h+=K[i]
491 add w20,w20,w2 // h+=X[i]
492 eor w16,w16,w25,ror#11
494 orr w17,w17,w28 // Ch(e,f,g)
495 eor w28,w21,w22 // a^b, b^c in next round
496 eor w16,w16,w25,ror#25 // Sigma1(e)
497 eor w10,w10,w21,ror#13
498 add w20,w20,w17 // h+=Ch(e,f,g)
499 and w19,w19,w28 // (b^c)&=(a^b)
501 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
502 add w20,w20,w16 // h+=Sigma1(e)
503 eor w19,w19,w22 // Maj(a,b,c)
504 eor w17,w10,w21,ror#22 // Sigma0(a)
505 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
507 add w24,w24,w20 // d+=h
508 add w20,w20,w19 // h+=Maj(a,b,c)
509 ldr w19,[x30],#4 // *K++, w28 in next round
511 add w20,w20,w17 // h+=Sigma0(a)
517 add w27,w27,w19 // h+=K[i]
523 add w27,w27,w3 // h+=X[i]
524 eor w16,w16,w24,ror#11
525 eor w10,w10,w5,ror#18
526 orr w17,w17,w19 // Ch(e,f,g)
527 eor w19,w20,w21 // a^b, b^c in next round
528 eor w16,w16,w24,ror#25 // Sigma1(e)
529 eor w11,w11,w20,ror#13
530 add w27,w27,w17 // h+=Ch(e,f,g)
531 and w28,w28,w19 // (b^c)&=(a^b)
533 eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
534 add w27,w27,w16 // h+=Sigma1(e)
535 eor w28,w28,w21 // Maj(a,b,c)
536 eor w17,w11,w20,ror#22 // Sigma0(a)
537 eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
539 add w23,w23,w27 // d+=h
540 add w27,w27,w28 // h+=Maj(a,b,c)
541 ldr w28,[x30],#4 // *K++, w19 in next round
543 add w27,w27,w17 // h+=Sigma0(a)
548 add w26,w26,w28 // h+=K[i]
554 add w26,w26,w4 // h+=X[i]
555 eor w16,w16,w23,ror#11
556 eor w11,w11,w6,ror#18
557 orr w17,w17,w28 // Ch(e,f,g)
558 eor w28,w27,w20 // a^b, b^c in next round
559 eor w16,w16,w23,ror#25 // Sigma1(e)
560 eor w12,w12,w27,ror#13
561 add w26,w26,w17 // h+=Ch(e,f,g)
562 and w19,w19,w28 // (b^c)&=(a^b)
563 eor w10,w10,w3,ror#19
564 eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
565 add w26,w26,w16 // h+=Sigma1(e)
566 eor w19,w19,w20 // Maj(a,b,c)
567 eor w17,w12,w27,ror#22 // Sigma0(a)
568 eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
570 add w22,w22,w26 // d+=h
571 add w26,w26,w19 // h+=Maj(a,b,c)
572 ldr w19,[x30],#4 // *K++, w28 in next round
574 add w26,w26,w17 // h+=Sigma0(a)
579 add w25,w25,w19 // h+=K[i]
585 add w25,w25,w5 // h+=X[i]
586 eor w16,w16,w22,ror#11
587 eor w12,w12,w7,ror#18
588 orr w17,w17,w19 // Ch(e,f,g)
589 eor w19,w26,w27 // a^b, b^c in next round
590 eor w16,w16,w22,ror#25 // Sigma1(e)
591 eor w13,w13,w26,ror#13
592 add w25,w25,w17 // h+=Ch(e,f,g)
593 and w28,w28,w19 // (b^c)&=(a^b)
594 eor w11,w11,w4,ror#19
595 eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
596 add w25,w25,w16 // h+=Sigma1(e)
597 eor w28,w28,w27 // Maj(a,b,c)
598 eor w17,w13,w26,ror#22 // Sigma0(a)
599 eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
601 add w21,w21,w25 // d+=h
602 add w25,w25,w28 // h+=Maj(a,b,c)
603 ldr w28,[x30],#4 // *K++, w19 in next round
605 add w25,w25,w17 // h+=Sigma0(a)
610 add w24,w24,w28 // h+=K[i]
616 add w24,w24,w6 // h+=X[i]
617 eor w16,w16,w21,ror#11
618 eor w13,w13,w8,ror#18
619 orr w17,w17,w28 // Ch(e,f,g)
620 eor w28,w25,w26 // a^b, b^c in next round
621 eor w16,w16,w21,ror#25 // Sigma1(e)
622 eor w14,w14,w25,ror#13
623 add w24,w24,w17 // h+=Ch(e,f,g)
624 and w19,w19,w28 // (b^c)&=(a^b)
625 eor w12,w12,w5,ror#19
626 eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
627 add w24,w24,w16 // h+=Sigma1(e)
628 eor w19,w19,w26 // Maj(a,b,c)
629 eor w17,w14,w25,ror#22 // Sigma0(a)
630 eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
632 add w20,w20,w24 // d+=h
633 add w24,w24,w19 // h+=Maj(a,b,c)
634 ldr w19,[x30],#4 // *K++, w28 in next round
636 add w24,w24,w17 // h+=Sigma0(a)
641 add w23,w23,w19 // h+=K[i]
647 add w23,w23,w7 // h+=X[i]
648 eor w16,w16,w20,ror#11
649 eor w14,w14,w9,ror#18
650 orr w17,w17,w19 // Ch(e,f,g)
651 eor w19,w24,w25 // a^b, b^c in next round
652 eor w16,w16,w20,ror#25 // Sigma1(e)
653 eor w15,w15,w24,ror#13
654 add w23,w23,w17 // h+=Ch(e,f,g)
655 and w28,w28,w19 // (b^c)&=(a^b)
656 eor w13,w13,w6,ror#19
657 eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
658 add w23,w23,w16 // h+=Sigma1(e)
659 eor w28,w28,w25 // Maj(a,b,c)
660 eor w17,w15,w24,ror#22 // Sigma0(a)
661 eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
663 add w27,w27,w23 // d+=h
664 add w23,w23,w28 // h+=Maj(a,b,c)
665 ldr w28,[x30],#4 // *K++, w19 in next round
667 add w23,w23,w17 // h+=Sigma0(a)
672 add w22,w22,w28 // h+=K[i]
678 add w22,w22,w8 // h+=X[i]
679 eor w16,w16,w27,ror#11
680 eor w15,w15,w10,ror#18
681 orr w17,w17,w28 // Ch(e,f,g)
682 eor w28,w23,w24 // a^b, b^c in next round
683 eor w16,w16,w27,ror#25 // Sigma1(e)
685 add w22,w22,w17 // h+=Ch(e,f,g)
686 and w19,w19,w28 // (b^c)&=(a^b)
687 eor w14,w14,w7,ror#19
688 eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
689 add w22,w22,w16 // h+=Sigma1(e)
690 eor w19,w19,w24 // Maj(a,b,c)
691 eor w17,w0,w23,ror#22 // Sigma0(a)
692 eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
694 add w26,w26,w22 // d+=h
695 add w22,w22,w19 // h+=Maj(a,b,c)
696 ldr w19,[x30],#4 // *K++, w28 in next round
698 add w22,w22,w17 // h+=Sigma0(a)
703 add w21,w21,w19 // h+=K[i]
709 add w21,w21,w9 // h+=X[i]
710 eor w16,w16,w26,ror#11
712 orr w17,w17,w19 // Ch(e,f,g)
713 eor w19,w22,w23 // a^b, b^c in next round
714 eor w16,w16,w26,ror#25 // Sigma1(e)
716 add w21,w21,w17 // h+=Ch(e,f,g)
717 and w28,w28,w19 // (b^c)&=(a^b)
718 eor w15,w15,w8,ror#19
719 eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
720 add w21,w21,w16 // h+=Sigma1(e)
721 eor w28,w28,w23 // Maj(a,b,c)
722 eor w17,w1,w22,ror#22 // Sigma0(a)
723 eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
725 add w25,w25,w21 // d+=h
726 add w21,w21,w28 // h+=Maj(a,b,c)
727 ldr w28,[x30],#4 // *K++, w19 in next round
729 add w21,w21,w17 // h+=Sigma0(a)
734 add w20,w20,w28 // h+=K[i]
740 add w20,w20,w10 // h+=X[i]
741 eor w16,w16,w25,ror#11
743 orr w17,w17,w28 // Ch(e,f,g)
744 eor w28,w21,w22 // a^b, b^c in next round
745 eor w16,w16,w25,ror#25 // Sigma1(e)
747 add w20,w20,w17 // h+=Ch(e,f,g)
748 and w19,w19,w28 // (b^c)&=(a^b)
750 eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
751 add w20,w20,w16 // h+=Sigma1(e)
752 eor w19,w19,w22 // Maj(a,b,c)
753 eor w17,w2,w21,ror#22 // Sigma0(a)
754 eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
756 add w24,w24,w20 // d+=h
757 add w20,w20,w19 // h+=Maj(a,b,c)
758 ldr w19,[x30],#4 // *K++, w28 in next round
760 add w20,w20,w17 // h+=Sigma0(a)
765 add w27,w27,w19 // h+=K[i]
771 add w27,w27,w11 // h+=X[i]
772 eor w16,w16,w24,ror#11
774 orr w17,w17,w19 // Ch(e,f,g)
775 eor w19,w20,w21 // a^b, b^c in next round
776 eor w16,w16,w24,ror#25 // Sigma1(e)
778 add w27,w27,w17 // h+=Ch(e,f,g)
779 and w28,w28,w19 // (b^c)&=(a^b)
781 eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
782 add w27,w27,w16 // h+=Sigma1(e)
783 eor w28,w28,w21 // Maj(a,b,c)
784 eor w17,w3,w20,ror#22 // Sigma0(a)
785 eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
787 add w23,w23,w27 // d+=h
788 add w27,w27,w28 // h+=Maj(a,b,c)
789 ldr w28,[x30],#4 // *K++, w19 in next round
791 add w27,w27,w17 // h+=Sigma0(a)
796 add w26,w26,w28 // h+=K[i]
802 add w26,w26,w12 // h+=X[i]
803 eor w16,w16,w23,ror#11
805 orr w17,w17,w28 // Ch(e,f,g)
806 eor w28,w27,w20 // a^b, b^c in next round
807 eor w16,w16,w23,ror#25 // Sigma1(e)
809 add w26,w26,w17 // h+=Ch(e,f,g)
810 and w19,w19,w28 // (b^c)&=(a^b)
812 eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
813 add w26,w26,w16 // h+=Sigma1(e)
814 eor w19,w19,w20 // Maj(a,b,c)
815 eor w17,w4,w27,ror#22 // Sigma0(a)
816 eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
818 add w22,w22,w26 // d+=h
819 add w26,w26,w19 // h+=Maj(a,b,c)
820 ldr w19,[x30],#4 // *K++, w28 in next round
822 add w26,w26,w17 // h+=Sigma0(a)
827 add w25,w25,w19 // h+=K[i]
833 add w25,w25,w13 // h+=X[i]
834 eor w16,w16,w22,ror#11
836 orr w17,w17,w19 // Ch(e,f,g)
837 eor w19,w26,w27 // a^b, b^c in next round
838 eor w16,w16,w22,ror#25 // Sigma1(e)
840 add w25,w25,w17 // h+=Ch(e,f,g)
841 and w28,w28,w19 // (b^c)&=(a^b)
843 eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
844 add w25,w25,w16 // h+=Sigma1(e)
845 eor w28,w28,w27 // Maj(a,b,c)
846 eor w17,w5,w26,ror#22 // Sigma0(a)
847 eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
849 add w21,w21,w25 // d+=h
850 add w25,w25,w28 // h+=Maj(a,b,c)
851 ldr w28,[x30],#4 // *K++, w19 in next round
853 add w25,w25,w17 // h+=Sigma0(a)
858 add w24,w24,w28 // h+=K[i]
864 add w24,w24,w14 // h+=X[i]
865 eor w16,w16,w21,ror#11
867 orr w17,w17,w28 // Ch(e,f,g)
868 eor w28,w25,w26 // a^b, b^c in next round
869 eor w16,w16,w21,ror#25 // Sigma1(e)
871 add w24,w24,w17 // h+=Ch(e,f,g)
872 and w19,w19,w28 // (b^c)&=(a^b)
874 eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
875 add w24,w24,w16 // h+=Sigma1(e)
876 eor w19,w19,w26 // Maj(a,b,c)
877 eor w17,w6,w25,ror#22 // Sigma0(a)
878 eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
880 add w20,w20,w24 // d+=h
881 add w24,w24,w19 // h+=Maj(a,b,c)
882 ldr w19,[x30],#4 // *K++, w28 in next round
884 add w24,w24,w17 // h+=Sigma0(a)
889 add w23,w23,w19 // h+=K[i]
895 add w23,w23,w15 // h+=X[i]
896 eor w16,w16,w20,ror#11
898 orr w17,w17,w19 // Ch(e,f,g)
899 eor w19,w24,w25 // a^b, b^c in next round
900 eor w16,w16,w20,ror#25 // Sigma1(e)
902 add w23,w23,w17 // h+=Ch(e,f,g)
903 and w28,w28,w19 // (b^c)&=(a^b)
905 eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
906 add w23,w23,w16 // h+=Sigma1(e)
907 eor w28,w28,w25 // Maj(a,b,c)
908 eor w17,w7,w24,ror#22 // Sigma0(a)
909 eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
911 add w27,w27,w23 // d+=h
912 add w23,w23,w28 // h+=Maj(a,b,c)
913 ldr w28,[x30],#4 // *K++, w19 in next round
915 add w23,w23,w17 // h+=Sigma0(a)
920 add w22,w22,w28 // h+=K[i]
926 add w22,w22,w0 // h+=X[i]
927 eor w16,w16,w27,ror#11
929 orr w17,w17,w28 // Ch(e,f,g)
930 eor w28,w23,w24 // a^b, b^c in next round
931 eor w16,w16,w27,ror#25 // Sigma1(e)
933 add w22,w22,w17 // h+=Ch(e,f,g)
934 and w19,w19,w28 // (b^c)&=(a^b)
936 eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
937 add w22,w22,w16 // h+=Sigma1(e)
938 eor w19,w19,w24 // Maj(a,b,c)
939 eor w17,w8,w23,ror#22 // Sigma0(a)
940 eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
942 add w26,w26,w22 // d+=h
943 add w22,w22,w19 // h+=Maj(a,b,c)
944 ldr w19,[x30],#4 // *K++, w28 in next round
946 add w22,w22,w17 // h+=Sigma0(a)
951 add w21,w21,w19 // h+=K[i]
957 add w21,w21,w1 // h+=X[i]
958 eor w16,w16,w26,ror#11
960 orr w17,w17,w19 // Ch(e,f,g)
961 eor w19,w22,w23 // a^b, b^c in next round
962 eor w16,w16,w26,ror#25 // Sigma1(e)
964 add w21,w21,w17 // h+=Ch(e,f,g)
965 and w28,w28,w19 // (b^c)&=(a^b)
967 eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
968 add w21,w21,w16 // h+=Sigma1(e)
969 eor w28,w28,w23 // Maj(a,b,c)
970 eor w17,w9,w22,ror#22 // Sigma0(a)
971 eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
973 add w25,w25,w21 // d+=h
974 add w21,w21,w28 // h+=Maj(a,b,c)
975 ldr w28,[x30],#4 // *K++, w19 in next round
977 add w21,w21,w17 // h+=Sigma0(a)
982 add w20,w20,w28 // h+=K[i]
988 add w20,w20,w2 // h+=X[i]
989 eor w16,w16,w25,ror#11
991 orr w17,w17,w28 // Ch(e,f,g)
992 eor w28,w21,w22 // a^b, b^c in next round
993 eor w16,w16,w25,ror#25 // Sigma1(e)
994 eor w10,w10,w21,ror#13
995 add w20,w20,w17 // h+=Ch(e,f,g)
996 and w19,w19,w28 // (b^c)&=(a^b)
998 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
999 add w20,w20,w16 // h+=Sigma1(e)
1000 eor w19,w19,w22 // Maj(a,b,c)
1001 eor w17,w10,w21,ror#22 // Sigma0(a)
1002 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
1004 add w24,w24,w20 // d+=h
1005 add w20,w20,w19 // h+=Maj(a,b,c)
1006 ldr w19,[x30],#4 // *K++, w28 in next round
1008 add w20,w20,w17 // h+=Sigma0(a)
1010 cbnz w19,.Loop_16_xx
1014 sub x30,x30,#260 // rewind
1018 add x1,x1,#14*4 // advance input pointer
1021 ldp w9,w10,[x0,#6*4]
1028 stp w22,w23,[x0,#2*4]
1032 stp w24,w25,[x0,#4*4]
1033 stp w26,w27,[x0,#6*4]
1036 ldp x19,x20,[x29,#16]
1038 ldp x21,x22,[x29,#32]
1039 ldp x23,x24,[x29,#48]
1040 ldp x25,x26,[x29,#64]
1041 ldp x27,x28,[x29,#80]
1042 ldp x29,x30,[sp],#128
1043 .inst 0xd50323bf // autiasp
1045 .size sha256_block_data_order,.-sha256_block_data_order
1048 .type .LK256,%object
1050 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1051 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1052 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1053 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1054 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1055 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1056 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1057 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1058 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1059 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1060 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1061 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1062 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1063 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1064 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1065 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1066 .long 0 //terminator
1067 .size .LK256,.-.LK256
1072 .long OPENSSL_armcap_P-.
1074 .quad OPENSSL_armcap_P-.
1077 .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
1081 .type sha256_block_armv8,%function
1085 stp x29,x30,[sp,#-16]!
1088 ld1 {v0.4s,v1.4s},[x0]
1092 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1094 ld1 {v16.4s},[x3],#16
1099 orr v18.16b,v0.16b,v0.16b // offload
1100 orr v19.16b,v1.16b,v1.16b
1101 ld1 {v17.4s},[x3],#16
1102 add v16.4s,v16.4s,v4.4s
1103 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.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 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1108 ld1 {v16.4s},[x3],#16
1109 add v17.4s,v17.4s,v5.4s
1110 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.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 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1115 ld1 {v17.4s},[x3],#16
1116 add v16.4s,v16.4s,v6.4s
1117 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.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 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1122 ld1 {v16.4s},[x3],#16
1123 add v17.4s,v17.4s,v7.4s
1124 .inst 0x5e282887 //sha256su0 v7.16b,v4.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 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1129 ld1 {v17.4s},[x3],#16
1130 add v16.4s,v16.4s,v4.4s
1131 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.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 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1136 ld1 {v16.4s},[x3],#16
1137 add v17.4s,v17.4s,v5.4s
1138 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.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 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1143 ld1 {v17.4s},[x3],#16
1144 add v16.4s,v16.4s,v6.4s
1145 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.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 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1150 ld1 {v16.4s},[x3],#16
1151 add v17.4s,v17.4s,v7.4s
1152 .inst 0x5e282887 //sha256su0 v7.16b,v4.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 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1157 ld1 {v17.4s},[x3],#16
1158 add v16.4s,v16.4s,v4.4s
1159 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.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 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1164 ld1 {v16.4s},[x3],#16
1165 add v17.4s,v17.4s,v5.4s
1166 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.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 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1171 ld1 {v17.4s},[x3],#16
1172 add v16.4s,v16.4s,v6.4s
1173 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1174 orr v2.16b,v0.16b,v0.16b
1175 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1176 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1177 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1178 ld1 {v16.4s},[x3],#16
1179 add v17.4s,v17.4s,v7.4s
1180 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1181 orr v2.16b,v0.16b,v0.16b
1182 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1183 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1184 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1185 ld1 {v17.4s},[x3],#16
1186 add v16.4s,v16.4s,v4.4s
1187 orr v2.16b,v0.16b,v0.16b
1188 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1189 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1191 ld1 {v16.4s},[x3],#16
1192 add v17.4s,v17.4s,v5.4s
1193 orr v2.16b,v0.16b,v0.16b
1194 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1195 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1198 add v16.4s,v16.4s,v6.4s
1199 sub x3,x3,#64*4-16 // rewind
1200 orr v2.16b,v0.16b,v0.16b
1201 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1202 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1204 add v17.4s,v17.4s,v7.4s
1205 orr v2.16b,v0.16b,v0.16b
1206 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1207 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1209 add v0.4s,v0.4s,v18.4s
1210 add v1.4s,v1.4s,v19.4s
1214 st1 {v0.4s,v1.4s},[x0]
1218 .size sha256_block_armv8,.-sha256_block_armv8
1221 .globl sha256_block_neon
1223 .type sha256_block_neon,%function
1227 stp x29, x30, [sp, #-16]!
1232 add x2,x1,x2,lsl#6 // len to point at the end of inp
1234 ld1 {v0.16b},[x1], #16
1235 ld1 {v1.16b},[x1], #16
1236 ld1 {v2.16b},[x1], #16
1237 ld1 {v3.16b},[x1], #16
1238 ld1 {v4.4s},[x16], #16
1239 ld1 {v5.4s},[x16], #16
1240 ld1 {v6.4s},[x16], #16
1241 ld1 {v7.4s},[x16], #16
1242 rev32 v0.16b,v0.16b // yes, even on
1243 rev32 v1.16b,v1.16b // big-endian
1247 add v4.4s,v4.4s,v0.4s
1248 add v5.4s,v5.4s,v1.4s
1249 add v6.4s,v6.4s,v2.4s
1250 st1 {v4.4s,v5.4s},[x17], #32
1251 add v7.4s,v7.4s,v3.4s
1252 st1 {v6.4s,v7.4s},[x17]
1267 ext v4.16b,v0.16b,v1.16b,#4
1272 ext v7.16b,v2.16b,v3.16b,#4
1277 eor w11,w11,w7,ror#19
1279 eor w15,w3,w3,ror#11
1282 add v0.4s,v0.4s,v7.4s
1286 eor w15,w15,w3,ror#20
1287 ushr v7.4s,v4.4s,#18
1291 eor v5.16b,v5.16b,v6.16b
1296 ushr v16.4s,v19.4s,#17
1300 eor v5.16b,v5.16b,v7.16b
1303 sli v16.4s,v19.4s,#15
1306 ushr v17.4s,v19.4s,#10
1307 eor w11,w11,w6,ror#19
1308 eor w15,w10,w10,ror#11
1309 ushr v7.4s,v19.4s,#19
1312 add v0.4s,v0.4s,v5.4s
1314 eor w15,w15,w10,ror#20
1315 sli v7.4s,v19.4s,#13
1319 eor v17.16b,v17.16b,v16.16b
1323 eor v17.16b,v17.16b,v7.16b
1327 add v0.4s,v0.4s,v17.4s
1331 ushr v18.4s,v0.4s,#17
1333 ushr v19.4s,v0.4s,#10
1334 eor w11,w11,w5,ror#19
1335 eor w15,w9,w9,ror#11
1336 sli v18.4s,v0.4s,#15
1338 ushr v17.4s,v0.4s,#19
1341 eor v19.16b,v19.16b,v18.16b
1342 eor w15,w15,w9,ror#20
1344 sli v17.4s,v0.4s,#13
1348 ld1 {v4.4s},[x16], #16
1350 eor v19.16b,v19.16b,v17.16b
1352 eor v17.16b,v17.16b,v17.16b
1356 mov v17.d[1],v19.d[0]
1360 add v0.4s,v0.4s,v17.4s
1362 eor w11,w11,w4,ror#19
1363 eor w15,w8,w8,ror#11
1364 add v4.4s,v4.4s,v0.4s
1368 eor w15,w15,w8,ror#20
1375 st1 {v4.4s},[x17], #16
1376 ext v4.16b,v1.16b,v2.16b,#4
1381 ext v7.16b,v3.16b,v0.16b,#4
1386 eor w11,w11,w3,ror#19
1388 eor w15,w7,w7,ror#11
1391 add v1.4s,v1.4s,v7.4s
1395 eor w15,w15,w7,ror#20
1396 ushr v7.4s,v4.4s,#18
1400 eor v5.16b,v5.16b,v6.16b
1405 ushr v16.4s,v19.4s,#17
1409 eor v5.16b,v5.16b,v7.16b
1411 eor w11,w10,w10,ror#5
1412 sli v16.4s,v19.4s,#15
1415 ushr v17.4s,v19.4s,#10
1416 eor w11,w11,w10,ror#19
1417 eor w15,w6,w6,ror#11
1418 ushr v7.4s,v19.4s,#19
1421 add v1.4s,v1.4s,v5.4s
1423 eor w15,w15,w6,ror#20
1424 sli v7.4s,v19.4s,#13
1428 eor v17.16b,v17.16b,v16.16b
1432 eor v17.16b,v17.16b,v7.16b
1436 add v1.4s,v1.4s,v17.4s
1440 ushr v18.4s,v1.4s,#17
1442 ushr v19.4s,v1.4s,#10
1443 eor w11,w11,w9,ror#19
1444 eor w15,w5,w5,ror#11
1445 sli v18.4s,v1.4s,#15
1447 ushr v17.4s,v1.4s,#19
1450 eor v19.16b,v19.16b,v18.16b
1451 eor w15,w15,w5,ror#20
1453 sli v17.4s,v1.4s,#13
1457 ld1 {v4.4s},[x16], #16
1459 eor v19.16b,v19.16b,v17.16b
1461 eor v17.16b,v17.16b,v17.16b
1465 mov v17.d[1],v19.d[0]
1469 add v1.4s,v1.4s,v17.4s
1471 eor w11,w11,w8,ror#19
1472 eor w15,w4,w4,ror#11
1473 add v4.4s,v4.4s,v1.4s
1477 eor w15,w15,w4,ror#20
1484 st1 {v4.4s},[x17], #16
1485 ext v4.16b,v2.16b,v3.16b,#4
1490 ext v7.16b,v0.16b,v1.16b,#4
1495 eor w11,w11,w7,ror#19
1497 eor w15,w3,w3,ror#11
1500 add v2.4s,v2.4s,v7.4s
1504 eor w15,w15,w3,ror#20
1505 ushr v7.4s,v4.4s,#18
1509 eor v5.16b,v5.16b,v6.16b
1514 ushr v16.4s,v19.4s,#17
1518 eor v5.16b,v5.16b,v7.16b
1521 sli v16.4s,v19.4s,#15
1524 ushr v17.4s,v19.4s,#10
1525 eor w11,w11,w6,ror#19
1526 eor w15,w10,w10,ror#11
1527 ushr v7.4s,v19.4s,#19
1530 add v2.4s,v2.4s,v5.4s
1532 eor w15,w15,w10,ror#20
1533 sli v7.4s,v19.4s,#13
1537 eor v17.16b,v17.16b,v16.16b
1541 eor v17.16b,v17.16b,v7.16b
1545 add v2.4s,v2.4s,v17.4s
1549 ushr v18.4s,v2.4s,#17
1551 ushr v19.4s,v2.4s,#10
1552 eor w11,w11,w5,ror#19
1553 eor w15,w9,w9,ror#11
1554 sli v18.4s,v2.4s,#15
1556 ushr v17.4s,v2.4s,#19
1559 eor v19.16b,v19.16b,v18.16b
1560 eor w15,w15,w9,ror#20
1562 sli v17.4s,v2.4s,#13
1566 ld1 {v4.4s},[x16], #16
1568 eor v19.16b,v19.16b,v17.16b
1570 eor v17.16b,v17.16b,v17.16b
1574 mov v17.d[1],v19.d[0]
1578 add v2.4s,v2.4s,v17.4s
1580 eor w11,w11,w4,ror#19
1581 eor w15,w8,w8,ror#11
1582 add v4.4s,v4.4s,v2.4s
1586 eor w15,w15,w8,ror#20
1593 st1 {v4.4s},[x17], #16
1594 ext v4.16b,v3.16b,v0.16b,#4
1599 ext v7.16b,v1.16b,v2.16b,#4
1604 eor w11,w11,w3,ror#19
1606 eor w15,w7,w7,ror#11
1609 add v3.4s,v3.4s,v7.4s
1613 eor w15,w15,w7,ror#20
1614 ushr v7.4s,v4.4s,#18
1618 eor v5.16b,v5.16b,v6.16b
1623 ushr v16.4s,v19.4s,#17
1627 eor v5.16b,v5.16b,v7.16b
1629 eor w11,w10,w10,ror#5
1630 sli v16.4s,v19.4s,#15
1633 ushr v17.4s,v19.4s,#10
1634 eor w11,w11,w10,ror#19
1635 eor w15,w6,w6,ror#11
1636 ushr v7.4s,v19.4s,#19
1639 add v3.4s,v3.4s,v5.4s
1641 eor w15,w15,w6,ror#20
1642 sli v7.4s,v19.4s,#13
1646 eor v17.16b,v17.16b,v16.16b
1650 eor v17.16b,v17.16b,v7.16b
1654 add v3.4s,v3.4s,v17.4s
1658 ushr v18.4s,v3.4s,#17
1660 ushr v19.4s,v3.4s,#10
1661 eor w11,w11,w9,ror#19
1662 eor w15,w5,w5,ror#11
1663 sli v18.4s,v3.4s,#15
1665 ushr v17.4s,v3.4s,#19
1668 eor v19.16b,v19.16b,v18.16b
1669 eor w15,w15,w5,ror#20
1671 sli v17.4s,v3.4s,#13
1675 ld1 {v4.4s},[x16], #16
1677 eor v19.16b,v19.16b,v17.16b
1679 eor v17.16b,v17.16b,v17.16b
1683 mov v17.d[1],v19.d[0]
1687 add v3.4s,v3.4s,v17.4s
1689 eor w11,w11,w8,ror#19
1690 eor w15,w4,w4,ror#11
1691 add v4.4s,v4.4s,v3.4s
1695 eor w15,w15,w4,ror#20
1702 st1 {v4.4s},[x17], #16
1703 cmp w12,#0 // check for K256 terminator
1708 sub x16,x16,#256 // rewind x16
1711 csel x17, x17, xzr, eq
1712 sub x1,x1,x17 // avoid SEGV
1717 ld1 {v0.16b},[x1],#16
1720 ld1 {v4.4s},[x16],#16
1723 eor w11,w11,w7,ror#19
1724 eor w15,w3,w3,ror#11
1729 eor w15,w15,w3,ror#20
1730 add v4.4s,v4.4s,v0.4s
1744 eor w11,w11,w6,ror#19
1745 eor w15,w10,w10,ror#11
1749 eor w15,w15,w10,ror#20
1763 eor w11,w11,w5,ror#19
1764 eor w15,w9,w9,ror#11
1768 eor w15,w15,w9,ror#20
1782 eor w11,w11,w4,ror#19
1783 eor w15,w8,w8,ror#11
1787 eor w15,w15,w8,ror#20
1794 st1 {v4.4s},[x17], #16
1798 ld1 {v1.16b},[x1],#16
1801 ld1 {v4.4s},[x16],#16
1804 eor w11,w11,w3,ror#19
1805 eor w15,w7,w7,ror#11
1810 eor w15,w15,w7,ror#20
1811 add v4.4s,v4.4s,v1.4s
1822 eor w11,w10,w10,ror#5
1825 eor w11,w11,w10,ror#19
1826 eor w15,w6,w6,ror#11
1830 eor w15,w15,w6,ror#20
1844 eor w11,w11,w9,ror#19
1845 eor w15,w5,w5,ror#11
1849 eor w15,w15,w5,ror#20
1863 eor w11,w11,w8,ror#19
1864 eor w15,w4,w4,ror#11
1868 eor w15,w15,w4,ror#20
1875 st1 {v4.4s},[x17], #16
1879 ld1 {v2.16b},[x1],#16
1882 ld1 {v4.4s},[x16],#16
1885 eor w11,w11,w7,ror#19
1886 eor w15,w3,w3,ror#11
1891 eor w15,w15,w3,ror#20
1892 add v4.4s,v4.4s,v2.4s
1906 eor w11,w11,w6,ror#19
1907 eor w15,w10,w10,ror#11
1911 eor w15,w15,w10,ror#20
1925 eor w11,w11,w5,ror#19
1926 eor w15,w9,w9,ror#11
1930 eor w15,w15,w9,ror#20
1944 eor w11,w11,w4,ror#19
1945 eor w15,w8,w8,ror#11
1949 eor w15,w15,w8,ror#20
1956 st1 {v4.4s},[x17], #16
1960 ld1 {v3.16b},[x1],#16
1963 ld1 {v4.4s},[x16],#16
1966 eor w11,w11,w3,ror#19
1967 eor w15,w7,w7,ror#11
1972 eor w15,w15,w7,ror#20
1973 add v4.4s,v4.4s,v3.4s
1984 eor w11,w10,w10,ror#5
1987 eor w11,w11,w10,ror#19
1988 eor w15,w6,w6,ror#11
1992 eor w15,w15,w6,ror#20
2006 eor w11,w11,w9,ror#19
2007 eor w15,w5,w5,ror#11
2011 eor w15,w15,w5,ror#20
2025 eor w11,w11,w8,ror#19
2026 eor w15,w4,w4,ror#11
2030 eor w15,w15,w4,ror#20
2036 st1 {v4.4s},[x17], #16
2037 add w3,w3,w15 // h+=Sigma0(a) from the past
2039 add w3,w3,w13 // h+=Maj(a,b,c) from the past
2041 add w3,w3,w11 // accumulate
2043 ldp w11,w12,[x0,#16]
2046 ldp w13,w14,[x0,#24]
2065 .size sha256_block_neon,.-sha256_block_neon