2 * Copyright 2012 pooler@litecoinpool.org
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
7 * any later version. See COPYING for more details.
10 #if defined(__arm__) && defined(__APCS_32__)
14 .long 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
15 .long 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
16 .long 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
17 .long 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
18 .long 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
19 .long 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
20 .long 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
21 .long 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
22 .long 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
23 .long 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
24 .long 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
25 .long 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
26 .long 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
27 .long 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
28 .long 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
29 .long 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
32 .macro sha256_extend_doubleround_core i, rw, ra, rb, ry, rz
35 eor r12, r12, \ry, ror #19
37 eor r12, r12, \ry, lsr #10
38 eor \ra, \ra, lr, ror #18
40 ldr r11, [\rw, #(\i+2)*4]
41 eor \ra, \ra, lr, lsr #3
45 str \ra, [\rw, #(\i+16)*4]
47 eor r12, r12, \rz, ror #19
49 eor r12, r12, \rz, lsr #10
50 eor \rb, \rb, r11, ror #18
52 eor \rb, \rb, r11, lsr #3
56 .macro sha256_extend_doubleround_head i, rw, ra, rb, ry, rz
57 ldr lr, [\rw, #(\i+1)*4]
58 sha256_extend_doubleround_core \i, \rw, \ra, \rb, \ry, \rz
59 ldr lr, [\rw, #(\i+3)*4]
62 .macro sha256_extend_doubleround_body i, rw, ra, rb, ry, rz
63 str \rz, [\rw, #(\i+15)*4]
64 sha256_extend_doubleround_core \i, \rw, \ra, \rb, \ry, \rz
65 ldr lr, [\rw, #(\i+3)*4]
68 .macro sha256_extend_doubleround_foot i, rw, ra, rb, ry, rz
69 str \rz, [\rw, #(\i+15)*4]
70 sha256_extend_doubleround_core \i, \rw, \ra, \rb, \ry, \rz
71 str \rb, [\rw, #(\i+17)*4]
74 .macro sha256_main_round i, ka, rw, ra, rb, rc, rd, re, rf, rg, rh
75 ldr r12, [\rw, #(\i)*4]
81 eor lr, \re, \re, ror #5
83 eor lr, lr, \re, ror #19
86 add \rh, \rh, lr, ror #6
89 eor r12, \ra, \ra, ror #11
91 eor r12, r12, \ra, ror #20
95 add \rd, r3, r12, ror #2
98 .macro sha256_main_quadround i, ka, rw
99 sha256_main_round \i+0, \ka, \rw, r4, r5, r6, r7, r8, r9, r10, r11
100 sha256_main_round \i+1, \ka, \rw, r7, r4, r5, r6, r11, r8, r9, r10
101 sha256_main_round \i+2, \ka, \rw, r6, r7, r4, r5, r10, r11, r8, r9
102 sha256_main_round \i+3, \ka, \rw, r5, r6, r7, r4, r9, r10, r11, r8
109 .globl sha256_transform
110 .globl _sha256_transform
112 .type sha256_transform, %function
116 stmfd sp!, {r4-r11, lr}
119 bne sha256_transform_swap
126 b sha256_transform_extend
129 eor r12, \rn, \rn, ror #16
130 bic r12, r12, #0x00ff0000
132 eor \rd, \rd, r12, lsr #8
135 sha256_transform_swap:
158 sha256_transform_extend:
162 sha256_extend_doubleround_head 0, sp, r4, r5, r9, r10
163 sha256_extend_doubleround_body 2, sp, r6, r7, r4, r5
164 sha256_extend_doubleround_body 4, sp, r8, r9, r6, r7
165 sha256_extend_doubleround_body 6, sp, r10, r4, r8, r9
166 sha256_extend_doubleround_body 8, sp, r5, r6, r10, r4
167 sha256_extend_doubleround_body 10, sp, r7, r8, r5, r6
168 sha256_extend_doubleround_body 12, sp, r9, r10, r7, r8
169 sha256_extend_doubleround_body 14, sp, r4, r5, r9, r10
170 sha256_extend_doubleround_body 16, sp, r6, r7, r4, r5
171 sha256_extend_doubleround_body 18, sp, r8, r9, r6, r7
172 sha256_extend_doubleround_body 20, sp, r10, r4, r8, r9
173 sha256_extend_doubleround_body 22, sp, r5, r6, r10, r4
174 sha256_extend_doubleround_body 24, sp, r7, r8, r5, r6
175 sha256_extend_doubleround_body 26, sp, r9, r10, r7, r8
176 sha256_extend_doubleround_body 28, sp, r4, r5, r9, r10
177 sha256_extend_doubleround_body 30, sp, r6, r7, r4, r5
178 sha256_extend_doubleround_body 32, sp, r8, r9, r6, r7
179 sha256_extend_doubleround_body 34, sp, r10, r4, r8, r9
180 sha256_extend_doubleround_body 36, sp, r5, r6, r10, r4
181 sha256_extend_doubleround_body 38, sp, r7, r8, r5, r6
182 sha256_extend_doubleround_body 40, sp, r9, r10, r7, r8
183 sha256_extend_doubleround_body 42, sp, r4, r5, r9, r10
184 sha256_extend_doubleround_body 44, sp, r6, r7, r4, r5
185 sha256_extend_doubleround_foot 46, sp, r8, r9, r6, r7
188 sha256_main_quadround 0, sha256_transform_k, sp
189 sha256_main_quadround 4, sha256_transform_k, sp
190 sha256_main_quadround 8, sha256_transform_k, sp
191 sha256_main_quadround 12, sha256_transform_k, sp
192 sha256_main_quadround 16, sha256_transform_k, sp
193 sha256_main_quadround 20, sha256_transform_k, sp
194 sha256_main_quadround 24, sha256_transform_k, sp
195 sha256_main_quadround 28, sha256_transform_k, sp
196 b sha256_transform_k_over
199 sha256_transform_k_over:
200 sha256_main_quadround 32, sha256_transform_k, sp
201 sha256_main_quadround 36, sha256_transform_k, sp
202 sha256_main_quadround 40, sha256_transform_k, sp
203 sha256_main_quadround 44, sha256_transform_k, sp
204 sha256_main_quadround 48, sha256_transform_k, sp
205 sha256_main_quadround 52, sha256_transform_k, sp
206 sha256_main_quadround 56, sha256_transform_k, sp
207 sha256_main_quadround 60, sha256_transform_k, sp
209 ldmia r0, {r1, r2, r3, r12}
215 ldmia r0, {r1, r2, r3, r12}
224 ldmfd sp!, {r4-r11, lr}
227 ldmfd sp!, {r4-r11, pc}
237 .type sha256d_ms, %function
241 stmfd sp!, {r4-r11, lr}
252 eor r12, r12, lr, ror #18
254 eor r12, r12, lr, lsr #3
263 eor r12, r12, r6, ror #19
265 eor r12, r12, r6, lsr #10
272 eor r9, r9, r7, ror #19
274 eor r9, r9, r7, lsr #10
279 eor r12, r12, r8, ror #19
281 eor r12, r12, r8, lsr #10
286 eor lr, lr, r9, ror #19
288 eor lr, lr, r9, lsr #10
292 mov r12, r10, ror #17
294 eor r12, r12, r10, ror #19
296 eor r12, r12, r10, lsr #10
297 eor lr, lr, r4, ror #19
299 eor lr, lr, r4, lsr #10
305 eor r12, r12, r5, ror #19
307 eor r12, r12, r5, lsr #10
308 eor lr, lr, r6, ror #19
310 eor lr, lr, r6, lsr #10
316 eor r12, r12, r7, ror #19
318 eor r12, r12, r7, lsr #10
319 eor lr, lr, r8, ror #19
321 eor lr, lr, r8, lsr #10
328 eor r12, r12, r9, ror #19
330 eor r12, r12, r9, lsr #10
333 mov r12, r10, ror #17
337 eor r12, r12, r10, ror #19
339 eor r12, r12, r10, lsr #10
343 sha256d_ms_extend_loop2:
344 sha256_extend_doubleround_body 16, r1, r6, r7, r4, r5
345 sha256_extend_doubleround_body 18, r1, r8, r9, r6, r7
346 sha256_extend_doubleround_body 20, r1, r10, r4, r8, r9
347 sha256_extend_doubleround_body 22, r1, r5, r6, r10, r4
348 sha256_extend_doubleround_body 24, r1, r7, r8, r5, r6
349 sha256_extend_doubleround_body 26, r1, r9, r10, r7, r8
350 sha256_extend_doubleround_body 28, r1, r4, r5, r9, r10
351 sha256_extend_doubleround_body 30, r1, r6, r7, r4, r5
352 sha256_extend_doubleround_body 32, r1, r8, r9, r6, r7
353 sha256_extend_doubleround_body 34, r1, r10, r4, r8, r9
354 sha256_extend_doubleround_body 36, r1, r5, r6, r10, r4
355 sha256_extend_doubleround_body 38, r1, r7, r8, r5, r6
356 sha256_extend_doubleround_body 40, r1, r9, r10, r7, r8
357 sha256_extend_doubleround_body 42, r1, r4, r5, r9, r10
358 bne sha256d_ms_extend_coda2
359 sha256_extend_doubleround_body 44, r1, r6, r7, r4, r5
360 sha256_extend_doubleround_foot 46, r1, r8, r9, r6, r7
370 b sha256d_ms_main_loop1
372 sha256d_ms_main_loop2:
373 sha256_main_round 0, sha256d_ms_k, r1, r4, r5, r6, r7, r8, r9, r10, r11
374 sha256_main_round 1, sha256d_ms_k, r1, r7, r4, r5, r6, r11, r8, r9, r10
375 sha256_main_round 2, sha256d_ms_k, r1, r6, r7, r4, r5, r10, r11, r8, r9
376 sha256d_ms_main_loop1:
377 sha256_main_round 3, sha256d_ms_k, r1, r5, r6, r7, r4, r9, r10, r11, r8
378 sha256_main_quadround 4, sha256d_ms_k, r1
379 sha256_main_quadround 8, sha256d_ms_k, r1
380 sha256_main_quadround 12, sha256d_ms_k, r1
381 sha256_main_quadround 16, sha256d_ms_k, r1
382 sha256_main_quadround 20, sha256d_ms_k, r1
383 sha256_main_quadround 24, sha256d_ms_k, r1
384 sha256_main_quadround 28, sha256d_ms_k, r1
389 sha256_main_quadround 32, sha256d_ms_k, r1
390 sha256_main_quadround 36, sha256d_ms_k, r1
391 sha256_main_quadround 40, sha256d_ms_k, r1
392 sha256_main_quadround 44, sha256d_ms_k, r1
393 sha256_main_quadround 48, sha256d_ms_k, r1
394 sha256_main_quadround 52, sha256d_ms_k, r1
395 sha256_main_round 56, sha256d_ms_k, r1, r4, r5, r6, r7, r8, r9, r10, r11
396 bne sha256d_ms_finish
397 sha256_main_round 57, sha256d_ms_k, r1, r7, r4, r5, r6, r11, r8, r9, r10
398 sha256_main_round 58, sha256d_ms_k, r1, r6, r7, r4, r5, r10, r11, r8, r9
399 sha256_main_round 59, sha256d_ms_k, r1, r5, r6, r7, r4, r9, r10, r11, r8
400 sha256_main_quadround 60, sha256d_ms_k, r1
402 ldmia r2!, {r3, r12, lr}
407 ldmia r2, {r3, r4, r5, r6, r12}
443 eor r12, r12, lr, ror #18
444 add r5, lr, #0x00a00000
445 eor r12, r12, lr, lsr #3
448 eor lr, lr, r11, ror #18
450 eor lr, lr, r11, lsr #3
456 eor r12, r12, r4, ror #19
458 eor r12, r12, r4, lsr #10
459 eor r6, r6, lr, ror #18
461 eor r6, r6, lr, lsr #3
467 eor r12, r12, r5, ror #19
469 eor r12, r12, r5, lsr #10
470 eor r7, r7, r11, ror #18
472 eor r7, r7, r11, lsr #3
478 eor r12, r12, r6, ror #19
480 eor r12, r12, r6, lsr #10
481 eor r8, r8, lr, ror #18
483 eor r8, r8, lr, lsr #3
489 eor r12, r12, r7, ror #19
491 eor r12, r12, r7, lsr #10
492 eor r9, r9, r11, ror #18
494 eor r9, r9, r11, lsr #3
500 eor r12, r12, r8, ror #19
502 eor r12, r12, r8, lsr #10
503 eor r10, r10, lr, ror #18
505 eor r10, r10, lr, lsr #3
507 add r11, r11, #0x00000100
511 eor r12, r12, r9, ror #19
513 add lr, lr, #0x11000000
514 eor r12, r12, r9, lsr #10
516 mov r12, r10, ror #17
517 add r4, lr, #0x00002000
518 eor r12, r12, r10, ror #19
520 add r5, r5, #0x80000000
521 eor r12, r12, r10, lsr #10
526 eor r12, r12, r4, ror #19
528 eor r12, r12, r4, lsr #10
529 eor r11, r11, r5, ror #19
531 eor r11, r11, r5, lsr #10
537 eor r12, r12, r6, ror #19
539 eor r12, r12, r6, lsr #10
540 eor r11, r11, r7, ror #19
542 eor r11, r11, r7, lsr #10
549 add r4, r4, #0x00400000
550 eor lr, lr, r8, ror #19
551 eor r12, r12, r9, ror #19
552 eor lr, lr, r8, lsr #10
553 eor r12, r12, r9, lsr #10
554 add r4, r4, #0x00000022
559 add r5, r5, #0x00000100
563 mov r12, r10, ror #17
564 eor lr, lr, r11, ror #18
565 eor r12, r12, r10, ror #19
566 eor lr, lr, r11, lsr #3
567 eor r12, r12, r10, lsr #10
572 b sha256d_ms_extend_loop2
574 sha256d_ms_extend_coda2:
575 str r5, [r1, #(44+15)*4]
579 eor r12, r12, r4, ror #19
580 eor r6, r6, lr, ror #18
581 eor r12, r12, r4, lsr #10
582 eor r6, r6, lr, lsr #3
585 str r6, [r1, #(44+16)*4]
589 b sha256d_ms_main_loop2
592 .long 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a
593 .long 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
595 .macro sha256_main_round_red i, ka, rw, rd, re, rf, rg, rh
596 ldr r12, [\rw, #(\i)*4]
603 eor lr, \re, \re, ror #5
605 eor lr, lr, \re, ror #19
607 add \rh, \rh, lr, ror #6
611 sha256_main_round_red 57, sha256d_ms_k, r1, r6, r11, r8, r9, r10
612 sha256_main_round_red 58, sha256d_ms_k, r1, r5, r10, r11, r8, r9
613 sha256_main_round_red 59, sha256d_ms_k, r1, r4, r9, r10, r11, r8
615 sha256_main_round_red 60, sha256d_ms_k, r1, r7, r8, r9, r10, r11
622 ldmfd sp!, {r4-r11, lr}
625 ldmfd sp!, {r4-r11, pc}
634 .globl sha256_init_4way
635 .globl _sha256_init_4way
637 .type sha256_init_4way, %function
647 .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
648 .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
649 .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
650 .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
651 .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
652 .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
653 .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
654 .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
657 .long 0x428a2f98, 0x428a2f98, 0x428a2f98, 0x428a2f98
658 .long 0x71374491, 0x71374491, 0x71374491, 0x71374491
659 .long 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf
660 .long 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5
661 .long 0x3956c25b, 0x3956c25b, 0x3956c25b, 0x3956c25b
662 .long 0x59f111f1, 0x59f111f1, 0x59f111f1, 0x59f111f1
663 .long 0x923f82a4, 0x923f82a4, 0x923f82a4, 0x923f82a4
664 .long 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5
665 .long 0xd807aa98, 0xd807aa98, 0xd807aa98, 0xd807aa98
666 .long 0x12835b01, 0x12835b01, 0x12835b01, 0x12835b01
667 .long 0x243185be, 0x243185be, 0x243185be, 0x243185be
668 .long 0x550c7dc3, 0x550c7dc3, 0x550c7dc3, 0x550c7dc3
669 .long 0x72be5d74, 0x72be5d74, 0x72be5d74, 0x72be5d74
670 .long 0x80deb1fe, 0x80deb1fe, 0x80deb1fe, 0x80deb1fe
671 .long 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7
672 .long 0xc19bf174, 0xc19bf174, 0xc19bf174, 0xc19bf174
673 .long 0xe49b69c1, 0xe49b69c1, 0xe49b69c1, 0xe49b69c1
674 .long 0xefbe4786, 0xefbe4786, 0xefbe4786, 0xefbe4786
675 .long 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6
676 .long 0x240ca1cc, 0x240ca1cc, 0x240ca1cc, 0x240ca1cc
677 .long 0x2de92c6f, 0x2de92c6f, 0x2de92c6f, 0x2de92c6f
678 .long 0x4a7484aa, 0x4a7484aa, 0x4a7484aa, 0x4a7484aa
679 .long 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc
680 .long 0x76f988da, 0x76f988da, 0x76f988da, 0x76f988da
681 .long 0x983e5152, 0x983e5152, 0x983e5152, 0x983e5152
682 .long 0xa831c66d, 0xa831c66d, 0xa831c66d, 0xa831c66d
683 .long 0xb00327c8, 0xb00327c8, 0xb00327c8, 0xb00327c8
684 .long 0xbf597fc7, 0xbf597fc7, 0xbf597fc7, 0xbf597fc7
685 .long 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3
686 .long 0xd5a79147, 0xd5a79147, 0xd5a79147, 0xd5a79147
687 .long 0x06ca6351, 0x06ca6351, 0x06ca6351, 0x06ca6351
688 .long 0x14292967, 0x14292967, 0x14292967, 0x14292967
689 .long 0x27b70a85, 0x27b70a85, 0x27b70a85, 0x27b70a85
690 .long 0x2e1b2138, 0x2e1b2138, 0x2e1b2138, 0x2e1b2138
691 .long 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc
692 .long 0x53380d13, 0x53380d13, 0x53380d13, 0x53380d13
693 .long 0x650a7354, 0x650a7354, 0x650a7354, 0x650a7354
694 .long 0x766a0abb, 0x766a0abb, 0x766a0abb, 0x766a0abb
695 .long 0x81c2c92e, 0x81c2c92e, 0x81c2c92e, 0x81c2c92e
696 .long 0x92722c85, 0x92722c85, 0x92722c85, 0x92722c85
697 .long 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1
698 .long 0xa81a664b, 0xa81a664b, 0xa81a664b, 0xa81a664b
699 .long 0xc24b8b70, 0xc24b8b70, 0xc24b8b70, 0xc24b8b70
700 .long 0xc76c51a3, 0xc76c51a3, 0xc76c51a3, 0xc76c51a3
701 .long 0xd192e819, 0xd192e819, 0xd192e819, 0xd192e819
702 .long 0xd6990624, 0xd6990624, 0xd6990624, 0xd6990624
703 .long 0xf40e3585, 0xf40e3585, 0xf40e3585, 0xf40e3585
704 .long 0x106aa070, 0x106aa070, 0x106aa070, 0x106aa070
705 .long 0x19a4c116, 0x19a4c116, 0x19a4c116, 0x19a4c116
706 .long 0x1e376c08, 0x1e376c08, 0x1e376c08, 0x1e376c08
707 .long 0x2748774c, 0x2748774c, 0x2748774c, 0x2748774c
708 .long 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5
709 .long 0x391c0cb3, 0x391c0cb3, 0x391c0cb3, 0x391c0cb3
710 .long 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a
711 .long 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f
712 .long 0x682e6ff3, 0x682e6ff3, 0x682e6ff3, 0x682e6ff3
713 .long 0x748f82ee, 0x748f82ee, 0x748f82ee, 0x748f82ee
714 .long 0x78a5636f, 0x78a5636f, 0x78a5636f, 0x78a5636f
715 .long 0x84c87814, 0x84c87814, 0x84c87814, 0x84c87814
716 .long 0x8cc70208, 0x8cc70208, 0x8cc70208, 0x8cc70208
717 .long 0x90befffa, 0x90befffa, 0x90befffa, 0x90befffa
718 .long 0xa4506ceb, 0xa4506ceb, 0xa4506ceb, 0xa4506ceb
719 .long 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7
720 .long 0xc67178f2, 0xc67178f2, 0xc67178f2, 0xc67178f2
723 .macro sha256_4way_extend_doubleround_core i, rr, rw, ra, rb, ry, rz
726 vshr.u32 q0, \ry, #19
727 vshl.u32 q1, \ry, #32-19
730 vshl.u32 q0, q6, #32-7
732 veor.u32 \ra, \ra, q0
733 vshr.u32 q1, \ry, #10
736 veor.u32 \ra, \ra, q0
737 vshl.u32 q1, q6, #32-18
739 veor.u32 \ra, \ra, q1
741 veor.u32 \ra, \ra, q0
742 vld1.u32 {q5}, [\rr]!
743 vadd.u32 \ra, \ra, q4
745 vshr.u32 q4, \rz, #17
746 vshl.u32 q0, \rz, #32-17
748 vst1.u32 {\ra}, [\rw]!
750 vshr.u32 q0, \rz, #19
751 vshl.u32 q1, \rz, #32-19
755 vshl.u32 q0, q5, #32-7
756 vshr.u32 q1, \rz, #10
757 veor.u32 \rb, \rb, q0
760 veor.u32 \rb, \rb, q0
761 vshl.u32 q1, q5, #32-18
763 veor.u32 \rb, \rb, q1
765 veor.u32 \rb, \rb, q0
768 .macro sha256_4way_extend_doubleround_head i, rr, rw, ra, rb, ry, rz
769 vld1.u32 {q6}, [\rr]!
770 vshr.u32 q4, \ry, #17
771 vshl.u32 q0, \ry, #32-17
772 sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
773 vld1.u32 {q6}, [\rr]!
774 vadd.u32 \rb, \rb, q1
777 .macro sha256_4way_extend_doubleround_body i, rr, rw, ra, rb, ry, rz
778 vshr.u32 q4, \ry, #17
779 vshl.u32 q0, \ry, #32-17
780 vst1.u32 {\rz}, [\rw]!
781 sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
782 vld1.u32 {q6}, [\rr]!
783 vadd.u32 \rb, \rb, q1
786 .macro sha256_4way_extend_doubleround_foot i, rr, rw, ra, rb, ry, rz
787 vshr.u32 q4, \ry, #17
788 vshl.u32 q0, \ry, #32-17
789 vst1.u32 {\rz}, [\rw]!
790 sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
791 vadd.u32 \rb, \rb, q1
792 vst1.u32 {\rb}, [\rw]!
795 .macro sha256_4way_main_round i, rk, rw, ra, rb, rc, rd, re, rf, rg, rh
796 vld1.u32 {q8}, [\rw]!
797 vand.u32 q9, \rf, \re
798 vbic.u32 q10, \rg, \re
799 vshr.u32 q11, \re, #5
800 vorr.u32 q10, q10, q9
801 vld1.u32 {q9}, [\rk]!
802 vadd.u32 \rh, \rh, q10
803 vshl.u32 q12, \re, #32-5
804 veor.u32 q10, \re, q11
805 vshr.u32 q11, \re, #19
806 veor.u32 q10, q10, q12
807 vshl.u32 q12, \re, #32-19
808 veor.u32 q10, q10, q11
809 vadd.u32 \rh, \rh, q8
810 veor.u32 q10, q10, q12
811 vadd.u32 \rh, \rh, q9
812 veor.u32 q9, \ra, \rb
813 vshr.u32 q11, q10, #6
814 vshl.u32 q13, q10, #32-6
815 vadd.u32 \rh, \rh, q11
817 vshr.u32 q11, \ra, #11
818 vshl.u32 q12, \ra, #32-11
819 veor.u32 q8, \ra, q11
820 vand.u32 q10, \ra, \rb
822 vshr.u32 q11, \ra, #20
823 vshl.u32 q12, \ra, #32-20
827 vadd.u32 \rh, \rh, q13
828 veor.u32 q10, q10, q9
830 vshl.u32 q12, q8, #32-2
831 vadd.u32 q9, \rh, q10
832 vadd.u32 q12, q12, q11
833 vadd.u32 \rh, \rh, \rd
834 vadd.u32 \rd, q9, q12
837 .macro sha256_4way_main_quadround i, rk, rw
838 sha256_4way_main_round \i+0, \rk, \rw, q0, q1, q2, q3, q4, q5, q6, q7
839 sha256_4way_main_round \i+1, \rk, \rw, q3, q0, q1, q2, q7, q4, q5, q6
840 sha256_4way_main_round \i+2, \rk, \rw, q2, q3, q0, q1, q6, q7, q4, q5
841 sha256_4way_main_round \i+3, \rk, \rw, q1, q2, q3, q0, q5, q6, q7, q4
848 .globl sha256_transform_4way
849 .globl _sha256_transform_4way
851 .type sha256_transform_4way, %function
853 sha256_transform_4way:
854 _sha256_transform_4way:
861 bne sha256_transform_4way_swap
868 b sha256_transform_4way_extend
870 sha256_transform_4way_swap:
893 sha256_transform_4way_extend:
897 sha256_4way_extend_doubleround_head 0, r1, r2, q9, q10, q14, q15
898 sha256_4way_extend_doubleround_body 2, r1, r2, q11, q12, q9, q10
899 sha256_4way_extend_doubleround_body 4, r1, r2, q13, q14, q11, q12
900 sha256_4way_extend_doubleround_body 6, r1, r2, q15, q9, q13, q14
901 sha256_4way_extend_doubleround_body 8, r1, r2, q10, q11, q15, q9
902 sha256_4way_extend_doubleround_body 10, r1, r2, q12, q13, q10, q11
903 sha256_4way_extend_doubleround_body 12, r1, r2, q14, q15, q12, q13
904 sha256_4way_extend_doubleround_body 14, r1, r2, q9, q10, q14, q15
905 sha256_4way_extend_doubleround_body 16, r1, r2, q11, q12, q9, q10
906 sha256_4way_extend_doubleround_body 18, r1, r2, q13, q14, q11, q12
907 sha256_4way_extend_doubleround_body 20, r1, r2, q15, q9, q13, q14
908 sha256_4way_extend_doubleround_body 22, r1, r2, q10, q11, q15, q9
909 sha256_4way_extend_doubleround_body 24, r1, r2, q12, q13, q10, q11
910 sha256_4way_extend_doubleround_body 26, r1, r2, q14, q15, q12, q13
911 sha256_4way_extend_doubleround_body 28, r1, r2, q9, q10, q14, q15
912 sha256_4way_extend_doubleround_body 30, r1, r2, q11, q12, q9, q10
913 sha256_4way_extend_doubleround_body 32, r1, r2, q13, q14, q11, q12
914 sha256_4way_extend_doubleround_body 34, r1, r2, q15, q9, q13, q14
915 sha256_4way_extend_doubleround_body 36, r1, r2, q10, q11, q15, q9
916 sha256_4way_extend_doubleround_body 38, r1, r2, q12, q13, q10, q11
917 sha256_4way_extend_doubleround_body 40, r1, r2, q14, q15, q12, q13
918 sha256_4way_extend_doubleround_body 42, r1, r2, q9, q10, q14, q15
919 sha256_4way_extend_doubleround_body 44, r1, r2, q11, q12, q9, q10
920 sha256_4way_extend_doubleround_foot 46, r1, r2, q13, q14, q11, q12
923 adr r4, sha256_transform_4way_4k
924 b sha256_transform_4way_4k_over
926 sha256_transform_4way_4k:
928 sha256_transform_4way_4k_over:
929 sha256_4way_main_quadround 0, r4, sp
930 sha256_4way_main_quadround 4, r4, sp
931 sha256_4way_main_quadround 8, r4, sp
932 sha256_4way_main_quadround 12, r4, sp
933 sha256_4way_main_quadround 16, r4, sp
934 sha256_4way_main_quadround 20, r4, sp
935 sha256_4way_main_quadround 24, r4, sp
936 sha256_4way_main_quadround 28, r4, sp
937 sha256_4way_main_quadround 32, r4, sp
938 sha256_4way_main_quadround 36, r4, sp
939 sha256_4way_main_quadround 40, r4, sp
940 sha256_4way_main_quadround 44, r4, sp
941 sha256_4way_main_quadround 48, r4, sp
942 sha256_4way_main_quadround 52, r4, sp
943 sha256_4way_main_quadround 56, r4, sp
944 sha256_4way_main_quadround 60, r4, sp
965 .globl sha256d_ms_4way
966 .globl _sha256d_ms_4way
968 .type sha256d_ms_4way, %function
985 vshl.u32 q0, q6, #32-7
987 veor.u32 q10, q10, q0
988 vshl.u32 q0, q6, #32-18
989 veor.u32 q10, q10, q1
991 veor.u32 q10, q10, q0
992 vstmia sp!, {q11-q13}
994 vadd.u32 q12, q12, q6
995 vadd.u32 q11, q11, q4
997 vshr.u32 q14, q12, #17
998 vshr.u32 q4, q11, #17
999 vshl.u32 q0, q11, #32-17
1000 vst1.u32 {q11}, [r1]!
1002 vshr.u32 q0, q11, #19
1003 vshl.u32 q1, q11, #32-19
1005 vst1.u32 {q12}, [r1]!
1007 vshr.u32 q1, q11, #10
1008 vshl.u32 q0, q12, #32-17
1010 veor.u32 q14, q14, q0
1011 vadd.u32 q13, q13, q4
1012 vshr.u32 q0, q12, #19
1013 vshl.u32 q1, q12, #32-19
1014 veor.u32 q14, q14, q0
1015 vst1.u32 {q13}, [r1]!
1016 veor.u32 q14, q14, q1
1017 vshr.u32 q1, q12, #10
1019 vshr.u32 q4, q13, #17
1020 vshl.u32 q0, q13, #32-17
1021 veor.u32 q14, q14, q1
1023 vshr.u32 q0, q13, #19
1024 vshl.u32 q1, q13, #32-19
1026 vst1.u32 {q14}, [r1]!
1028 vshr.u32 q1, q13, #10
1029 vld1.u32 {q15}, [r1]
1031 vst1.u32 {q15}, [sp]!
1032 vadd.u32 q15, q15, q4
1033 vshr.u32 q4, q14, #17
1034 vshl.u32 q0, q14, #32-17
1035 vshl.u32 q1, q14, #32-19
1037 vshr.u32 q0, q14, #19
1038 vst1.u32 {q15}, [r1]!
1042 vshr.u32 q1, q14, #10
1043 vst1.u32 {q9}, [sp]!
1046 vshr.u32 q4, q15, #17
1048 vshl.u32 q0, q15, #32-17
1049 vshl.u32 q1, q15, #32-19
1051 vshr.u32 q0, q15, #19
1052 vst1.u32 {q9}, [r1]!
1054 vld1.u32 {q10}, [r1]
1056 vshr.u32 q1, q15, #10
1057 vst1.u32 {q10}, [sp]!
1059 vshl.u32 q0, q9, #32-17
1060 vadd.u32 q10, q10, q4
1061 vshr.u32 q4, q9, #17
1062 vshl.u32 q1, q9, #32-19
1064 vshr.u32 q0, q9, #19
1066 vshr.u32 q1, q9, #10
1068 vst1.u32 {q10}, [r1]!
1071 vshr.u32 q4, q10, #17
1072 vshl.u32 q0, q10, #32-17
1073 vadd.u32 q11, q11, q5
1075 vshr.u32 q0, q10, #19
1076 vshl.u32 q1, q10, #32-19
1078 vst1.u32 {q11}, [r1]!
1080 vshr.u32 q1, q10, #10
1081 vshl.u32 q0, q11, #32-17
1083 vshr.u32 q4, q11, #17
1084 vadd.u32 q12, q12, q2
1085 vshl.u32 q1, q11, #32-19
1087 vshr.u32 q0, q11, #19
1089 vshr.u32 q1, q11, #10
1091 vst1.u32 {q12}, [r1]!
1094 vshr.u32 q4, q12, #17
1095 vshl.u32 q0, q12, #32-17
1096 vadd.u32 q13, q13, q5
1098 vshr.u32 q0, q12, #19
1099 vshl.u32 q1, q12, #32-19
1101 vst1.u32 {q13}, [r1]!
1103 vshr.u32 q1, q12, #10
1104 vshl.u32 q0, q13, #32-17
1106 vshr.u32 q4, q13, #17
1107 vadd.u32 q14, q14, q2
1108 vshl.u32 q1, q13, #32-19
1110 vshr.u32 q0, q13, #19
1112 vshr.u32 q1, q13, #10
1114 vst1.u32 {q14}, [r1]!
1118 vshr.u32 q4, q14, #17
1119 vshl.u32 q0, q14, #32-17
1120 vadd.u32 q15, q15, q5
1122 vshr.u32 q0, q14, #19
1123 vshl.u32 q1, q14, #32-19
1125 vst1.u32 {q15}, [r1]!
1127 vshr.u32 q1, q14, #10
1130 vshl.u32 q0, q15, #32-17
1132 vst1.u32 {q2}, [sp]!
1134 vshr.u32 q4, q15, #17
1135 vshr.u32 q2, q15, #19
1137 vst1.u32 {q9}, [r1]!
1138 vshl.u32 q1, q15, #32-19
1140 vshr.u32 q0, q15, #10
1142 vld1.u32 {q5-q6}, [r4]!
1145 vadd.u32 q10, q10, q4
1146 vst1.u32 {q2}, [sp]!
1147 vadd.u32 q10, q10, q2
1151 sha256d_ms_4way_extend_loop2:
1152 sha256_4way_extend_doubleround_body 16, r4, r1, q11, q12, q9, q10
1153 sha256_4way_extend_doubleround_body 18, r4, r1, q13, q14, q11, q12
1154 sha256_4way_extend_doubleround_body 20, r4, r1, q15, q9, q13, q14
1155 sha256_4way_extend_doubleround_body 22, r4, r1, q10, q11, q15, q9
1156 sha256_4way_extend_doubleround_body 24, r4, r1, q12, q13, q10, q11
1157 sha256_4way_extend_doubleround_body 26, r4, r1, q14, q15, q12, q13
1158 sha256_4way_extend_doubleround_body 28, r4, r1, q9, q10, q14, q15
1159 sha256_4way_extend_doubleround_body 30, r4, r1, q11, q12, q9, q10
1160 sha256_4way_extend_doubleround_body 32, r4, r1, q13, q14, q11, q12
1161 sha256_4way_extend_doubleround_body 34, r4, r1, q15, q9, q13, q14
1162 sha256_4way_extend_doubleround_body 36, r4, r1, q10, q11, q15, q9
1163 sha256_4way_extend_doubleround_body 38, r4, r1, q12, q13, q10, q11
1164 sha256_4way_extend_doubleround_body 40, r4, r1, q14, q15, q12, q13
1165 sha256_4way_extend_doubleround_body 42, r4, r1, q9, q10, q14, q15
1166 sha256_4way_extend_doubleround_body 44, r4, r1, q11, q12, q9, q10
1167 sha256_4way_extend_doubleround_foot 46, r4, r1, q13, q14, q11, q12
1168 bne sha256d_ms_4way_extend_coda2
1173 adr r3, sha256d_ms_4way_4k+3*16
1174 sub r1, r1, #(64-3)*16
1175 b sha256d_ms_4way_main_loop1
1181 sha256d_ms_4way_main_loop2:
1182 sha256_4way_main_round 0, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1183 sha256_4way_main_round 1, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1184 sha256_4way_main_round 2, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1185 sha256d_ms_4way_main_loop1:
1186 sha256_4way_main_round 3, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1187 sha256_4way_main_quadround 4, r3, r1
1188 sha256_4way_main_quadround 8, r3, r1
1189 sha256_4way_main_quadround 12, r3, r1
1190 sha256_4way_main_quadround 16, r3, r1
1191 sha256_4way_main_quadround 20, r3, r1
1192 sha256_4way_main_quadround 24, r3, r1
1193 sha256_4way_main_quadround 28, r3, r1
1194 sha256_4way_main_quadround 32, r3, r1
1195 sha256_4way_main_quadround 36, r3, r1
1196 sha256_4way_main_quadround 40, r3, r1
1197 sha256_4way_main_quadround 44, r3, r1
1198 sha256_4way_main_quadround 48, r3, r1
1199 sha256_4way_main_quadround 52, r3, r1
1200 sha256_4way_main_round 56, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1201 bne sha256d_ms_4way_finish
1202 sha256_4way_main_round 57, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1203 sha256_4way_main_round 58, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1204 sha256_4way_main_round 59, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1205 sha256_4way_main_quadround 60, r3, r1
1210 vadd.u32 q2, q2, q10
1211 vadd.u32 q3, q3, q11
1212 vadd.u32 q4, q4, q12
1213 vadd.u32 q5, q5, q13
1214 vadd.u32 q6, q6, q14
1215 vadd.u32 q7, q7, q15
1218 sub r1, r1, #(64-18)*16
1221 vstmia r1, {q11-q13}
1223 vstmia r1, {q14-q15}
1226 vmov.u32 q8, #0x80000000
1233 vmov.u32 q15, #0x00000100
1235 vstmia r1!, {q8-q15}
1239 vshl.u32 q2, q1, #32-7
1240 vshr.u32 q4, q1, #18
1242 vshl.u32 q3, q1, #32-18
1246 vld1.u32 {q5}, [r4]!
1248 vmov.u32 q7, #0x00a00000
1250 vshr.u32 q10, q5, #7
1251 vshl.u32 q0, q5, #32-7
1252 vshl.u32 q3, q5, #32-18
1253 veor.u32 q10, q10, q0
1254 vshr.u32 q0, q5, #18
1255 veor.u32 q10, q10, q3
1256 vst1.u32 {q9}, [r1]!
1258 veor.u32 q10, q10, q0
1260 vld1.u32 {q6}, [r4]!
1261 veor.u32 q10, q10, q0
1263 vshr.u32 q4, q9, #17
1264 vshl.u32 q0, q9, #32-17
1265 vadd.u32 q10, q10, q3
1267 vshr.u32 q0, q9, #19
1268 vshl.u32 q1, q9, #32-19
1270 vshr.u32 q11, q6, #7
1271 vshl.u32 q0, q6, #32-7
1273 veor.u32 q11, q11, q0
1274 vshr.u32 q1, q9, #10
1275 vshr.u32 q0, q6, #18
1277 veor.u32 q11, q11, q0
1278 vshl.u32 q1, q6, #32-18
1280 veor.u32 q11, q11, q1
1282 veor.u32 q11, q11, q0
1283 vld1.u32 {q5}, [r4]!
1284 vadd.u32 q11, q11, q4
1285 vshr.u32 q4, q10, #17
1286 vshl.u32 q0, q10, #32-17
1287 vst1.u32 {q10}, [r1]!
1289 vshr.u32 q0, q10, #19
1290 vshl.u32 q1, q10, #32-19
1292 vshr.u32 q12, q5, #7
1294 vshl.u32 q0, q5, #32-7
1295 vshr.u32 q1, q10, #10
1296 veor.u32 q12, q12, q0
1297 vshr.u32 q0, q5, #18
1299 veor.u32 q12, q12, q0
1300 vshl.u32 q1, q5, #32-18
1301 vst1.u32 {q11}, [r1]!
1302 veor.u32 q12, q12, q1
1305 veor.u32 q12, q12, q0
1307 vshr.u32 q4, q11, #17
1308 vshl.u32 q0, q11, #32-17
1309 vadd.u32 q12, q12, q1
1310 vld1.u32 {q6}, [r4]!
1312 vshr.u32 q0, q11, #19
1313 vshl.u32 q1, q11, #32-19
1315 vshr.u32 q13, q6, #7
1316 vshl.u32 q0, q6, #32-7
1318 veor.u32 q13, q13, q0
1319 vshr.u32 q1, q11, #10
1320 vshr.u32 q0, q6, #18
1322 veor.u32 q13, q13, q0
1323 vshl.u32 q1, q6, #32-18
1325 veor.u32 q13, q13, q1
1327 veor.u32 q13, q13, q0
1328 vld1.u32 {q5}, [r4]!
1329 vadd.u32 q13, q13, q4
1330 vshr.u32 q4, q12, #17
1331 vshl.u32 q0, q12, #32-17
1332 vst1.u32 {q12}, [r1]!
1334 vshr.u32 q0, q12, #19
1335 vshl.u32 q1, q12, #32-19
1337 vshr.u32 q14, q5, #7
1339 vshl.u32 q0, q5, #32-7
1340 vshr.u32 q1, q12, #10
1341 veor.u32 q14, q14, q0
1342 vshr.u32 q0, q5, #18
1344 veor.u32 q14, q14, q0
1345 vshl.u32 q1, q5, #32-18
1346 vst1.u32 {q13}, [r1]!
1347 veor.u32 q14, q14, q1
1350 veor.u32 q14, q14, q0
1352 vshr.u32 q4, q13, #17
1353 vshl.u32 q0, q13, #32-17
1354 vadd.u32 q14, q14, q1
1355 vld1.u32 {q6}, [r4]!
1356 vadd.u32 q5, q5, q15
1358 vshr.u32 q0, q13, #19
1359 vshl.u32 q1, q13, #32-19
1361 vshr.u32 q15, q6, #7
1362 vshl.u32 q0, q6, #32-7
1364 veor.u32 q15, q15, q0
1365 vshr.u32 q1, q13, #10
1366 vshr.u32 q0, q6, #18
1368 veor.u32 q15, q15, q0
1369 vshl.u32 q1, q6, #32-18
1371 veor.u32 q15, q15, q1
1373 veor.u32 q15, q15, q0
1374 vmov.u32 q5, #0x80000000
1375 vadd.u32 q15, q15, q4
1376 vshr.u32 q4, q14, #17
1377 vshl.u32 q0, q14, #32-17
1379 vst1.u32 {q14}, [r1]!
1380 vmov.u32 q7, #0x11000000
1382 vshr.u32 q0, q14, #19
1383 vshl.u32 q1, q14, #32-19
1385 vmov.u32 q2, #0x00002000
1387 vst1.u32 {q15}, [r1]!
1389 vshr.u32 q1, q14, #10
1394 vshr.u32 q4, q15, #17
1395 vshl.u32 q0, q15, #32-17
1398 vshr.u32 q0, q15, #19
1399 vshl.u32 q1, q15, #32-19
1401 vst1.u32 {q9}, [r1]!
1402 vadd.u32 q5, q5, q10
1404 vshr.u32 q1, q15, #10
1405 vshl.u32 q0, q9, #32-17
1406 veor.u32 q10, q4, q1
1407 vshr.u32 q4, q9, #17
1408 vadd.u32 q10, q10, q5
1410 vshr.u32 q0, q9, #19
1411 vshl.u32 q1, q9, #32-19
1413 vshr.u32 q0, q9, #10
1415 vst1.u32 {q10}, [r1]!
1418 vshr.u32 q4, q10, #17
1419 vshl.u32 q0, q10, #32-17
1420 vadd.u32 q11, q11, q1
1422 vshr.u32 q0, q10, #19
1423 vshl.u32 q1, q10, #32-19
1425 vst1.u32 {q11}, [r1]!
1427 vshr.u32 q1, q10, #10
1428 vshl.u32 q0, q11, #32-17
1430 vshr.u32 q4, q11, #17
1431 vadd.u32 q12, q12, q1
1433 vshr.u32 q0, q11, #19
1434 vshl.u32 q1, q11, #32-19
1436 vshr.u32 q0, q11, #10
1438 vst1.u32 {q12}, [r1]!
1441 vshr.u32 q4, q12, #17
1442 vshl.u32 q0, q12, #32-17
1443 vadd.u32 q13, q13, q1
1445 vshr.u32 q0, q12, #19
1446 vshl.u32 q1, q12, #32-19
1448 vst1.u32 {q13}, [r1]!
1450 vshr.u32 q1, q12, #10
1451 vshl.u32 q0, q13, #32-17
1453 vshr.u32 q4, q13, #17
1454 vadd.u32 q14, q14, q1
1456 vshr.u32 q0, q13, #19
1457 vshl.u32 q1, q13, #32-19
1459 vshr.u32 q0, q13, #10
1461 vst1.u32 {q14}, [r1]!
1463 vmov.u32 q6, #0x00000100
1464 vadd.u32 q15, q15, q4
1466 vshr.u32 q4, q14, #17
1467 vshl.u32 q0, q14, #32-17
1468 vmov.u32 q7, #0x00400000
1469 vst1.u32 {q15}, [r1]!
1471 vshr.u32 q0, q14, #19
1472 vshl.u32 q1, q14, #32-19
1476 vshr.u32 q1, q14, #10
1477 vmov.u32 q2, #0x00000022
1480 vld1.u32 {q5}, [r4]!
1482 vshr.u32 q4, q15, #17
1483 vshl.u32 q0, q15, #32-17
1484 vadd.u32 q6, q6, q10
1485 vst1.u32 {q9}, [r1]!
1487 vshr.u32 q0, q15, #19
1488 vshl.u32 q1, q15, #32-19
1490 vshr.u32 q10, q5, #7
1492 vshl.u32 q0, q5, #32-7
1493 vshr.u32 q1, q15, #10
1494 veor.u32 q10, q10, q0
1495 vshr.u32 q0, q5, #18
1497 veor.u32 q10, q10, q0
1498 vshl.u32 q1, q5, #32-18
1500 veor.u32 q10, q10, q1
1502 veor.u32 q10, q10, q0
1503 vld1.u32 {q6}, [r4]!
1504 vadd.u32 q10, q10, q1
1506 b sha256d_ms_4way_extend_loop2
1510 .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
1511 .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
1512 .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
1513 .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
1514 .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
1515 .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
1516 .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
1517 .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
1519 sha256d_ms_4way_extend_coda2:
1520 adr r4, sha256d_ms_4way_4h
1525 b sha256d_ms_4way_main_loop2
1527 .macro sha256_4way_main_round_red i, rk, rw, rd, re, rf, rg, rh
1528 vld1.u32 {q8}, [\rw]!
1529 vand.u32 q9, \rf, \re
1530 vbic.u32 q10, \rg, \re
1531 vshr.u32 q11, \re, #5
1532 vorr.u32 q10, q10, q9
1533 vshl.u32 q12, \re, #32-5
1534 vadd.u32 \rh, \rh, q10
1535 veor.u32 q10, \re, q11
1536 vshr.u32 q11, \re, #19
1537 veor.u32 q10, q10, q12
1538 vshl.u32 q12, \re, #32-19
1539 veor.u32 q10, q10, q11
1540 vadd.u32 \rh, \rh, q8
1541 veor.u32 q10, q10, q12
1542 vld1.u32 {q9}, [\rk]!
1543 vadd.u32 \rh, \rh, \rd
1544 vshr.u32 q11, q10, #6
1545 vadd.u32 \rh, \rh, q9
1546 vshl.u32 q13, q10, #32-6
1547 vadd.u32 \rh, \rh, q11
1548 vadd.u32 \rh, \rh, q13
1551 sha256d_ms_4way_finish:
1552 sha256_4way_main_round_red 57, r3, r1, q2, q7, q4, q5, q6
1553 sha256_4way_main_round_red 58, r3, r1, q1, q6, q7, q4, q5
1554 sha256_4way_main_round_red 59, r3, r1, q0, q5, q6, q7, q4
1555 sha256_4way_main_round_red 60, r3, r1, q3, q4, q5, q6, q7
1557 vadd.u32 q7, q7, q15
1569 .globl sha256_use_4way
1570 .globl _sha256_use_4way
1572 .type sha256_use_4way, %function
1579 #endif /* __ARM_NEON__ */