1 # Copyright 2011-2012 pooler@litecoinpool.org
\r
2 # All rights reserved.
\r
4 # Redistribution and use in source and binary forms, with or without
\r
5 # modification, are permitted provided that the following conditions
\r
7 # 1. Redistributions of source code must retain the above copyright
\r
8 # notice, this list of conditions and the following disclaimer.
\r
9 # 2. Redistributions in binary form must reproduce the above copyright
\r
10 # notice, this list of conditions and the following disclaimer in the
\r
11 # documentation and/or other materials provided with the distribution.
\r
13 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
\r
14 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
\r
16 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
\r
17 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\r
18 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
\r
19 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
\r
20 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
\r
21 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
\r
22 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
\r
25 #if defined(__linux__) && defined(__ELF__)
\r
26 .section .note.GNU-stack,"",%progbits
\r
29 #if defined(__x86_64__)
\r
31 .macro scrypt_shuffle src, so, dest, do
\r
32 movl \so+60(\src), %r8d
\r
33 movl \so+44(\src), %r9d
\r
34 movl \so+28(\src), %r10d
\r
35 movl \so+12(\src), %r11d
\r
36 movl %r8d, \do+12(\dest)
\r
37 movl %r9d, \do+28(\dest)
\r
38 movl %r10d, \do+44(\dest)
\r
39 movl %r11d, \do+60(\dest)
\r
40 movl \so+40(\src), %r8d
\r
41 movl \so+8(\src), %r9d
\r
42 movl \so+48(\src), %r10d
\r
43 movl \so+16(\src), %r11d
\r
44 movl %r8d, \do+8(\dest)
\r
45 movl %r9d, \do+40(\dest)
\r
46 movl %r10d, \do+16(\dest)
\r
47 movl %r11d, \do+48(\dest)
\r
48 movl \so+20(\src), %r8d
\r
49 movl \so+4(\src), %r9d
\r
50 movl \so+52(\src), %r10d
\r
51 movl \so+36(\src), %r11d
\r
52 movl %r8d, \do+4(\dest)
\r
53 movl %r9d, \do+20(\dest)
\r
54 movl %r10d, \do+36(\dest)
\r
55 movl %r11d, \do+52(\dest)
\r
56 movl \so+0(\src), %r8d
\r
57 movl \so+24(\src), %r9d
\r
58 movl \so+32(\src), %r10d
\r
59 movl \so+56(\src), %r11d
\r
60 movl %r8d, \do+0(\dest)
\r
61 movl %r9d, \do+24(\dest)
\r
62 movl %r10d, \do+32(\dest)
\r
63 movl %r11d, \do+56(\dest)
\r
66 .macro gen_salsa8_core_doubleround
\r
69 leaq (%r14, %rdx), %rbp
\r
72 leaq (%rdi, %r15), %rbp
\r
75 leaq (%rdx, %r9), %rbp
\r
78 leaq (%r15, %r10), %rbp
\r
81 leaq (%r9, %r11), %rbp
\r
84 leaq (%r10, %r13), %rbp
\r
87 leaq (%r11, %r14), %rbp
\r
90 leaq (%r13, %rdi), %rbp
\r
97 leaq (%rax, %rbp), %r15
\r
100 leaq (%rbp, %rbx), %r15
\r
103 leaq (%rbx, %rcx), %r15
\r
106 leaq (%rcx, %rax), %r15
\r
110 movq 88(%rsp), %r15
\r
111 movq %rbp, 48(%rsp)
\r
113 leaq (%r12, %r15), %rbp
\r
116 leaq (%r15, %rsi), %rbp
\r
119 leaq (%rsi, %r8), %rbp
\r
122 leaq (%r8, %r12), %rbp
\r
126 movq %r15, 88(%rsp)
\r
127 movq 72(%rsp), %r15
\r
129 leaq (%rsi, %rdx), %rbp
\r
132 leaq (%r9, %r15), %rbp
\r
135 leaq (%rdx, %rdi), %rbp
\r
138 leaq (%r15, %rax), %rbp
\r
141 leaq (%rdi, %rcx), %rbp
\r
144 leaq (%rax, %r8), %rbp
\r
147 leaq (%rcx, %rsi), %rbp
\r
150 leaq (%r8, %r9), %rbp
\r
154 movq 48(%rsp), %rbp
\r
155 movq %r15, 72(%rsp)
\r
157 leaq (%r10, %rbp), %r15
\r
160 leaq (%rbp, %r12), %r15
\r
163 leaq (%r12, %r11), %r15
\r
166 leaq (%r11, %r10), %r15
\r
170 movq 88(%rsp), %r15
\r
171 movq %rbp, 48(%rsp)
\r
173 leaq (%rbx, %r15), %rbp
\r
176 leaq (%r15, %r14), %rbp
\r
179 leaq (%r14, %r13), %rbp
\r
182 leaq (%r13, %rbx), %rbp
\r
186 movq %r15, 88(%rsp)
\r
192 # 0: %rdx, %rdi, %rcx, %rsi
\r
196 movq 16(%rsp), %rsi
\r
199 # 1: %r9, 72(%rsp), %rax, %r8
\r
207 # 2: %r11, %r10, 48(%rsp), %r12
\r
208 movq 40(%rsp), %r10
\r
211 movq 48(%rsp), %r12
\r
213 #movq %r13, 48(%rsp)
\r
215 # 3: %r14, %r13, %rbx, 88(%rsp)
\r
216 movq 56(%rsp), %r13
\r
219 movq 64(%rsp), %r15
\r
222 movq %r15, 88(%rsp)
\r
224 gen_salsa8_core_doubleround
\r
225 gen_salsa8_core_doubleround
\r
226 gen_salsa8_core_doubleround
\r
227 gen_salsa8_core_doubleround
\r
239 movq 72(%rsp), %rdi
\r
255 movl 48(%rsp), %r8d
\r
265 movq 88(%rsp), %rdi
\r
271 punpcklqdq %xmm4, %xmm0
\r
272 punpcklqdq %xmm5, %xmm1
\r
273 punpcklqdq %xmm6, %xmm2
\r
274 punpcklqdq %xmm7, %xmm3
\r
276 #movq %rdx, 8(%rsp)
\r
277 #movq %rcx, 16(%rsp)
\r
278 #movq %r9, 24(%rsp)
\r
279 #movq %rax, 32(%rsp)
\r
280 #movq %r11, 40(%rsp)
\r
281 #movq %r8, 48(%rsp)
\r
282 #movq %r14, 56(%rsp)
\r
283 #movq %rbx, 64(%rsp)
\r
291 .globl _scrypt_core
\r
302 movdqa %xmm6, 8(%rsp)
\r
303 movdqa %xmm7, 24(%rsp)
\r
304 movdqa %xmm8, 40(%rsp)
\r
305 movdqa %xmm9, 56(%rsp)
\r
306 movdqa %xmm10, 72(%rsp)
\r
307 movdqa %xmm11, 88(%rsp)
\r
308 movdqa %xmm12, 104(%rsp)
\r
309 movdqa %xmm13, 120(%rsp)
\r
310 movdqa %xmm14, 136(%rsp)
\r
311 movdqa %xmm15, 152(%rsp)
\r
318 .macro scrypt_core_cleanup
\r
322 movdqa 8(%rsp), %xmm6
\r
323 movdqa 24(%rsp), %xmm7
\r
324 movdqa 40(%rsp), %xmm8
\r
325 movdqa 56(%rsp), %xmm9
\r
326 movdqa 72(%rsp), %xmm10
\r
327 movdqa 88(%rsp), %xmm11
\r
328 movdqa 104(%rsp), %xmm12
\r
329 movdqa 120(%rsp), %xmm13
\r
330 movdqa 136(%rsp), %xmm14
\r
331 movdqa 152(%rsp), %xmm15
\r
342 # GenuineIntel processors have fast SIMD
\r
345 cmpl $0x6c65746e, %ecx
\r
346 jne gen_scrypt_core
\r
347 cmpl $0x49656e69, %edx
\r
348 jne gen_scrypt_core
\r
349 cmpl $0x756e6547, %ebx
\r
354 movdqa 0(%rdi), %xmm8
\r
355 movdqa 16(%rdi), %xmm9
\r
356 movdqa 32(%rdi), %xmm10
\r
357 movdqa 48(%rdi), %xmm11
\r
358 movdqa 64(%rdi), %xmm12
\r
359 movdqa 80(%rdi), %xmm13
\r
360 movdqa 96(%rdi), %xmm14
\r
361 movdqa 112(%rdi), %xmm15
\r
363 leaq 131072(%rsi), %rcx
\r
364 movq %rdi, 104(%rsp)
\r
365 movq %rsi, 112(%rsp)
\r
366 movq %rcx, 120(%rsp)
\r
367 gen_scrypt_core_loop1:
\r
368 movdqa %xmm8, 0(%rsi)
\r
369 movdqa %xmm9, 16(%rsi)
\r
370 movdqa %xmm10, 32(%rsi)
\r
371 movdqa %xmm11, 48(%rsi)
\r
372 movdqa %xmm12, 64(%rsi)
\r
373 movdqa %xmm13, 80(%rsi)
\r
374 movdqa %xmm14, 96(%rsi)
\r
375 movdqa %xmm15, 112(%rsi)
\r
379 pxor %xmm14, %xmm10
\r
380 pxor %xmm15, %xmm11
\r
381 movdqa %xmm8, 0(%rsp)
\r
382 movdqa %xmm9, 16(%rsp)
\r
383 movdqa %xmm10, 32(%rsp)
\r
384 movdqa %xmm11, 48(%rsp)
\r
385 movq %rsi, 128(%rsp)
\r
386 call gen_salsa8_core
\r
389 paddd %xmm2, %xmm10
\r
390 paddd %xmm3, %xmm11
\r
394 pxor %xmm10, %xmm14
\r
395 pxor %xmm11, %xmm15
\r
396 movdqa %xmm12, 0(%rsp)
\r
397 movdqa %xmm13, 16(%rsp)
\r
398 movdqa %xmm14, 32(%rsp)
\r
399 movdqa %xmm15, 48(%rsp)
\r
400 call gen_salsa8_core
\r
401 movq 128(%rsp), %rsi
\r
402 paddd %xmm0, %xmm12
\r
403 paddd %xmm1, %xmm13
\r
404 paddd %xmm2, %xmm14
\r
405 paddd %xmm3, %xmm15
\r
408 movq 120(%rsp), %rcx
\r
410 jne gen_scrypt_core_loop1
\r
413 gen_scrypt_core_loop2:
\r
414 movq 112(%rsp), %rsi
\r
418 movdqa 0(%rsi, %rdx), %xmm0
\r
419 movdqa 16(%rsi, %rdx), %xmm1
\r
420 movdqa 32(%rsi, %rdx), %xmm2
\r
421 movdqa 48(%rsi, %rdx), %xmm3
\r
422 movdqa 64(%rsi, %rdx), %xmm4
\r
423 movdqa 80(%rsi, %rdx), %xmm5
\r
424 movdqa 96(%rsi, %rdx), %xmm6
\r
425 movdqa 112(%rsi, %rdx), %xmm7
\r
437 pxor %xmm14, %xmm10
\r
438 pxor %xmm15, %xmm11
\r
439 movdqa %xmm8, 0(%rsp)
\r
440 movdqa %xmm9, 16(%rsp)
\r
441 movdqa %xmm10, 32(%rsp)
\r
442 movdqa %xmm11, 48(%rsp)
\r
443 movq %rcx, 128(%rsp)
\r
444 call gen_salsa8_core
\r
447 paddd %xmm2, %xmm10
\r
448 paddd %xmm3, %xmm11
\r
452 pxor %xmm10, %xmm14
\r
453 pxor %xmm11, %xmm15
\r
454 movdqa %xmm12, 0(%rsp)
\r
455 movdqa %xmm13, 16(%rsp)
\r
456 movdqa %xmm14, 32(%rsp)
\r
457 movdqa %xmm15, 48(%rsp)
\r
458 call gen_salsa8_core
\r
459 movq 128(%rsp), %rcx
\r
460 paddd %xmm0, %xmm12
\r
461 paddd %xmm1, %xmm13
\r
462 paddd %xmm2, %xmm14
\r
463 paddd %xmm3, %xmm15
\r
466 ja gen_scrypt_core_loop2
\r
468 movq 104(%rsp), %rdi
\r
469 movdqa %xmm8, 0(%rdi)
\r
470 movdqa %xmm9, 16(%rdi)
\r
471 movdqa %xmm10, 32(%rdi)
\r
472 movdqa %xmm11, 48(%rdi)
\r
473 movdqa %xmm12, 64(%rdi)
\r
474 movdqa %xmm13, 80(%rdi)
\r
475 movdqa %xmm14, 96(%rdi)
\r
476 movdqa %xmm15, 112(%rdi)
\r
479 scrypt_core_cleanup
\r
483 .macro xmm_salsa8_core_doubleround
\r
484 movdqa %xmm1, %xmm4
\r
486 movdqa %xmm4, %xmm5
\r
491 movdqa %xmm0, %xmm4
\r
494 movdqa %xmm4, %xmm5
\r
498 movdqa %xmm3, %xmm4
\r
499 pshufd $0x93, %xmm3, %xmm3
\r
503 movdqa %xmm4, %xmm5
\r
507 movdqa %xmm2, %xmm4
\r
508 pshufd $0x4e, %xmm2, %xmm2
\r
512 movdqa %xmm4, %xmm5
\r
516 pshufd $0x39, %xmm1, %xmm1
\r
518 movdqa %xmm3, %xmm4
\r
521 movdqa %xmm4, %xmm5
\r
526 movdqa %xmm0, %xmm4
\r
529 movdqa %xmm4, %xmm5
\r
533 movdqa %xmm1, %xmm4
\r
534 pshufd $0x93, %xmm1, %xmm1
\r
538 movdqa %xmm4, %xmm5
\r
542 movdqa %xmm2, %xmm4
\r
543 pshufd $0x4e, %xmm2, %xmm2
\r
547 movdqa %xmm4, %xmm5
\r
551 pshufd $0x39, %xmm3, %xmm3
\r
555 .macro xmm_salsa8_core
\r
556 xmm_salsa8_core_doubleround
\r
557 xmm_salsa8_core_doubleround
\r
558 xmm_salsa8_core_doubleround
\r
559 xmm_salsa8_core_doubleround
\r
564 # shuffle 1st block into %xmm8-%xmm11
\r
565 movl 60(%rdi), %edx
\r
566 movl 44(%rdi), %ecx
\r
567 movl 28(%rdi), %ebx
\r
568 movl 12(%rdi), %eax
\r
573 movl 40(%rdi), %ecx
\r
574 movl 24(%rdi), %ebx
\r
576 movl 56(%rdi), %edx
\r
577 pshufd $0x93, %xmm0, %xmm0
\r
578 pshufd $0x93, %xmm1, %xmm1
\r
579 pshufd $0x93, %xmm2, %xmm2
\r
580 pshufd $0x93, %xmm3, %xmm3
\r
589 movl 20(%rdi), %ebx
\r
591 movl 52(%rdi), %edx
\r
592 movl 36(%rdi), %ecx
\r
593 pshufd $0x93, %xmm0, %xmm0
\r
594 pshufd $0x93, %xmm1, %xmm1
\r
595 pshufd $0x93, %xmm2, %xmm2
\r
596 pshufd $0x93, %xmm3, %xmm3
\r
606 movl 48(%rdi), %edx
\r
607 movl 32(%rdi), %ecx
\r
608 movl 16(%rdi), %ebx
\r
609 pshufd $0x93, %xmm0, %xmm0
\r
610 pshufd $0x93, %xmm1, %xmm1
\r
611 pshufd $0x93, %xmm2, %xmm2
\r
612 pshufd $0x93, %xmm3, %xmm3
\r
619 paddd %xmm2, %xmm10
\r
620 paddd %xmm3, %xmm11
\r
622 # shuffle 2nd block into %xmm12-%xmm15
\r
623 movl 124(%rdi), %edx
\r
624 movl 108(%rdi), %ecx
\r
625 movl 92(%rdi), %ebx
\r
626 movl 76(%rdi), %eax
\r
631 movl 104(%rdi), %ecx
\r
632 movl 88(%rdi), %ebx
\r
633 movl 72(%rdi), %eax
\r
634 movl 120(%rdi), %edx
\r
635 pshufd $0x93, %xmm0, %xmm0
\r
636 pshufd $0x93, %xmm1, %xmm1
\r
637 pshufd $0x93, %xmm2, %xmm2
\r
638 pshufd $0x93, %xmm3, %xmm3
\r
647 movl 84(%rdi), %ebx
\r
648 movl 68(%rdi), %eax
\r
649 movl 116(%rdi), %edx
\r
650 movl 100(%rdi), %ecx
\r
651 pshufd $0x93, %xmm0, %xmm0
\r
652 pshufd $0x93, %xmm1, %xmm1
\r
653 pshufd $0x93, %xmm2, %xmm2
\r
654 pshufd $0x93, %xmm3, %xmm3
\r
663 movl 64(%rdi), %eax
\r
664 movl 112(%rdi), %edx
\r
665 movl 96(%rdi), %ecx
\r
666 movl 80(%rdi), %ebx
\r
667 pshufd $0x93, %xmm0, %xmm0
\r
668 pshufd $0x93, %xmm1, %xmm1
\r
669 pshufd $0x93, %xmm2, %xmm2
\r
670 pshufd $0x93, %xmm3, %xmm3
\r
675 paddd %xmm0, %xmm12
\r
676 paddd %xmm1, %xmm13
\r
677 paddd %xmm2, %xmm14
\r
678 paddd %xmm3, %xmm15
\r
681 leaq 131072(%rsi), %rcx
\r
682 xmm_scrypt_core_loop1:
\r
683 movdqa %xmm8, 0(%rdx)
\r
684 movdqa %xmm9, 16(%rdx)
\r
685 movdqa %xmm10, 32(%rdx)
\r
686 movdqa %xmm11, 48(%rdx)
\r
687 movdqa %xmm12, 64(%rdx)
\r
688 movdqa %xmm13, 80(%rdx)
\r
689 movdqa %xmm14, 96(%rdx)
\r
690 movdqa %xmm15, 112(%rdx)
\r
694 pxor %xmm14, %xmm10
\r
695 pxor %xmm15, %xmm11
\r
696 movdqa %xmm8, %xmm0
\r
697 movdqa %xmm9, %xmm1
\r
698 movdqa %xmm10, %xmm2
\r
699 movdqa %xmm11, %xmm3
\r
703 paddd %xmm2, %xmm10
\r
704 paddd %xmm3, %xmm11
\r
708 pxor %xmm10, %xmm14
\r
709 pxor %xmm11, %xmm15
\r
710 movdqa %xmm12, %xmm0
\r
711 movdqa %xmm13, %xmm1
\r
712 movdqa %xmm14, %xmm2
\r
713 movdqa %xmm15, %xmm3
\r
715 paddd %xmm0, %xmm12
\r
716 paddd %xmm1, %xmm13
\r
717 paddd %xmm2, %xmm14
\r
718 paddd %xmm3, %xmm15
\r
722 jne xmm_scrypt_core_loop1
\r
725 xmm_scrypt_core_loop2:
\r
729 movdqa 0(%rsi, %rdx), %xmm0
\r
730 movdqa 16(%rsi, %rdx), %xmm1
\r
731 movdqa 32(%rsi, %rdx), %xmm2
\r
732 movdqa 48(%rsi, %rdx), %xmm3
\r
733 movdqa 64(%rsi, %rdx), %xmm4
\r
734 movdqa 80(%rsi, %rdx), %xmm5
\r
735 movdqa 96(%rsi, %rdx), %xmm6
\r
736 movdqa 112(%rsi, %rdx), %xmm7
\r
748 pxor %xmm14, %xmm10
\r
749 pxor %xmm15, %xmm11
\r
750 movdqa %xmm8, %xmm0
\r
751 movdqa %xmm9, %xmm1
\r
752 movdqa %xmm10, %xmm2
\r
753 movdqa %xmm11, %xmm3
\r
757 paddd %xmm2, %xmm10
\r
758 paddd %xmm3, %xmm11
\r
762 pxor %xmm10, %xmm14
\r
763 pxor %xmm11, %xmm15
\r
764 movdqa %xmm12, %xmm0
\r
765 movdqa %xmm13, %xmm1
\r
766 movdqa %xmm14, %xmm2
\r
767 movdqa %xmm15, %xmm3
\r
769 paddd %xmm0, %xmm12
\r
770 paddd %xmm1, %xmm13
\r
771 paddd %xmm2, %xmm14
\r
772 paddd %xmm3, %xmm15
\r
775 ja xmm_scrypt_core_loop2
\r
777 # re-shuffle 1st block back
\r
782 pshufd $0x39, %xmm8, %xmm8
\r
783 pshufd $0x39, %xmm9, %xmm9
\r
784 pshufd $0x39, %xmm10, %xmm10
\r
785 pshufd $0x39, %xmm11, %xmm11
\r
787 movl %edx, 48(%rdi)
\r
788 movl %ecx, 32(%rdi)
\r
789 movl %ebx, 16(%rdi)
\r
794 pshufd $0x39, %xmm8, %xmm8
\r
795 pshufd $0x39, %xmm9, %xmm9
\r
796 pshufd $0x39, %xmm10, %xmm10
\r
797 pshufd $0x39, %xmm11, %xmm11
\r
798 movl %ebx, 20(%rdi)
\r
800 movl %edx, 52(%rdi)
\r
801 movl %ecx, 36(%rdi)
\r
806 pshufd $0x39, %xmm8, %xmm8
\r
807 pshufd $0x39, %xmm9, %xmm9
\r
808 pshufd $0x39, %xmm10, %xmm10
\r
809 pshufd $0x39, %xmm11, %xmm11
\r
810 movl %ecx, 40(%rdi)
\r
811 movl %ebx, 24(%rdi)
\r
813 movl %edx, 56(%rdi)
\r
818 movl %edx, 60(%rdi)
\r
819 movl %ecx, 44(%rdi)
\r
820 movl %ebx, 28(%rdi)
\r
821 movl %eax, 12(%rdi)
\r
823 # re-shuffle 2nd block back
\r
828 pshufd $0x39, %xmm12, %xmm12
\r
829 pshufd $0x39, %xmm13, %xmm13
\r
830 pshufd $0x39, %xmm14, %xmm14
\r
831 pshufd $0x39, %xmm15, %xmm15
\r
832 movl %eax, 64(%rdi)
\r
833 movl %edx, 112(%rdi)
\r
834 movl %ecx, 96(%rdi)
\r
835 movl %ebx, 80(%rdi)
\r
840 pshufd $0x39, %xmm12, %xmm12
\r
841 pshufd $0x39, %xmm13, %xmm13
\r
842 pshufd $0x39, %xmm14, %xmm14
\r
843 pshufd $0x39, %xmm15, %xmm15
\r
844 movl %ebx, 84(%rdi)
\r
845 movl %eax, 68(%rdi)
\r
846 movl %edx, 116(%rdi)
\r
847 movl %ecx, 100(%rdi)
\r
852 pshufd $0x39, %xmm12, %xmm12
\r
853 pshufd $0x39, %xmm13, %xmm13
\r
854 pshufd $0x39, %xmm14, %xmm14
\r
855 pshufd $0x39, %xmm15, %xmm15
\r
856 movl %ecx, 104(%rdi)
\r
857 movl %ebx, 88(%rdi)
\r
858 movl %eax, 72(%rdi)
\r
859 movl %edx, 120(%rdi)
\r
864 movl %edx, 124(%rdi)
\r
865 movl %ecx, 108(%rdi)
\r
866 movl %ebx, 92(%rdi)
\r
867 movl %eax, 76(%rdi)
\r
869 scrypt_core_cleanup
\r
875 .globl scrypt_best_throughput
\r
876 .globl _scrypt_best_throughput
\r
877 scrypt_best_throughput:
\r
878 _scrypt_best_throughput:
\r
883 cmpl $0x444d4163, %ecx
\r
884 jne scrypt_best_throughput_exit
\r
885 cmpl $0x69746e65, %edx
\r
886 jne scrypt_best_throughput_exit
\r
887 cmpl $0x68747541, %ebx
\r
888 jne scrypt_best_throughput_exit
\r
891 andl $0x0ff00000, %eax
\r
893 jnz scrypt_best_throughput_exit
\r
895 scrypt_best_throughput_exit:
\r
900 .macro xmm_salsa8_core_2way_doubleround
\r
901 movdqa %xmm1, %xmm4
\r
902 movdqa %xmm9, %xmm6
\r
905 movdqa %xmm4, %xmm5
\r
906 movdqa %xmm6, %xmm7
\r
915 movdqa %xmm0, %xmm4
\r
916 movdqa %xmm8, %xmm6
\r
919 paddd %xmm11, %xmm6
\r
920 movdqa %xmm4, %xmm5
\r
921 movdqa %xmm6, %xmm7
\r
928 movdqa %xmm3, %xmm4
\r
929 movdqa %xmm11, %xmm6
\r
930 pshufd $0x93, %xmm3, %xmm3
\r
931 pshufd $0x93, %xmm11, %xmm11
\r
936 paddd %xmm10, %xmm6
\r
937 movdqa %xmm4, %xmm5
\r
938 movdqa %xmm6, %xmm7
\r
945 movdqa %xmm2, %xmm4
\r
946 movdqa %xmm10, %xmm6
\r
947 pshufd $0x4e, %xmm2, %xmm2
\r
948 pshufd $0x4e, %xmm10, %xmm10
\r
954 movdqa %xmm4, %xmm5
\r
955 movdqa %xmm6, %xmm7
\r
962 pshufd $0x39, %xmm1, %xmm1
\r
963 pshufd $0x39, %xmm9, %xmm9
\r
966 movdqa %xmm3, %xmm4
\r
967 movdqa %xmm11, %xmm6
\r
971 movdqa %xmm4, %xmm5
\r
972 movdqa %xmm6, %xmm7
\r
981 movdqa %xmm0, %xmm4
\r
982 movdqa %xmm8, %xmm6
\r
986 movdqa %xmm4, %xmm5
\r
987 movdqa %xmm6, %xmm7
\r
994 movdqa %xmm1, %xmm4
\r
995 movdqa %xmm9, %xmm6
\r
996 pshufd $0x93, %xmm1, %xmm1
\r
997 pshufd $0x93, %xmm9, %xmm9
\r
1001 paddd %xmm2, %xmm4
\r
1002 paddd %xmm10, %xmm6
\r
1003 movdqa %xmm4, %xmm5
\r
1004 movdqa %xmm6, %xmm7
\r
1010 pxor %xmm6, %xmm11
\r
1011 movdqa %xmm2, %xmm4
\r
1012 movdqa %xmm10, %xmm6
\r
1013 pshufd $0x4e, %xmm2, %xmm2
\r
1014 pshufd $0x4e, %xmm10, %xmm10
\r
1016 pxor %xmm7, %xmm11
\r
1018 paddd %xmm3, %xmm4
\r
1019 paddd %xmm11, %xmm6
\r
1020 movdqa %xmm4, %xmm5
\r
1021 movdqa %xmm6, %xmm7
\r
1028 pshufd $0x39, %xmm3, %xmm3
\r
1029 pshufd $0x39, %xmm11, %xmm11
\r
1034 .macro xmm_salsa8_core_2way
\r
1035 xmm_salsa8_core_2way_doubleround
\r
1036 xmm_salsa8_core_2way_doubleround
\r
1037 xmm_salsa8_core_2way_doubleround
\r
1038 xmm_salsa8_core_2way_doubleround
\r
1044 .globl scrypt_core_2way
\r
1045 .globl _scrypt_core_2way
\r
1047 _scrypt_core_2way:
\r
1050 #if defined(WIN64)
\r
1052 movdqa %xmm6, 8(%rsp)
\r
1053 movdqa %xmm7, 24(%rsp)
\r
1054 movdqa %xmm8, 40(%rsp)
\r
1055 movdqa %xmm9, 56(%rsp)
\r
1056 movdqa %xmm10, 72(%rsp)
\r
1057 movdqa %xmm11, 88(%rsp)
\r
1058 movdqa %xmm12, 104(%rsp)
\r
1059 movdqa %xmm13, 120(%rsp)
\r
1060 movdqa %xmm14, 136(%rsp)
\r
1061 movdqa %xmm15, 152(%rsp)
\r
1070 scrypt_shuffle %rdi, 0, %rsp, 0
\r
1071 scrypt_shuffle %rdi, 64, %rsp, 64
\r
1072 scrypt_shuffle %rsi, 0, %rsp, 128
\r
1073 scrypt_shuffle %rsi, 64, %rsp, 192
\r
1075 movdqa 192(%rsp), %xmm12
\r
1076 movdqa 208(%rsp), %xmm13
\r
1077 movdqa 224(%rsp), %xmm14
\r
1078 movdqa 240(%rsp), %xmm15
\r
1081 leaq 262144(%rdx), %rcx
\r
1082 scrypt_core_2way_loop1:
\r
1083 movdqa 0(%rsp), %xmm0
\r
1084 movdqa 16(%rsp), %xmm1
\r
1085 movdqa 32(%rsp), %xmm2
\r
1086 movdqa 48(%rsp), %xmm3
\r
1087 movdqa 64(%rsp), %xmm4
\r
1088 movdqa 80(%rsp), %xmm5
\r
1089 movdqa 96(%rsp), %xmm6
\r
1090 movdqa 112(%rsp), %xmm7
\r
1091 movdqa 128(%rsp), %xmm8
\r
1092 movdqa 144(%rsp), %xmm9
\r
1093 movdqa 160(%rsp), %xmm10
\r
1094 movdqa 176(%rsp), %xmm11
\r
1099 movdqa %xmm0, 0(%rbp)
\r
1100 movdqa %xmm1, 16(%rbp)
\r
1101 movdqa %xmm2, 32(%rbp)
\r
1102 movdqa %xmm3, 48(%rbp)
\r
1103 movdqa %xmm4, 64(%rbp)
\r
1104 movdqa %xmm5, 80(%rbp)
\r
1105 movdqa %xmm6, 96(%rbp)
\r
1106 movdqa %xmm7, 112(%rbp)
\r
1107 pxor %xmm12, %xmm8
\r
1108 pxor %xmm13, %xmm9
\r
1109 pxor %xmm14, %xmm10
\r
1110 pxor %xmm15, %xmm11
\r
1111 movdqa %xmm8, 128(%rbp)
\r
1112 movdqa %xmm9, 144(%rbp)
\r
1113 movdqa %xmm10, 160(%rbp)
\r
1114 movdqa %xmm11, 176(%rbp)
\r
1115 movdqa %xmm12, 192(%rbp)
\r
1116 movdqa %xmm13, 208(%rbp)
\r
1117 movdqa %xmm14, 224(%rbp)
\r
1118 movdqa %xmm15, 240(%rbp)
\r
1120 xmm_salsa8_core_2way
\r
1121 paddd 0(%rbp), %xmm0
\r
1122 paddd 16(%rbp), %xmm1
\r
1123 paddd 32(%rbp), %xmm2
\r
1124 paddd 48(%rbp), %xmm3
\r
1125 paddd 128(%rbp), %xmm8
\r
1126 paddd 144(%rbp), %xmm9
\r
1127 paddd 160(%rbp), %xmm10
\r
1128 paddd 176(%rbp), %xmm11
\r
1129 movdqa %xmm0, 0(%rsp)
\r
1130 movdqa %xmm1, 16(%rsp)
\r
1131 movdqa %xmm2, 32(%rsp)
\r
1132 movdqa %xmm3, 48(%rsp)
\r
1133 movdqa %xmm8, 128(%rsp)
\r
1134 movdqa %xmm9, 144(%rsp)
\r
1135 movdqa %xmm10, 160(%rsp)
\r
1136 movdqa %xmm11, 176(%rsp)
\r
1138 pxor 64(%rsp), %xmm0
\r
1139 pxor 80(%rsp), %xmm1
\r
1140 pxor 96(%rsp), %xmm2
\r
1141 pxor 112(%rsp), %xmm3
\r
1142 pxor %xmm12, %xmm8
\r
1143 pxor %xmm13, %xmm9
\r
1144 pxor %xmm14, %xmm10
\r
1145 pxor %xmm15, %xmm11
\r
1146 movdqa %xmm0, 64(%rsp)
\r
1147 movdqa %xmm1, 80(%rsp)
\r
1148 movdqa %xmm2, 96(%rsp)
\r
1149 movdqa %xmm3, 112(%rsp)
\r
1150 movdqa %xmm8, %xmm12
\r
1151 movdqa %xmm9, %xmm13
\r
1152 movdqa %xmm10, %xmm14
\r
1153 movdqa %xmm11, %xmm15
\r
1154 xmm_salsa8_core_2way
\r
1155 paddd 64(%rsp), %xmm0
\r
1156 paddd 80(%rsp), %xmm1
\r
1157 paddd 96(%rsp), %xmm2
\r
1158 paddd 112(%rsp), %xmm3
\r
1159 paddd %xmm8, %xmm12
\r
1160 paddd %xmm9, %xmm13
\r
1161 paddd %xmm10, %xmm14
\r
1162 paddd %xmm11, %xmm15
\r
1163 movdqa %xmm0, 64(%rsp)
\r
1164 movdqa %xmm1, 80(%rsp)
\r
1165 movdqa %xmm2, 96(%rsp)
\r
1166 movdqa %xmm3, 112(%rsp)
\r
1170 jne scrypt_core_2way_loop1
\r
1173 scrypt_core_2way_loop2:
\r
1174 movdqa 0(%rsp), %xmm0
\r
1175 movdqa 16(%rsp), %xmm1
\r
1176 movdqa 32(%rsp), %xmm2
\r
1177 movdqa 48(%rsp), %xmm3
\r
1178 movdqa 64(%rsp), %xmm4
\r
1179 movdqa 80(%rsp), %xmm5
\r
1180 movdqa 96(%rsp), %xmm6
\r
1181 movdqa 112(%rsp), %xmm7
\r
1182 movdqa 128(%rsp), %xmm8
\r
1183 movdqa 144(%rsp), %xmm9
\r
1184 movdqa 160(%rsp), %xmm10
\r
1185 movdqa 176(%rsp), %xmm11
\r
1189 pxor 0(%rdx, %rbp), %xmm0
\r
1190 pxor 16(%rdx, %rbp), %xmm1
\r
1191 pxor 32(%rdx, %rbp), %xmm2
\r
1192 pxor 48(%rdx, %rbp), %xmm3
\r
1197 pxor 0(%rdx, %rbx), %xmm8
\r
1198 pxor 16(%rdx, %rbx), %xmm9
\r
1199 pxor 32(%rdx, %rbx), %xmm10
\r
1200 pxor 48(%rdx, %rbx), %xmm11
\r
1206 pxor %xmm12, %xmm8
\r
1207 pxor %xmm13, %xmm9
\r
1208 pxor %xmm14, %xmm10
\r
1209 pxor %xmm15, %xmm11
\r
1210 movdqa %xmm0, 0(%rsp)
\r
1211 movdqa %xmm1, 16(%rsp)
\r
1212 movdqa %xmm2, 32(%rsp)
\r
1213 movdqa %xmm3, 48(%rsp)
\r
1214 movdqa %xmm8, 128(%rsp)
\r
1215 movdqa %xmm9, 144(%rsp)
\r
1216 movdqa %xmm10, 160(%rsp)
\r
1217 movdqa %xmm11, 176(%rsp)
\r
1218 xmm_salsa8_core_2way
\r
1219 paddd 0(%rsp), %xmm0
\r
1220 paddd 16(%rsp), %xmm1
\r
1221 paddd 32(%rsp), %xmm2
\r
1222 paddd 48(%rsp), %xmm3
\r
1223 paddd 128(%rsp), %xmm8
\r
1224 paddd 144(%rsp), %xmm9
\r
1225 paddd 160(%rsp), %xmm10
\r
1226 paddd 176(%rsp), %xmm11
\r
1227 movdqa %xmm0, 0(%rsp)
\r
1228 movdqa %xmm1, 16(%rsp)
\r
1229 movdqa %xmm2, 32(%rsp)
\r
1230 movdqa %xmm3, 48(%rsp)
\r
1231 movdqa %xmm8, 128(%rsp)
\r
1232 movdqa %xmm9, 144(%rsp)
\r
1233 movdqa %xmm10, 160(%rsp)
\r
1234 movdqa %xmm11, 176(%rsp)
\r
1236 pxor 64(%rdx, %rbp), %xmm0
\r
1237 pxor 80(%rdx, %rbp), %xmm1
\r
1238 pxor 96(%rdx, %rbp), %xmm2
\r
1239 pxor 112(%rdx, %rbp), %xmm3
\r
1240 pxor 64(%rdx, %rbx), %xmm8
\r
1241 pxor 80(%rdx, %rbx), %xmm9
\r
1242 pxor 96(%rdx, %rbx), %xmm10
\r
1243 pxor 112(%rdx, %rbx), %xmm11
\r
1244 pxor 64(%rsp), %xmm0
\r
1245 pxor 80(%rsp), %xmm1
\r
1246 pxor 96(%rsp), %xmm2
\r
1247 pxor 112(%rsp), %xmm3
\r
1248 pxor %xmm12, %xmm8
\r
1249 pxor %xmm13, %xmm9
\r
1250 pxor %xmm14, %xmm10
\r
1251 pxor %xmm15, %xmm11
\r
1252 movdqa %xmm0, 64(%rsp)
\r
1253 movdqa %xmm1, 80(%rsp)
\r
1254 movdqa %xmm2, 96(%rsp)
\r
1255 movdqa %xmm3, 112(%rsp)
\r
1256 movdqa %xmm8, %xmm12
\r
1257 movdqa %xmm9, %xmm13
\r
1258 movdqa %xmm10, %xmm14
\r
1259 movdqa %xmm11, %xmm15
\r
1260 xmm_salsa8_core_2way
\r
1261 paddd 64(%rsp), %xmm0
\r
1262 paddd 80(%rsp), %xmm1
\r
1263 paddd 96(%rsp), %xmm2
\r
1264 paddd 112(%rsp), %xmm3
\r
1265 paddd %xmm8, %xmm12
\r
1266 paddd %xmm9, %xmm13
\r
1267 paddd %xmm10, %xmm14
\r
1268 paddd %xmm11, %xmm15
\r
1269 movdqa %xmm0, 64(%rsp)
\r
1270 movdqa %xmm1, 80(%rsp)
\r
1271 movdqa %xmm2, 96(%rsp)
\r
1272 movdqa %xmm3, 112(%rsp)
\r
1275 ja scrypt_core_2way_loop2
\r
1277 movdqa %xmm12, 192(%rsp)
\r
1278 movdqa %xmm13, 208(%rsp)
\r
1279 movdqa %xmm14, 224(%rsp)
\r
1280 movdqa %xmm15, 240(%rsp)
\r
1282 scrypt_shuffle %rsp, 0, %rdi, 0
\r
1283 scrypt_shuffle %rsp, 64, %rdi, 64
\r
1284 scrypt_shuffle %rsp, 128, %rsi, 0
\r
1285 scrypt_shuffle %rsp, 192, %rsi, 64
\r
1288 #if defined(WIN64)
\r
1291 movdqa 8(%rsp), %xmm6
\r
1292 movdqa 24(%rsp), %xmm7
\r
1293 movdqa 40(%rsp), %xmm8
\r
1294 movdqa 56(%rsp), %xmm9
\r
1295 movdqa 72(%rsp), %xmm10
\r
1296 movdqa 88(%rsp), %xmm11
\r
1297 movdqa 104(%rsp), %xmm12
\r
1298 movdqa 120(%rsp), %xmm13
\r
1299 movdqa 136(%rsp), %xmm14
\r
1300 movdqa 152(%rsp), %xmm15
\r
1308 .macro xmm_salsa8_core_3way_doubleround
\r
1309 movdqa %xmm1, %xmm4
\r
1310 movdqa %xmm9, %xmm6
\r
1311 movdqa %xmm13, %xmm7
\r
1312 paddd %xmm0, %xmm4
\r
1313 paddd %xmm8, %xmm6
\r
1314 paddd %xmm12, %xmm7
\r
1315 movdqa %xmm4, %xmm5
\r
1320 movdqa %xmm0, %xmm4
\r
1321 movdqa %xmm6, %xmm5
\r
1324 pxor %xmm6, %xmm11
\r
1325 pxor %xmm5, %xmm11
\r
1326 movdqa %xmm8, %xmm6
\r
1327 movdqa %xmm7, %xmm5
\r
1330 pxor %xmm7, %xmm15
\r
1331 pxor %xmm5, %xmm15
\r
1332 movdqa %xmm12, %xmm7
\r
1334 paddd %xmm3, %xmm4
\r
1335 paddd %xmm11, %xmm6
\r
1336 paddd %xmm15, %xmm7
\r
1337 movdqa %xmm4, %xmm5
\r
1341 movdqa %xmm3, %xmm4
\r
1342 pshufd $0x93, %xmm3, %xmm3
\r
1344 movdqa %xmm6, %xmm5
\r
1347 pxor %xmm6, %xmm10
\r
1348 movdqa %xmm11, %xmm6
\r
1349 pshufd $0x93, %xmm11, %xmm11
\r
1350 pxor %xmm5, %xmm10
\r
1351 movdqa %xmm7, %xmm5
\r
1354 pxor %xmm7, %xmm14
\r
1355 movdqa %xmm15, %xmm7
\r
1356 pshufd $0x93, %xmm15, %xmm15
\r
1357 pxor %xmm5, %xmm14
\r
1359 paddd %xmm2, %xmm4
\r
1360 paddd %xmm10, %xmm6
\r
1361 paddd %xmm14, %xmm7
\r
1362 movdqa %xmm4, %xmm5
\r
1366 movdqa %xmm2, %xmm4
\r
1367 pshufd $0x4e, %xmm2, %xmm2
\r
1369 movdqa %xmm6, %xmm5
\r
1373 movdqa %xmm10, %xmm6
\r
1374 pshufd $0x4e, %xmm10, %xmm10
\r
1376 movdqa %xmm7, %xmm5
\r
1379 pxor %xmm7, %xmm13
\r
1380 movdqa %xmm14, %xmm7
\r
1381 pshufd $0x4e, %xmm14, %xmm14
\r
1382 pxor %xmm5, %xmm13
\r
1384 paddd %xmm1, %xmm4
\r
1385 paddd %xmm9, %xmm6
\r
1386 paddd %xmm13, %xmm7
\r
1387 movdqa %xmm4, %xmm5
\r
1391 pshufd $0x39, %xmm1, %xmm1
\r
1393 movdqa %xmm3, %xmm4
\r
1394 movdqa %xmm6, %xmm5
\r
1398 pshufd $0x39, %xmm9, %xmm9
\r
1400 movdqa %xmm11, %xmm6
\r
1401 movdqa %xmm7, %xmm5
\r
1404 pxor %xmm7, %xmm12
\r
1405 pshufd $0x39, %xmm13, %xmm13
\r
1406 pxor %xmm5, %xmm12
\r
1407 movdqa %xmm15, %xmm7
\r
1409 paddd %xmm0, %xmm4
\r
1410 paddd %xmm8, %xmm6
\r
1411 paddd %xmm12, %xmm7
\r
1412 movdqa %xmm4, %xmm5
\r
1417 movdqa %xmm0, %xmm4
\r
1418 movdqa %xmm6, %xmm5
\r
1423 movdqa %xmm8, %xmm6
\r
1424 movdqa %xmm7, %xmm5
\r
1427 pxor %xmm7, %xmm13
\r
1428 pxor %xmm5, %xmm13
\r
1429 movdqa %xmm12, %xmm7
\r
1431 paddd %xmm1, %xmm4
\r
1432 paddd %xmm9, %xmm6
\r
1433 paddd %xmm13, %xmm7
\r
1434 movdqa %xmm4, %xmm5
\r
1438 movdqa %xmm1, %xmm4
\r
1439 pshufd $0x93, %xmm1, %xmm1
\r
1441 movdqa %xmm6, %xmm5
\r
1444 pxor %xmm6, %xmm10
\r
1445 movdqa %xmm9, %xmm6
\r
1446 pshufd $0x93, %xmm9, %xmm9
\r
1447 pxor %xmm5, %xmm10
\r
1448 movdqa %xmm7, %xmm5
\r
1451 pxor %xmm7, %xmm14
\r
1452 movdqa %xmm13, %xmm7
\r
1453 pshufd $0x93, %xmm13, %xmm13
\r
1454 pxor %xmm5, %xmm14
\r
1456 paddd %xmm2, %xmm4
\r
1457 paddd %xmm10, %xmm6
\r
1458 paddd %xmm14, %xmm7
\r
1459 movdqa %xmm4, %xmm5
\r
1463 movdqa %xmm2, %xmm4
\r
1464 pshufd $0x4e, %xmm2, %xmm2
\r
1466 movdqa %xmm6, %xmm5
\r
1469 pxor %xmm6, %xmm11
\r
1470 movdqa %xmm10, %xmm6
\r
1471 pshufd $0x4e, %xmm10, %xmm10
\r
1472 pxor %xmm5, %xmm11
\r
1473 movdqa %xmm7, %xmm5
\r
1476 pxor %xmm7, %xmm15
\r
1477 movdqa %xmm14, %xmm7
\r
1478 pshufd $0x4e, %xmm14, %xmm14
\r
1479 pxor %xmm5, %xmm15
\r
1481 paddd %xmm3, %xmm4
\r
1482 paddd %xmm11, %xmm6
\r
1483 paddd %xmm15, %xmm7
\r
1484 movdqa %xmm4, %xmm5
\r
1488 pshufd $0x39, %xmm3, %xmm3
\r
1490 movdqa %xmm6, %xmm5
\r
1494 pshufd $0x39, %xmm11, %xmm11
\r
1496 movdqa %xmm7, %xmm5
\r
1499 pxor %xmm7, %xmm12
\r
1500 pshufd $0x39, %xmm15, %xmm15
\r
1501 pxor %xmm5, %xmm12
\r
1504 .macro xmm_salsa8_core_3way
\r
1505 xmm_salsa8_core_3way_doubleround
\r
1506 xmm_salsa8_core_3way_doubleround
\r
1507 xmm_salsa8_core_3way_doubleround
\r
1508 xmm_salsa8_core_3way_doubleround
\r
1513 .globl scrypt_core_3way
\r
1514 .globl _scrypt_core_3way
\r
1516 _scrypt_core_3way:
\r
1519 #if defined(WIN64)
\r
1521 movdqa %xmm6, 8(%rsp)
\r
1522 movdqa %xmm7, 24(%rsp)
\r
1523 movdqa %xmm8, 40(%rsp)
\r
1524 movdqa %xmm9, 56(%rsp)
\r
1525 movdqa %xmm10, 72(%rsp)
\r
1526 movdqa %xmm11, 88(%rsp)
\r
1527 movdqa %xmm12, 104(%rsp)
\r
1528 movdqa %xmm13, 120(%rsp)
\r
1529 movdqa %xmm14, 136(%rsp)
\r
1530 movdqa %xmm15, 152(%rsp)
\r
1540 scrypt_shuffle %rdi, 0, %rsp, 0
\r
1541 scrypt_shuffle %rdi, 64, %rsp, 64
\r
1542 scrypt_shuffle %rsi, 0, %rsp, 128
\r
1543 scrypt_shuffle %rsi, 64, %rsp, 192
\r
1544 scrypt_shuffle %rdx, 0, %rsp, 256
\r
1545 scrypt_shuffle %rdx, 64, %rsp, 320
\r
1547 movdqa 128+64(%rsp), %xmm8
\r
1548 movdqa 128+80(%rsp), %xmm9
\r
1549 movdqa 128+96(%rsp), %xmm10
\r
1550 movdqa 128+112(%rsp), %xmm11
\r
1553 leaq 3*131072(%rcx), %rax
\r
1554 scrypt_core_3way_loop1:
\r
1555 movdqa %xmm8, %xmm12
\r
1556 movdqa %xmm9, %xmm13
\r
1557 movdqa %xmm10, %xmm14
\r
1558 movdqa %xmm11, %xmm15
\r
1559 movdqa 0(%rsp), %xmm0
\r
1560 movdqa 16(%rsp), %xmm1
\r
1561 movdqa 32(%rsp), %xmm2
\r
1562 movdqa 48(%rsp), %xmm3
\r
1563 movdqa 64(%rsp), %xmm4
\r
1564 movdqa 80(%rsp), %xmm5
\r
1565 movdqa 96(%rsp), %xmm6
\r
1566 movdqa 112(%rsp), %xmm7
\r
1567 movdqa 128+0(%rsp), %xmm8
\r
1568 movdqa 128+16(%rsp), %xmm9
\r
1569 movdqa 128+32(%rsp), %xmm10
\r
1570 movdqa 128+48(%rsp), %xmm11
\r
1575 movdqa %xmm0, 0(%rbp)
\r
1576 movdqa %xmm1, 16(%rbp)
\r
1577 movdqa %xmm2, 32(%rbp)
\r
1578 movdqa %xmm3, 48(%rbp)
\r
1579 movdqa %xmm4, 64(%rbp)
\r
1580 movdqa %xmm5, 80(%rbp)
\r
1581 movdqa %xmm6, 96(%rbp)
\r
1582 movdqa %xmm7, 112(%rbp)
\r
1583 pxor %xmm12, %xmm8
\r
1584 pxor %xmm13, %xmm9
\r
1585 pxor %xmm14, %xmm10
\r
1586 pxor %xmm15, %xmm11
\r
1587 movdqa %xmm8, 128+0(%rbp)
\r
1588 movdqa %xmm9, 128+16(%rbp)
\r
1589 movdqa %xmm10, 128+32(%rbp)
\r
1590 movdqa %xmm11, 128+48(%rbp)
\r
1591 movdqa %xmm12, 128+64(%rbp)
\r
1592 movdqa %xmm13, 128+80(%rbp)
\r
1593 movdqa %xmm14, 128+96(%rbp)
\r
1594 movdqa %xmm15, 128+112(%rbp)
\r
1595 movdqa 256+0(%rsp), %xmm12
\r
1596 movdqa 256+16(%rsp), %xmm13
\r
1597 movdqa 256+32(%rsp), %xmm14
\r
1598 movdqa 256+48(%rsp), %xmm15
\r
1599 movdqa 256+64(%rsp), %xmm4
\r
1600 movdqa 256+80(%rsp), %xmm5
\r
1601 movdqa 256+96(%rsp), %xmm6
\r
1602 movdqa 256+112(%rsp), %xmm7
\r
1603 pxor %xmm4, %xmm12
\r
1604 pxor %xmm5, %xmm13
\r
1605 pxor %xmm6, %xmm14
\r
1606 pxor %xmm7, %xmm15
\r
1607 movdqa %xmm12, 256+0(%rbp)
\r
1608 movdqa %xmm13, 256+16(%rbp)
\r
1609 movdqa %xmm14, 256+32(%rbp)
\r
1610 movdqa %xmm15, 256+48(%rbp)
\r
1611 movdqa %xmm4, 256+64(%rbp)
\r
1612 movdqa %xmm5, 256+80(%rbp)
\r
1613 movdqa %xmm6, 256+96(%rbp)
\r
1614 movdqa %xmm7, 256+112(%rbp)
\r
1616 xmm_salsa8_core_3way
\r
1617 paddd 0(%rbp), %xmm0
\r
1618 paddd 16(%rbp), %xmm1
\r
1619 paddd 32(%rbp), %xmm2
\r
1620 paddd 48(%rbp), %xmm3
\r
1621 paddd 128+0(%rbp), %xmm8
\r
1622 paddd 128+16(%rbp), %xmm9
\r
1623 paddd 128+32(%rbp), %xmm10
\r
1624 paddd 128+48(%rbp), %xmm11
\r
1625 paddd 256+0(%rbp), %xmm12
\r
1626 paddd 256+16(%rbp), %xmm13
\r
1627 paddd 256+32(%rbp), %xmm14
\r
1628 paddd 256+48(%rbp), %xmm15
\r
1629 movdqa %xmm0, 0(%rsp)
\r
1630 movdqa %xmm1, 16(%rsp)
\r
1631 movdqa %xmm2, 32(%rsp)
\r
1632 movdqa %xmm3, 48(%rsp)
\r
1633 movdqa %xmm8, 128+0(%rsp)
\r
1634 movdqa %xmm9, 128+16(%rsp)
\r
1635 movdqa %xmm10, 128+32(%rsp)
\r
1636 movdqa %xmm11, 128+48(%rsp)
\r
1637 movdqa %xmm12, 256+0(%rsp)
\r
1638 movdqa %xmm13, 256+16(%rsp)
\r
1639 movdqa %xmm14, 256+32(%rsp)
\r
1640 movdqa %xmm15, 256+48(%rsp)
\r
1642 pxor 64(%rsp), %xmm0
\r
1643 pxor 80(%rsp), %xmm1
\r
1644 pxor 96(%rsp), %xmm2
\r
1645 pxor 112(%rsp), %xmm3
\r
1646 pxor 128+64(%rsp), %xmm8
\r
1647 pxor 128+80(%rsp), %xmm9
\r
1648 pxor 128+96(%rsp), %xmm10
\r
1649 pxor 128+112(%rsp), %xmm11
\r
1650 pxor 256+64(%rsp), %xmm12
\r
1651 pxor 256+80(%rsp), %xmm13
\r
1652 pxor 256+96(%rsp), %xmm14
\r
1653 pxor 256+112(%rsp), %xmm15
\r
1654 movdqa %xmm0, 64(%rsp)
\r
1655 movdqa %xmm1, 80(%rsp)
\r
1656 movdqa %xmm2, 96(%rsp)
\r
1657 movdqa %xmm3, 112(%rsp)
\r
1658 movdqa %xmm8, 128+64(%rsp)
\r
1659 movdqa %xmm9, 128+80(%rsp)
\r
1660 movdqa %xmm10, 128+96(%rsp)
\r
1661 movdqa %xmm11, 128+112(%rsp)
\r
1662 movdqa %xmm12, 256+64(%rsp)
\r
1663 movdqa %xmm13, 256+80(%rsp)
\r
1664 movdqa %xmm14, 256+96(%rsp)
\r
1665 movdqa %xmm15, 256+112(%rsp)
\r
1666 xmm_salsa8_core_3way
\r
1667 paddd 64(%rsp), %xmm0
\r
1668 paddd 80(%rsp), %xmm1
\r
1669 paddd 96(%rsp), %xmm2
\r
1670 paddd 112(%rsp), %xmm3
\r
1671 paddd 128+64(%rsp), %xmm8
\r
1672 paddd 128+80(%rsp), %xmm9
\r
1673 paddd 128+96(%rsp), %xmm10
\r
1674 paddd 128+112(%rsp), %xmm11
\r
1675 paddd 256+64(%rsp), %xmm12
\r
1676 paddd 256+80(%rsp), %xmm13
\r
1677 paddd 256+96(%rsp), %xmm14
\r
1678 paddd 256+112(%rsp), %xmm15
\r
1679 movdqa %xmm0, 64(%rsp)
\r
1680 movdqa %xmm1, 80(%rsp)
\r
1681 movdqa %xmm2, 96(%rsp)
\r
1682 movdqa %xmm3, 112(%rsp)
\r
1683 movdqa %xmm8, 128+64(%rsp)
\r
1684 movdqa %xmm9, 128+80(%rsp)
\r
1685 movdqa %xmm10, 128+96(%rsp)
\r
1686 movdqa %xmm11, 128+112(%rsp)
\r
1687 movdqa %xmm12, 256+64(%rsp)
\r
1688 movdqa %xmm13, 256+80(%rsp)
\r
1689 movdqa %xmm14, 256+96(%rsp)
\r
1690 movdqa %xmm15, 256+112(%rsp)
\r
1694 jne scrypt_core_3way_loop1
\r
1697 scrypt_core_3way_loop2:
\r
1698 movl 64(%rsp), %ebp
\r
1700 leal (%ebp, %ebp, 2), %ebp
\r
1702 movl 128+64(%rsp), %ebx
\r
1704 leal (%ebx, %ebx, 2), %ebx
\r
1707 movl 256+64(%rsp), %r8d
\r
1709 leal (%r8d, %r8d, 2), %r8d
\r
1712 movdqa 0(%rsp), %xmm0
\r
1713 movdqa 16(%rsp), %xmm1
\r
1714 movdqa 32(%rsp), %xmm2
\r
1715 movdqa 48(%rsp), %xmm3
\r
1716 movdqa 128+0(%rsp), %xmm8
\r
1717 movdqa 128+16(%rsp), %xmm9
\r
1718 movdqa 128+32(%rsp), %xmm10
\r
1719 movdqa 128+48(%rsp), %xmm11
\r
1720 movdqa 256+0(%rsp), %xmm12
\r
1721 movdqa 256+16(%rsp), %xmm13
\r
1722 movdqa 256+32(%rsp), %xmm14
\r
1723 movdqa 256+48(%rsp), %xmm15
\r
1724 pxor 0(%rcx, %rbp), %xmm0
\r
1725 pxor 16(%rcx, %rbp), %xmm1
\r
1726 pxor 32(%rcx, %rbp), %xmm2
\r
1727 pxor 48(%rcx, %rbp), %xmm3
\r
1728 pxor 0(%rcx, %rbx), %xmm8
\r
1729 pxor 16(%rcx, %rbx), %xmm9
\r
1730 pxor 32(%rcx, %rbx), %xmm10
\r
1731 pxor 48(%rcx, %rbx), %xmm11
\r
1732 pxor 0(%rcx, %r8), %xmm12
\r
1733 pxor 16(%rcx, %r8), %xmm13
\r
1734 pxor 32(%rcx, %r8), %xmm14
\r
1735 pxor 48(%rcx, %r8), %xmm15
\r
1737 pxor 64(%rsp), %xmm0
\r
1738 pxor 80(%rsp), %xmm1
\r
1739 pxor 96(%rsp), %xmm2
\r
1740 pxor 112(%rsp), %xmm3
\r
1741 pxor 128+64(%rsp), %xmm8
\r
1742 pxor 128+80(%rsp), %xmm9
\r
1743 pxor 128+96(%rsp), %xmm10
\r
1744 pxor 128+112(%rsp), %xmm11
\r
1745 pxor 256+64(%rsp), %xmm12
\r
1746 pxor 256+80(%rsp), %xmm13
\r
1747 pxor 256+96(%rsp), %xmm14
\r
1748 pxor 256+112(%rsp), %xmm15
\r
1749 movdqa %xmm0, 0(%rsp)
\r
1750 movdqa %xmm1, 16(%rsp)
\r
1751 movdqa %xmm2, 32(%rsp)
\r
1752 movdqa %xmm3, 48(%rsp)
\r
1753 movdqa %xmm8, 128+0(%rsp)
\r
1754 movdqa %xmm9, 128+16(%rsp)
\r
1755 movdqa %xmm10, 128+32(%rsp)
\r
1756 movdqa %xmm11, 128+48(%rsp)
\r
1757 movdqa %xmm12, 256+0(%rsp)
\r
1758 movdqa %xmm13, 256+16(%rsp)
\r
1759 movdqa %xmm14, 256+32(%rsp)
\r
1760 movdqa %xmm15, 256+48(%rsp)
\r
1761 xmm_salsa8_core_3way
\r
1762 paddd 0(%rsp), %xmm0
\r
1763 paddd 16(%rsp), %xmm1
\r
1764 paddd 32(%rsp), %xmm2
\r
1765 paddd 48(%rsp), %xmm3
\r
1766 paddd 128+0(%rsp), %xmm8
\r
1767 paddd 128+16(%rsp), %xmm9
\r
1768 paddd 128+32(%rsp), %xmm10
\r
1769 paddd 128+48(%rsp), %xmm11
\r
1770 paddd 256+0(%rsp), %xmm12
\r
1771 paddd 256+16(%rsp), %xmm13
\r
1772 paddd 256+32(%rsp), %xmm14
\r
1773 paddd 256+48(%rsp), %xmm15
\r
1774 movdqa %xmm0, 0(%rsp)
\r
1775 movdqa %xmm1, 16(%rsp)
\r
1776 movdqa %xmm2, 32(%rsp)
\r
1777 movdqa %xmm3, 48(%rsp)
\r
1778 movdqa %xmm8, 128+0(%rsp)
\r
1779 movdqa %xmm9, 128+16(%rsp)
\r
1780 movdqa %xmm10, 128+32(%rsp)
\r
1781 movdqa %xmm11, 128+48(%rsp)
\r
1782 movdqa %xmm12, 256+0(%rsp)
\r
1783 movdqa %xmm13, 256+16(%rsp)
\r
1784 movdqa %xmm14, 256+32(%rsp)
\r
1785 movdqa %xmm15, 256+48(%rsp)
\r
1787 pxor 64(%rcx, %rbp), %xmm0
\r
1788 pxor 80(%rcx, %rbp), %xmm1
\r
1789 pxor 96(%rcx, %rbp), %xmm2
\r
1790 pxor 112(%rcx, %rbp), %xmm3
\r
1791 pxor 64(%rcx, %rbx), %xmm8
\r
1792 pxor 80(%rcx, %rbx), %xmm9
\r
1793 pxor 96(%rcx, %rbx), %xmm10
\r
1794 pxor 112(%rcx, %rbx), %xmm11
\r
1795 pxor 64(%rcx, %r8), %xmm12
\r
1796 pxor 80(%rcx, %r8), %xmm13
\r
1797 pxor 96(%rcx, %r8), %xmm14
\r
1798 pxor 112(%rcx, %r8), %xmm15
\r
1799 pxor 64(%rsp), %xmm0
\r
1800 pxor 80(%rsp), %xmm1
\r
1801 pxor 96(%rsp), %xmm2
\r
1802 pxor 112(%rsp), %xmm3
\r
1803 pxor 128+64(%rsp), %xmm8
\r
1804 pxor 128+80(%rsp), %xmm9
\r
1805 pxor 128+96(%rsp), %xmm10
\r
1806 pxor 128+112(%rsp), %xmm11
\r
1807 pxor 256+64(%rsp), %xmm12
\r
1808 pxor 256+80(%rsp), %xmm13
\r
1809 pxor 256+96(%rsp), %xmm14
\r
1810 pxor 256+112(%rsp), %xmm15
\r
1811 movdqa %xmm0, 64(%rsp)
\r
1812 movdqa %xmm1, 80(%rsp)
\r
1813 movdqa %xmm2, 96(%rsp)
\r
1814 movdqa %xmm3, 112(%rsp)
\r
1815 movdqa %xmm8, 128+64(%rsp)
\r
1816 movdqa %xmm9, 128+80(%rsp)
\r
1817 movdqa %xmm10, 128+96(%rsp)
\r
1818 movdqa %xmm11, 128+112(%rsp)
\r
1819 movdqa %xmm12, 256+64(%rsp)
\r
1820 movdqa %xmm13, 256+80(%rsp)
\r
1821 movdqa %xmm14, 256+96(%rsp)
\r
1822 movdqa %xmm15, 256+112(%rsp)
\r
1823 xmm_salsa8_core_3way
\r
1824 paddd 64(%rsp), %xmm0
\r
1825 paddd 80(%rsp), %xmm1
\r
1826 paddd 96(%rsp), %xmm2
\r
1827 paddd 112(%rsp), %xmm3
\r
1828 paddd 128+64(%rsp), %xmm8
\r
1829 paddd 128+80(%rsp), %xmm9
\r
1830 paddd 128+96(%rsp), %xmm10
\r
1831 paddd 128+112(%rsp), %xmm11
\r
1832 paddd 256+64(%rsp), %xmm12
\r
1833 paddd 256+80(%rsp), %xmm13
\r
1834 paddd 256+96(%rsp), %xmm14
\r
1835 paddd 256+112(%rsp), %xmm15
\r
1836 movdqa %xmm0, 64(%rsp)
\r
1837 movdqa %xmm1, 80(%rsp)
\r
1838 movdqa %xmm2, 96(%rsp)
\r
1839 movdqa %xmm3, 112(%rsp)
\r
1840 movdqa %xmm8, 128+64(%rsp)
\r
1841 movdqa %xmm9, 128+80(%rsp)
\r
1842 movdqa %xmm10, 128+96(%rsp)
\r
1843 movdqa %xmm11, 128+112(%rsp)
\r
1844 movdqa %xmm12, 256+64(%rsp)
\r
1845 movdqa %xmm13, 256+80(%rsp)
\r
1846 movdqa %xmm14, 256+96(%rsp)
\r
1847 movdqa %xmm15, 256+112(%rsp)
\r
1850 ja scrypt_core_3way_loop2
\r
1852 scrypt_shuffle %rsp, 0, %rdi, 0
\r
1853 scrypt_shuffle %rsp, 64, %rdi, 64
\r
1854 scrypt_shuffle %rsp, 128, %rsi, 0
\r
1855 scrypt_shuffle %rsp, 192, %rsi, 64
\r
1856 scrypt_shuffle %rsp, 256, %rdx, 0
\r
1857 scrypt_shuffle %rsp, 320, %rdx, 64
\r
1860 #if defined(WIN64)
\r
1863 movdqa 8(%rsp), %xmm6
\r
1864 movdqa 24(%rsp), %xmm7
\r
1865 movdqa 40(%rsp), %xmm8
\r
1866 movdqa 56(%rsp), %xmm9
\r
1867 movdqa 72(%rsp), %xmm10
\r
1868 movdqa 88(%rsp), %xmm11
\r
1869 movdqa 104(%rsp), %xmm12
\r
1870 movdqa 120(%rsp), %xmm13
\r
1871 movdqa 136(%rsp), %xmm14
\r
1872 movdqa 152(%rsp), %xmm15
\r