1 // SPDX-License-Identifier: GPL-2.0
3 // This code is taken from the OpenSSL project but the author (Andy Polyakov)
4 // has relicensed it under the GPLv2. Therefore this program is free software;
5 // you can redistribute it and/or modify it under the terms of the GNU General
6 // Public License version 2 as published by the Free Software Foundation.
8 // The original headers, including the original license headers, are
9 // included below for completeness.
11 // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
13 // Licensed under the OpenSSL license (the "License"). You may not use
14 // this file except in compliance with the License. You can obtain a copy
15 // in the file LICENSE in the source distribution or at
16 // https://www.openssl.org/source/license.html
18 // ====================================================================
19 // Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
20 // project. The module is, however, dual licensed under OpenSSL and
21 // CRYPTOGAMS licenses depending on where you obtain it. For further
22 // details see http://www.openssl.org/~appro/cryptogams/.
23 // ====================================================================
25 // SHA256/512 for ARMv8.
27 // Performance in cycles per processed byte and improvement coefficient
28 // over code generated with "default" compiler:
30 // SHA256-hw SHA256(*) SHA512
31 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**))
32 // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***))
33 // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***))
34 // Denver 2.01 10.5 (+26%) 6.70 (+8%)
35 // X-Gene 20.0 (+100%) 12.8 (+300%(***))
36 // Mongoose 2.36 13.0 (+50%) 8.36 (+33%)
38 // (*) Software SHA256 results are of lesser relevance, presented
39 // mostly for informational purposes.
40 // (**) The result is a trade-off: it's possible to improve it by
41 // 10% (or by 1 cycle per round), but at the cost of 20% loss
42 // on Cortex-A53 (or by 4 cycles per round).
43 // (***) Super-impressive coefficients over gcc-generated code are
44 // indication of some compiler "pathology", most notably code
45 // generated with -mgeneral-regs-only is significanty faster
46 // and the gap is only 40-90%.
50 // Originally it was reckoned that it makes no sense to implement NEON
51 // version of SHA256 for 64-bit processors. This is because performance
52 // improvement on most wide-spread Cortex-A5x processors was observed
53 // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
54 // observed that 32-bit NEON SHA256 performs significantly better than
55 // 64-bit scalar version on *some* of the more recent processors. As
56 // result 64-bit NEON version of SHA256 was added to provide best
57 // all-round performance. For example it executes ~30% faster on X-Gene
58 // and Mongoose. [For reference, NEON version of SHA512 is bound to
59 // deliver much less improvement, likely *negative* on Cortex-A5x.
60 // Which is why NEON support is limited to SHA256.]
63 # include "arm_arch.h"
68 .extern OPENSSL_armcap_P
69 .globl sha256_block_data_order
70 .type sha256_block_data_order,%function
72 sha256_block_data_order:
75 ldrsw x16,.LOPENSSL_armcap_P
77 ldr x16,.LOPENSSL_armcap_P
79 adr x17,.LOPENSSL_armcap_P
87 stp x29,x30,[sp,#-128]!
97 ldp w20,w21,[x0] // load context
100 add x2,x1,x2,lsl#6 // end of input
101 ldp w26,w27,[x0,#6*4]
107 ldr w19,[x30],#4 // *K++
108 eor w28,w21,w22 // magic seed
110 #ifndef __AARCH64EB__
114 add w27,w27,w19 // h+=K[i]
115 eor w6,w24,w24,ror#14
118 add w27,w27,w3 // h+=X[i]
119 orr w17,w17,w19 // Ch(e,f,g)
120 eor w19,w20,w21 // a^b, b^c in next round
121 eor w16,w16,w6,ror#11 // Sigma1(e)
123 add w27,w27,w17 // h+=Ch(e,f,g)
124 eor w17,w20,w20,ror#9
125 add w27,w27,w16 // h+=Sigma1(e)
126 and w28,w28,w19 // (b^c)&=(a^b)
127 add w23,w23,w27 // d+=h
128 eor w28,w28,w21 // Maj(a,b,c)
129 eor w17,w6,w17,ror#13 // Sigma0(a)
130 add w27,w27,w28 // h+=Maj(a,b,c)
131 ldr w28,[x30],#4 // *K++, w19 in next round
132 //add w27,w27,w17 // h+=Sigma0(a)
133 #ifndef __AARCH64EB__
137 add w27,w27,w17 // h+=Sigma0(a)
139 add w26,w26,w28 // h+=K[i]
140 eor w7,w23,w23,ror#14
143 add w26,w26,w4 // h+=X[i]
144 orr w17,w17,w28 // Ch(e,f,g)
145 eor w28,w27,w20 // a^b, b^c in next round
146 eor w16,w16,w7,ror#11 // Sigma1(e)
148 add w26,w26,w17 // h+=Ch(e,f,g)
149 eor w17,w27,w27,ror#9
150 add w26,w26,w16 // h+=Sigma1(e)
151 and w19,w19,w28 // (b^c)&=(a^b)
152 add w22,w22,w26 // d+=h
153 eor w19,w19,w20 // Maj(a,b,c)
154 eor w17,w7,w17,ror#13 // Sigma0(a)
155 add w26,w26,w19 // h+=Maj(a,b,c)
156 ldr w19,[x30],#4 // *K++, w28 in next round
157 //add w26,w26,w17 // h+=Sigma0(a)
158 #ifndef __AARCH64EB__
161 add w26,w26,w17 // h+=Sigma0(a)
163 add w25,w25,w19 // h+=K[i]
164 eor w8,w22,w22,ror#14
167 add w25,w25,w5 // h+=X[i]
168 orr w17,w17,w19 // Ch(e,f,g)
169 eor w19,w26,w27 // a^b, b^c in next round
170 eor w16,w16,w8,ror#11 // Sigma1(e)
172 add w25,w25,w17 // h+=Ch(e,f,g)
173 eor w17,w26,w26,ror#9
174 add w25,w25,w16 // h+=Sigma1(e)
175 and w28,w28,w19 // (b^c)&=(a^b)
176 add w21,w21,w25 // d+=h
177 eor w28,w28,w27 // Maj(a,b,c)
178 eor w17,w8,w17,ror#13 // Sigma0(a)
179 add w25,w25,w28 // h+=Maj(a,b,c)
180 ldr w28,[x30],#4 // *K++, w19 in next round
181 //add w25,w25,w17 // h+=Sigma0(a)
182 #ifndef __AARCH64EB__
186 add w25,w25,w17 // h+=Sigma0(a)
188 add w24,w24,w28 // h+=K[i]
189 eor w9,w21,w21,ror#14
192 add w24,w24,w6 // h+=X[i]
193 orr w17,w17,w28 // Ch(e,f,g)
194 eor w28,w25,w26 // a^b, b^c in next round
195 eor w16,w16,w9,ror#11 // Sigma1(e)
197 add w24,w24,w17 // h+=Ch(e,f,g)
198 eor w17,w25,w25,ror#9
199 add w24,w24,w16 // h+=Sigma1(e)
200 and w19,w19,w28 // (b^c)&=(a^b)
201 add w20,w20,w24 // d+=h
202 eor w19,w19,w26 // Maj(a,b,c)
203 eor w17,w9,w17,ror#13 // Sigma0(a)
204 add w24,w24,w19 // h+=Maj(a,b,c)
205 ldr w19,[x30],#4 // *K++, w28 in next round
206 //add w24,w24,w17 // h+=Sigma0(a)
207 #ifndef __AARCH64EB__
210 add w24,w24,w17 // h+=Sigma0(a)
212 add w23,w23,w19 // h+=K[i]
213 eor w10,w20,w20,ror#14
216 add w23,w23,w7 // h+=X[i]
217 orr w17,w17,w19 // Ch(e,f,g)
218 eor w19,w24,w25 // a^b, b^c in next round
219 eor w16,w16,w10,ror#11 // Sigma1(e)
221 add w23,w23,w17 // h+=Ch(e,f,g)
222 eor w17,w24,w24,ror#9
223 add w23,w23,w16 // h+=Sigma1(e)
224 and w28,w28,w19 // (b^c)&=(a^b)
225 add w27,w27,w23 // d+=h
226 eor w28,w28,w25 // Maj(a,b,c)
227 eor w17,w10,w17,ror#13 // Sigma0(a)
228 add w23,w23,w28 // h+=Maj(a,b,c)
229 ldr w28,[x30],#4 // *K++, w19 in next round
230 //add w23,w23,w17 // h+=Sigma0(a)
231 #ifndef __AARCH64EB__
235 add w23,w23,w17 // h+=Sigma0(a)
237 add w22,w22,w28 // h+=K[i]
238 eor w11,w27,w27,ror#14
241 add w22,w22,w8 // h+=X[i]
242 orr w17,w17,w28 // Ch(e,f,g)
243 eor w28,w23,w24 // a^b, b^c in next round
244 eor w16,w16,w11,ror#11 // Sigma1(e)
246 add w22,w22,w17 // h+=Ch(e,f,g)
247 eor w17,w23,w23,ror#9
248 add w22,w22,w16 // h+=Sigma1(e)
249 and w19,w19,w28 // (b^c)&=(a^b)
250 add w26,w26,w22 // d+=h
251 eor w19,w19,w24 // Maj(a,b,c)
252 eor w17,w11,w17,ror#13 // Sigma0(a)
253 add w22,w22,w19 // h+=Maj(a,b,c)
254 ldr w19,[x30],#4 // *K++, w28 in next round
255 //add w22,w22,w17 // h+=Sigma0(a)
256 #ifndef __AARCH64EB__
259 add w22,w22,w17 // h+=Sigma0(a)
261 add w21,w21,w19 // h+=K[i]
262 eor w12,w26,w26,ror#14
265 add w21,w21,w9 // h+=X[i]
266 orr w17,w17,w19 // Ch(e,f,g)
267 eor w19,w22,w23 // a^b, b^c in next round
268 eor w16,w16,w12,ror#11 // Sigma1(e)
270 add w21,w21,w17 // h+=Ch(e,f,g)
271 eor w17,w22,w22,ror#9
272 add w21,w21,w16 // h+=Sigma1(e)
273 and w28,w28,w19 // (b^c)&=(a^b)
274 add w25,w25,w21 // d+=h
275 eor w28,w28,w23 // Maj(a,b,c)
276 eor w17,w12,w17,ror#13 // Sigma0(a)
277 add w21,w21,w28 // h+=Maj(a,b,c)
278 ldr w28,[x30],#4 // *K++, w19 in next round
279 //add w21,w21,w17 // h+=Sigma0(a)
280 #ifndef __AARCH64EB__
283 ldp w11,w12,[x1],#2*4
284 add w21,w21,w17 // h+=Sigma0(a)
286 add w20,w20,w28 // h+=K[i]
287 eor w13,w25,w25,ror#14
290 add w20,w20,w10 // h+=X[i]
291 orr w17,w17,w28 // Ch(e,f,g)
292 eor w28,w21,w22 // a^b, b^c in next round
293 eor w16,w16,w13,ror#11 // Sigma1(e)
295 add w20,w20,w17 // h+=Ch(e,f,g)
296 eor w17,w21,w21,ror#9
297 add w20,w20,w16 // h+=Sigma1(e)
298 and w19,w19,w28 // (b^c)&=(a^b)
299 add w24,w24,w20 // d+=h
300 eor w19,w19,w22 // Maj(a,b,c)
301 eor w17,w13,w17,ror#13 // Sigma0(a)
302 add w20,w20,w19 // h+=Maj(a,b,c)
303 ldr w19,[x30],#4 // *K++, w28 in next round
304 //add w20,w20,w17 // h+=Sigma0(a)
305 #ifndef __AARCH64EB__
308 add w20,w20,w17 // h+=Sigma0(a)
310 add w27,w27,w19 // h+=K[i]
311 eor w14,w24,w24,ror#14
314 add w27,w27,w11 // h+=X[i]
315 orr w17,w17,w19 // Ch(e,f,g)
316 eor w19,w20,w21 // a^b, b^c in next round
317 eor w16,w16,w14,ror#11 // Sigma1(e)
319 add w27,w27,w17 // h+=Ch(e,f,g)
320 eor w17,w20,w20,ror#9
321 add w27,w27,w16 // h+=Sigma1(e)
322 and w28,w28,w19 // (b^c)&=(a^b)
323 add w23,w23,w27 // d+=h
324 eor w28,w28,w21 // Maj(a,b,c)
325 eor w17,w14,w17,ror#13 // Sigma0(a)
326 add w27,w27,w28 // h+=Maj(a,b,c)
327 ldr w28,[x30],#4 // *K++, w19 in next round
328 //add w27,w27,w17 // h+=Sigma0(a)
329 #ifndef __AARCH64EB__
332 ldp w13,w14,[x1],#2*4
333 add w27,w27,w17 // h+=Sigma0(a)
335 add w26,w26,w28 // h+=K[i]
336 eor w15,w23,w23,ror#14
339 add w26,w26,w12 // h+=X[i]
340 orr w17,w17,w28 // Ch(e,f,g)
341 eor w28,w27,w20 // a^b, b^c in next round
342 eor w16,w16,w15,ror#11 // Sigma1(e)
344 add w26,w26,w17 // h+=Ch(e,f,g)
345 eor w17,w27,w27,ror#9
346 add w26,w26,w16 // h+=Sigma1(e)
347 and w19,w19,w28 // (b^c)&=(a^b)
348 add w22,w22,w26 // d+=h
349 eor w19,w19,w20 // Maj(a,b,c)
350 eor w17,w15,w17,ror#13 // Sigma0(a)
351 add w26,w26,w19 // h+=Maj(a,b,c)
352 ldr w19,[x30],#4 // *K++, w28 in next round
353 //add w26,w26,w17 // h+=Sigma0(a)
354 #ifndef __AARCH64EB__
357 add w26,w26,w17 // h+=Sigma0(a)
359 add w25,w25,w19 // h+=K[i]
360 eor w0,w22,w22,ror#14
363 add w25,w25,w13 // h+=X[i]
364 orr w17,w17,w19 // Ch(e,f,g)
365 eor w19,w26,w27 // a^b, b^c in next round
366 eor w16,w16,w0,ror#11 // Sigma1(e)
368 add w25,w25,w17 // h+=Ch(e,f,g)
369 eor w17,w26,w26,ror#9
370 add w25,w25,w16 // h+=Sigma1(e)
371 and w28,w28,w19 // (b^c)&=(a^b)
372 add w21,w21,w25 // d+=h
373 eor w28,w28,w27 // Maj(a,b,c)
374 eor w17,w0,w17,ror#13 // Sigma0(a)
375 add w25,w25,w28 // h+=Maj(a,b,c)
376 ldr w28,[x30],#4 // *K++, w19 in next round
377 //add w25,w25,w17 // h+=Sigma0(a)
378 #ifndef __AARCH64EB__
382 add w25,w25,w17 // h+=Sigma0(a)
385 add w24,w24,w28 // h+=K[i]
386 eor w6,w21,w21,ror#14
389 add w24,w24,w14 // h+=X[i]
390 orr w17,w17,w28 // Ch(e,f,g)
391 eor w28,w25,w26 // a^b, b^c in next round
392 eor w16,w16,w6,ror#11 // Sigma1(e)
394 add w24,w24,w17 // h+=Ch(e,f,g)
395 eor w17,w25,w25,ror#9
396 add w24,w24,w16 // h+=Sigma1(e)
397 and w19,w19,w28 // (b^c)&=(a^b)
398 add w20,w20,w24 // d+=h
399 eor w19,w19,w26 // Maj(a,b,c)
400 eor w17,w6,w17,ror#13 // Sigma0(a)
401 add w24,w24,w19 // h+=Maj(a,b,c)
402 ldr w19,[x30],#4 // *K++, w28 in next round
403 //add w24,w24,w17 // h+=Sigma0(a)
404 #ifndef __AARCH64EB__
407 add w24,w24,w17 // h+=Sigma0(a)
410 add w23,w23,w19 // h+=K[i]
411 eor w7,w20,w20,ror#14
414 add w23,w23,w15 // h+=X[i]
415 orr w17,w17,w19 // Ch(e,f,g)
416 eor w19,w24,w25 // a^b, b^c in next round
417 eor w16,w16,w7,ror#11 // Sigma1(e)
419 add w23,w23,w17 // h+=Ch(e,f,g)
420 eor w17,w24,w24,ror#9
421 add w23,w23,w16 // h+=Sigma1(e)
422 and w28,w28,w19 // (b^c)&=(a^b)
423 add w27,w27,w23 // d+=h
424 eor w28,w28,w25 // Maj(a,b,c)
425 eor w17,w7,w17,ror#13 // Sigma0(a)
426 add w23,w23,w28 // h+=Maj(a,b,c)
427 ldr w28,[x30],#4 // *K++, w19 in next round
428 //add w23,w23,w17 // h+=Sigma0(a)
429 #ifndef __AARCH64EB__
433 add w23,w23,w17 // h+=Sigma0(a)
436 add w22,w22,w28 // h+=K[i]
437 eor w8,w27,w27,ror#14
440 add w22,w22,w0 // h+=X[i]
441 orr w17,w17,w28 // Ch(e,f,g)
442 eor w28,w23,w24 // a^b, b^c in next round
443 eor w16,w16,w8,ror#11 // Sigma1(e)
445 add w22,w22,w17 // h+=Ch(e,f,g)
446 eor w17,w23,w23,ror#9
447 add w22,w22,w16 // h+=Sigma1(e)
448 and w19,w19,w28 // (b^c)&=(a^b)
449 add w26,w26,w22 // d+=h
450 eor w19,w19,w24 // Maj(a,b,c)
451 eor w17,w8,w17,ror#13 // Sigma0(a)
452 add w22,w22,w19 // h+=Maj(a,b,c)
453 ldr w19,[x30],#4 // *K++, w28 in next round
454 //add w22,w22,w17 // h+=Sigma0(a)
455 #ifndef __AARCH64EB__
459 add w22,w22,w17 // h+=Sigma0(a)
462 add w21,w21,w19 // h+=K[i]
463 eor w9,w26,w26,ror#14
466 add w21,w21,w1 // h+=X[i]
467 orr w17,w17,w19 // Ch(e,f,g)
468 eor w19,w22,w23 // a^b, b^c in next round
469 eor w16,w16,w9,ror#11 // Sigma1(e)
471 add w21,w21,w17 // h+=Ch(e,f,g)
472 eor w17,w22,w22,ror#9
473 add w21,w21,w16 // h+=Sigma1(e)
474 and w28,w28,w19 // (b^c)&=(a^b)
475 add w25,w25,w21 // d+=h
476 eor w28,w28,w23 // Maj(a,b,c)
477 eor w17,w9,w17,ror#13 // Sigma0(a)
478 add w21,w21,w28 // h+=Maj(a,b,c)
479 ldr w28,[x30],#4 // *K++, w19 in next round
480 //add w21,w21,w17 // h+=Sigma0(a)
481 #ifndef __AARCH64EB__
485 add w21,w21,w17 // h+=Sigma0(a)
488 add w20,w20,w28 // h+=K[i]
494 add w20,w20,w2 // h+=X[i]
495 eor w16,w16,w25,ror#11
497 orr w17,w17,w28 // Ch(e,f,g)
498 eor w28,w21,w22 // a^b, b^c in next round
499 eor w16,w16,w25,ror#25 // Sigma1(e)
500 eor w10,w10,w21,ror#13
501 add w20,w20,w17 // h+=Ch(e,f,g)
502 and w19,w19,w28 // (b^c)&=(a^b)
504 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
505 add w20,w20,w16 // h+=Sigma1(e)
506 eor w19,w19,w22 // Maj(a,b,c)
507 eor w17,w10,w21,ror#22 // Sigma0(a)
508 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
510 add w24,w24,w20 // d+=h
511 add w20,w20,w19 // h+=Maj(a,b,c)
512 ldr w19,[x30],#4 // *K++, w28 in next round
514 add w20,w20,w17 // h+=Sigma0(a)
520 add w27,w27,w19 // h+=K[i]
526 add w27,w27,w3 // h+=X[i]
527 eor w16,w16,w24,ror#11
528 eor w10,w10,w5,ror#18
529 orr w17,w17,w19 // Ch(e,f,g)
530 eor w19,w20,w21 // a^b, b^c in next round
531 eor w16,w16,w24,ror#25 // Sigma1(e)
532 eor w11,w11,w20,ror#13
533 add w27,w27,w17 // h+=Ch(e,f,g)
534 and w28,w28,w19 // (b^c)&=(a^b)
536 eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
537 add w27,w27,w16 // h+=Sigma1(e)
538 eor w28,w28,w21 // Maj(a,b,c)
539 eor w17,w11,w20,ror#22 // Sigma0(a)
540 eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
542 add w23,w23,w27 // d+=h
543 add w27,w27,w28 // h+=Maj(a,b,c)
544 ldr w28,[x30],#4 // *K++, w19 in next round
546 add w27,w27,w17 // h+=Sigma0(a)
551 add w26,w26,w28 // h+=K[i]
557 add w26,w26,w4 // h+=X[i]
558 eor w16,w16,w23,ror#11
559 eor w11,w11,w6,ror#18
560 orr w17,w17,w28 // Ch(e,f,g)
561 eor w28,w27,w20 // a^b, b^c in next round
562 eor w16,w16,w23,ror#25 // Sigma1(e)
563 eor w12,w12,w27,ror#13
564 add w26,w26,w17 // h+=Ch(e,f,g)
565 and w19,w19,w28 // (b^c)&=(a^b)
566 eor w10,w10,w3,ror#19
567 eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
568 add w26,w26,w16 // h+=Sigma1(e)
569 eor w19,w19,w20 // Maj(a,b,c)
570 eor w17,w12,w27,ror#22 // Sigma0(a)
571 eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
573 add w22,w22,w26 // d+=h
574 add w26,w26,w19 // h+=Maj(a,b,c)
575 ldr w19,[x30],#4 // *K++, w28 in next round
577 add w26,w26,w17 // h+=Sigma0(a)
582 add w25,w25,w19 // h+=K[i]
588 add w25,w25,w5 // h+=X[i]
589 eor w16,w16,w22,ror#11
590 eor w12,w12,w7,ror#18
591 orr w17,w17,w19 // Ch(e,f,g)
592 eor w19,w26,w27 // a^b, b^c in next round
593 eor w16,w16,w22,ror#25 // Sigma1(e)
594 eor w13,w13,w26,ror#13
595 add w25,w25,w17 // h+=Ch(e,f,g)
596 and w28,w28,w19 // (b^c)&=(a^b)
597 eor w11,w11,w4,ror#19
598 eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
599 add w25,w25,w16 // h+=Sigma1(e)
600 eor w28,w28,w27 // Maj(a,b,c)
601 eor w17,w13,w26,ror#22 // Sigma0(a)
602 eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
604 add w21,w21,w25 // d+=h
605 add w25,w25,w28 // h+=Maj(a,b,c)
606 ldr w28,[x30],#4 // *K++, w19 in next round
608 add w25,w25,w17 // h+=Sigma0(a)
613 add w24,w24,w28 // h+=K[i]
619 add w24,w24,w6 // h+=X[i]
620 eor w16,w16,w21,ror#11
621 eor w13,w13,w8,ror#18
622 orr w17,w17,w28 // Ch(e,f,g)
623 eor w28,w25,w26 // a^b, b^c in next round
624 eor w16,w16,w21,ror#25 // Sigma1(e)
625 eor w14,w14,w25,ror#13
626 add w24,w24,w17 // h+=Ch(e,f,g)
627 and w19,w19,w28 // (b^c)&=(a^b)
628 eor w12,w12,w5,ror#19
629 eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
630 add w24,w24,w16 // h+=Sigma1(e)
631 eor w19,w19,w26 // Maj(a,b,c)
632 eor w17,w14,w25,ror#22 // Sigma0(a)
633 eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
635 add w20,w20,w24 // d+=h
636 add w24,w24,w19 // h+=Maj(a,b,c)
637 ldr w19,[x30],#4 // *K++, w28 in next round
639 add w24,w24,w17 // h+=Sigma0(a)
644 add w23,w23,w19 // h+=K[i]
650 add w23,w23,w7 // h+=X[i]
651 eor w16,w16,w20,ror#11
652 eor w14,w14,w9,ror#18
653 orr w17,w17,w19 // Ch(e,f,g)
654 eor w19,w24,w25 // a^b, b^c in next round
655 eor w16,w16,w20,ror#25 // Sigma1(e)
656 eor w15,w15,w24,ror#13
657 add w23,w23,w17 // h+=Ch(e,f,g)
658 and w28,w28,w19 // (b^c)&=(a^b)
659 eor w13,w13,w6,ror#19
660 eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
661 add w23,w23,w16 // h+=Sigma1(e)
662 eor w28,w28,w25 // Maj(a,b,c)
663 eor w17,w15,w24,ror#22 // Sigma0(a)
664 eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
666 add w27,w27,w23 // d+=h
667 add w23,w23,w28 // h+=Maj(a,b,c)
668 ldr w28,[x30],#4 // *K++, w19 in next round
670 add w23,w23,w17 // h+=Sigma0(a)
675 add w22,w22,w28 // h+=K[i]
681 add w22,w22,w8 // h+=X[i]
682 eor w16,w16,w27,ror#11
683 eor w15,w15,w10,ror#18
684 orr w17,w17,w28 // Ch(e,f,g)
685 eor w28,w23,w24 // a^b, b^c in next round
686 eor w16,w16,w27,ror#25 // Sigma1(e)
688 add w22,w22,w17 // h+=Ch(e,f,g)
689 and w19,w19,w28 // (b^c)&=(a^b)
690 eor w14,w14,w7,ror#19
691 eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
692 add w22,w22,w16 // h+=Sigma1(e)
693 eor w19,w19,w24 // Maj(a,b,c)
694 eor w17,w0,w23,ror#22 // Sigma0(a)
695 eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
697 add w26,w26,w22 // d+=h
698 add w22,w22,w19 // h+=Maj(a,b,c)
699 ldr w19,[x30],#4 // *K++, w28 in next round
701 add w22,w22,w17 // h+=Sigma0(a)
706 add w21,w21,w19 // h+=K[i]
712 add w21,w21,w9 // h+=X[i]
713 eor w16,w16,w26,ror#11
715 orr w17,w17,w19 // Ch(e,f,g)
716 eor w19,w22,w23 // a^b, b^c in next round
717 eor w16,w16,w26,ror#25 // Sigma1(e)
719 add w21,w21,w17 // h+=Ch(e,f,g)
720 and w28,w28,w19 // (b^c)&=(a^b)
721 eor w15,w15,w8,ror#19
722 eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
723 add w21,w21,w16 // h+=Sigma1(e)
724 eor w28,w28,w23 // Maj(a,b,c)
725 eor w17,w1,w22,ror#22 // Sigma0(a)
726 eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
728 add w25,w25,w21 // d+=h
729 add w21,w21,w28 // h+=Maj(a,b,c)
730 ldr w28,[x30],#4 // *K++, w19 in next round
732 add w21,w21,w17 // h+=Sigma0(a)
737 add w20,w20,w28 // h+=K[i]
743 add w20,w20,w10 // h+=X[i]
744 eor w16,w16,w25,ror#11
746 orr w17,w17,w28 // Ch(e,f,g)
747 eor w28,w21,w22 // a^b, b^c in next round
748 eor w16,w16,w25,ror#25 // Sigma1(e)
750 add w20,w20,w17 // h+=Ch(e,f,g)
751 and w19,w19,w28 // (b^c)&=(a^b)
753 eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
754 add w20,w20,w16 // h+=Sigma1(e)
755 eor w19,w19,w22 // Maj(a,b,c)
756 eor w17,w2,w21,ror#22 // Sigma0(a)
757 eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
759 add w24,w24,w20 // d+=h
760 add w20,w20,w19 // h+=Maj(a,b,c)
761 ldr w19,[x30],#4 // *K++, w28 in next round
763 add w20,w20,w17 // h+=Sigma0(a)
768 add w27,w27,w19 // h+=K[i]
774 add w27,w27,w11 // h+=X[i]
775 eor w16,w16,w24,ror#11
777 orr w17,w17,w19 // Ch(e,f,g)
778 eor w19,w20,w21 // a^b, b^c in next round
779 eor w16,w16,w24,ror#25 // Sigma1(e)
781 add w27,w27,w17 // h+=Ch(e,f,g)
782 and w28,w28,w19 // (b^c)&=(a^b)
784 eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
785 add w27,w27,w16 // h+=Sigma1(e)
786 eor w28,w28,w21 // Maj(a,b,c)
787 eor w17,w3,w20,ror#22 // Sigma0(a)
788 eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
790 add w23,w23,w27 // d+=h
791 add w27,w27,w28 // h+=Maj(a,b,c)
792 ldr w28,[x30],#4 // *K++, w19 in next round
794 add w27,w27,w17 // h+=Sigma0(a)
799 add w26,w26,w28 // h+=K[i]
805 add w26,w26,w12 // h+=X[i]
806 eor w16,w16,w23,ror#11
808 orr w17,w17,w28 // Ch(e,f,g)
809 eor w28,w27,w20 // a^b, b^c in next round
810 eor w16,w16,w23,ror#25 // Sigma1(e)
812 add w26,w26,w17 // h+=Ch(e,f,g)
813 and w19,w19,w28 // (b^c)&=(a^b)
815 eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
816 add w26,w26,w16 // h+=Sigma1(e)
817 eor w19,w19,w20 // Maj(a,b,c)
818 eor w17,w4,w27,ror#22 // Sigma0(a)
819 eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
821 add w22,w22,w26 // d+=h
822 add w26,w26,w19 // h+=Maj(a,b,c)
823 ldr w19,[x30],#4 // *K++, w28 in next round
825 add w26,w26,w17 // h+=Sigma0(a)
830 add w25,w25,w19 // h+=K[i]
836 add w25,w25,w13 // h+=X[i]
837 eor w16,w16,w22,ror#11
839 orr w17,w17,w19 // Ch(e,f,g)
840 eor w19,w26,w27 // a^b, b^c in next round
841 eor w16,w16,w22,ror#25 // Sigma1(e)
843 add w25,w25,w17 // h+=Ch(e,f,g)
844 and w28,w28,w19 // (b^c)&=(a^b)
846 eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
847 add w25,w25,w16 // h+=Sigma1(e)
848 eor w28,w28,w27 // Maj(a,b,c)
849 eor w17,w5,w26,ror#22 // Sigma0(a)
850 eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
852 add w21,w21,w25 // d+=h
853 add w25,w25,w28 // h+=Maj(a,b,c)
854 ldr w28,[x30],#4 // *K++, w19 in next round
856 add w25,w25,w17 // h+=Sigma0(a)
861 add w24,w24,w28 // h+=K[i]
867 add w24,w24,w14 // h+=X[i]
868 eor w16,w16,w21,ror#11
870 orr w17,w17,w28 // Ch(e,f,g)
871 eor w28,w25,w26 // a^b, b^c in next round
872 eor w16,w16,w21,ror#25 // Sigma1(e)
874 add w24,w24,w17 // h+=Ch(e,f,g)
875 and w19,w19,w28 // (b^c)&=(a^b)
877 eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
878 add w24,w24,w16 // h+=Sigma1(e)
879 eor w19,w19,w26 // Maj(a,b,c)
880 eor w17,w6,w25,ror#22 // Sigma0(a)
881 eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
883 add w20,w20,w24 // d+=h
884 add w24,w24,w19 // h+=Maj(a,b,c)
885 ldr w19,[x30],#4 // *K++, w28 in next round
887 add w24,w24,w17 // h+=Sigma0(a)
892 add w23,w23,w19 // h+=K[i]
898 add w23,w23,w15 // h+=X[i]
899 eor w16,w16,w20,ror#11
901 orr w17,w17,w19 // Ch(e,f,g)
902 eor w19,w24,w25 // a^b, b^c in next round
903 eor w16,w16,w20,ror#25 // Sigma1(e)
905 add w23,w23,w17 // h+=Ch(e,f,g)
906 and w28,w28,w19 // (b^c)&=(a^b)
908 eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
909 add w23,w23,w16 // h+=Sigma1(e)
910 eor w28,w28,w25 // Maj(a,b,c)
911 eor w17,w7,w24,ror#22 // Sigma0(a)
912 eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
914 add w27,w27,w23 // d+=h
915 add w23,w23,w28 // h+=Maj(a,b,c)
916 ldr w28,[x30],#4 // *K++, w19 in next round
918 add w23,w23,w17 // h+=Sigma0(a)
923 add w22,w22,w28 // h+=K[i]
929 add w22,w22,w0 // h+=X[i]
930 eor w16,w16,w27,ror#11
932 orr w17,w17,w28 // Ch(e,f,g)
933 eor w28,w23,w24 // a^b, b^c in next round
934 eor w16,w16,w27,ror#25 // Sigma1(e)
936 add w22,w22,w17 // h+=Ch(e,f,g)
937 and w19,w19,w28 // (b^c)&=(a^b)
939 eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
940 add w22,w22,w16 // h+=Sigma1(e)
941 eor w19,w19,w24 // Maj(a,b,c)
942 eor w17,w8,w23,ror#22 // Sigma0(a)
943 eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
945 add w26,w26,w22 // d+=h
946 add w22,w22,w19 // h+=Maj(a,b,c)
947 ldr w19,[x30],#4 // *K++, w28 in next round
949 add w22,w22,w17 // h+=Sigma0(a)
954 add w21,w21,w19 // h+=K[i]
960 add w21,w21,w1 // h+=X[i]
961 eor w16,w16,w26,ror#11
963 orr w17,w17,w19 // Ch(e,f,g)
964 eor w19,w22,w23 // a^b, b^c in next round
965 eor w16,w16,w26,ror#25 // Sigma1(e)
967 add w21,w21,w17 // h+=Ch(e,f,g)
968 and w28,w28,w19 // (b^c)&=(a^b)
970 eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
971 add w21,w21,w16 // h+=Sigma1(e)
972 eor w28,w28,w23 // Maj(a,b,c)
973 eor w17,w9,w22,ror#22 // Sigma0(a)
974 eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
976 add w25,w25,w21 // d+=h
977 add w21,w21,w28 // h+=Maj(a,b,c)
978 ldr w28,[x30],#4 // *K++, w19 in next round
980 add w21,w21,w17 // h+=Sigma0(a)
985 add w20,w20,w28 // h+=K[i]
991 add w20,w20,w2 // h+=X[i]
992 eor w16,w16,w25,ror#11
994 orr w17,w17,w28 // Ch(e,f,g)
995 eor w28,w21,w22 // a^b, b^c in next round
996 eor w16,w16,w25,ror#25 // Sigma1(e)
997 eor w10,w10,w21,ror#13
998 add w20,w20,w17 // h+=Ch(e,f,g)
999 and w19,w19,w28 // (b^c)&=(a^b)
1001 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
1002 add w20,w20,w16 // h+=Sigma1(e)
1003 eor w19,w19,w22 // Maj(a,b,c)
1004 eor w17,w10,w21,ror#22 // Sigma0(a)
1005 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
1007 add w24,w24,w20 // d+=h
1008 add w20,w20,w19 // h+=Maj(a,b,c)
1009 ldr w19,[x30],#4 // *K++, w28 in next round
1011 add w20,w20,w17 // h+=Sigma0(a)
1013 cbnz w19,.Loop_16_xx
1017 sub x30,x30,#260 // rewind
1021 add x1,x1,#14*4 // advance input pointer
1024 ldp w9,w10,[x0,#6*4]
1031 stp w22,w23,[x0,#2*4]
1035 stp w24,w25,[x0,#4*4]
1036 stp w26,w27,[x0,#6*4]
1039 ldp x19,x20,[x29,#16]
1041 ldp x21,x22,[x29,#32]
1042 ldp x23,x24,[x29,#48]
1043 ldp x25,x26,[x29,#64]
1044 ldp x27,x28,[x29,#80]
1045 ldp x29,x30,[sp],#128
1047 .size sha256_block_data_order,.-sha256_block_data_order
1050 .type .LK256,%object
1052 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1053 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1054 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1055 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1056 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1057 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1058 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1059 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1060 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1061 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1062 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1063 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1064 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1065 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1066 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1067 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1068 .long 0 //terminator
1069 .size .LK256,.-.LK256
1074 .long OPENSSL_armcap_P-.
1076 .quad OPENSSL_armcap_P-.
1079 .asciz "SHA256 block transform for ARMv8, CRYPTOGAMS by <appro@openssl.org>"
1082 .type sha256_block_armv8,%function
1086 stp x29,x30,[sp,#-16]!
1089 ld1 {v0.4s,v1.4s},[x0]
1093 ld1 {v4.16b-v7.16b},[x1],#64
1095 ld1 {v16.4s},[x3],#16
1100 orr v18.16b,v0.16b,v0.16b // offload
1101 orr v19.16b,v1.16b,v1.16b
1102 ld1 {v17.4s},[x3],#16
1103 add v16.4s,v16.4s,v4.4s
1104 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1105 orr v2.16b,v0.16b,v0.16b
1106 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1107 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1108 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1109 ld1 {v16.4s},[x3],#16
1110 add v17.4s,v17.4s,v5.4s
1111 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1112 orr v2.16b,v0.16b,v0.16b
1113 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1114 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1115 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1116 ld1 {v17.4s},[x3],#16
1117 add v16.4s,v16.4s,v6.4s
1118 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1119 orr v2.16b,v0.16b,v0.16b
1120 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1121 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1122 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1123 ld1 {v16.4s},[x3],#16
1124 add v17.4s,v17.4s,v7.4s
1125 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1126 orr v2.16b,v0.16b,v0.16b
1127 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1128 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1129 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1130 ld1 {v17.4s},[x3],#16
1131 add v16.4s,v16.4s,v4.4s
1132 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1133 orr v2.16b,v0.16b,v0.16b
1134 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1135 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1136 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1137 ld1 {v16.4s},[x3],#16
1138 add v17.4s,v17.4s,v5.4s
1139 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1140 orr v2.16b,v0.16b,v0.16b
1141 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1142 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1143 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1144 ld1 {v17.4s},[x3],#16
1145 add v16.4s,v16.4s,v6.4s
1146 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1147 orr v2.16b,v0.16b,v0.16b
1148 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1149 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1150 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1151 ld1 {v16.4s},[x3],#16
1152 add v17.4s,v17.4s,v7.4s
1153 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1154 orr v2.16b,v0.16b,v0.16b
1155 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1156 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1157 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1158 ld1 {v17.4s},[x3],#16
1159 add v16.4s,v16.4s,v4.4s
1160 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1161 orr v2.16b,v0.16b,v0.16b
1162 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1163 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1164 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1165 ld1 {v16.4s},[x3],#16
1166 add v17.4s,v17.4s,v5.4s
1167 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1168 orr v2.16b,v0.16b,v0.16b
1169 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1170 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1171 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1172 ld1 {v17.4s},[x3],#16
1173 add v16.4s,v16.4s,v6.4s
1174 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1175 orr v2.16b,v0.16b,v0.16b
1176 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1177 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1178 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1179 ld1 {v16.4s},[x3],#16
1180 add v17.4s,v17.4s,v7.4s
1181 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1182 orr v2.16b,v0.16b,v0.16b
1183 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1184 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1185 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1186 ld1 {v17.4s},[x3],#16
1187 add v16.4s,v16.4s,v4.4s
1188 orr v2.16b,v0.16b,v0.16b
1189 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1190 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1192 ld1 {v16.4s},[x3],#16
1193 add v17.4s,v17.4s,v5.4s
1194 orr v2.16b,v0.16b,v0.16b
1195 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1196 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1199 add v16.4s,v16.4s,v6.4s
1200 sub x3,x3,#64*4-16 // rewind
1201 orr v2.16b,v0.16b,v0.16b
1202 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1203 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1205 add v17.4s,v17.4s,v7.4s
1206 orr v2.16b,v0.16b,v0.16b
1207 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1208 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1210 add v0.4s,v0.4s,v18.4s
1211 add v1.4s,v1.4s,v19.4s
1215 st1 {v0.4s,v1.4s},[x0]
1219 .size sha256_block_armv8,.-sha256_block_armv8
1222 .globl sha256_block_neon
1224 .type sha256_block_neon,%function
1228 stp x29, x30, [sp, #-16]!
1233 add x2,x1,x2,lsl#6 // len to point at the end of inp
1235 ld1 {v0.16b},[x1], #16
1236 ld1 {v1.16b},[x1], #16
1237 ld1 {v2.16b},[x1], #16
1238 ld1 {v3.16b},[x1], #16
1239 ld1 {v4.4s},[x16], #16
1240 ld1 {v5.4s},[x16], #16
1241 ld1 {v6.4s},[x16], #16
1242 ld1 {v7.4s},[x16], #16
1243 rev32 v0.16b,v0.16b // yes, even on
1244 rev32 v1.16b,v1.16b // big-endian
1248 add v4.4s,v4.4s,v0.4s
1249 add v5.4s,v5.4s,v1.4s
1250 add v6.4s,v6.4s,v2.4s
1251 st1 {v4.4s-v5.4s},[x17], #32
1252 add v7.4s,v7.4s,v3.4s
1253 st1 {v6.4s-v7.4s},[x17]
1268 ext v4.16b,v0.16b,v1.16b,#4
1273 ext v7.16b,v2.16b,v3.16b,#4
1278 eor w11,w11,w7,ror#19
1280 eor w15,w3,w3,ror#11
1283 add v0.4s,v0.4s,v7.4s
1287 eor w15,w15,w3,ror#20
1288 ushr v7.4s,v4.4s,#18
1292 eor v5.16b,v5.16b,v6.16b
1297 ushr v16.4s,v19.4s,#17
1301 eor v5.16b,v5.16b,v7.16b
1304 sli v16.4s,v19.4s,#15
1307 ushr v17.4s,v19.4s,#10
1308 eor w11,w11,w6,ror#19
1309 eor w15,w10,w10,ror#11
1310 ushr v7.4s,v19.4s,#19
1313 add v0.4s,v0.4s,v5.4s
1315 eor w15,w15,w10,ror#20
1316 sli v7.4s,v19.4s,#13
1320 eor v17.16b,v17.16b,v16.16b
1324 eor v17.16b,v17.16b,v7.16b
1328 add v0.4s,v0.4s,v17.4s
1332 ushr v18.4s,v0.4s,#17
1334 ushr v19.4s,v0.4s,#10
1335 eor w11,w11,w5,ror#19
1336 eor w15,w9,w9,ror#11
1337 sli v18.4s,v0.4s,#15
1339 ushr v17.4s,v0.4s,#19
1342 eor v19.16b,v19.16b,v18.16b
1343 eor w15,w15,w9,ror#20
1345 sli v17.4s,v0.4s,#13
1349 ld1 {v4.4s},[x16], #16
1351 eor v19.16b,v19.16b,v17.16b
1353 eor v17.16b,v17.16b,v17.16b
1357 mov v17.d[1],v19.d[0]
1361 add v0.4s,v0.4s,v17.4s
1363 eor w11,w11,w4,ror#19
1364 eor w15,w8,w8,ror#11
1365 add v4.4s,v4.4s,v0.4s
1369 eor w15,w15,w8,ror#20
1376 st1 {v4.4s},[x17], #16
1377 ext v4.16b,v1.16b,v2.16b,#4
1382 ext v7.16b,v3.16b,v0.16b,#4
1387 eor w11,w11,w3,ror#19
1389 eor w15,w7,w7,ror#11
1392 add v1.4s,v1.4s,v7.4s
1396 eor w15,w15,w7,ror#20
1397 ushr v7.4s,v4.4s,#18
1401 eor v5.16b,v5.16b,v6.16b
1406 ushr v16.4s,v19.4s,#17
1410 eor v5.16b,v5.16b,v7.16b
1412 eor w11,w10,w10,ror#5
1413 sli v16.4s,v19.4s,#15
1416 ushr v17.4s,v19.4s,#10
1417 eor w11,w11,w10,ror#19
1418 eor w15,w6,w6,ror#11
1419 ushr v7.4s,v19.4s,#19
1422 add v1.4s,v1.4s,v5.4s
1424 eor w15,w15,w6,ror#20
1425 sli v7.4s,v19.4s,#13
1429 eor v17.16b,v17.16b,v16.16b
1433 eor v17.16b,v17.16b,v7.16b
1437 add v1.4s,v1.4s,v17.4s
1441 ushr v18.4s,v1.4s,#17
1443 ushr v19.4s,v1.4s,#10
1444 eor w11,w11,w9,ror#19
1445 eor w15,w5,w5,ror#11
1446 sli v18.4s,v1.4s,#15
1448 ushr v17.4s,v1.4s,#19
1451 eor v19.16b,v19.16b,v18.16b
1452 eor w15,w15,w5,ror#20
1454 sli v17.4s,v1.4s,#13
1458 ld1 {v4.4s},[x16], #16
1460 eor v19.16b,v19.16b,v17.16b
1462 eor v17.16b,v17.16b,v17.16b
1466 mov v17.d[1],v19.d[0]
1470 add v1.4s,v1.4s,v17.4s
1472 eor w11,w11,w8,ror#19
1473 eor w15,w4,w4,ror#11
1474 add v4.4s,v4.4s,v1.4s
1478 eor w15,w15,w4,ror#20
1485 st1 {v4.4s},[x17], #16
1486 ext v4.16b,v2.16b,v3.16b,#4
1491 ext v7.16b,v0.16b,v1.16b,#4
1496 eor w11,w11,w7,ror#19
1498 eor w15,w3,w3,ror#11
1501 add v2.4s,v2.4s,v7.4s
1505 eor w15,w15,w3,ror#20
1506 ushr v7.4s,v4.4s,#18
1510 eor v5.16b,v5.16b,v6.16b
1515 ushr v16.4s,v19.4s,#17
1519 eor v5.16b,v5.16b,v7.16b
1522 sli v16.4s,v19.4s,#15
1525 ushr v17.4s,v19.4s,#10
1526 eor w11,w11,w6,ror#19
1527 eor w15,w10,w10,ror#11
1528 ushr v7.4s,v19.4s,#19
1531 add v2.4s,v2.4s,v5.4s
1533 eor w15,w15,w10,ror#20
1534 sli v7.4s,v19.4s,#13
1538 eor v17.16b,v17.16b,v16.16b
1542 eor v17.16b,v17.16b,v7.16b
1546 add v2.4s,v2.4s,v17.4s
1550 ushr v18.4s,v2.4s,#17
1552 ushr v19.4s,v2.4s,#10
1553 eor w11,w11,w5,ror#19
1554 eor w15,w9,w9,ror#11
1555 sli v18.4s,v2.4s,#15
1557 ushr v17.4s,v2.4s,#19
1560 eor v19.16b,v19.16b,v18.16b
1561 eor w15,w15,w9,ror#20
1563 sli v17.4s,v2.4s,#13
1567 ld1 {v4.4s},[x16], #16
1569 eor v19.16b,v19.16b,v17.16b
1571 eor v17.16b,v17.16b,v17.16b
1575 mov v17.d[1],v19.d[0]
1579 add v2.4s,v2.4s,v17.4s
1581 eor w11,w11,w4,ror#19
1582 eor w15,w8,w8,ror#11
1583 add v4.4s,v4.4s,v2.4s
1587 eor w15,w15,w8,ror#20
1594 st1 {v4.4s},[x17], #16
1595 ext v4.16b,v3.16b,v0.16b,#4
1600 ext v7.16b,v1.16b,v2.16b,#4
1605 eor w11,w11,w3,ror#19
1607 eor w15,w7,w7,ror#11
1610 add v3.4s,v3.4s,v7.4s
1614 eor w15,w15,w7,ror#20
1615 ushr v7.4s,v4.4s,#18
1619 eor v5.16b,v5.16b,v6.16b
1624 ushr v16.4s,v19.4s,#17
1628 eor v5.16b,v5.16b,v7.16b
1630 eor w11,w10,w10,ror#5
1631 sli v16.4s,v19.4s,#15
1634 ushr v17.4s,v19.4s,#10
1635 eor w11,w11,w10,ror#19
1636 eor w15,w6,w6,ror#11
1637 ushr v7.4s,v19.4s,#19
1640 add v3.4s,v3.4s,v5.4s
1642 eor w15,w15,w6,ror#20
1643 sli v7.4s,v19.4s,#13
1647 eor v17.16b,v17.16b,v16.16b
1651 eor v17.16b,v17.16b,v7.16b
1655 add v3.4s,v3.4s,v17.4s
1659 ushr v18.4s,v3.4s,#17
1661 ushr v19.4s,v3.4s,#10
1662 eor w11,w11,w9,ror#19
1663 eor w15,w5,w5,ror#11
1664 sli v18.4s,v3.4s,#15
1666 ushr v17.4s,v3.4s,#19
1669 eor v19.16b,v19.16b,v18.16b
1670 eor w15,w15,w5,ror#20
1672 sli v17.4s,v3.4s,#13
1676 ld1 {v4.4s},[x16], #16
1678 eor v19.16b,v19.16b,v17.16b
1680 eor v17.16b,v17.16b,v17.16b
1684 mov v17.d[1],v19.d[0]
1688 add v3.4s,v3.4s,v17.4s
1690 eor w11,w11,w8,ror#19
1691 eor w15,w4,w4,ror#11
1692 add v4.4s,v4.4s,v3.4s
1696 eor w15,w15,w4,ror#20
1703 st1 {v4.4s},[x17], #16
1704 cmp w12,#0 // check for K256 terminator
1709 sub x16,x16,#256 // rewind x16
1712 csel x17, x17, xzr, eq
1713 sub x1,x1,x17 // avoid SEGV
1718 ld1 {v0.16b},[x1],#16
1721 ld1 {v4.4s},[x16],#16
1724 eor w11,w11,w7,ror#19
1725 eor w15,w3,w3,ror#11
1730 eor w15,w15,w3,ror#20
1731 add v4.4s,v4.4s,v0.4s
1745 eor w11,w11,w6,ror#19
1746 eor w15,w10,w10,ror#11
1750 eor w15,w15,w10,ror#20
1764 eor w11,w11,w5,ror#19
1765 eor w15,w9,w9,ror#11
1769 eor w15,w15,w9,ror#20
1783 eor w11,w11,w4,ror#19
1784 eor w15,w8,w8,ror#11
1788 eor w15,w15,w8,ror#20
1795 st1 {v4.4s},[x17], #16
1799 ld1 {v1.16b},[x1],#16
1802 ld1 {v4.4s},[x16],#16
1805 eor w11,w11,w3,ror#19
1806 eor w15,w7,w7,ror#11
1811 eor w15,w15,w7,ror#20
1812 add v4.4s,v4.4s,v1.4s
1823 eor w11,w10,w10,ror#5
1826 eor w11,w11,w10,ror#19
1827 eor w15,w6,w6,ror#11
1831 eor w15,w15,w6,ror#20
1845 eor w11,w11,w9,ror#19
1846 eor w15,w5,w5,ror#11
1850 eor w15,w15,w5,ror#20
1864 eor w11,w11,w8,ror#19
1865 eor w15,w4,w4,ror#11
1869 eor w15,w15,w4,ror#20
1876 st1 {v4.4s},[x17], #16
1880 ld1 {v2.16b},[x1],#16
1883 ld1 {v4.4s},[x16],#16
1886 eor w11,w11,w7,ror#19
1887 eor w15,w3,w3,ror#11
1892 eor w15,w15,w3,ror#20
1893 add v4.4s,v4.4s,v2.4s
1907 eor w11,w11,w6,ror#19
1908 eor w15,w10,w10,ror#11
1912 eor w15,w15,w10,ror#20
1926 eor w11,w11,w5,ror#19
1927 eor w15,w9,w9,ror#11
1931 eor w15,w15,w9,ror#20
1945 eor w11,w11,w4,ror#19
1946 eor w15,w8,w8,ror#11
1950 eor w15,w15,w8,ror#20
1957 st1 {v4.4s},[x17], #16
1961 ld1 {v3.16b},[x1],#16
1964 ld1 {v4.4s},[x16],#16
1967 eor w11,w11,w3,ror#19
1968 eor w15,w7,w7,ror#11
1973 eor w15,w15,w7,ror#20
1974 add v4.4s,v4.4s,v3.4s
1985 eor w11,w10,w10,ror#5
1988 eor w11,w11,w10,ror#19
1989 eor w15,w6,w6,ror#11
1993 eor w15,w15,w6,ror#20
2007 eor w11,w11,w9,ror#19
2008 eor w15,w5,w5,ror#11
2012 eor w15,w15,w5,ror#20
2026 eor w11,w11,w8,ror#19
2027 eor w15,w4,w4,ror#11
2031 eor w15,w15,w4,ror#20
2037 st1 {v4.4s},[x17], #16
2038 add w3,w3,w15 // h+=Sigma0(a) from the past
2040 add w3,w3,w13 // h+=Maj(a,b,c) from the past
2042 add w3,w3,w11 // accumulate
2044 ldp w11,w12,[x0,#16]
2047 ldp w13,w14,[x0,#24]
2066 .size sha256_block_neon,.-sha256_block_neon
2068 .comm OPENSSL_armcap_P,4,4