2 /* Do not modify. This file is auto-generated from sha512-armv8.pl. */
3 // Copyright 2014-2018 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 .globl sha256_block_data_order
65 .type sha256_block_data_order,%function
67 sha256_block_data_order:
70 ldrsw x16,.LOPENSSL_armcap_P
72 ldr x16,.LOPENSSL_armcap_P
74 adr x17,.LOPENSSL_armcap_P
82 stp x29,x30,[sp,#-128]!
92 ldp w20,w21,[x0] // load context
95 add x2,x1,x2,lsl#6 // end of input
102 ldr w19,[x30],#4 // *K++
103 eor w28,w21,w22 // magic seed
105 #ifndef __AARCH64EB__
109 add w27,w27,w19 // h+=K[i]
110 eor w6,w24,w24,ror#14
113 add w27,w27,w3 // h+=X[i]
114 orr w17,w17,w19 // Ch(e,f,g)
115 eor w19,w20,w21 // a^b, b^c in next round
116 eor w16,w16,w6,ror#11 // Sigma1(e)
118 add w27,w27,w17 // h+=Ch(e,f,g)
119 eor w17,w20,w20,ror#9
120 add w27,w27,w16 // h+=Sigma1(e)
121 and w28,w28,w19 // (b^c)&=(a^b)
122 add w23,w23,w27 // d+=h
123 eor w28,w28,w21 // Maj(a,b,c)
124 eor w17,w6,w17,ror#13 // Sigma0(a)
125 add w27,w27,w28 // h+=Maj(a,b,c)
126 ldr w28,[x30],#4 // *K++, w19 in next round
127 //add w27,w27,w17 // h+=Sigma0(a)
128 #ifndef __AARCH64EB__
132 add w27,w27,w17 // h+=Sigma0(a)
134 add w26,w26,w28 // h+=K[i]
135 eor w7,w23,w23,ror#14
138 add w26,w26,w4 // h+=X[i]
139 orr w17,w17,w28 // Ch(e,f,g)
140 eor w28,w27,w20 // a^b, b^c in next round
141 eor w16,w16,w7,ror#11 // Sigma1(e)
143 add w26,w26,w17 // h+=Ch(e,f,g)
144 eor w17,w27,w27,ror#9
145 add w26,w26,w16 // h+=Sigma1(e)
146 and w19,w19,w28 // (b^c)&=(a^b)
147 add w22,w22,w26 // d+=h
148 eor w19,w19,w20 // Maj(a,b,c)
149 eor w17,w7,w17,ror#13 // Sigma0(a)
150 add w26,w26,w19 // h+=Maj(a,b,c)
151 ldr w19,[x30],#4 // *K++, w28 in next round
152 //add w26,w26,w17 // h+=Sigma0(a)
153 #ifndef __AARCH64EB__
156 add w26,w26,w17 // h+=Sigma0(a)
158 add w25,w25,w19 // h+=K[i]
159 eor w8,w22,w22,ror#14
162 add w25,w25,w5 // h+=X[i]
163 orr w17,w17,w19 // Ch(e,f,g)
164 eor w19,w26,w27 // a^b, b^c in next round
165 eor w16,w16,w8,ror#11 // Sigma1(e)
167 add w25,w25,w17 // h+=Ch(e,f,g)
168 eor w17,w26,w26,ror#9
169 add w25,w25,w16 // h+=Sigma1(e)
170 and w28,w28,w19 // (b^c)&=(a^b)
171 add w21,w21,w25 // d+=h
172 eor w28,w28,w27 // Maj(a,b,c)
173 eor w17,w8,w17,ror#13 // Sigma0(a)
174 add w25,w25,w28 // h+=Maj(a,b,c)
175 ldr w28,[x30],#4 // *K++, w19 in next round
176 //add w25,w25,w17 // h+=Sigma0(a)
177 #ifndef __AARCH64EB__
181 add w25,w25,w17 // h+=Sigma0(a)
183 add w24,w24,w28 // h+=K[i]
184 eor w9,w21,w21,ror#14
187 add w24,w24,w6 // h+=X[i]
188 orr w17,w17,w28 // Ch(e,f,g)
189 eor w28,w25,w26 // a^b, b^c in next round
190 eor w16,w16,w9,ror#11 // Sigma1(e)
192 add w24,w24,w17 // h+=Ch(e,f,g)
193 eor w17,w25,w25,ror#9
194 add w24,w24,w16 // h+=Sigma1(e)
195 and w19,w19,w28 // (b^c)&=(a^b)
196 add w20,w20,w24 // d+=h
197 eor w19,w19,w26 // Maj(a,b,c)
198 eor w17,w9,w17,ror#13 // Sigma0(a)
199 add w24,w24,w19 // h+=Maj(a,b,c)
200 ldr w19,[x30],#4 // *K++, w28 in next round
201 //add w24,w24,w17 // h+=Sigma0(a)
202 #ifndef __AARCH64EB__
205 add w24,w24,w17 // h+=Sigma0(a)
207 add w23,w23,w19 // h+=K[i]
208 eor w10,w20,w20,ror#14
211 add w23,w23,w7 // h+=X[i]
212 orr w17,w17,w19 // Ch(e,f,g)
213 eor w19,w24,w25 // a^b, b^c in next round
214 eor w16,w16,w10,ror#11 // Sigma1(e)
216 add w23,w23,w17 // h+=Ch(e,f,g)
217 eor w17,w24,w24,ror#9
218 add w23,w23,w16 // h+=Sigma1(e)
219 and w28,w28,w19 // (b^c)&=(a^b)
220 add w27,w27,w23 // d+=h
221 eor w28,w28,w25 // Maj(a,b,c)
222 eor w17,w10,w17,ror#13 // Sigma0(a)
223 add w23,w23,w28 // h+=Maj(a,b,c)
224 ldr w28,[x30],#4 // *K++, w19 in next round
225 //add w23,w23,w17 // h+=Sigma0(a)
226 #ifndef __AARCH64EB__
230 add w23,w23,w17 // h+=Sigma0(a)
232 add w22,w22,w28 // h+=K[i]
233 eor w11,w27,w27,ror#14
236 add w22,w22,w8 // h+=X[i]
237 orr w17,w17,w28 // Ch(e,f,g)
238 eor w28,w23,w24 // a^b, b^c in next round
239 eor w16,w16,w11,ror#11 // Sigma1(e)
241 add w22,w22,w17 // h+=Ch(e,f,g)
242 eor w17,w23,w23,ror#9
243 add w22,w22,w16 // h+=Sigma1(e)
244 and w19,w19,w28 // (b^c)&=(a^b)
245 add w26,w26,w22 // d+=h
246 eor w19,w19,w24 // Maj(a,b,c)
247 eor w17,w11,w17,ror#13 // Sigma0(a)
248 add w22,w22,w19 // h+=Maj(a,b,c)
249 ldr w19,[x30],#4 // *K++, w28 in next round
250 //add w22,w22,w17 // h+=Sigma0(a)
251 #ifndef __AARCH64EB__
254 add w22,w22,w17 // h+=Sigma0(a)
256 add w21,w21,w19 // h+=K[i]
257 eor w12,w26,w26,ror#14
260 add w21,w21,w9 // h+=X[i]
261 orr w17,w17,w19 // Ch(e,f,g)
262 eor w19,w22,w23 // a^b, b^c in next round
263 eor w16,w16,w12,ror#11 // Sigma1(e)
265 add w21,w21,w17 // h+=Ch(e,f,g)
266 eor w17,w22,w22,ror#9
267 add w21,w21,w16 // h+=Sigma1(e)
268 and w28,w28,w19 // (b^c)&=(a^b)
269 add w25,w25,w21 // d+=h
270 eor w28,w28,w23 // Maj(a,b,c)
271 eor w17,w12,w17,ror#13 // Sigma0(a)
272 add w21,w21,w28 // h+=Maj(a,b,c)
273 ldr w28,[x30],#4 // *K++, w19 in next round
274 //add w21,w21,w17 // h+=Sigma0(a)
275 #ifndef __AARCH64EB__
278 ldp w11,w12,[x1],#2*4
279 add w21,w21,w17 // h+=Sigma0(a)
281 add w20,w20,w28 // h+=K[i]
282 eor w13,w25,w25,ror#14
285 add w20,w20,w10 // h+=X[i]
286 orr w17,w17,w28 // Ch(e,f,g)
287 eor w28,w21,w22 // a^b, b^c in next round
288 eor w16,w16,w13,ror#11 // Sigma1(e)
290 add w20,w20,w17 // h+=Ch(e,f,g)
291 eor w17,w21,w21,ror#9
292 add w20,w20,w16 // h+=Sigma1(e)
293 and w19,w19,w28 // (b^c)&=(a^b)
294 add w24,w24,w20 // d+=h
295 eor w19,w19,w22 // Maj(a,b,c)
296 eor w17,w13,w17,ror#13 // Sigma0(a)
297 add w20,w20,w19 // h+=Maj(a,b,c)
298 ldr w19,[x30],#4 // *K++, w28 in next round
299 //add w20,w20,w17 // h+=Sigma0(a)
300 #ifndef __AARCH64EB__
303 add w20,w20,w17 // h+=Sigma0(a)
305 add w27,w27,w19 // h+=K[i]
306 eor w14,w24,w24,ror#14
309 add w27,w27,w11 // h+=X[i]
310 orr w17,w17,w19 // Ch(e,f,g)
311 eor w19,w20,w21 // a^b, b^c in next round
312 eor w16,w16,w14,ror#11 // Sigma1(e)
314 add w27,w27,w17 // h+=Ch(e,f,g)
315 eor w17,w20,w20,ror#9
316 add w27,w27,w16 // h+=Sigma1(e)
317 and w28,w28,w19 // (b^c)&=(a^b)
318 add w23,w23,w27 // d+=h
319 eor w28,w28,w21 // Maj(a,b,c)
320 eor w17,w14,w17,ror#13 // Sigma0(a)
321 add w27,w27,w28 // h+=Maj(a,b,c)
322 ldr w28,[x30],#4 // *K++, w19 in next round
323 //add w27,w27,w17 // h+=Sigma0(a)
324 #ifndef __AARCH64EB__
327 ldp w13,w14,[x1],#2*4
328 add w27,w27,w17 // h+=Sigma0(a)
330 add w26,w26,w28 // h+=K[i]
331 eor w15,w23,w23,ror#14
334 add w26,w26,w12 // h+=X[i]
335 orr w17,w17,w28 // Ch(e,f,g)
336 eor w28,w27,w20 // a^b, b^c in next round
337 eor w16,w16,w15,ror#11 // Sigma1(e)
339 add w26,w26,w17 // h+=Ch(e,f,g)
340 eor w17,w27,w27,ror#9
341 add w26,w26,w16 // h+=Sigma1(e)
342 and w19,w19,w28 // (b^c)&=(a^b)
343 add w22,w22,w26 // d+=h
344 eor w19,w19,w20 // Maj(a,b,c)
345 eor w17,w15,w17,ror#13 // Sigma0(a)
346 add w26,w26,w19 // h+=Maj(a,b,c)
347 ldr w19,[x30],#4 // *K++, w28 in next round
348 //add w26,w26,w17 // h+=Sigma0(a)
349 #ifndef __AARCH64EB__
352 add w26,w26,w17 // h+=Sigma0(a)
354 add w25,w25,w19 // h+=K[i]
355 eor w0,w22,w22,ror#14
358 add w25,w25,w13 // h+=X[i]
359 orr w17,w17,w19 // Ch(e,f,g)
360 eor w19,w26,w27 // a^b, b^c in next round
361 eor w16,w16,w0,ror#11 // Sigma1(e)
363 add w25,w25,w17 // h+=Ch(e,f,g)
364 eor w17,w26,w26,ror#9
365 add w25,w25,w16 // h+=Sigma1(e)
366 and w28,w28,w19 // (b^c)&=(a^b)
367 add w21,w21,w25 // d+=h
368 eor w28,w28,w27 // Maj(a,b,c)
369 eor w17,w0,w17,ror#13 // Sigma0(a)
370 add w25,w25,w28 // h+=Maj(a,b,c)
371 ldr w28,[x30],#4 // *K++, w19 in next round
372 //add w25,w25,w17 // h+=Sigma0(a)
373 #ifndef __AARCH64EB__
377 add w25,w25,w17 // h+=Sigma0(a)
380 add w24,w24,w28 // h+=K[i]
381 eor w6,w21,w21,ror#14
384 add w24,w24,w14 // h+=X[i]
385 orr w17,w17,w28 // Ch(e,f,g)
386 eor w28,w25,w26 // a^b, b^c in next round
387 eor w16,w16,w6,ror#11 // Sigma1(e)
389 add w24,w24,w17 // h+=Ch(e,f,g)
390 eor w17,w25,w25,ror#9
391 add w24,w24,w16 // h+=Sigma1(e)
392 and w19,w19,w28 // (b^c)&=(a^b)
393 add w20,w20,w24 // d+=h
394 eor w19,w19,w26 // Maj(a,b,c)
395 eor w17,w6,w17,ror#13 // Sigma0(a)
396 add w24,w24,w19 // h+=Maj(a,b,c)
397 ldr w19,[x30],#4 // *K++, w28 in next round
398 //add w24,w24,w17 // h+=Sigma0(a)
399 #ifndef __AARCH64EB__
402 add w24,w24,w17 // h+=Sigma0(a)
405 add w23,w23,w19 // h+=K[i]
406 eor w7,w20,w20,ror#14
409 add w23,w23,w15 // h+=X[i]
410 orr w17,w17,w19 // Ch(e,f,g)
411 eor w19,w24,w25 // a^b, b^c in next round
412 eor w16,w16,w7,ror#11 // Sigma1(e)
414 add w23,w23,w17 // h+=Ch(e,f,g)
415 eor w17,w24,w24,ror#9
416 add w23,w23,w16 // h+=Sigma1(e)
417 and w28,w28,w19 // (b^c)&=(a^b)
418 add w27,w27,w23 // d+=h
419 eor w28,w28,w25 // Maj(a,b,c)
420 eor w17,w7,w17,ror#13 // Sigma0(a)
421 add w23,w23,w28 // h+=Maj(a,b,c)
422 ldr w28,[x30],#4 // *K++, w19 in next round
423 //add w23,w23,w17 // h+=Sigma0(a)
424 #ifndef __AARCH64EB__
428 add w23,w23,w17 // h+=Sigma0(a)
431 add w22,w22,w28 // h+=K[i]
432 eor w8,w27,w27,ror#14
435 add w22,w22,w0 // h+=X[i]
436 orr w17,w17,w28 // Ch(e,f,g)
437 eor w28,w23,w24 // a^b, b^c in next round
438 eor w16,w16,w8,ror#11 // Sigma1(e)
440 add w22,w22,w17 // h+=Ch(e,f,g)
441 eor w17,w23,w23,ror#9
442 add w22,w22,w16 // h+=Sigma1(e)
443 and w19,w19,w28 // (b^c)&=(a^b)
444 add w26,w26,w22 // d+=h
445 eor w19,w19,w24 // Maj(a,b,c)
446 eor w17,w8,w17,ror#13 // Sigma0(a)
447 add w22,w22,w19 // h+=Maj(a,b,c)
448 ldr w19,[x30],#4 // *K++, w28 in next round
449 //add w22,w22,w17 // h+=Sigma0(a)
450 #ifndef __AARCH64EB__
454 add w22,w22,w17 // h+=Sigma0(a)
457 add w21,w21,w19 // h+=K[i]
458 eor w9,w26,w26,ror#14
461 add w21,w21,w1 // h+=X[i]
462 orr w17,w17,w19 // Ch(e,f,g)
463 eor w19,w22,w23 // a^b, b^c in next round
464 eor w16,w16,w9,ror#11 // Sigma1(e)
466 add w21,w21,w17 // h+=Ch(e,f,g)
467 eor w17,w22,w22,ror#9
468 add w21,w21,w16 // h+=Sigma1(e)
469 and w28,w28,w19 // (b^c)&=(a^b)
470 add w25,w25,w21 // d+=h
471 eor w28,w28,w23 // Maj(a,b,c)
472 eor w17,w9,w17,ror#13 // Sigma0(a)
473 add w21,w21,w28 // h+=Maj(a,b,c)
474 ldr w28,[x30],#4 // *K++, w19 in next round
475 //add w21,w21,w17 // h+=Sigma0(a)
476 #ifndef __AARCH64EB__
480 add w21,w21,w17 // h+=Sigma0(a)
483 add w20,w20,w28 // h+=K[i]
489 add w20,w20,w2 // h+=X[i]
490 eor w16,w16,w25,ror#11
492 orr w17,w17,w28 // Ch(e,f,g)
493 eor w28,w21,w22 // a^b, b^c in next round
494 eor w16,w16,w25,ror#25 // Sigma1(e)
495 eor w10,w10,w21,ror#13
496 add w20,w20,w17 // h+=Ch(e,f,g)
497 and w19,w19,w28 // (b^c)&=(a^b)
499 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
500 add w20,w20,w16 // h+=Sigma1(e)
501 eor w19,w19,w22 // Maj(a,b,c)
502 eor w17,w10,w21,ror#22 // Sigma0(a)
503 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
505 add w24,w24,w20 // d+=h
506 add w20,w20,w19 // h+=Maj(a,b,c)
507 ldr w19,[x30],#4 // *K++, w28 in next round
509 add w20,w20,w17 // h+=Sigma0(a)
515 add w27,w27,w19 // h+=K[i]
521 add w27,w27,w3 // h+=X[i]
522 eor w16,w16,w24,ror#11
523 eor w10,w10,w5,ror#18
524 orr w17,w17,w19 // Ch(e,f,g)
525 eor w19,w20,w21 // a^b, b^c in next round
526 eor w16,w16,w24,ror#25 // Sigma1(e)
527 eor w11,w11,w20,ror#13
528 add w27,w27,w17 // h+=Ch(e,f,g)
529 and w28,w28,w19 // (b^c)&=(a^b)
531 eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
532 add w27,w27,w16 // h+=Sigma1(e)
533 eor w28,w28,w21 // Maj(a,b,c)
534 eor w17,w11,w20,ror#22 // Sigma0(a)
535 eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
537 add w23,w23,w27 // d+=h
538 add w27,w27,w28 // h+=Maj(a,b,c)
539 ldr w28,[x30],#4 // *K++, w19 in next round
541 add w27,w27,w17 // h+=Sigma0(a)
546 add w26,w26,w28 // h+=K[i]
552 add w26,w26,w4 // h+=X[i]
553 eor w16,w16,w23,ror#11
554 eor w11,w11,w6,ror#18
555 orr w17,w17,w28 // Ch(e,f,g)
556 eor w28,w27,w20 // a^b, b^c in next round
557 eor w16,w16,w23,ror#25 // Sigma1(e)
558 eor w12,w12,w27,ror#13
559 add w26,w26,w17 // h+=Ch(e,f,g)
560 and w19,w19,w28 // (b^c)&=(a^b)
561 eor w10,w10,w3,ror#19
562 eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
563 add w26,w26,w16 // h+=Sigma1(e)
564 eor w19,w19,w20 // Maj(a,b,c)
565 eor w17,w12,w27,ror#22 // Sigma0(a)
566 eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
568 add w22,w22,w26 // d+=h
569 add w26,w26,w19 // h+=Maj(a,b,c)
570 ldr w19,[x30],#4 // *K++, w28 in next round
572 add w26,w26,w17 // h+=Sigma0(a)
577 add w25,w25,w19 // h+=K[i]
583 add w25,w25,w5 // h+=X[i]
584 eor w16,w16,w22,ror#11
585 eor w12,w12,w7,ror#18
586 orr w17,w17,w19 // Ch(e,f,g)
587 eor w19,w26,w27 // a^b, b^c in next round
588 eor w16,w16,w22,ror#25 // Sigma1(e)
589 eor w13,w13,w26,ror#13
590 add w25,w25,w17 // h+=Ch(e,f,g)
591 and w28,w28,w19 // (b^c)&=(a^b)
592 eor w11,w11,w4,ror#19
593 eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
594 add w25,w25,w16 // h+=Sigma1(e)
595 eor w28,w28,w27 // Maj(a,b,c)
596 eor w17,w13,w26,ror#22 // Sigma0(a)
597 eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
599 add w21,w21,w25 // d+=h
600 add w25,w25,w28 // h+=Maj(a,b,c)
601 ldr w28,[x30],#4 // *K++, w19 in next round
603 add w25,w25,w17 // h+=Sigma0(a)
608 add w24,w24,w28 // h+=K[i]
614 add w24,w24,w6 // h+=X[i]
615 eor w16,w16,w21,ror#11
616 eor w13,w13,w8,ror#18
617 orr w17,w17,w28 // Ch(e,f,g)
618 eor w28,w25,w26 // a^b, b^c in next round
619 eor w16,w16,w21,ror#25 // Sigma1(e)
620 eor w14,w14,w25,ror#13
621 add w24,w24,w17 // h+=Ch(e,f,g)
622 and w19,w19,w28 // (b^c)&=(a^b)
623 eor w12,w12,w5,ror#19
624 eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
625 add w24,w24,w16 // h+=Sigma1(e)
626 eor w19,w19,w26 // Maj(a,b,c)
627 eor w17,w14,w25,ror#22 // Sigma0(a)
628 eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
630 add w20,w20,w24 // d+=h
631 add w24,w24,w19 // h+=Maj(a,b,c)
632 ldr w19,[x30],#4 // *K++, w28 in next round
634 add w24,w24,w17 // h+=Sigma0(a)
639 add w23,w23,w19 // h+=K[i]
645 add w23,w23,w7 // h+=X[i]
646 eor w16,w16,w20,ror#11
647 eor w14,w14,w9,ror#18
648 orr w17,w17,w19 // Ch(e,f,g)
649 eor w19,w24,w25 // a^b, b^c in next round
650 eor w16,w16,w20,ror#25 // Sigma1(e)
651 eor w15,w15,w24,ror#13
652 add w23,w23,w17 // h+=Ch(e,f,g)
653 and w28,w28,w19 // (b^c)&=(a^b)
654 eor w13,w13,w6,ror#19
655 eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
656 add w23,w23,w16 // h+=Sigma1(e)
657 eor w28,w28,w25 // Maj(a,b,c)
658 eor w17,w15,w24,ror#22 // Sigma0(a)
659 eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
661 add w27,w27,w23 // d+=h
662 add w23,w23,w28 // h+=Maj(a,b,c)
663 ldr w28,[x30],#4 // *K++, w19 in next round
665 add w23,w23,w17 // h+=Sigma0(a)
670 add w22,w22,w28 // h+=K[i]
676 add w22,w22,w8 // h+=X[i]
677 eor w16,w16,w27,ror#11
678 eor w15,w15,w10,ror#18
679 orr w17,w17,w28 // Ch(e,f,g)
680 eor w28,w23,w24 // a^b, b^c in next round
681 eor w16,w16,w27,ror#25 // Sigma1(e)
683 add w22,w22,w17 // h+=Ch(e,f,g)
684 and w19,w19,w28 // (b^c)&=(a^b)
685 eor w14,w14,w7,ror#19
686 eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
687 add w22,w22,w16 // h+=Sigma1(e)
688 eor w19,w19,w24 // Maj(a,b,c)
689 eor w17,w0,w23,ror#22 // Sigma0(a)
690 eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
692 add w26,w26,w22 // d+=h
693 add w22,w22,w19 // h+=Maj(a,b,c)
694 ldr w19,[x30],#4 // *K++, w28 in next round
696 add w22,w22,w17 // h+=Sigma0(a)
701 add w21,w21,w19 // h+=K[i]
707 add w21,w21,w9 // h+=X[i]
708 eor w16,w16,w26,ror#11
710 orr w17,w17,w19 // Ch(e,f,g)
711 eor w19,w22,w23 // a^b, b^c in next round
712 eor w16,w16,w26,ror#25 // Sigma1(e)
714 add w21,w21,w17 // h+=Ch(e,f,g)
715 and w28,w28,w19 // (b^c)&=(a^b)
716 eor w15,w15,w8,ror#19
717 eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
718 add w21,w21,w16 // h+=Sigma1(e)
719 eor w28,w28,w23 // Maj(a,b,c)
720 eor w17,w1,w22,ror#22 // Sigma0(a)
721 eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
723 add w25,w25,w21 // d+=h
724 add w21,w21,w28 // h+=Maj(a,b,c)
725 ldr w28,[x30],#4 // *K++, w19 in next round
727 add w21,w21,w17 // h+=Sigma0(a)
732 add w20,w20,w28 // h+=K[i]
738 add w20,w20,w10 // h+=X[i]
739 eor w16,w16,w25,ror#11
741 orr w17,w17,w28 // Ch(e,f,g)
742 eor w28,w21,w22 // a^b, b^c in next round
743 eor w16,w16,w25,ror#25 // Sigma1(e)
745 add w20,w20,w17 // h+=Ch(e,f,g)
746 and w19,w19,w28 // (b^c)&=(a^b)
748 eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
749 add w20,w20,w16 // h+=Sigma1(e)
750 eor w19,w19,w22 // Maj(a,b,c)
751 eor w17,w2,w21,ror#22 // Sigma0(a)
752 eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
754 add w24,w24,w20 // d+=h
755 add w20,w20,w19 // h+=Maj(a,b,c)
756 ldr w19,[x30],#4 // *K++, w28 in next round
758 add w20,w20,w17 // h+=Sigma0(a)
763 add w27,w27,w19 // h+=K[i]
769 add w27,w27,w11 // h+=X[i]
770 eor w16,w16,w24,ror#11
772 orr w17,w17,w19 // Ch(e,f,g)
773 eor w19,w20,w21 // a^b, b^c in next round
774 eor w16,w16,w24,ror#25 // Sigma1(e)
776 add w27,w27,w17 // h+=Ch(e,f,g)
777 and w28,w28,w19 // (b^c)&=(a^b)
779 eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
780 add w27,w27,w16 // h+=Sigma1(e)
781 eor w28,w28,w21 // Maj(a,b,c)
782 eor w17,w3,w20,ror#22 // Sigma0(a)
783 eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
785 add w23,w23,w27 // d+=h
786 add w27,w27,w28 // h+=Maj(a,b,c)
787 ldr w28,[x30],#4 // *K++, w19 in next round
789 add w27,w27,w17 // h+=Sigma0(a)
794 add w26,w26,w28 // h+=K[i]
800 add w26,w26,w12 // h+=X[i]
801 eor w16,w16,w23,ror#11
803 orr w17,w17,w28 // Ch(e,f,g)
804 eor w28,w27,w20 // a^b, b^c in next round
805 eor w16,w16,w23,ror#25 // Sigma1(e)
807 add w26,w26,w17 // h+=Ch(e,f,g)
808 and w19,w19,w28 // (b^c)&=(a^b)
810 eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
811 add w26,w26,w16 // h+=Sigma1(e)
812 eor w19,w19,w20 // Maj(a,b,c)
813 eor w17,w4,w27,ror#22 // Sigma0(a)
814 eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
816 add w22,w22,w26 // d+=h
817 add w26,w26,w19 // h+=Maj(a,b,c)
818 ldr w19,[x30],#4 // *K++, w28 in next round
820 add w26,w26,w17 // h+=Sigma0(a)
825 add w25,w25,w19 // h+=K[i]
831 add w25,w25,w13 // h+=X[i]
832 eor w16,w16,w22,ror#11
834 orr w17,w17,w19 // Ch(e,f,g)
835 eor w19,w26,w27 // a^b, b^c in next round
836 eor w16,w16,w22,ror#25 // Sigma1(e)
838 add w25,w25,w17 // h+=Ch(e,f,g)
839 and w28,w28,w19 // (b^c)&=(a^b)
841 eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
842 add w25,w25,w16 // h+=Sigma1(e)
843 eor w28,w28,w27 // Maj(a,b,c)
844 eor w17,w5,w26,ror#22 // Sigma0(a)
845 eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
847 add w21,w21,w25 // d+=h
848 add w25,w25,w28 // h+=Maj(a,b,c)
849 ldr w28,[x30],#4 // *K++, w19 in next round
851 add w25,w25,w17 // h+=Sigma0(a)
856 add w24,w24,w28 // h+=K[i]
862 add w24,w24,w14 // h+=X[i]
863 eor w16,w16,w21,ror#11
865 orr w17,w17,w28 // Ch(e,f,g)
866 eor w28,w25,w26 // a^b, b^c in next round
867 eor w16,w16,w21,ror#25 // Sigma1(e)
869 add w24,w24,w17 // h+=Ch(e,f,g)
870 and w19,w19,w28 // (b^c)&=(a^b)
872 eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
873 add w24,w24,w16 // h+=Sigma1(e)
874 eor w19,w19,w26 // Maj(a,b,c)
875 eor w17,w6,w25,ror#22 // Sigma0(a)
876 eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
878 add w20,w20,w24 // d+=h
879 add w24,w24,w19 // h+=Maj(a,b,c)
880 ldr w19,[x30],#4 // *K++, w28 in next round
882 add w24,w24,w17 // h+=Sigma0(a)
887 add w23,w23,w19 // h+=K[i]
893 add w23,w23,w15 // h+=X[i]
894 eor w16,w16,w20,ror#11
896 orr w17,w17,w19 // Ch(e,f,g)
897 eor w19,w24,w25 // a^b, b^c in next round
898 eor w16,w16,w20,ror#25 // Sigma1(e)
900 add w23,w23,w17 // h+=Ch(e,f,g)
901 and w28,w28,w19 // (b^c)&=(a^b)
903 eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
904 add w23,w23,w16 // h+=Sigma1(e)
905 eor w28,w28,w25 // Maj(a,b,c)
906 eor w17,w7,w24,ror#22 // Sigma0(a)
907 eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
909 add w27,w27,w23 // d+=h
910 add w23,w23,w28 // h+=Maj(a,b,c)
911 ldr w28,[x30],#4 // *K++, w19 in next round
913 add w23,w23,w17 // h+=Sigma0(a)
918 add w22,w22,w28 // h+=K[i]
924 add w22,w22,w0 // h+=X[i]
925 eor w16,w16,w27,ror#11
927 orr w17,w17,w28 // Ch(e,f,g)
928 eor w28,w23,w24 // a^b, b^c in next round
929 eor w16,w16,w27,ror#25 // Sigma1(e)
931 add w22,w22,w17 // h+=Ch(e,f,g)
932 and w19,w19,w28 // (b^c)&=(a^b)
934 eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
935 add w22,w22,w16 // h+=Sigma1(e)
936 eor w19,w19,w24 // Maj(a,b,c)
937 eor w17,w8,w23,ror#22 // Sigma0(a)
938 eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
940 add w26,w26,w22 // d+=h
941 add w22,w22,w19 // h+=Maj(a,b,c)
942 ldr w19,[x30],#4 // *K++, w28 in next round
944 add w22,w22,w17 // h+=Sigma0(a)
949 add w21,w21,w19 // h+=K[i]
955 add w21,w21,w1 // h+=X[i]
956 eor w16,w16,w26,ror#11
958 orr w17,w17,w19 // Ch(e,f,g)
959 eor w19,w22,w23 // a^b, b^c in next round
960 eor w16,w16,w26,ror#25 // Sigma1(e)
962 add w21,w21,w17 // h+=Ch(e,f,g)
963 and w28,w28,w19 // (b^c)&=(a^b)
965 eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
966 add w21,w21,w16 // h+=Sigma1(e)
967 eor w28,w28,w23 // Maj(a,b,c)
968 eor w17,w9,w22,ror#22 // Sigma0(a)
969 eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
971 add w25,w25,w21 // d+=h
972 add w21,w21,w28 // h+=Maj(a,b,c)
973 ldr w28,[x30],#4 // *K++, w19 in next round
975 add w21,w21,w17 // h+=Sigma0(a)
980 add w20,w20,w28 // h+=K[i]
986 add w20,w20,w2 // h+=X[i]
987 eor w16,w16,w25,ror#11
989 orr w17,w17,w28 // Ch(e,f,g)
990 eor w28,w21,w22 // a^b, b^c in next round
991 eor w16,w16,w25,ror#25 // Sigma1(e)
992 eor w10,w10,w21,ror#13
993 add w20,w20,w17 // h+=Ch(e,f,g)
994 and w19,w19,w28 // (b^c)&=(a^b)
996 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
997 add w20,w20,w16 // h+=Sigma1(e)
998 eor w19,w19,w22 // Maj(a,b,c)
999 eor w17,w10,w21,ror#22 // Sigma0(a)
1000 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
1002 add w24,w24,w20 // d+=h
1003 add w20,w20,w19 // h+=Maj(a,b,c)
1004 ldr w19,[x30],#4 // *K++, w28 in next round
1006 add w20,w20,w17 // h+=Sigma0(a)
1008 cbnz w19,.Loop_16_xx
1012 sub x30,x30,#260 // rewind
1016 add x1,x1,#14*4 // advance input pointer
1019 ldp w9,w10,[x0,#6*4]
1026 stp w22,w23,[x0,#2*4]
1030 stp w24,w25,[x0,#4*4]
1031 stp w26,w27,[x0,#6*4]
1034 ldp x19,x20,[x29,#16]
1036 ldp x21,x22,[x29,#32]
1037 ldp x23,x24,[x29,#48]
1038 ldp x25,x26,[x29,#64]
1039 ldp x27,x28,[x29,#80]
1040 ldp x29,x30,[sp],#128
1042 .size sha256_block_data_order,.-sha256_block_data_order
1045 .type .LK256,%object
1047 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1048 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1049 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1050 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1051 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1052 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1053 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1054 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1055 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1056 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1057 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1058 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1059 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1060 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1061 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1062 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1063 .long 0 //terminator
1064 .size .LK256,.-.LK256
1069 .long OPENSSL_armcap_P-.
1071 .quad OPENSSL_armcap_P-.
1074 .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
1078 .type sha256_block_armv8,%function
1082 stp x29,x30,[sp,#-16]!
1085 ld1 {v0.4s,v1.4s},[x0]
1089 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1091 ld1 {v16.4s},[x3],#16
1096 orr v18.16b,v0.16b,v0.16b // offload
1097 orr v19.16b,v1.16b,v1.16b
1098 ld1 {v17.4s},[x3],#16
1099 add v16.4s,v16.4s,v4.4s
1100 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1101 orr v2.16b,v0.16b,v0.16b
1102 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1103 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1104 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1105 ld1 {v16.4s},[x3],#16
1106 add v17.4s,v17.4s,v5.4s
1107 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1108 orr v2.16b,v0.16b,v0.16b
1109 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1110 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1111 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1112 ld1 {v17.4s},[x3],#16
1113 add v16.4s,v16.4s,v6.4s
1114 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1115 orr v2.16b,v0.16b,v0.16b
1116 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1117 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1118 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1119 ld1 {v16.4s},[x3],#16
1120 add v17.4s,v17.4s,v7.4s
1121 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1122 orr v2.16b,v0.16b,v0.16b
1123 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1124 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1125 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1126 ld1 {v17.4s},[x3],#16
1127 add v16.4s,v16.4s,v4.4s
1128 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1129 orr v2.16b,v0.16b,v0.16b
1130 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1131 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1132 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1133 ld1 {v16.4s},[x3],#16
1134 add v17.4s,v17.4s,v5.4s
1135 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1136 orr v2.16b,v0.16b,v0.16b
1137 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1138 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1139 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1140 ld1 {v17.4s},[x3],#16
1141 add v16.4s,v16.4s,v6.4s
1142 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1143 orr v2.16b,v0.16b,v0.16b
1144 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1145 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1146 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1147 ld1 {v16.4s},[x3],#16
1148 add v17.4s,v17.4s,v7.4s
1149 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1150 orr v2.16b,v0.16b,v0.16b
1151 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1152 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1153 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1154 ld1 {v17.4s},[x3],#16
1155 add v16.4s,v16.4s,v4.4s
1156 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1157 orr v2.16b,v0.16b,v0.16b
1158 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1159 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1160 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1161 ld1 {v16.4s},[x3],#16
1162 add v17.4s,v17.4s,v5.4s
1163 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1164 orr v2.16b,v0.16b,v0.16b
1165 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1166 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1167 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1168 ld1 {v17.4s},[x3],#16
1169 add v16.4s,v16.4s,v6.4s
1170 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1171 orr v2.16b,v0.16b,v0.16b
1172 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1173 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1174 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1175 ld1 {v16.4s},[x3],#16
1176 add v17.4s,v17.4s,v7.4s
1177 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1178 orr v2.16b,v0.16b,v0.16b
1179 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1180 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1181 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1182 ld1 {v17.4s},[x3],#16
1183 add v16.4s,v16.4s,v4.4s
1184 orr v2.16b,v0.16b,v0.16b
1185 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1186 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1188 ld1 {v16.4s},[x3],#16
1189 add v17.4s,v17.4s,v5.4s
1190 orr v2.16b,v0.16b,v0.16b
1191 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1192 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1195 add v16.4s,v16.4s,v6.4s
1196 sub x3,x3,#64*4-16 // rewind
1197 orr v2.16b,v0.16b,v0.16b
1198 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1199 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1201 add v17.4s,v17.4s,v7.4s
1202 orr v2.16b,v0.16b,v0.16b
1203 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1204 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1206 add v0.4s,v0.4s,v18.4s
1207 add v1.4s,v1.4s,v19.4s
1211 st1 {v0.4s,v1.4s},[x0]
1215 .size sha256_block_armv8,.-sha256_block_armv8
1218 .globl sha256_block_neon
1220 .type sha256_block_neon,%function
1224 stp x29, x30, [sp, #-16]!
1229 add x2,x1,x2,lsl#6 // len to point at the end of inp
1231 ld1 {v0.16b},[x1], #16
1232 ld1 {v1.16b},[x1], #16
1233 ld1 {v2.16b},[x1], #16
1234 ld1 {v3.16b},[x1], #16
1235 ld1 {v4.4s},[x16], #16
1236 ld1 {v5.4s},[x16], #16
1237 ld1 {v6.4s},[x16], #16
1238 ld1 {v7.4s},[x16], #16
1239 rev32 v0.16b,v0.16b // yes, even on
1240 rev32 v1.16b,v1.16b // big-endian
1244 add v4.4s,v4.4s,v0.4s
1245 add v5.4s,v5.4s,v1.4s
1246 add v6.4s,v6.4s,v2.4s
1247 st1 {v4.4s,v5.4s},[x17], #32
1248 add v7.4s,v7.4s,v3.4s
1249 st1 {v6.4s,v7.4s},[x17]
1264 ext v4.16b,v0.16b,v1.16b,#4
1269 ext v7.16b,v2.16b,v3.16b,#4
1274 eor w11,w11,w7,ror#19
1276 eor w15,w3,w3,ror#11
1279 add v0.4s,v0.4s,v7.4s
1283 eor w15,w15,w3,ror#20
1284 ushr v7.4s,v4.4s,#18
1288 eor v5.16b,v5.16b,v6.16b
1293 ushr v16.4s,v19.4s,#17
1297 eor v5.16b,v5.16b,v7.16b
1300 sli v16.4s,v19.4s,#15
1303 ushr v17.4s,v19.4s,#10
1304 eor w11,w11,w6,ror#19
1305 eor w15,w10,w10,ror#11
1306 ushr v7.4s,v19.4s,#19
1309 add v0.4s,v0.4s,v5.4s
1311 eor w15,w15,w10,ror#20
1312 sli v7.4s,v19.4s,#13
1316 eor v17.16b,v17.16b,v16.16b
1320 eor v17.16b,v17.16b,v7.16b
1324 add v0.4s,v0.4s,v17.4s
1328 ushr v18.4s,v0.4s,#17
1330 ushr v19.4s,v0.4s,#10
1331 eor w11,w11,w5,ror#19
1332 eor w15,w9,w9,ror#11
1333 sli v18.4s,v0.4s,#15
1335 ushr v17.4s,v0.4s,#19
1338 eor v19.16b,v19.16b,v18.16b
1339 eor w15,w15,w9,ror#20
1341 sli v17.4s,v0.4s,#13
1345 ld1 {v4.4s},[x16], #16
1347 eor v19.16b,v19.16b,v17.16b
1349 eor v17.16b,v17.16b,v17.16b
1353 mov v17.d[1],v19.d[0]
1357 add v0.4s,v0.4s,v17.4s
1359 eor w11,w11,w4,ror#19
1360 eor w15,w8,w8,ror#11
1361 add v4.4s,v4.4s,v0.4s
1365 eor w15,w15,w8,ror#20
1372 st1 {v4.4s},[x17], #16
1373 ext v4.16b,v1.16b,v2.16b,#4
1378 ext v7.16b,v3.16b,v0.16b,#4
1383 eor w11,w11,w3,ror#19
1385 eor w15,w7,w7,ror#11
1388 add v1.4s,v1.4s,v7.4s
1392 eor w15,w15,w7,ror#20
1393 ushr v7.4s,v4.4s,#18
1397 eor v5.16b,v5.16b,v6.16b
1402 ushr v16.4s,v19.4s,#17
1406 eor v5.16b,v5.16b,v7.16b
1408 eor w11,w10,w10,ror#5
1409 sli v16.4s,v19.4s,#15
1412 ushr v17.4s,v19.4s,#10
1413 eor w11,w11,w10,ror#19
1414 eor w15,w6,w6,ror#11
1415 ushr v7.4s,v19.4s,#19
1418 add v1.4s,v1.4s,v5.4s
1420 eor w15,w15,w6,ror#20
1421 sli v7.4s,v19.4s,#13
1425 eor v17.16b,v17.16b,v16.16b
1429 eor v17.16b,v17.16b,v7.16b
1433 add v1.4s,v1.4s,v17.4s
1437 ushr v18.4s,v1.4s,#17
1439 ushr v19.4s,v1.4s,#10
1440 eor w11,w11,w9,ror#19
1441 eor w15,w5,w5,ror#11
1442 sli v18.4s,v1.4s,#15
1444 ushr v17.4s,v1.4s,#19
1447 eor v19.16b,v19.16b,v18.16b
1448 eor w15,w15,w5,ror#20
1450 sli v17.4s,v1.4s,#13
1454 ld1 {v4.4s},[x16], #16
1456 eor v19.16b,v19.16b,v17.16b
1458 eor v17.16b,v17.16b,v17.16b
1462 mov v17.d[1],v19.d[0]
1466 add v1.4s,v1.4s,v17.4s
1468 eor w11,w11,w8,ror#19
1469 eor w15,w4,w4,ror#11
1470 add v4.4s,v4.4s,v1.4s
1474 eor w15,w15,w4,ror#20
1481 st1 {v4.4s},[x17], #16
1482 ext v4.16b,v2.16b,v3.16b,#4
1487 ext v7.16b,v0.16b,v1.16b,#4
1492 eor w11,w11,w7,ror#19
1494 eor w15,w3,w3,ror#11
1497 add v2.4s,v2.4s,v7.4s
1501 eor w15,w15,w3,ror#20
1502 ushr v7.4s,v4.4s,#18
1506 eor v5.16b,v5.16b,v6.16b
1511 ushr v16.4s,v19.4s,#17
1515 eor v5.16b,v5.16b,v7.16b
1518 sli v16.4s,v19.4s,#15
1521 ushr v17.4s,v19.4s,#10
1522 eor w11,w11,w6,ror#19
1523 eor w15,w10,w10,ror#11
1524 ushr v7.4s,v19.4s,#19
1527 add v2.4s,v2.4s,v5.4s
1529 eor w15,w15,w10,ror#20
1530 sli v7.4s,v19.4s,#13
1534 eor v17.16b,v17.16b,v16.16b
1538 eor v17.16b,v17.16b,v7.16b
1542 add v2.4s,v2.4s,v17.4s
1546 ushr v18.4s,v2.4s,#17
1548 ushr v19.4s,v2.4s,#10
1549 eor w11,w11,w5,ror#19
1550 eor w15,w9,w9,ror#11
1551 sli v18.4s,v2.4s,#15
1553 ushr v17.4s,v2.4s,#19
1556 eor v19.16b,v19.16b,v18.16b
1557 eor w15,w15,w9,ror#20
1559 sli v17.4s,v2.4s,#13
1563 ld1 {v4.4s},[x16], #16
1565 eor v19.16b,v19.16b,v17.16b
1567 eor v17.16b,v17.16b,v17.16b
1571 mov v17.d[1],v19.d[0]
1575 add v2.4s,v2.4s,v17.4s
1577 eor w11,w11,w4,ror#19
1578 eor w15,w8,w8,ror#11
1579 add v4.4s,v4.4s,v2.4s
1583 eor w15,w15,w8,ror#20
1590 st1 {v4.4s},[x17], #16
1591 ext v4.16b,v3.16b,v0.16b,#4
1596 ext v7.16b,v1.16b,v2.16b,#4
1601 eor w11,w11,w3,ror#19
1603 eor w15,w7,w7,ror#11
1606 add v3.4s,v3.4s,v7.4s
1610 eor w15,w15,w7,ror#20
1611 ushr v7.4s,v4.4s,#18
1615 eor v5.16b,v5.16b,v6.16b
1620 ushr v16.4s,v19.4s,#17
1624 eor v5.16b,v5.16b,v7.16b
1626 eor w11,w10,w10,ror#5
1627 sli v16.4s,v19.4s,#15
1630 ushr v17.4s,v19.4s,#10
1631 eor w11,w11,w10,ror#19
1632 eor w15,w6,w6,ror#11
1633 ushr v7.4s,v19.4s,#19
1636 add v3.4s,v3.4s,v5.4s
1638 eor w15,w15,w6,ror#20
1639 sli v7.4s,v19.4s,#13
1643 eor v17.16b,v17.16b,v16.16b
1647 eor v17.16b,v17.16b,v7.16b
1651 add v3.4s,v3.4s,v17.4s
1655 ushr v18.4s,v3.4s,#17
1657 ushr v19.4s,v3.4s,#10
1658 eor w11,w11,w9,ror#19
1659 eor w15,w5,w5,ror#11
1660 sli v18.4s,v3.4s,#15
1662 ushr v17.4s,v3.4s,#19
1665 eor v19.16b,v19.16b,v18.16b
1666 eor w15,w15,w5,ror#20
1668 sli v17.4s,v3.4s,#13
1672 ld1 {v4.4s},[x16], #16
1674 eor v19.16b,v19.16b,v17.16b
1676 eor v17.16b,v17.16b,v17.16b
1680 mov v17.d[1],v19.d[0]
1684 add v3.4s,v3.4s,v17.4s
1686 eor w11,w11,w8,ror#19
1687 eor w15,w4,w4,ror#11
1688 add v4.4s,v4.4s,v3.4s
1692 eor w15,w15,w4,ror#20
1699 st1 {v4.4s},[x17], #16
1700 cmp w12,#0 // check for K256 terminator
1705 sub x16,x16,#256 // rewind x16
1708 csel x17, x17, xzr, eq
1709 sub x1,x1,x17 // avoid SEGV
1714 ld1 {v0.16b},[x1],#16
1717 ld1 {v4.4s},[x16],#16
1720 eor w11,w11,w7,ror#19
1721 eor w15,w3,w3,ror#11
1726 eor w15,w15,w3,ror#20
1727 add v4.4s,v4.4s,v0.4s
1741 eor w11,w11,w6,ror#19
1742 eor w15,w10,w10,ror#11
1746 eor w15,w15,w10,ror#20
1760 eor w11,w11,w5,ror#19
1761 eor w15,w9,w9,ror#11
1765 eor w15,w15,w9,ror#20
1779 eor w11,w11,w4,ror#19
1780 eor w15,w8,w8,ror#11
1784 eor w15,w15,w8,ror#20
1791 st1 {v4.4s},[x17], #16
1795 ld1 {v1.16b},[x1],#16
1798 ld1 {v4.4s},[x16],#16
1801 eor w11,w11,w3,ror#19
1802 eor w15,w7,w7,ror#11
1807 eor w15,w15,w7,ror#20
1808 add v4.4s,v4.4s,v1.4s
1819 eor w11,w10,w10,ror#5
1822 eor w11,w11,w10,ror#19
1823 eor w15,w6,w6,ror#11
1827 eor w15,w15,w6,ror#20
1841 eor w11,w11,w9,ror#19
1842 eor w15,w5,w5,ror#11
1846 eor w15,w15,w5,ror#20
1860 eor w11,w11,w8,ror#19
1861 eor w15,w4,w4,ror#11
1865 eor w15,w15,w4,ror#20
1872 st1 {v4.4s},[x17], #16
1876 ld1 {v2.16b},[x1],#16
1879 ld1 {v4.4s},[x16],#16
1882 eor w11,w11,w7,ror#19
1883 eor w15,w3,w3,ror#11
1888 eor w15,w15,w3,ror#20
1889 add v4.4s,v4.4s,v2.4s
1903 eor w11,w11,w6,ror#19
1904 eor w15,w10,w10,ror#11
1908 eor w15,w15,w10,ror#20
1922 eor w11,w11,w5,ror#19
1923 eor w15,w9,w9,ror#11
1927 eor w15,w15,w9,ror#20
1941 eor w11,w11,w4,ror#19
1942 eor w15,w8,w8,ror#11
1946 eor w15,w15,w8,ror#20
1953 st1 {v4.4s},[x17], #16
1957 ld1 {v3.16b},[x1],#16
1960 ld1 {v4.4s},[x16],#16
1963 eor w11,w11,w3,ror#19
1964 eor w15,w7,w7,ror#11
1969 eor w15,w15,w7,ror#20
1970 add v4.4s,v4.4s,v3.4s
1981 eor w11,w10,w10,ror#5
1984 eor w11,w11,w10,ror#19
1985 eor w15,w6,w6,ror#11
1989 eor w15,w15,w6,ror#20
2003 eor w11,w11,w9,ror#19
2004 eor w15,w5,w5,ror#11
2008 eor w15,w15,w5,ror#20
2022 eor w11,w11,w8,ror#19
2023 eor w15,w4,w4,ror#11
2027 eor w15,w15,w4,ror#20
2033 st1 {v4.4s},[x17], #16
2034 add w3,w3,w15 // h+=Sigma0(a) from the past
2036 add w3,w3,w13 // h+=Maj(a,b,c) from the past
2038 add w3,w3,w11 // accumulate
2040 ldp w11,w12,[x0,#16]
2043 ldp w13,w14,[x0,#24]
2062 .size sha256_block_neon,.-sha256_block_neon
2064 .comm OPENSSL_armcap_P,4,4