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}
632 .globl sha256_init_4way
633 .globl _sha256_init_4way
635 .type sha256_init_4way, %function
645 .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
646 .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
647 .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
648 .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
649 .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
650 .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
651 .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
652 .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
655 .long 0x428a2f98, 0x428a2f98, 0x428a2f98, 0x428a2f98
656 .long 0x71374491, 0x71374491, 0x71374491, 0x71374491
657 .long 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf
658 .long 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5
659 .long 0x3956c25b, 0x3956c25b, 0x3956c25b, 0x3956c25b
660 .long 0x59f111f1, 0x59f111f1, 0x59f111f1, 0x59f111f1
661 .long 0x923f82a4, 0x923f82a4, 0x923f82a4, 0x923f82a4
662 .long 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5
663 .long 0xd807aa98, 0xd807aa98, 0xd807aa98, 0xd807aa98
664 .long 0x12835b01, 0x12835b01, 0x12835b01, 0x12835b01
665 .long 0x243185be, 0x243185be, 0x243185be, 0x243185be
666 .long 0x550c7dc3, 0x550c7dc3, 0x550c7dc3, 0x550c7dc3
667 .long 0x72be5d74, 0x72be5d74, 0x72be5d74, 0x72be5d74
668 .long 0x80deb1fe, 0x80deb1fe, 0x80deb1fe, 0x80deb1fe
669 .long 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7
670 .long 0xc19bf174, 0xc19bf174, 0xc19bf174, 0xc19bf174
671 .long 0xe49b69c1, 0xe49b69c1, 0xe49b69c1, 0xe49b69c1
672 .long 0xefbe4786, 0xefbe4786, 0xefbe4786, 0xefbe4786
673 .long 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6
674 .long 0x240ca1cc, 0x240ca1cc, 0x240ca1cc, 0x240ca1cc
675 .long 0x2de92c6f, 0x2de92c6f, 0x2de92c6f, 0x2de92c6f
676 .long 0x4a7484aa, 0x4a7484aa, 0x4a7484aa, 0x4a7484aa
677 .long 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc
678 .long 0x76f988da, 0x76f988da, 0x76f988da, 0x76f988da
679 .long 0x983e5152, 0x983e5152, 0x983e5152, 0x983e5152
680 .long 0xa831c66d, 0xa831c66d, 0xa831c66d, 0xa831c66d
681 .long 0xb00327c8, 0xb00327c8, 0xb00327c8, 0xb00327c8
682 .long 0xbf597fc7, 0xbf597fc7, 0xbf597fc7, 0xbf597fc7
683 .long 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3
684 .long 0xd5a79147, 0xd5a79147, 0xd5a79147, 0xd5a79147
685 .long 0x06ca6351, 0x06ca6351, 0x06ca6351, 0x06ca6351
686 .long 0x14292967, 0x14292967, 0x14292967, 0x14292967
687 .long 0x27b70a85, 0x27b70a85, 0x27b70a85, 0x27b70a85
688 .long 0x2e1b2138, 0x2e1b2138, 0x2e1b2138, 0x2e1b2138
689 .long 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc
690 .long 0x53380d13, 0x53380d13, 0x53380d13, 0x53380d13
691 .long 0x650a7354, 0x650a7354, 0x650a7354, 0x650a7354
692 .long 0x766a0abb, 0x766a0abb, 0x766a0abb, 0x766a0abb
693 .long 0x81c2c92e, 0x81c2c92e, 0x81c2c92e, 0x81c2c92e
694 .long 0x92722c85, 0x92722c85, 0x92722c85, 0x92722c85
695 .long 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1
696 .long 0xa81a664b, 0xa81a664b, 0xa81a664b, 0xa81a664b
697 .long 0xc24b8b70, 0xc24b8b70, 0xc24b8b70, 0xc24b8b70
698 .long 0xc76c51a3, 0xc76c51a3, 0xc76c51a3, 0xc76c51a3
699 .long 0xd192e819, 0xd192e819, 0xd192e819, 0xd192e819
700 .long 0xd6990624, 0xd6990624, 0xd6990624, 0xd6990624
701 .long 0xf40e3585, 0xf40e3585, 0xf40e3585, 0xf40e3585
702 .long 0x106aa070, 0x106aa070, 0x106aa070, 0x106aa070
703 .long 0x19a4c116, 0x19a4c116, 0x19a4c116, 0x19a4c116
704 .long 0x1e376c08, 0x1e376c08, 0x1e376c08, 0x1e376c08
705 .long 0x2748774c, 0x2748774c, 0x2748774c, 0x2748774c
706 .long 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5
707 .long 0x391c0cb3, 0x391c0cb3, 0x391c0cb3, 0x391c0cb3
708 .long 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a
709 .long 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f
710 .long 0x682e6ff3, 0x682e6ff3, 0x682e6ff3, 0x682e6ff3
711 .long 0x748f82ee, 0x748f82ee, 0x748f82ee, 0x748f82ee
712 .long 0x78a5636f, 0x78a5636f, 0x78a5636f, 0x78a5636f
713 .long 0x84c87814, 0x84c87814, 0x84c87814, 0x84c87814
714 .long 0x8cc70208, 0x8cc70208, 0x8cc70208, 0x8cc70208
715 .long 0x90befffa, 0x90befffa, 0x90befffa, 0x90befffa
716 .long 0xa4506ceb, 0xa4506ceb, 0xa4506ceb, 0xa4506ceb
717 .long 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7
718 .long 0xc67178f2, 0xc67178f2, 0xc67178f2, 0xc67178f2
721 .macro sha256_4way_extend_doubleround_core i, rr, rw, ra, rb, ry, rz
724 vshr.u32 q0, \ry, #19
725 vshl.u32 q1, \ry, #32-19
728 vshl.u32 q0, q6, #32-7
730 veor.u32 \ra, \ra, q0
731 vshr.u32 q1, \ry, #10
734 veor.u32 \ra, \ra, q0
735 vshl.u32 q1, q6, #32-18
737 veor.u32 \ra, \ra, q1
739 veor.u32 \ra, \ra, q0
740 vld1.u32 {q5}, [\rr]!
741 vadd.u32 \ra, \ra, q4
743 vshr.u32 q4, \rz, #17
744 vshl.u32 q0, \rz, #32-17
746 vst1.u32 {\ra}, [\rw]!
748 vshr.u32 q0, \rz, #19
749 vshl.u32 q1, \rz, #32-19
753 vshl.u32 q0, q5, #32-7
754 vshr.u32 q1, \rz, #10
755 veor.u32 \rb, \rb, q0
758 veor.u32 \rb, \rb, q0
759 vshl.u32 q1, q5, #32-18
761 veor.u32 \rb, \rb, q1
763 veor.u32 \rb, \rb, q0
766 .macro sha256_4way_extend_doubleround_head i, rr, rw, ra, rb, ry, rz
767 vld1.u32 {q6}, [\rr]!
768 vshr.u32 q4, \ry, #17
769 vshl.u32 q0, \ry, #32-17
770 sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
771 vld1.u32 {q6}, [\rr]!
772 vadd.u32 \rb, \rb, q1
775 .macro sha256_4way_extend_doubleround_body i, rr, rw, ra, rb, ry, rz
776 vshr.u32 q4, \ry, #17
777 vshl.u32 q0, \ry, #32-17
778 vst1.u32 {\rz}, [\rw]!
779 sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
780 vld1.u32 {q6}, [\rr]!
781 vadd.u32 \rb, \rb, q1
784 .macro sha256_4way_extend_doubleround_foot i, rr, rw, ra, rb, ry, rz
785 vshr.u32 q4, \ry, #17
786 vshl.u32 q0, \ry, #32-17
787 vst1.u32 {\rz}, [\rw]!
788 sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
789 vadd.u32 \rb, \rb, q1
790 vst1.u32 {\rb}, [\rw]!
793 .macro sha256_4way_main_round i, rk, rw, ra, rb, rc, rd, re, rf, rg, rh
794 vld1.u32 {q8}, [\rw]!
795 vand.u32 q9, \rf, \re
796 vbic.u32 q10, \rg, \re
797 vshr.u32 q11, \re, #5
798 vorr.u32 q10, q10, q9
799 vld1.u32 {q9}, [\rk]!
800 vadd.u32 \rh, \rh, q10
801 vshl.u32 q12, \re, #32-5
802 veor.u32 q10, \re, q11
803 vshr.u32 q11, \re, #19
804 veor.u32 q10, q10, q12
805 vshl.u32 q12, \re, #32-19
806 veor.u32 q10, q10, q11
807 vadd.u32 \rh, \rh, q8
808 veor.u32 q10, q10, q12
809 vadd.u32 \rh, \rh, q9
810 veor.u32 q9, \ra, \rb
811 vshr.u32 q11, q10, #6
812 vshl.u32 q13, q10, #32-6
813 vadd.u32 \rh, \rh, q11
815 vshr.u32 q11, \ra, #11
816 vshl.u32 q12, \ra, #32-11
817 veor.u32 q8, \ra, q11
818 vand.u32 q10, \ra, \rb
820 vshr.u32 q11, \ra, #20
821 vshl.u32 q12, \ra, #32-20
825 vadd.u32 \rh, \rh, q13
826 veor.u32 q10, q10, q9
828 vshl.u32 q12, q8, #32-2
829 vadd.u32 q9, \rh, q10
830 vadd.u32 q12, q12, q11
831 vadd.u32 \rh, \rh, \rd
832 vadd.u32 \rd, q9, q12
835 .macro sha256_4way_main_quadround i, rk, rw
836 sha256_4way_main_round \i+0, \rk, \rw, q0, q1, q2, q3, q4, q5, q6, q7
837 sha256_4way_main_round \i+1, \rk, \rw, q3, q0, q1, q2, q7, q4, q5, q6
838 sha256_4way_main_round \i+2, \rk, \rw, q2, q3, q0, q1, q6, q7, q4, q5
839 sha256_4way_main_round \i+3, \rk, \rw, q1, q2, q3, q0, q5, q6, q7, q4
846 .globl sha256_transform_4way
847 .globl _sha256_transform_4way
849 .type sha256_transform_4way, %function
851 sha256_transform_4way:
852 _sha256_transform_4way:
859 bne sha256_transform_4way_swap
866 b sha256_transform_4way_extend
868 sha256_transform_4way_swap:
891 sha256_transform_4way_extend:
895 sha256_4way_extend_doubleround_head 0, r1, r2, q9, q10, q14, q15
896 sha256_4way_extend_doubleround_body 2, r1, r2, q11, q12, q9, q10
897 sha256_4way_extend_doubleround_body 4, r1, r2, q13, q14, q11, q12
898 sha256_4way_extend_doubleround_body 6, r1, r2, q15, q9, q13, q14
899 sha256_4way_extend_doubleround_body 8, r1, r2, q10, q11, q15, q9
900 sha256_4way_extend_doubleround_body 10, r1, r2, q12, q13, q10, q11
901 sha256_4way_extend_doubleround_body 12, r1, r2, q14, q15, q12, q13
902 sha256_4way_extend_doubleround_body 14, r1, r2, q9, q10, q14, q15
903 sha256_4way_extend_doubleround_body 16, r1, r2, q11, q12, q9, q10
904 sha256_4way_extend_doubleround_body 18, r1, r2, q13, q14, q11, q12
905 sha256_4way_extend_doubleround_body 20, r1, r2, q15, q9, q13, q14
906 sha256_4way_extend_doubleround_body 22, r1, r2, q10, q11, q15, q9
907 sha256_4way_extend_doubleround_body 24, r1, r2, q12, q13, q10, q11
908 sha256_4way_extend_doubleround_body 26, r1, r2, q14, q15, q12, q13
909 sha256_4way_extend_doubleround_body 28, r1, r2, q9, q10, q14, q15
910 sha256_4way_extend_doubleround_body 30, r1, r2, q11, q12, q9, q10
911 sha256_4way_extend_doubleround_body 32, r1, r2, q13, q14, q11, q12
912 sha256_4way_extend_doubleround_body 34, r1, r2, q15, q9, q13, q14
913 sha256_4way_extend_doubleround_body 36, r1, r2, q10, q11, q15, q9
914 sha256_4way_extend_doubleround_body 38, r1, r2, q12, q13, q10, q11
915 sha256_4way_extend_doubleround_body 40, r1, r2, q14, q15, q12, q13
916 sha256_4way_extend_doubleround_body 42, r1, r2, q9, q10, q14, q15
917 sha256_4way_extend_doubleround_body 44, r1, r2, q11, q12, q9, q10
918 sha256_4way_extend_doubleround_foot 46, r1, r2, q13, q14, q11, q12
921 adr r4, sha256_transform_4way_4k
922 b sha256_transform_4way_4k_over
924 sha256_transform_4way_4k:
926 sha256_transform_4way_4k_over:
927 sha256_4way_main_quadround 0, r4, sp
928 sha256_4way_main_quadround 4, r4, sp
929 sha256_4way_main_quadround 8, r4, sp
930 sha256_4way_main_quadround 12, r4, sp
931 sha256_4way_main_quadround 16, r4, sp
932 sha256_4way_main_quadround 20, r4, sp
933 sha256_4way_main_quadround 24, r4, sp
934 sha256_4way_main_quadround 28, r4, sp
935 sha256_4way_main_quadround 32, r4, sp
936 sha256_4way_main_quadround 36, r4, sp
937 sha256_4way_main_quadround 40, r4, sp
938 sha256_4way_main_quadround 44, r4, sp
939 sha256_4way_main_quadround 48, r4, sp
940 sha256_4way_main_quadround 52, r4, sp
941 sha256_4way_main_quadround 56, r4, sp
942 sha256_4way_main_quadround 60, r4, sp
963 .globl sha256d_ms_4way
964 .globl _sha256d_ms_4way
966 .type sha256d_ms_4way, %function
983 vshl.u32 q0, q6, #32-7
985 veor.u32 q10, q10, q0
986 vshl.u32 q0, q6, #32-18
987 veor.u32 q10, q10, q1
989 veor.u32 q10, q10, q0
990 vstmia sp!, {q11-q13}
992 vadd.u32 q12, q12, q6
993 vadd.u32 q11, q11, q4
995 vshr.u32 q14, q12, #17
996 vshr.u32 q4, q11, #17
997 vshl.u32 q0, q11, #32-17
998 vst1.u32 {q11}, [r1]!
1000 vshr.u32 q0, q11, #19
1001 vshl.u32 q1, q11, #32-19
1003 vst1.u32 {q12}, [r1]!
1005 vshr.u32 q1, q11, #10
1006 vshl.u32 q0, q12, #32-17
1008 veor.u32 q14, q14, q0
1009 vadd.u32 q13, q13, q4
1010 vshr.u32 q0, q12, #19
1011 vshl.u32 q1, q12, #32-19
1012 veor.u32 q14, q14, q0
1013 vst1.u32 {q13}, [r1]!
1014 veor.u32 q14, q14, q1
1015 vshr.u32 q1, q12, #10
1017 vshr.u32 q4, q13, #17
1018 vshl.u32 q0, q13, #32-17
1019 veor.u32 q14, q14, q1
1021 vshr.u32 q0, q13, #19
1022 vshl.u32 q1, q13, #32-19
1024 vst1.u32 {q14}, [r1]!
1026 vshr.u32 q1, q13, #10
1027 vld1.u32 {q15}, [r1]
1029 vst1.u32 {q15}, [sp]!
1030 vadd.u32 q15, q15, q4
1031 vshr.u32 q4, q14, #17
1032 vshl.u32 q0, q14, #32-17
1033 vshl.u32 q1, q14, #32-19
1035 vshr.u32 q0, q14, #19
1036 vst1.u32 {q15}, [r1]!
1040 vshr.u32 q1, q14, #10
1041 vst1.u32 {q9}, [sp]!
1044 vshr.u32 q4, q15, #17
1046 vshl.u32 q0, q15, #32-17
1047 vshl.u32 q1, q15, #32-19
1049 vshr.u32 q0, q15, #19
1050 vst1.u32 {q9}, [r1]!
1052 vld1.u32 {q10}, [r1]
1054 vshr.u32 q1, q15, #10
1055 vst1.u32 {q10}, [sp]!
1057 vshl.u32 q0, q9, #32-17
1058 vadd.u32 q10, q10, q4
1059 vshr.u32 q4, q9, #17
1060 vshl.u32 q1, q9, #32-19
1062 vshr.u32 q0, q9, #19
1064 vshr.u32 q1, q9, #10
1066 vst1.u32 {q10}, [r1]!
1069 vshr.u32 q4, q10, #17
1070 vshl.u32 q0, q10, #32-17
1071 vadd.u32 q11, q11, q5
1073 vshr.u32 q0, q10, #19
1074 vshl.u32 q1, q10, #32-19
1076 vst1.u32 {q11}, [r1]!
1078 vshr.u32 q1, q10, #10
1079 vshl.u32 q0, q11, #32-17
1081 vshr.u32 q4, q11, #17
1082 vadd.u32 q12, q12, q2
1083 vshl.u32 q1, q11, #32-19
1085 vshr.u32 q0, q11, #19
1087 vshr.u32 q1, q11, #10
1089 vst1.u32 {q12}, [r1]!
1092 vshr.u32 q4, q12, #17
1093 vshl.u32 q0, q12, #32-17
1094 vadd.u32 q13, q13, q5
1096 vshr.u32 q0, q12, #19
1097 vshl.u32 q1, q12, #32-19
1099 vst1.u32 {q13}, [r1]!
1101 vshr.u32 q1, q12, #10
1102 vshl.u32 q0, q13, #32-17
1104 vshr.u32 q4, q13, #17
1105 vadd.u32 q14, q14, q2
1106 vshl.u32 q1, q13, #32-19
1108 vshr.u32 q0, q13, #19
1110 vshr.u32 q1, q13, #10
1112 vst1.u32 {q14}, [r1]!
1116 vshr.u32 q4, q14, #17
1117 vshl.u32 q0, q14, #32-17
1118 vadd.u32 q15, q15, q5
1120 vshr.u32 q0, q14, #19
1121 vshl.u32 q1, q14, #32-19
1123 vst1.u32 {q15}, [r1]!
1125 vshr.u32 q1, q14, #10
1128 vshl.u32 q0, q15, #32-17
1130 vst1.u32 {q2}, [sp]!
1132 vshr.u32 q4, q15, #17
1133 vshr.u32 q2, q15, #19
1135 vst1.u32 {q9}, [r1]!
1136 vshl.u32 q1, q15, #32-19
1138 vshr.u32 q0, q15, #10
1140 vld1.u32 {q5-q6}, [r4]!
1143 vadd.u32 q10, q10, q4
1144 vst1.u32 {q2}, [sp]!
1145 vadd.u32 q10, q10, q2
1149 sha256d_ms_4way_extend_loop2:
1150 sha256_4way_extend_doubleround_body 16, r4, r1, q11, q12, q9, q10
1151 sha256_4way_extend_doubleround_body 18, r4, r1, q13, q14, q11, q12
1152 sha256_4way_extend_doubleround_body 20, r4, r1, q15, q9, q13, q14
1153 sha256_4way_extend_doubleround_body 22, r4, r1, q10, q11, q15, q9
1154 sha256_4way_extend_doubleround_body 24, r4, r1, q12, q13, q10, q11
1155 sha256_4way_extend_doubleround_body 26, r4, r1, q14, q15, q12, q13
1156 sha256_4way_extend_doubleround_body 28, r4, r1, q9, q10, q14, q15
1157 sha256_4way_extend_doubleround_body 30, r4, r1, q11, q12, q9, q10
1158 sha256_4way_extend_doubleround_body 32, r4, r1, q13, q14, q11, q12
1159 sha256_4way_extend_doubleround_body 34, r4, r1, q15, q9, q13, q14
1160 sha256_4way_extend_doubleround_body 36, r4, r1, q10, q11, q15, q9
1161 sha256_4way_extend_doubleround_body 38, r4, r1, q12, q13, q10, q11
1162 sha256_4way_extend_doubleround_body 40, r4, r1, q14, q15, q12, q13
1163 sha256_4way_extend_doubleround_body 42, r4, r1, q9, q10, q14, q15
1164 sha256_4way_extend_doubleround_body 44, r4, r1, q11, q12, q9, q10
1165 sha256_4way_extend_doubleround_foot 46, r4, r1, q13, q14, q11, q12
1166 bne sha256d_ms_4way_extend_coda2
1171 adr r3, sha256d_ms_4way_4k+3*16
1172 sub r1, r1, #(64-3)*16
1173 b sha256d_ms_4way_main_loop1
1179 sha256d_ms_4way_main_loop2:
1180 sha256_4way_main_round 0, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1181 sha256_4way_main_round 1, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1182 sha256_4way_main_round 2, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1183 sha256d_ms_4way_main_loop1:
1184 sha256_4way_main_round 3, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1185 sha256_4way_main_quadround 4, r3, r1
1186 sha256_4way_main_quadround 8, r3, r1
1187 sha256_4way_main_quadround 12, r3, r1
1188 sha256_4way_main_quadround 16, r3, r1
1189 sha256_4way_main_quadround 20, r3, r1
1190 sha256_4way_main_quadround 24, r3, r1
1191 sha256_4way_main_quadround 28, r3, r1
1192 sha256_4way_main_quadround 32, r3, r1
1193 sha256_4way_main_quadround 36, r3, r1
1194 sha256_4way_main_quadround 40, r3, r1
1195 sha256_4way_main_quadround 44, r3, r1
1196 sha256_4way_main_quadround 48, r3, r1
1197 sha256_4way_main_quadround 52, r3, r1
1198 sha256_4way_main_round 56, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1199 bne sha256d_ms_4way_finish
1200 sha256_4way_main_round 57, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1201 sha256_4way_main_round 58, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1202 sha256_4way_main_round 59, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1203 sha256_4way_main_quadround 60, r3, r1
1208 vadd.u32 q2, q2, q10
1209 vadd.u32 q3, q3, q11
1210 vadd.u32 q4, q4, q12
1211 vadd.u32 q5, q5, q13
1212 vadd.u32 q6, q6, q14
1213 vadd.u32 q7, q7, q15
1216 sub r1, r1, #(64-18)*16
1219 vstmia r1, {q11-q13}
1221 vstmia r1, {q14-q15}
1224 vmov.u32 q8, #0x80000000
1231 vmov.u32 q15, #0x00000100
1233 vstmia r1!, {q8-q15}
1237 vshl.u32 q2, q1, #32-7
1238 vshr.u32 q4, q1, #18
1240 vshl.u32 q3, q1, #32-18
1244 vld1.u32 {q5}, [r4]!
1246 vmov.u32 q7, #0x00a00000
1248 vshr.u32 q10, q5, #7
1249 vshl.u32 q0, q5, #32-7
1250 vshl.u32 q3, q5, #32-18
1251 veor.u32 q10, q10, q0
1252 vshr.u32 q0, q5, #18
1253 veor.u32 q10, q10, q3
1254 vst1.u32 {q9}, [r1]!
1256 veor.u32 q10, q10, q0
1258 vld1.u32 {q6}, [r4]!
1259 veor.u32 q10, q10, q0
1261 vshr.u32 q4, q9, #17
1262 vshl.u32 q0, q9, #32-17
1263 vadd.u32 q10, q10, q3
1265 vshr.u32 q0, q9, #19
1266 vshl.u32 q1, q9, #32-19
1268 vshr.u32 q11, q6, #7
1269 vshl.u32 q0, q6, #32-7
1271 veor.u32 q11, q11, q0
1272 vshr.u32 q1, q9, #10
1273 vshr.u32 q0, q6, #18
1275 veor.u32 q11, q11, q0
1276 vshl.u32 q1, q6, #32-18
1278 veor.u32 q11, q11, q1
1280 veor.u32 q11, q11, q0
1281 vld1.u32 {q5}, [r4]!
1282 vadd.u32 q11, q11, q4
1283 vshr.u32 q4, q10, #17
1284 vshl.u32 q0, q10, #32-17
1285 vst1.u32 {q10}, [r1]!
1287 vshr.u32 q0, q10, #19
1288 vshl.u32 q1, q10, #32-19
1290 vshr.u32 q12, q5, #7
1292 vshl.u32 q0, q5, #32-7
1293 vshr.u32 q1, q10, #10
1294 veor.u32 q12, q12, q0
1295 vshr.u32 q0, q5, #18
1297 veor.u32 q12, q12, q0
1298 vshl.u32 q1, q5, #32-18
1299 vst1.u32 {q11}, [r1]!
1300 veor.u32 q12, q12, q1
1303 veor.u32 q12, q12, q0
1305 vshr.u32 q4, q11, #17
1306 vshl.u32 q0, q11, #32-17
1307 vadd.u32 q12, q12, q1
1308 vld1.u32 {q6}, [r4]!
1310 vshr.u32 q0, q11, #19
1311 vshl.u32 q1, q11, #32-19
1313 vshr.u32 q13, q6, #7
1314 vshl.u32 q0, q6, #32-7
1316 veor.u32 q13, q13, q0
1317 vshr.u32 q1, q11, #10
1318 vshr.u32 q0, q6, #18
1320 veor.u32 q13, q13, q0
1321 vshl.u32 q1, q6, #32-18
1323 veor.u32 q13, q13, q1
1325 veor.u32 q13, q13, q0
1326 vld1.u32 {q5}, [r4]!
1327 vadd.u32 q13, q13, q4
1328 vshr.u32 q4, q12, #17
1329 vshl.u32 q0, q12, #32-17
1330 vst1.u32 {q12}, [r1]!
1332 vshr.u32 q0, q12, #19
1333 vshl.u32 q1, q12, #32-19
1335 vshr.u32 q14, q5, #7
1337 vshl.u32 q0, q5, #32-7
1338 vshr.u32 q1, q12, #10
1339 veor.u32 q14, q14, q0
1340 vshr.u32 q0, q5, #18
1342 veor.u32 q14, q14, q0
1343 vshl.u32 q1, q5, #32-18
1344 vst1.u32 {q13}, [r1]!
1345 veor.u32 q14, q14, q1
1348 veor.u32 q14, q14, q0
1350 vshr.u32 q4, q13, #17
1351 vshl.u32 q0, q13, #32-17
1352 vadd.u32 q14, q14, q1
1353 vld1.u32 {q6}, [r4]!
1354 vadd.u32 q5, q5, q15
1356 vshr.u32 q0, q13, #19
1357 vshl.u32 q1, q13, #32-19
1359 vshr.u32 q15, q6, #7
1360 vshl.u32 q0, q6, #32-7
1362 veor.u32 q15, q15, q0
1363 vshr.u32 q1, q13, #10
1364 vshr.u32 q0, q6, #18
1366 veor.u32 q15, q15, q0
1367 vshl.u32 q1, q6, #32-18
1369 veor.u32 q15, q15, q1
1371 veor.u32 q15, q15, q0
1372 vmov.u32 q5, #0x80000000
1373 vadd.u32 q15, q15, q4
1374 vshr.u32 q4, q14, #17
1375 vshl.u32 q0, q14, #32-17
1377 vst1.u32 {q14}, [r1]!
1378 vmov.u32 q7, #0x11000000
1380 vshr.u32 q0, q14, #19
1381 vshl.u32 q1, q14, #32-19
1383 vmov.u32 q2, #0x00002000
1385 vst1.u32 {q15}, [r1]!
1387 vshr.u32 q1, q14, #10
1392 vshr.u32 q4, q15, #17
1393 vshl.u32 q0, q15, #32-17
1396 vshr.u32 q0, q15, #19
1397 vshl.u32 q1, q15, #32-19
1399 vst1.u32 {q9}, [r1]!
1400 vadd.u32 q5, q5, q10
1402 vshr.u32 q1, q15, #10
1403 vshl.u32 q0, q9, #32-17
1404 veor.u32 q10, q4, q1
1405 vshr.u32 q4, q9, #17
1406 vadd.u32 q10, q10, q5
1408 vshr.u32 q0, q9, #19
1409 vshl.u32 q1, q9, #32-19
1411 vshr.u32 q0, q9, #10
1413 vst1.u32 {q10}, [r1]!
1416 vshr.u32 q4, q10, #17
1417 vshl.u32 q0, q10, #32-17
1418 vadd.u32 q11, q11, q1
1420 vshr.u32 q0, q10, #19
1421 vshl.u32 q1, q10, #32-19
1423 vst1.u32 {q11}, [r1]!
1425 vshr.u32 q1, q10, #10
1426 vshl.u32 q0, q11, #32-17
1428 vshr.u32 q4, q11, #17
1429 vadd.u32 q12, q12, q1
1431 vshr.u32 q0, q11, #19
1432 vshl.u32 q1, q11, #32-19
1434 vshr.u32 q0, q11, #10
1436 vst1.u32 {q12}, [r1]!
1439 vshr.u32 q4, q12, #17
1440 vshl.u32 q0, q12, #32-17
1441 vadd.u32 q13, q13, q1
1443 vshr.u32 q0, q12, #19
1444 vshl.u32 q1, q12, #32-19
1446 vst1.u32 {q13}, [r1]!
1448 vshr.u32 q1, q12, #10
1449 vshl.u32 q0, q13, #32-17
1451 vshr.u32 q4, q13, #17
1452 vadd.u32 q14, q14, q1
1454 vshr.u32 q0, q13, #19
1455 vshl.u32 q1, q13, #32-19
1457 vshr.u32 q0, q13, #10
1459 vst1.u32 {q14}, [r1]!
1461 vmov.u32 q6, #0x00000100
1462 vadd.u32 q15, q15, q4
1464 vshr.u32 q4, q14, #17
1465 vshl.u32 q0, q14, #32-17
1466 vmov.u32 q7, #0x00400000
1467 vst1.u32 {q15}, [r1]!
1469 vshr.u32 q0, q14, #19
1470 vshl.u32 q1, q14, #32-19
1474 vshr.u32 q1, q14, #10
1475 vmov.u32 q2, #0x00000022
1478 vld1.u32 {q5}, [r4]!
1480 vshr.u32 q4, q15, #17
1481 vshl.u32 q0, q15, #32-17
1482 vadd.u32 q6, q6, q10
1483 vst1.u32 {q9}, [r1]!
1485 vshr.u32 q0, q15, #19
1486 vshl.u32 q1, q15, #32-19
1488 vshr.u32 q10, q5, #7
1490 vshl.u32 q0, q5, #32-7
1491 vshr.u32 q1, q15, #10
1492 veor.u32 q10, q10, q0
1493 vshr.u32 q0, q5, #18
1495 veor.u32 q10, q10, q0
1496 vshl.u32 q1, q5, #32-18
1498 veor.u32 q10, q10, q1
1500 veor.u32 q10, q10, q0
1501 vld1.u32 {q6}, [r4]!
1502 vadd.u32 q10, q10, q1
1504 b sha256d_ms_4way_extend_loop2
1508 .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
1509 .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
1510 .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
1511 .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
1512 .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
1513 .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
1514 .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
1515 .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
1517 sha256d_ms_4way_extend_coda2:
1518 adr r4, sha256d_ms_4way_4h
1523 b sha256d_ms_4way_main_loop2
1525 .macro sha256_4way_main_round_red i, rk, rw, rd, re, rf, rg, rh
1526 vld1.u32 {q8}, [\rw]!
1527 vand.u32 q9, \rf, \re
1528 vbic.u32 q10, \rg, \re
1529 vshr.u32 q11, \re, #5
1530 vorr.u32 q10, q10, q9
1531 vshl.u32 q12, \re, #32-5
1532 vadd.u32 \rh, \rh, q10
1533 veor.u32 q10, \re, q11
1534 vshr.u32 q11, \re, #19
1535 veor.u32 q10, q10, q12
1536 vshl.u32 q12, \re, #32-19
1537 veor.u32 q10, q10, q11
1538 vadd.u32 \rh, \rh, q8
1539 veor.u32 q10, q10, q12
1540 vld1.u32 {q9}, [\rk]!
1541 vadd.u32 \rh, \rh, \rd
1542 vshr.u32 q11, q10, #6
1543 vadd.u32 \rh, \rh, q9
1544 vshl.u32 q13, q10, #32-6
1545 vadd.u32 \rh, \rh, q11
1546 vadd.u32 \rh, \rh, q13
1549 sha256d_ms_4way_finish:
1550 sha256_4way_main_round_red 57, r3, r1, q2, q7, q4, q5, q6
1551 sha256_4way_main_round_red 58, r3, r1, q1, q6, q7, q4, q5
1552 sha256_4way_main_round_red 59, r3, r1, q0, q5, q6, q7, q4
1553 sha256_4way_main_round_red 60, r3, r1, q3, q4, q5, q6, q7
1555 vadd.u32 q7, q7, q15
1567 .globl sha256_use_4way
1568 .globl _sha256_use_4way
1570 .type sha256_use_4way, %function