1 // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
3 // Licensed under the OpenSSL license (the "License"). You may not use
4 // this file except in compliance with the License. You can obtain a copy
5 // in the file LICENSE in the source distribution or at
6 // https://www.openssl.org/source/license.html
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/.
14 // Permission to use under GPLv2 terms is granted.
15 // ====================================================================
17 // SHA256/512 for ARMv8.
19 // Performance in cycles per processed byte and improvement coefficient
20 // over code generated with "default" compiler:
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%)
30 // (*) Software SHA256 results are of lesser relevance, presented
31 // mostly for informational purposes.
32 // (**) The result is a trade-off: it's possible to improve it by
33 // 10% (or by 1 cycle per round), but at the cost of 20% loss
34 // on Cortex-A53 (or by 4 cycles per round).
35 // (***) Super-impressive coefficients over gcc-generated code are
36 // indication of some compiler "pathology", most notably code
37 // generated with -mgeneral-regs-only is significanty faster
38 // and the gap is only 40-90%.
42 // Originally it was reckoned that it makes no sense to implement NEON
43 // version of SHA256 for 64-bit processors. This is because performance
44 // improvement on most wide-spread Cortex-A5x processors was observed
45 // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
46 // observed that 32-bit NEON SHA256 performs significantly better than
47 // 64-bit scalar version on *some* of the more recent processors. As
48 // result 64-bit NEON version of SHA256 was added to provide best
49 // all-round performance. For example it executes ~30% faster on X-Gene
50 // and Mongoose. [For reference, NEON version of SHA512 is bound to
51 // deliver much less improvement, likely *negative* on Cortex-A5x.
52 // Which is why NEON support is limited to SHA256.]
55 # include "arm_arch.h"
60 .extern OPENSSL_armcap_P
61 .globl sha256_block_data_order
62 .type sha256_block_data_order,%function
64 sha256_block_data_order:
67 ldrsw x16,.LOPENSSL_armcap_P
69 ldr x16,.LOPENSSL_armcap_P
71 adr x17,.LOPENSSL_armcap_P
79 stp x29,x30,[sp,#-128]!
89 ldp w20,w21,[x0] // load context
92 add x2,x1,x2,lsl#6 // end of input
99 ldr w19,[x30],#4 // *K++
100 eor w28,w21,w22 // magic seed
102 #ifndef __AARCH64EB__
106 add w27,w27,w19 // h+=K[i]
107 eor w6,w24,w24,ror#14
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)
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__
129 add w27,w27,w17 // h+=Sigma0(a)
131 add w26,w26,w28 // h+=K[i]
132 eor w7,w23,w23,ror#14
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)
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__
153 add w26,w26,w17 // h+=Sigma0(a)
155 add w25,w25,w19 // h+=K[i]
156 eor w8,w22,w22,ror#14
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)
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__
178 add w25,w25,w17 // h+=Sigma0(a)
180 add w24,w24,w28 // h+=K[i]
181 eor w9,w21,w21,ror#14
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)
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__
202 add w24,w24,w17 // h+=Sigma0(a)
204 add w23,w23,w19 // h+=K[i]
205 eor w10,w20,w20,ror#14
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)
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__
227 add w23,w23,w17 // h+=Sigma0(a)
229 add w22,w22,w28 // h+=K[i]
230 eor w11,w27,w27,ror#14
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)
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__
251 add w22,w22,w17 // h+=Sigma0(a)
253 add w21,w21,w19 // h+=K[i]
254 eor w12,w26,w26,ror#14
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)
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__
275 ldp w11,w12,[x1],#2*4
276 add w21,w21,w17 // h+=Sigma0(a)
278 add w20,w20,w28 // h+=K[i]
279 eor w13,w25,w25,ror#14
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)
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__
300 add w20,w20,w17 // h+=Sigma0(a)
302 add w27,w27,w19 // h+=K[i]
303 eor w14,w24,w24,ror#14
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)
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__
324 ldp w13,w14,[x1],#2*4
325 add w27,w27,w17 // h+=Sigma0(a)
327 add w26,w26,w28 // h+=K[i]
328 eor w15,w23,w23,ror#14
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)
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__
349 add w26,w26,w17 // h+=Sigma0(a)
351 add w25,w25,w19 // h+=K[i]
352 eor w0,w22,w22,ror#14
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)
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__
374 add w25,w25,w17 // h+=Sigma0(a)
377 add w24,w24,w28 // h+=K[i]
378 eor w6,w21,w21,ror#14
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)
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__
399 add w24,w24,w17 // h+=Sigma0(a)
402 add w23,w23,w19 // h+=K[i]
403 eor w7,w20,w20,ror#14
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)
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__
425 add w23,w23,w17 // h+=Sigma0(a)
428 add w22,w22,w28 // h+=K[i]
429 eor w8,w27,w27,ror#14
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)
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__
451 add w22,w22,w17 // h+=Sigma0(a)
454 add w21,w21,w19 // h+=K[i]
455 eor w9,w26,w26,ror#14
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)
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__
477 add w21,w21,w17 // h+=Sigma0(a)
480 add w20,w20,w28 // h+=K[i]
486 add w20,w20,w2 // h+=X[i]
487 eor w16,w16,w25,ror#11
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)
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])
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
506 add w20,w20,w17 // h+=Sigma0(a)
512 add w27,w27,w19 // h+=K[i]
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)
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])
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
538 add w27,w27,w17 // h+=Sigma0(a)
543 add w26,w26,w28 // h+=K[i]
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])
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
569 add w26,w26,w17 // h+=Sigma0(a)
574 add w25,w25,w19 // h+=K[i]
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])
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
600 add w25,w25,w17 // h+=Sigma0(a)
605 add w24,w24,w28 // h+=K[i]
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])
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
631 add w24,w24,w17 // h+=Sigma0(a)
636 add w23,w23,w19 // h+=K[i]
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])
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
662 add w23,w23,w17 // h+=Sigma0(a)
667 add w22,w22,w28 // h+=K[i]
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)
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])
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
693 add w22,w22,w17 // h+=Sigma0(a)
698 add w21,w21,w19 // h+=K[i]
704 add w21,w21,w9 // h+=X[i]
705 eor w16,w16,w26,ror#11
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)
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])
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
724 add w21,w21,w17 // h+=Sigma0(a)
729 add w20,w20,w28 // h+=K[i]
735 add w20,w20,w10 // h+=X[i]
736 eor w16,w16,w25,ror#11
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)
742 add w20,w20,w17 // h+=Ch(e,f,g)
743 and w19,w19,w28 // (b^c)&=(a^b)
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])
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
755 add w20,w20,w17 // h+=Sigma0(a)
760 add w27,w27,w19 // h+=K[i]
766 add w27,w27,w11 // h+=X[i]
767 eor w16,w16,w24,ror#11
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)
773 add w27,w27,w17 // h+=Ch(e,f,g)
774 and w28,w28,w19 // (b^c)&=(a^b)
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])
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
786 add w27,w27,w17 // h+=Sigma0(a)
791 add w26,w26,w28 // h+=K[i]
797 add w26,w26,w12 // h+=X[i]
798 eor w16,w16,w23,ror#11
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)
804 add w26,w26,w17 // h+=Ch(e,f,g)
805 and w19,w19,w28 // (b^c)&=(a^b)
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])
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
817 add w26,w26,w17 // h+=Sigma0(a)
822 add w25,w25,w19 // h+=K[i]
828 add w25,w25,w13 // h+=X[i]
829 eor w16,w16,w22,ror#11
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)
835 add w25,w25,w17 // h+=Ch(e,f,g)
836 and w28,w28,w19 // (b^c)&=(a^b)
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])
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
848 add w25,w25,w17 // h+=Sigma0(a)
853 add w24,w24,w28 // h+=K[i]
859 add w24,w24,w14 // h+=X[i]
860 eor w16,w16,w21,ror#11
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)
866 add w24,w24,w17 // h+=Ch(e,f,g)
867 and w19,w19,w28 // (b^c)&=(a^b)
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])
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
879 add w24,w24,w17 // h+=Sigma0(a)
884 add w23,w23,w19 // h+=K[i]
890 add w23,w23,w15 // h+=X[i]
891 eor w16,w16,w20,ror#11
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)
897 add w23,w23,w17 // h+=Ch(e,f,g)
898 and w28,w28,w19 // (b^c)&=(a^b)
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])
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
910 add w23,w23,w17 // h+=Sigma0(a)
915 add w22,w22,w28 // h+=K[i]
921 add w22,w22,w0 // h+=X[i]
922 eor w16,w16,w27,ror#11
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)
928 add w22,w22,w17 // h+=Ch(e,f,g)
929 and w19,w19,w28 // (b^c)&=(a^b)
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])
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
941 add w22,w22,w17 // h+=Sigma0(a)
946 add w21,w21,w19 // h+=K[i]
952 add w21,w21,w1 // h+=X[i]
953 eor w16,w16,w26,ror#11
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)
959 add w21,w21,w17 // h+=Ch(e,f,g)
960 and w28,w28,w19 // (b^c)&=(a^b)
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])
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
972 add w21,w21,w17 // h+=Sigma0(a)
977 add w20,w20,w28 // h+=K[i]
983 add w20,w20,w2 // h+=X[i]
984 eor w16,w16,w25,ror#11
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)
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])
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
1003 add w20,w20,w17 // h+=Sigma0(a)
1005 cbnz w19,.Loop_16_xx
1009 sub x30,x30,#260 // rewind
1013 add x1,x1,#14*4 // advance input pointer
1016 ldp w9,w10,[x0,#6*4]
1023 stp w22,w23,[x0,#2*4]
1027 stp w24,w25,[x0,#4*4]
1028 stp w26,w27,[x0,#6*4]
1031 ldp x19,x20,[x29,#16]
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
1039 .size sha256_block_data_order,.-sha256_block_data_order
1042 .type .LK256,%object
1044 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1045 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1046 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1047 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1048 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1049 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1050 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1051 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1052 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1053 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1054 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1055 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1056 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1057 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1058 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1059 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1060 .long 0 //terminator
1061 .size .LK256,.-.LK256
1066 .long OPENSSL_armcap_P-.
1068 .quad OPENSSL_armcap_P-.
1071 .asciz "SHA256 block transform for ARMv8, CRYPTOGAMS by <appro@openssl.org>"
1074 .type sha256_block_armv8,%function
1078 stp x29,x30,[sp,#-16]!
1081 ld1 {v0.4s,v1.4s},[x0]
1085 ld1 {v4.16b-v7.16b},[x1],#64
1087 ld1 {v16.4s},[x3],#16
1092 orr v18.16b,v0.16b,v0.16b // offload
1093 orr v19.16b,v1.16b,v1.16b
1094 ld1 {v17.4s},[x3],#16
1095 add v16.4s,v16.4s,v4.4s
1096 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1097 orr v2.16b,v0.16b,v0.16b
1098 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1099 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1100 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1101 ld1 {v16.4s},[x3],#16
1102 add v17.4s,v17.4s,v5.4s
1103 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1104 orr v2.16b,v0.16b,v0.16b
1105 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1106 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1107 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1108 ld1 {v17.4s},[x3],#16
1109 add v16.4s,v16.4s,v6.4s
1110 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1111 orr v2.16b,v0.16b,v0.16b
1112 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1113 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1114 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1115 ld1 {v16.4s},[x3],#16
1116 add v17.4s,v17.4s,v7.4s
1117 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1118 orr v2.16b,v0.16b,v0.16b
1119 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1120 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1121 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1122 ld1 {v17.4s},[x3],#16
1123 add v16.4s,v16.4s,v4.4s
1124 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1125 orr v2.16b,v0.16b,v0.16b
1126 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1127 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1128 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1129 ld1 {v16.4s},[x3],#16
1130 add v17.4s,v17.4s,v5.4s
1131 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1132 orr v2.16b,v0.16b,v0.16b
1133 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1134 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1135 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1136 ld1 {v17.4s},[x3],#16
1137 add v16.4s,v16.4s,v6.4s
1138 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1139 orr v2.16b,v0.16b,v0.16b
1140 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1141 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1142 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1143 ld1 {v16.4s},[x3],#16
1144 add v17.4s,v17.4s,v7.4s
1145 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1146 orr v2.16b,v0.16b,v0.16b
1147 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1148 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1149 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1150 ld1 {v17.4s},[x3],#16
1151 add v16.4s,v16.4s,v4.4s
1152 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1153 orr v2.16b,v0.16b,v0.16b
1154 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1155 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1156 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1157 ld1 {v16.4s},[x3],#16
1158 add v17.4s,v17.4s,v5.4s
1159 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1160 orr v2.16b,v0.16b,v0.16b
1161 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1162 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1163 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1164 ld1 {v17.4s},[x3],#16
1165 add v16.4s,v16.4s,v6.4s
1166 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1167 orr v2.16b,v0.16b,v0.16b
1168 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1169 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1170 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1171 ld1 {v16.4s},[x3],#16
1172 add v17.4s,v17.4s,v7.4s
1173 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1174 orr v2.16b,v0.16b,v0.16b
1175 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1176 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1177 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1178 ld1 {v17.4s},[x3],#16
1179 add v16.4s,v16.4s,v4.4s
1180 orr v2.16b,v0.16b,v0.16b
1181 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1182 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1184 ld1 {v16.4s},[x3],#16
1185 add v17.4s,v17.4s,v5.4s
1186 orr v2.16b,v0.16b,v0.16b
1187 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1188 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1191 add v16.4s,v16.4s,v6.4s
1192 sub x3,x3,#64*4-16 // rewind
1193 orr v2.16b,v0.16b,v0.16b
1194 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1195 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1197 add v17.4s,v17.4s,v7.4s
1198 orr v2.16b,v0.16b,v0.16b
1199 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1200 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1202 add v0.4s,v0.4s,v18.4s
1203 add v1.4s,v1.4s,v19.4s
1207 st1 {v0.4s,v1.4s},[x0]
1211 .size sha256_block_armv8,.-sha256_block_armv8
1214 .globl sha256_block_neon
1216 .type sha256_block_neon,%function
1220 stp x29, x30, [sp, #-16]!
1225 add x2,x1,x2,lsl#6 // len to point at the end of inp
1227 ld1 {v0.16b},[x1], #16
1228 ld1 {v1.16b},[x1], #16
1229 ld1 {v2.16b},[x1], #16
1230 ld1 {v3.16b},[x1], #16
1231 ld1 {v4.4s},[x16], #16
1232 ld1 {v5.4s},[x16], #16
1233 ld1 {v6.4s},[x16], #16
1234 ld1 {v7.4s},[x16], #16
1235 rev32 v0.16b,v0.16b // yes, even on
1236 rev32 v1.16b,v1.16b // big-endian
1240 add v4.4s,v4.4s,v0.4s
1241 add v5.4s,v5.4s,v1.4s
1242 add v6.4s,v6.4s,v2.4s
1243 st1 {v4.4s-v5.4s},[x17], #32
1244 add v7.4s,v7.4s,v3.4s
1245 st1 {v6.4s-v7.4s},[x17]
1260 ext v4.16b,v0.16b,v1.16b,#4
1265 ext v7.16b,v2.16b,v3.16b,#4
1270 eor w11,w11,w7,ror#19
1272 eor w15,w3,w3,ror#11
1275 add v0.4s,v0.4s,v7.4s
1279 eor w15,w15,w3,ror#20
1280 ushr v7.4s,v4.4s,#18
1284 eor v5.16b,v5.16b,v6.16b
1289 ushr v16.4s,v19.4s,#17
1293 eor v5.16b,v5.16b,v7.16b
1296 sli v16.4s,v19.4s,#15
1299 ushr v17.4s,v19.4s,#10
1300 eor w11,w11,w6,ror#19
1301 eor w15,w10,w10,ror#11
1302 ushr v7.4s,v19.4s,#19
1305 add v0.4s,v0.4s,v5.4s
1307 eor w15,w15,w10,ror#20
1308 sli v7.4s,v19.4s,#13
1312 eor v17.16b,v17.16b,v16.16b
1316 eor v17.16b,v17.16b,v7.16b
1320 add v0.4s,v0.4s,v17.4s
1324 ushr v18.4s,v0.4s,#17
1326 ushr v19.4s,v0.4s,#10
1327 eor w11,w11,w5,ror#19
1328 eor w15,w9,w9,ror#11
1329 sli v18.4s,v0.4s,#15
1331 ushr v17.4s,v0.4s,#19
1334 eor v19.16b,v19.16b,v18.16b
1335 eor w15,w15,w9,ror#20
1337 sli v17.4s,v0.4s,#13
1341 ld1 {v4.4s},[x16], #16
1343 eor v19.16b,v19.16b,v17.16b
1345 eor v17.16b,v17.16b,v17.16b
1349 mov v17.d[1],v19.d[0]
1353 add v0.4s,v0.4s,v17.4s
1355 eor w11,w11,w4,ror#19
1356 eor w15,w8,w8,ror#11
1357 add v4.4s,v4.4s,v0.4s
1361 eor w15,w15,w8,ror#20
1368 st1 {v4.4s},[x17], #16
1369 ext v4.16b,v1.16b,v2.16b,#4
1374 ext v7.16b,v3.16b,v0.16b,#4
1379 eor w11,w11,w3,ror#19
1381 eor w15,w7,w7,ror#11
1384 add v1.4s,v1.4s,v7.4s
1388 eor w15,w15,w7,ror#20
1389 ushr v7.4s,v4.4s,#18
1393 eor v5.16b,v5.16b,v6.16b
1398 ushr v16.4s,v19.4s,#17
1402 eor v5.16b,v5.16b,v7.16b
1404 eor w11,w10,w10,ror#5
1405 sli v16.4s,v19.4s,#15
1408 ushr v17.4s,v19.4s,#10
1409 eor w11,w11,w10,ror#19
1410 eor w15,w6,w6,ror#11
1411 ushr v7.4s,v19.4s,#19
1414 add v1.4s,v1.4s,v5.4s
1416 eor w15,w15,w6,ror#20
1417 sli v7.4s,v19.4s,#13
1421 eor v17.16b,v17.16b,v16.16b
1425 eor v17.16b,v17.16b,v7.16b
1429 add v1.4s,v1.4s,v17.4s
1433 ushr v18.4s,v1.4s,#17
1435 ushr v19.4s,v1.4s,#10
1436 eor w11,w11,w9,ror#19
1437 eor w15,w5,w5,ror#11
1438 sli v18.4s,v1.4s,#15
1440 ushr v17.4s,v1.4s,#19
1443 eor v19.16b,v19.16b,v18.16b
1444 eor w15,w15,w5,ror#20
1446 sli v17.4s,v1.4s,#13
1450 ld1 {v4.4s},[x16], #16
1452 eor v19.16b,v19.16b,v17.16b
1454 eor v17.16b,v17.16b,v17.16b
1458 mov v17.d[1],v19.d[0]
1462 add v1.4s,v1.4s,v17.4s
1464 eor w11,w11,w8,ror#19
1465 eor w15,w4,w4,ror#11
1466 add v4.4s,v4.4s,v1.4s
1470 eor w15,w15,w4,ror#20
1477 st1 {v4.4s},[x17], #16
1478 ext v4.16b,v2.16b,v3.16b,#4
1483 ext v7.16b,v0.16b,v1.16b,#4
1488 eor w11,w11,w7,ror#19
1490 eor w15,w3,w3,ror#11
1493 add v2.4s,v2.4s,v7.4s
1497 eor w15,w15,w3,ror#20
1498 ushr v7.4s,v4.4s,#18
1502 eor v5.16b,v5.16b,v6.16b
1507 ushr v16.4s,v19.4s,#17
1511 eor v5.16b,v5.16b,v7.16b
1514 sli v16.4s,v19.4s,#15
1517 ushr v17.4s,v19.4s,#10
1518 eor w11,w11,w6,ror#19
1519 eor w15,w10,w10,ror#11
1520 ushr v7.4s,v19.4s,#19
1523 add v2.4s,v2.4s,v5.4s
1525 eor w15,w15,w10,ror#20
1526 sli v7.4s,v19.4s,#13
1530 eor v17.16b,v17.16b,v16.16b
1534 eor v17.16b,v17.16b,v7.16b
1538 add v2.4s,v2.4s,v17.4s
1542 ushr v18.4s,v2.4s,#17
1544 ushr v19.4s,v2.4s,#10
1545 eor w11,w11,w5,ror#19
1546 eor w15,w9,w9,ror#11
1547 sli v18.4s,v2.4s,#15
1549 ushr v17.4s,v2.4s,#19
1552 eor v19.16b,v19.16b,v18.16b
1553 eor w15,w15,w9,ror#20
1555 sli v17.4s,v2.4s,#13
1559 ld1 {v4.4s},[x16], #16
1561 eor v19.16b,v19.16b,v17.16b
1563 eor v17.16b,v17.16b,v17.16b
1567 mov v17.d[1],v19.d[0]
1571 add v2.4s,v2.4s,v17.4s
1573 eor w11,w11,w4,ror#19
1574 eor w15,w8,w8,ror#11
1575 add v4.4s,v4.4s,v2.4s
1579 eor w15,w15,w8,ror#20
1586 st1 {v4.4s},[x17], #16
1587 ext v4.16b,v3.16b,v0.16b,#4
1592 ext v7.16b,v1.16b,v2.16b,#4
1597 eor w11,w11,w3,ror#19
1599 eor w15,w7,w7,ror#11
1602 add v3.4s,v3.4s,v7.4s
1606 eor w15,w15,w7,ror#20
1607 ushr v7.4s,v4.4s,#18
1611 eor v5.16b,v5.16b,v6.16b
1616 ushr v16.4s,v19.4s,#17
1620 eor v5.16b,v5.16b,v7.16b
1622 eor w11,w10,w10,ror#5
1623 sli v16.4s,v19.4s,#15
1626 ushr v17.4s,v19.4s,#10
1627 eor w11,w11,w10,ror#19
1628 eor w15,w6,w6,ror#11
1629 ushr v7.4s,v19.4s,#19
1632 add v3.4s,v3.4s,v5.4s
1634 eor w15,w15,w6,ror#20
1635 sli v7.4s,v19.4s,#13
1639 eor v17.16b,v17.16b,v16.16b
1643 eor v17.16b,v17.16b,v7.16b
1647 add v3.4s,v3.4s,v17.4s
1651 ushr v18.4s,v3.4s,#17
1653 ushr v19.4s,v3.4s,#10
1654 eor w11,w11,w9,ror#19
1655 eor w15,w5,w5,ror#11
1656 sli v18.4s,v3.4s,#15
1658 ushr v17.4s,v3.4s,#19
1661 eor v19.16b,v19.16b,v18.16b
1662 eor w15,w15,w5,ror#20
1664 sli v17.4s,v3.4s,#13
1668 ld1 {v4.4s},[x16], #16
1670 eor v19.16b,v19.16b,v17.16b
1672 eor v17.16b,v17.16b,v17.16b
1676 mov v17.d[1],v19.d[0]
1680 add v3.4s,v3.4s,v17.4s
1682 eor w11,w11,w8,ror#19
1683 eor w15,w4,w4,ror#11
1684 add v4.4s,v4.4s,v3.4s
1688 eor w15,w15,w4,ror#20
1695 st1 {v4.4s},[x17], #16
1696 cmp w12,#0 // check for K256 terminator
1701 sub x16,x16,#256 // rewind x16
1704 csel x17, x17, xzr, eq
1705 sub x1,x1,x17 // avoid SEGV
1710 ld1 {v0.16b},[x1],#16
1713 ld1 {v4.4s},[x16],#16
1716 eor w11,w11,w7,ror#19
1717 eor w15,w3,w3,ror#11
1722 eor w15,w15,w3,ror#20
1723 add v4.4s,v4.4s,v0.4s
1737 eor w11,w11,w6,ror#19
1738 eor w15,w10,w10,ror#11
1742 eor w15,w15,w10,ror#20
1756 eor w11,w11,w5,ror#19
1757 eor w15,w9,w9,ror#11
1761 eor w15,w15,w9,ror#20
1775 eor w11,w11,w4,ror#19
1776 eor w15,w8,w8,ror#11
1780 eor w15,w15,w8,ror#20
1787 st1 {v4.4s},[x17], #16
1791 ld1 {v1.16b},[x1],#16
1794 ld1 {v4.4s},[x16],#16
1797 eor w11,w11,w3,ror#19
1798 eor w15,w7,w7,ror#11
1803 eor w15,w15,w7,ror#20
1804 add v4.4s,v4.4s,v1.4s
1815 eor w11,w10,w10,ror#5
1818 eor w11,w11,w10,ror#19
1819 eor w15,w6,w6,ror#11
1823 eor w15,w15,w6,ror#20
1837 eor w11,w11,w9,ror#19
1838 eor w15,w5,w5,ror#11
1842 eor w15,w15,w5,ror#20
1856 eor w11,w11,w8,ror#19
1857 eor w15,w4,w4,ror#11
1861 eor w15,w15,w4,ror#20
1868 st1 {v4.4s},[x17], #16
1872 ld1 {v2.16b},[x1],#16
1875 ld1 {v4.4s},[x16],#16
1878 eor w11,w11,w7,ror#19
1879 eor w15,w3,w3,ror#11
1884 eor w15,w15,w3,ror#20
1885 add v4.4s,v4.4s,v2.4s
1899 eor w11,w11,w6,ror#19
1900 eor w15,w10,w10,ror#11
1904 eor w15,w15,w10,ror#20
1918 eor w11,w11,w5,ror#19
1919 eor w15,w9,w9,ror#11
1923 eor w15,w15,w9,ror#20
1937 eor w11,w11,w4,ror#19
1938 eor w15,w8,w8,ror#11
1942 eor w15,w15,w8,ror#20
1949 st1 {v4.4s},[x17], #16
1953 ld1 {v3.16b},[x1],#16
1956 ld1 {v4.4s},[x16],#16
1959 eor w11,w11,w3,ror#19
1960 eor w15,w7,w7,ror#11
1965 eor w15,w15,w7,ror#20
1966 add v4.4s,v4.4s,v3.4s
1977 eor w11,w10,w10,ror#5
1980 eor w11,w11,w10,ror#19
1981 eor w15,w6,w6,ror#11
1985 eor w15,w15,w6,ror#20
1999 eor w11,w11,w9,ror#19
2000 eor w15,w5,w5,ror#11
2004 eor w15,w15,w5,ror#20
2018 eor w11,w11,w8,ror#19
2019 eor w15,w4,w4,ror#11
2023 eor w15,w15,w4,ror#20
2029 st1 {v4.4s},[x17], #16
2030 add w3,w3,w15 // h+=Sigma0(a) from the past
2032 add w3,w3,w13 // h+=Maj(a,b,c) from the past
2034 add w3,w3,w11 // accumulate
2036 ldp w11,w12,[x0,#16]
2039 ldp w13,w14,[x0,#24]
2058 .size sha256_block_neon,.-sha256_block_neon
2060 .comm OPENSSL_armcap_P,4,4