5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include "cpuminer-config.h"
29 #if defined(__linux__) && defined(__ELF__)
30 .section .note.GNU-stack,"",%progbits
33 #if defined(__x86_64__)
37 .globl scrypt_best_throughput
38 .globl _scrypt_best_throughput
39 scrypt_best_throughput:
40 _scrypt_best_throughput:
43 /* Check for AVX and OSXSAVE support */
46 andl $0x18000000, %ecx
47 cmpl $0x18000000, %ecx
48 jne scrypt_best_throughput_no_avx2
49 /* Check for AVX2 support */
53 andl $0x00000020, %ebx
54 cmpl $0x00000020, %ebx
55 jne scrypt_best_throughput_no_avx2
56 /* Check for XMM and YMM state support */
59 andl $0x00000006, %eax
60 cmpl $0x00000006, %eax
61 jne scrypt_best_throughput_no_avx2
63 jmp scrypt_best_throughput_exit
64 scrypt_best_throughput_no_avx2:
66 /* Check for AuthenticAMD */
70 cmpl $0x444d4163, %ecx
71 jne scrypt_best_throughput_not_amd
72 cmpl $0x69746e65, %edx
73 jne scrypt_best_throughput_not_amd
74 cmpl $0x68747541, %ebx
75 jne scrypt_best_throughput_not_amd
76 /* Check for AMD K8 or Bobcat */
79 andl $0x0ff00000, %eax
80 jz scrypt_best_throughput_one
81 cmpl $0x00500000, %eax
82 je scrypt_best_throughput_one
84 jmp scrypt_best_throughput_exit
85 scrypt_best_throughput_not_amd:
86 /* Check for GenuineIntel */
87 cmpl $0x6c65746e, %ecx
88 jne scrypt_best_throughput_exit
89 cmpl $0x49656e69, %edx
90 jne scrypt_best_throughput_exit
91 cmpl $0x756e6547, %ebx
92 jne scrypt_best_throughput_exit
93 /* Check for Intel Atom */
97 andl $0x0ff00f00, %eax
98 cmpl $0x00000600, %eax
100 jnz scrypt_best_throughput_exit
101 andl $0x000f00f0, %edx
102 cmpl $0x000100c0, %edx
103 je scrypt_best_throughput_one
104 cmpl $0x00020060, %edx
105 je scrypt_best_throughput_one
106 cmpl $0x00030060, %edx
107 jne scrypt_best_throughput_exit
108 scrypt_best_throughput_one:
110 scrypt_best_throughput_exit:
115 .macro scrypt_shuffle src, so, dest, do
116 movl \so+60(\src), %r8d
117 movl \so+44(\src), %r9d
118 movl \so+28(\src), %r10d
119 movl \so+12(\src), %r11d
120 movl %r8d, \do+12(\dest)
121 movl %r9d, \do+28(\dest)
122 movl %r10d, \do+44(\dest)
123 movl %r11d, \do+60(\dest)
124 movl \so+40(\src), %r8d
125 movl \so+8(\src), %r9d
126 movl \so+48(\src), %r10d
127 movl \so+16(\src), %r11d
128 movl %r8d, \do+8(\dest)
129 movl %r9d, \do+40(\dest)
130 movl %r10d, \do+16(\dest)
131 movl %r11d, \do+48(\dest)
132 movl \so+20(\src), %r8d
133 movl \so+4(\src), %r9d
134 movl \so+52(\src), %r10d
135 movl \so+36(\src), %r11d
136 movl %r8d, \do+4(\dest)
137 movl %r9d, \do+20(\dest)
138 movl %r10d, \do+36(\dest)
139 movl %r11d, \do+52(\dest)
140 movl \so+0(\src), %r8d
141 movl \so+24(\src), %r9d
142 movl \so+32(\src), %r10d
143 movl \so+56(\src), %r11d
144 movl %r8d, \do+0(\dest)
145 movl %r9d, \do+24(\dest)
146 movl %r10d, \do+32(\dest)
147 movl %r11d, \do+56(\dest)
151 .macro salsa8_core_gen_doubleround
154 leaq (%r14, %rdx), %rbp
157 leaq (%rdi, %r15), %rbp
160 leaq (%rdx, %r9), %rbp
163 leaq (%r15, %r10), %rbp
167 leaq (%r9, %r11), %rbp
170 leaq (%r10, %r13), %rbp
173 leaq (%r11, %r14), %rbp
176 leaq (%r13, %rdi), %rbp
183 leaq (%rax, %rbp), %r15
186 leaq (%rbp, %rbx), %r15
189 leaq (%rbx, %rcx), %r15
192 leaq (%rcx, %rax), %r15
199 leaq (%r12, %r15), %rbp
202 leaq (%r15, %rsi), %rbp
205 leaq (%rsi, %r8), %rbp
208 leaq (%r8, %r12), %rbp
215 leaq (%rsi, %rdx), %rbp
218 leaq (%r9, %r15), %rbp
221 leaq (%rdx, %rdi), %rbp
224 leaq (%r15, %rax), %rbp
228 leaq (%rdi, %rcx), %rbp
231 leaq (%rax, %r8), %rbp
234 leaq (%rcx, %rsi), %rbp
237 leaq (%r8, %r9), %rbp
244 leaq (%r10, %rbp), %r15
247 leaq (%rbp, %r12), %r15
250 leaq (%r12, %r11), %r15
253 leaq (%r11, %r10), %r15
260 leaq (%rbx, %r15), %rbp
263 leaq (%r15, %r14), %rbp
266 leaq (%r14, %r13), %rbp
269 leaq (%r13, %rbx), %rbp
279 /* 0: %rdx, %rdi, %rcx, %rsi */
286 /* 1: %r9, 72(%rsp), %rax, %r8 */
294 /* 2: %r11, %r10, 48(%rsp), %r12 */
299 /* movq %r12, %r13 */
300 /* movq %r13, 48(%rsp) */
302 /* 3: %r14, %r13, %rbx, 88(%rsp) */
311 salsa8_core_gen_doubleround
312 salsa8_core_gen_doubleround
313 salsa8_core_gen_doubleround
314 salsa8_core_gen_doubleround
346 movdqa 24(%rsp), %xmm0
352 movdqa 40(%rsp), %xmm1
353 movdqa 56(%rsp), %xmm2
354 movdqa 72(%rsp), %xmm3
371 #if defined(_WIN64) || defined(__CYGWIN__)
373 movdqa %xmm6, 8(%rsp)
374 movdqa %xmm7, 24(%rsp)
375 movdqa %xmm8, 40(%rsp)
376 movdqa %xmm9, 56(%rsp)
377 movdqa %xmm10, 72(%rsp)
378 movdqa %xmm11, 88(%rsp)
379 movdqa %xmm12, 104(%rsp)
380 movdqa %xmm13, 120(%rsp)
381 movdqa %xmm14, 136(%rsp)
382 movdqa %xmm15, 152(%rsp)
389 .macro scrypt_core_cleanup
390 #if defined(_WIN64) || defined(__CYGWIN__)
393 movdqa 8(%rsp), %xmm6
394 movdqa 24(%rsp), %xmm7
395 movdqa 40(%rsp), %xmm8
396 movdqa 56(%rsp), %xmm9
397 movdqa 72(%rsp), %xmm10
398 movdqa 88(%rsp), %xmm11
399 movdqa 104(%rsp), %xmm12
400 movdqa 120(%rsp), %xmm13
401 movdqa 136(%rsp), %xmm14
402 movdqa 152(%rsp), %xmm15
413 /* GenuineIntel processors have fast SIMD */
416 cmpl $0x6c65746e, %ecx
418 cmpl $0x49656e69, %edx
420 cmpl $0x756e6547, %ebx
426 movdqa 0(%rdi), %xmm8
427 movdqa 16(%rdi), %xmm9
428 movdqa 32(%rdi), %xmm10
429 movdqa 48(%rdi), %xmm11
430 movdqa 64(%rdi), %xmm12
431 movdqa 80(%rdi), %xmm13
432 movdqa 96(%rdi), %xmm14
433 movdqa 112(%rdi), %xmm15
435 leaq 131072(%rsi), %rcx
439 scrypt_core_gen_loop1:
440 movdqa %xmm8, 0(%rsi)
441 movdqa %xmm9, 16(%rsi)
442 movdqa %xmm10, 32(%rsi)
443 movdqa %xmm11, 48(%rsi)
444 movdqa %xmm12, 64(%rsi)
445 movdqa %xmm13, 80(%rsi)
446 movdqa %xmm14, 96(%rsi)
447 movdqa %xmm15, 112(%rsi)
453 movdqa %xmm8, 0(%rsp)
454 movdqa %xmm9, 16(%rsp)
455 movdqa %xmm10, 32(%rsp)
456 movdqa %xmm11, 48(%rsp)
468 movdqa %xmm12, 0(%rsp)
469 movdqa %xmm13, 16(%rsp)
470 movdqa %xmm14, 32(%rsp)
471 movdqa %xmm15, 48(%rsp)
482 jne scrypt_core_gen_loop1
486 scrypt_core_gen_loop2:
491 movdqa 0(%rdx), %xmm0
492 movdqa 16(%rdx), %xmm1
493 movdqa 32(%rdx), %xmm2
494 movdqa 48(%rdx), %xmm3
495 movdqa 64(%rdx), %xmm4
496 movdqa 80(%rdx), %xmm5
497 movdqa 96(%rdx), %xmm6
498 movdqa 112(%rdx), %xmm7
512 movdqa %xmm8, 0(%rsp)
513 movdqa %xmm9, 16(%rsp)
514 movdqa %xmm10, 32(%rsp)
515 movdqa %xmm11, 48(%rsp)
527 movdqa %xmm12, 0(%rsp)
528 movdqa %xmm13, 16(%rsp)
529 movdqa %xmm14, 32(%rsp)
530 movdqa %xmm15, 48(%rsp)
540 ja scrypt_core_gen_loop2
543 movdqa %xmm8, 0(%rdi)
544 movdqa %xmm9, 16(%rdi)
545 movdqa %xmm10, 32(%rdi)
546 movdqa %xmm11, 48(%rdi)
547 movdqa %xmm12, 64(%rdi)
548 movdqa %xmm13, 80(%rdi)
549 movdqa %xmm14, 96(%rdi)
550 movdqa %xmm15, 112(%rdi)
557 .macro salsa8_core_xmm_doubleround
574 pshufd $0x93, %xmm3, %xmm3
583 pshufd $0x4e, %xmm2, %xmm2
592 pshufd $0x39, %xmm1, %xmm1
609 pshufd $0x93, %xmm1, %xmm1
618 pshufd $0x4e, %xmm2, %xmm2
625 pshufd $0x39, %xmm3, %xmm3
629 .macro salsa8_core_xmm
630 salsa8_core_xmm_doubleround
631 salsa8_core_xmm_doubleround
632 salsa8_core_xmm_doubleround
633 salsa8_core_xmm_doubleround
641 movdqa 0(%rdi), %xmm8
642 movdqa 16(%rdi), %xmm11
643 movdqa 32(%rdi), %xmm10
644 movdqa 48(%rdi), %xmm9
659 pshufd $0x4e, %xmm10, %xmm10
660 punpcklqdq %xmm10, %xmm8
661 punpckhqdq %xmm0, %xmm10
663 pshufd $0x4e, %xmm9, %xmm9
664 punpcklqdq %xmm9, %xmm11
665 punpckhqdq %xmm0, %xmm9
667 movdqa 64(%rdi), %xmm12
668 movdqa 80(%rdi), %xmm15
669 movdqa 96(%rdi), %xmm14
670 movdqa 112(%rdi), %xmm13
685 pshufd $0x4e, %xmm14, %xmm14
686 punpcklqdq %xmm14, %xmm12
687 punpckhqdq %xmm0, %xmm14
689 pshufd $0x4e, %xmm13, %xmm13
690 punpcklqdq %xmm13, %xmm15
691 punpckhqdq %xmm0, %xmm13
694 leaq 131072(%rsi), %rcx
695 scrypt_core_xmm_loop1:
700 movdqa %xmm8, 0(%rdx)
701 movdqa %xmm9, 16(%rdx)
702 movdqa %xmm10, 32(%rdx)
703 movdqa %xmm11, 48(%rdx)
704 movdqa %xmm12, 64(%rdx)
705 movdqa %xmm13, 80(%rdx)
706 movdqa %xmm14, 96(%rdx)
707 movdqa %xmm15, 112(%rdx)
735 jne scrypt_core_xmm_loop1
738 scrypt_core_xmm_loop2:
742 pxor 0(%rsi, %rdx), %xmm8
743 pxor 16(%rsi, %rdx), %xmm9
744 pxor 32(%rsi, %rdx), %xmm10
745 pxor 48(%rsi, %rdx), %xmm11
761 pxor 64(%rsi, %rdx), %xmm12
762 pxor 80(%rsi, %rdx), %xmm13
763 pxor 96(%rsi, %rdx), %xmm14
764 pxor 112(%rsi, %rdx), %xmm15
780 ja scrypt_core_xmm_loop2
799 pshufd $0x4e, %xmm10, %xmm10
800 punpcklqdq %xmm10, %xmm8
801 punpckhqdq %xmm0, %xmm10
803 pshufd $0x4e, %xmm11, %xmm11
804 punpcklqdq %xmm11, %xmm9
805 punpckhqdq %xmm0, %xmm11
806 movdqa %xmm8, 0(%rdi)
807 movdqa %xmm11, 16(%rdi)
808 movdqa %xmm10, 32(%rdi)
809 movdqa %xmm9, 48(%rdi)
825 pshufd $0x4e, %xmm14, %xmm14
826 punpcklqdq %xmm14, %xmm12
827 punpckhqdq %xmm0, %xmm14
829 pshufd $0x4e, %xmm15, %xmm15
830 punpcklqdq %xmm15, %xmm13
831 punpckhqdq %xmm0, %xmm15
832 movdqa %xmm12, 64(%rdi)
833 movdqa %xmm15, 80(%rdi)
834 movdqa %xmm14, 96(%rdi)
835 movdqa %xmm13, 112(%rdi)
842 .macro salsa8_core_3way_avx_doubleround
843 vpaddd %xmm0, %xmm1, %xmm4
844 vpaddd %xmm8, %xmm9, %xmm6
845 vpaddd %xmm12, %xmm13, %xmm7
846 vpslld $7, %xmm4, %xmm5
847 vpsrld $25, %xmm4, %xmm4
848 vpxor %xmm5, %xmm3, %xmm3
849 vpxor %xmm4, %xmm3, %xmm3
850 vpslld $7, %xmm6, %xmm5
851 vpsrld $25, %xmm6, %xmm6
852 vpxor %xmm5, %xmm11, %xmm11
853 vpxor %xmm6, %xmm11, %xmm11
854 vpslld $7, %xmm7, %xmm5
855 vpsrld $25, %xmm7, %xmm7
856 vpxor %xmm5, %xmm15, %xmm15
857 vpxor %xmm7, %xmm15, %xmm15
859 vpaddd %xmm3, %xmm0, %xmm4
860 vpaddd %xmm11, %xmm8, %xmm6
861 vpaddd %xmm15, %xmm12, %xmm7
862 vpslld $9, %xmm4, %xmm5
863 vpsrld $23, %xmm4, %xmm4
864 vpxor %xmm5, %xmm2, %xmm2
865 vpxor %xmm4, %xmm2, %xmm2
866 vpslld $9, %xmm6, %xmm5
867 vpsrld $23, %xmm6, %xmm6
868 vpxor %xmm5, %xmm10, %xmm10
869 vpxor %xmm6, %xmm10, %xmm10
870 vpslld $9, %xmm7, %xmm5
871 vpsrld $23, %xmm7, %xmm7
872 vpxor %xmm5, %xmm14, %xmm14
873 vpxor %xmm7, %xmm14, %xmm14
875 vpaddd %xmm2, %xmm3, %xmm4
876 vpaddd %xmm10, %xmm11, %xmm6
877 vpaddd %xmm14, %xmm15, %xmm7
878 vpslld $13, %xmm4, %xmm5
879 vpsrld $19, %xmm4, %xmm4
880 vpshufd $0x93, %xmm3, %xmm3
881 vpshufd $0x93, %xmm11, %xmm11
882 vpshufd $0x93, %xmm15, %xmm15
883 vpxor %xmm5, %xmm1, %xmm1
884 vpxor %xmm4, %xmm1, %xmm1
885 vpslld $13, %xmm6, %xmm5
886 vpsrld $19, %xmm6, %xmm6
887 vpxor %xmm5, %xmm9, %xmm9
888 vpxor %xmm6, %xmm9, %xmm9
889 vpslld $13, %xmm7, %xmm5
890 vpsrld $19, %xmm7, %xmm7
891 vpxor %xmm5, %xmm13, %xmm13
892 vpxor %xmm7, %xmm13, %xmm13
894 vpaddd %xmm1, %xmm2, %xmm4
895 vpaddd %xmm9, %xmm10, %xmm6
896 vpaddd %xmm13, %xmm14, %xmm7
897 vpslld $18, %xmm4, %xmm5
898 vpsrld $14, %xmm4, %xmm4
899 vpshufd $0x4e, %xmm2, %xmm2
900 vpshufd $0x4e, %xmm10, %xmm10
901 vpshufd $0x4e, %xmm14, %xmm14
902 vpxor %xmm5, %xmm0, %xmm0
903 vpxor %xmm4, %xmm0, %xmm0
904 vpslld $18, %xmm6, %xmm5
905 vpsrld $14, %xmm6, %xmm6
906 vpxor %xmm5, %xmm8, %xmm8
907 vpxor %xmm6, %xmm8, %xmm8
908 vpslld $18, %xmm7, %xmm5
909 vpsrld $14, %xmm7, %xmm7
910 vpxor %xmm5, %xmm12, %xmm12
911 vpxor %xmm7, %xmm12, %xmm12
913 vpaddd %xmm0, %xmm3, %xmm4
914 vpaddd %xmm8, %xmm11, %xmm6
915 vpaddd %xmm12, %xmm15, %xmm7
916 vpslld $7, %xmm4, %xmm5
917 vpsrld $25, %xmm4, %xmm4
918 vpshufd $0x39, %xmm1, %xmm1
919 vpxor %xmm5, %xmm1, %xmm1
920 vpxor %xmm4, %xmm1, %xmm1
921 vpslld $7, %xmm6, %xmm5
922 vpsrld $25, %xmm6, %xmm6
923 vpshufd $0x39, %xmm9, %xmm9
924 vpxor %xmm5, %xmm9, %xmm9
925 vpxor %xmm6, %xmm9, %xmm9
926 vpslld $7, %xmm7, %xmm5
927 vpsrld $25, %xmm7, %xmm7
928 vpshufd $0x39, %xmm13, %xmm13
929 vpxor %xmm5, %xmm13, %xmm13
930 vpxor %xmm7, %xmm13, %xmm13
932 vpaddd %xmm1, %xmm0, %xmm4
933 vpaddd %xmm9, %xmm8, %xmm6
934 vpaddd %xmm13, %xmm12, %xmm7
935 vpslld $9, %xmm4, %xmm5
936 vpsrld $23, %xmm4, %xmm4
937 vpxor %xmm5, %xmm2, %xmm2
938 vpxor %xmm4, %xmm2, %xmm2
939 vpslld $9, %xmm6, %xmm5
940 vpsrld $23, %xmm6, %xmm6
941 vpxor %xmm5, %xmm10, %xmm10
942 vpxor %xmm6, %xmm10, %xmm10
943 vpslld $9, %xmm7, %xmm5
944 vpsrld $23, %xmm7, %xmm7
945 vpxor %xmm5, %xmm14, %xmm14
946 vpxor %xmm7, %xmm14, %xmm14
948 vpaddd %xmm2, %xmm1, %xmm4
949 vpaddd %xmm10, %xmm9, %xmm6
950 vpaddd %xmm14, %xmm13, %xmm7
951 vpslld $13, %xmm4, %xmm5
952 vpsrld $19, %xmm4, %xmm4
953 vpshufd $0x93, %xmm1, %xmm1
954 vpshufd $0x93, %xmm9, %xmm9
955 vpshufd $0x93, %xmm13, %xmm13
956 vpxor %xmm5, %xmm3, %xmm3
957 vpxor %xmm4, %xmm3, %xmm3
958 vpslld $13, %xmm6, %xmm5
959 vpsrld $19, %xmm6, %xmm6
960 vpxor %xmm5, %xmm11, %xmm11
961 vpxor %xmm6, %xmm11, %xmm11
962 vpslld $13, %xmm7, %xmm5
963 vpsrld $19, %xmm7, %xmm7
964 vpxor %xmm5, %xmm15, %xmm15
965 vpxor %xmm7, %xmm15, %xmm15
967 vpaddd %xmm3, %xmm2, %xmm4
968 vpaddd %xmm11, %xmm10, %xmm6
969 vpaddd %xmm15, %xmm14, %xmm7
970 vpslld $18, %xmm4, %xmm5
971 vpsrld $14, %xmm4, %xmm4
972 vpshufd $0x4e, %xmm2, %xmm2
973 vpshufd $0x4e, %xmm10, %xmm10
974 vpxor %xmm5, %xmm0, %xmm0
975 vpxor %xmm4, %xmm0, %xmm0
976 vpslld $18, %xmm6, %xmm5
977 vpsrld $14, %xmm6, %xmm6
978 vpshufd $0x4e, %xmm14, %xmm14
979 vpshufd $0x39, %xmm11, %xmm11
980 vpxor %xmm5, %xmm8, %xmm8
981 vpxor %xmm6, %xmm8, %xmm8
982 vpslld $18, %xmm7, %xmm5
983 vpsrld $14, %xmm7, %xmm7
984 vpshufd $0x39, %xmm3, %xmm3
985 vpshufd $0x39, %xmm15, %xmm15
986 vpxor %xmm5, %xmm12, %xmm12
987 vpxor %xmm7, %xmm12, %xmm12
990 .macro salsa8_core_3way_avx
991 salsa8_core_3way_avx_doubleround
992 salsa8_core_3way_avx_doubleround
993 salsa8_core_3way_avx_doubleround
994 salsa8_core_3way_avx_doubleround
1000 .globl scrypt_core_3way
1001 .globl _scrypt_core_3way
1006 #if defined(_WIN64) || defined(__CYGWIN__)
1008 movdqa %xmm6, 8(%rsp)
1009 movdqa %xmm7, 24(%rsp)
1010 movdqa %xmm8, 40(%rsp)
1011 movdqa %xmm9, 56(%rsp)
1012 movdqa %xmm10, 72(%rsp)
1013 movdqa %xmm11, 88(%rsp)
1014 movdqa %xmm12, 104(%rsp)
1015 movdqa %xmm13, 120(%rsp)
1016 movdqa %xmm14, 136(%rsp)
1017 movdqa %xmm15, 152(%rsp)
1025 .macro scrypt_core_3way_cleanup
1027 #if defined(_WIN64) || defined(__CYGWIN__)
1030 movdqa 8(%rsp), %xmm6
1031 movdqa 24(%rsp), %xmm7
1032 movdqa 40(%rsp), %xmm8
1033 movdqa 56(%rsp), %xmm9
1034 movdqa 72(%rsp), %xmm10
1035 movdqa 88(%rsp), %xmm11
1036 movdqa 104(%rsp), %xmm12
1037 movdqa 120(%rsp), %xmm13
1038 movdqa 136(%rsp), %xmm14
1039 movdqa 152(%rsp), %xmm15
1046 #if !defined(USE_AVX)
1047 jmp scrypt_core_3way_xmm
1049 /* Check for AVX and OSXSAVE support */
1052 andl $0x18000000, %ecx
1053 cmpl $0x18000000, %ecx
1054 jne scrypt_core_3way_xmm
1055 /* Check for XMM and YMM state support */
1058 andl $0x00000006, %eax
1059 cmpl $0x00000006, %eax
1060 jne scrypt_core_3way_xmm
1061 #if defined(USE_XOP)
1062 /* Check for XOP support */
1063 movl $0x80000001, %eax
1065 andl $0x00000800, %ecx
1066 jnz scrypt_core_3way_xop
1069 scrypt_core_3way_avx:
1070 scrypt_shuffle %rdi, 0, %rsp, 0
1071 scrypt_shuffle %rdi, 64, %rsp, 64
1072 scrypt_shuffle %rdi, 128, %rsp, 128
1073 scrypt_shuffle %rdi, 192, %rsp, 192
1074 scrypt_shuffle %rdi, 256, %rsp, 256
1075 scrypt_shuffle %rdi, 320, %rsp, 320
1077 movdqa 64(%rsp), %xmm0
1078 movdqa 80(%rsp), %xmm1
1079 movdqa 96(%rsp), %xmm2
1080 movdqa 112(%rsp), %xmm3
1081 movdqa 128+64(%rsp), %xmm8
1082 movdqa 128+80(%rsp), %xmm9
1083 movdqa 128+96(%rsp), %xmm10
1084 movdqa 128+112(%rsp), %xmm11
1085 movdqa 256+64(%rsp), %xmm12
1086 movdqa 256+80(%rsp), %xmm13
1087 movdqa 256+96(%rsp), %xmm14
1088 movdqa 256+112(%rsp), %xmm15
1091 leaq 3*131072(%rsi), %rax
1092 scrypt_core_3way_avx_loop1:
1093 movdqa %xmm0, 64(%rbx)
1094 movdqa %xmm1, 80(%rbx)
1095 movdqa %xmm2, 96(%rbx)
1096 movdqa %xmm3, 112(%rbx)
1098 pxor 16(%rsp), %xmm1
1099 pxor 32(%rsp), %xmm2
1100 pxor 48(%rsp), %xmm3
1101 movdqa %xmm8, 128+64(%rbx)
1102 movdqa %xmm9, 128+80(%rbx)
1103 movdqa %xmm10, 128+96(%rbx)
1104 movdqa %xmm11, 128+112(%rbx)
1105 pxor 128+0(%rsp), %xmm8
1106 pxor 128+16(%rsp), %xmm9
1107 pxor 128+32(%rsp), %xmm10
1108 pxor 128+48(%rsp), %xmm11
1109 movdqa %xmm12, 256+64(%rbx)
1110 movdqa %xmm13, 256+80(%rbx)
1111 movdqa %xmm14, 256+96(%rbx)
1112 movdqa %xmm15, 256+112(%rbx)
1113 pxor 256+0(%rsp), %xmm12
1114 pxor 256+16(%rsp), %xmm13
1115 pxor 256+32(%rsp), %xmm14
1116 pxor 256+48(%rsp), %xmm15
1117 movdqa %xmm0, 0(%rbx)
1118 movdqa %xmm1, 16(%rbx)
1119 movdqa %xmm2, 32(%rbx)
1120 movdqa %xmm3, 48(%rbx)
1121 movdqa %xmm8, 128+0(%rbx)
1122 movdqa %xmm9, 128+16(%rbx)
1123 movdqa %xmm10, 128+32(%rbx)
1124 movdqa %xmm11, 128+48(%rbx)
1125 movdqa %xmm12, 256+0(%rbx)
1126 movdqa %xmm13, 256+16(%rbx)
1127 movdqa %xmm14, 256+32(%rbx)
1128 movdqa %xmm15, 256+48(%rbx)
1130 salsa8_core_3way_avx
1131 paddd 0(%rbx), %xmm0
1132 paddd 16(%rbx), %xmm1
1133 paddd 32(%rbx), %xmm2
1134 paddd 48(%rbx), %xmm3
1135 paddd 128+0(%rbx), %xmm8
1136 paddd 128+16(%rbx), %xmm9
1137 paddd 128+32(%rbx), %xmm10
1138 paddd 128+48(%rbx), %xmm11
1139 paddd 256+0(%rbx), %xmm12
1140 paddd 256+16(%rbx), %xmm13
1141 paddd 256+32(%rbx), %xmm14
1142 paddd 256+48(%rbx), %xmm15
1143 movdqa %xmm0, 0(%rsp)
1144 movdqa %xmm1, 16(%rsp)
1145 movdqa %xmm2, 32(%rsp)
1146 movdqa %xmm3, 48(%rsp)
1147 movdqa %xmm8, 128+0(%rsp)
1148 movdqa %xmm9, 128+16(%rsp)
1149 movdqa %xmm10, 128+32(%rsp)
1150 movdqa %xmm11, 128+48(%rsp)
1151 movdqa %xmm12, 256+0(%rsp)
1152 movdqa %xmm13, 256+16(%rsp)
1153 movdqa %xmm14, 256+32(%rsp)
1154 movdqa %xmm15, 256+48(%rsp)
1156 pxor 64(%rbx), %xmm0
1157 pxor 80(%rbx), %xmm1
1158 pxor 96(%rbx), %xmm2
1159 pxor 112(%rbx), %xmm3
1160 pxor 128+64(%rbx), %xmm8
1161 pxor 128+80(%rbx), %xmm9
1162 pxor 128+96(%rbx), %xmm10
1163 pxor 128+112(%rbx), %xmm11
1164 pxor 256+64(%rbx), %xmm12
1165 pxor 256+80(%rbx), %xmm13
1166 pxor 256+96(%rbx), %xmm14
1167 pxor 256+112(%rbx), %xmm15
1168 movdqa %xmm0, 64(%rsp)
1169 movdqa %xmm1, 80(%rsp)
1170 movdqa %xmm2, 96(%rsp)
1171 movdqa %xmm3, 112(%rsp)
1172 movdqa %xmm8, 128+64(%rsp)
1173 movdqa %xmm9, 128+80(%rsp)
1174 movdqa %xmm10, 128+96(%rsp)
1175 movdqa %xmm11, 128+112(%rsp)
1176 movdqa %xmm12, 256+64(%rsp)
1177 movdqa %xmm13, 256+80(%rsp)
1178 movdqa %xmm14, 256+96(%rsp)
1179 movdqa %xmm15, 256+112(%rsp)
1180 salsa8_core_3way_avx
1181 paddd 64(%rsp), %xmm0
1182 paddd 80(%rsp), %xmm1
1183 paddd 96(%rsp), %xmm2
1184 paddd 112(%rsp), %xmm3
1185 paddd 128+64(%rsp), %xmm8
1186 paddd 128+80(%rsp), %xmm9
1187 paddd 128+96(%rsp), %xmm10
1188 paddd 128+112(%rsp), %xmm11
1189 paddd 256+64(%rsp), %xmm12
1190 paddd 256+80(%rsp), %xmm13
1191 paddd 256+96(%rsp), %xmm14
1192 paddd 256+112(%rsp), %xmm15
1196 jne scrypt_core_3way_avx_loop1
1198 movdqa %xmm0, 64(%rsp)
1199 movdqa %xmm1, 80(%rsp)
1200 movdqa %xmm2, 96(%rsp)
1201 movdqa %xmm3, 112(%rsp)
1202 movdqa %xmm8, 128+64(%rsp)
1203 movdqa %xmm9, 128+80(%rsp)
1204 movdqa %xmm10, 128+96(%rsp)
1205 movdqa %xmm11, 128+112(%rsp)
1206 movdqa %xmm12, 256+64(%rsp)
1207 movdqa %xmm13, 256+80(%rsp)
1208 movdqa %xmm14, 256+96(%rsp)
1209 movdqa %xmm15, 256+112(%rsp)
1212 scrypt_core_3way_avx_loop2:
1217 pxor 16(%rsp), %xmm1
1218 pxor 32(%rsp), %xmm2
1219 pxor 48(%rsp), %xmm3
1220 pxor 128+0(%rsp), %xmm8
1221 pxor 128+16(%rsp), %xmm9
1222 pxor 128+32(%rsp), %xmm10
1223 pxor 128+48(%rsp), %xmm11
1224 pxor 256+0(%rsp), %xmm12
1225 pxor 256+16(%rsp), %xmm13
1226 pxor 256+32(%rsp), %xmm14
1227 pxor 256+48(%rsp), %xmm15
1229 leaq (%rbp, %rbp, 2), %rbp
1232 leaq 1(%rbx, %rbx, 2), %rbx
1235 leaq 2(%rax, %rax, 2), %rax
1237 pxor 0(%rsi, %rbp), %xmm0
1238 pxor 16(%rsi, %rbp), %xmm1
1239 pxor 32(%rsi, %rbp), %xmm2
1240 pxor 48(%rsi, %rbp), %xmm3
1241 pxor 0(%rsi, %rbx), %xmm8
1242 pxor 16(%rsi, %rbx), %xmm9
1243 pxor 32(%rsi, %rbx), %xmm10
1244 pxor 48(%rsi, %rbx), %xmm11
1245 pxor 0(%rsi, %rax), %xmm12
1246 pxor 16(%rsi, %rax), %xmm13
1247 pxor 32(%rsi, %rax), %xmm14
1248 pxor 48(%rsi, %rax), %xmm15
1250 movdqa %xmm0, 0(%rsp)
1251 movdqa %xmm1, 16(%rsp)
1252 movdqa %xmm2, 32(%rsp)
1253 movdqa %xmm3, 48(%rsp)
1254 movdqa %xmm8, 128+0(%rsp)
1255 movdqa %xmm9, 128+16(%rsp)
1256 movdqa %xmm10, 128+32(%rsp)
1257 movdqa %xmm11, 128+48(%rsp)
1258 movdqa %xmm12, 256+0(%rsp)
1259 movdqa %xmm13, 256+16(%rsp)
1260 movdqa %xmm14, 256+32(%rsp)
1261 movdqa %xmm15, 256+48(%rsp)
1262 salsa8_core_3way_avx
1263 paddd 0(%rsp), %xmm0
1264 paddd 16(%rsp), %xmm1
1265 paddd 32(%rsp), %xmm2
1266 paddd 48(%rsp), %xmm3
1267 paddd 128+0(%rsp), %xmm8
1268 paddd 128+16(%rsp), %xmm9
1269 paddd 128+32(%rsp), %xmm10
1270 paddd 128+48(%rsp), %xmm11
1271 paddd 256+0(%rsp), %xmm12
1272 paddd 256+16(%rsp), %xmm13
1273 paddd 256+32(%rsp), %xmm14
1274 paddd 256+48(%rsp), %xmm15
1275 movdqa %xmm0, 0(%rsp)
1276 movdqa %xmm1, 16(%rsp)
1277 movdqa %xmm2, 32(%rsp)
1278 movdqa %xmm3, 48(%rsp)
1279 movdqa %xmm8, 128+0(%rsp)
1280 movdqa %xmm9, 128+16(%rsp)
1281 movdqa %xmm10, 128+32(%rsp)
1282 movdqa %xmm11, 128+48(%rsp)
1283 movdqa %xmm12, 256+0(%rsp)
1284 movdqa %xmm13, 256+16(%rsp)
1285 movdqa %xmm14, 256+32(%rsp)
1286 movdqa %xmm15, 256+48(%rsp)
1288 pxor 64(%rsi, %rbp), %xmm0
1289 pxor 80(%rsi, %rbp), %xmm1
1290 pxor 96(%rsi, %rbp), %xmm2
1291 pxor 112(%rsi, %rbp), %xmm3
1292 pxor 64(%rsi, %rbx), %xmm8
1293 pxor 80(%rsi, %rbx), %xmm9
1294 pxor 96(%rsi, %rbx), %xmm10
1295 pxor 112(%rsi, %rbx), %xmm11
1296 pxor 64(%rsi, %rax), %xmm12
1297 pxor 80(%rsi, %rax), %xmm13
1298 pxor 96(%rsi, %rax), %xmm14
1299 pxor 112(%rsi, %rax), %xmm15
1300 pxor 64(%rsp), %xmm0
1301 pxor 80(%rsp), %xmm1
1302 pxor 96(%rsp), %xmm2
1303 pxor 112(%rsp), %xmm3
1304 pxor 128+64(%rsp), %xmm8
1305 pxor 128+80(%rsp), %xmm9
1306 pxor 128+96(%rsp), %xmm10
1307 pxor 128+112(%rsp), %xmm11
1308 pxor 256+64(%rsp), %xmm12
1309 pxor 256+80(%rsp), %xmm13
1310 pxor 256+96(%rsp), %xmm14
1311 pxor 256+112(%rsp), %xmm15
1312 movdqa %xmm0, 64(%rsp)
1313 movdqa %xmm1, 80(%rsp)
1314 movdqa %xmm2, 96(%rsp)
1315 movdqa %xmm3, 112(%rsp)
1316 movdqa %xmm8, 128+64(%rsp)
1317 movdqa %xmm9, 128+80(%rsp)
1318 movdqa %xmm10, 128+96(%rsp)
1319 movdqa %xmm11, 128+112(%rsp)
1320 movdqa %xmm12, 256+64(%rsp)
1321 movdqa %xmm13, 256+80(%rsp)
1322 movdqa %xmm14, 256+96(%rsp)
1323 movdqa %xmm15, 256+112(%rsp)
1324 salsa8_core_3way_avx
1325 paddd 64(%rsp), %xmm0
1326 paddd 80(%rsp), %xmm1
1327 paddd 96(%rsp), %xmm2
1328 paddd 112(%rsp), %xmm3
1329 paddd 128+64(%rsp), %xmm8
1330 paddd 128+80(%rsp), %xmm9
1331 paddd 128+96(%rsp), %xmm10
1332 paddd 128+112(%rsp), %xmm11
1333 paddd 256+64(%rsp), %xmm12
1334 paddd 256+80(%rsp), %xmm13
1335 paddd 256+96(%rsp), %xmm14
1336 paddd 256+112(%rsp), %xmm15
1337 movdqa %xmm0, 64(%rsp)
1338 movdqa %xmm1, 80(%rsp)
1339 movdqa %xmm2, 96(%rsp)
1340 movdqa %xmm3, 112(%rsp)
1341 movdqa %xmm8, 128+64(%rsp)
1342 movdqa %xmm9, 128+80(%rsp)
1343 movdqa %xmm10, 128+96(%rsp)
1344 movdqa %xmm11, 128+112(%rsp)
1345 movdqa %xmm12, 256+64(%rsp)
1346 movdqa %xmm13, 256+80(%rsp)
1347 movdqa %xmm14, 256+96(%rsp)
1348 movdqa %xmm15, 256+112(%rsp)
1351 ja scrypt_core_3way_avx_loop2
1353 scrypt_shuffle %rsp, 0, %rdi, 0
1354 scrypt_shuffle %rsp, 64, %rdi, 64
1355 scrypt_shuffle %rsp, 128, %rdi, 128
1356 scrypt_shuffle %rsp, 192, %rdi, 192
1357 scrypt_shuffle %rsp, 256, %rdi, 256
1358 scrypt_shuffle %rsp, 320, %rdi, 320
1360 scrypt_core_3way_cleanup
1363 #if defined(USE_XOP)
1364 .macro salsa8_core_3way_xop_doubleround
1365 vpaddd %xmm0, %xmm1, %xmm4
1366 vpaddd %xmm8, %xmm9, %xmm6
1367 vpaddd %xmm12, %xmm13, %xmm7
1368 vprotd $7, %xmm4, %xmm4
1369 vprotd $7, %xmm6, %xmm6
1370 vprotd $7, %xmm7, %xmm7
1371 vpxor %xmm4, %xmm3, %xmm3
1372 vpxor %xmm6, %xmm11, %xmm11
1373 vpxor %xmm7, %xmm15, %xmm15
1375 vpaddd %xmm3, %xmm0, %xmm4
1376 vpaddd %xmm11, %xmm8, %xmm6
1377 vpaddd %xmm15, %xmm12, %xmm7
1378 vprotd $9, %xmm4, %xmm4
1379 vprotd $9, %xmm6, %xmm6
1380 vprotd $9, %xmm7, %xmm7
1381 vpxor %xmm4, %xmm2, %xmm2
1382 vpxor %xmm6, %xmm10, %xmm10
1383 vpxor %xmm7, %xmm14, %xmm14
1385 vpaddd %xmm2, %xmm3, %xmm4
1386 vpaddd %xmm10, %xmm11, %xmm6
1387 vpaddd %xmm14, %xmm15, %xmm7
1388 vprotd $13, %xmm4, %xmm4
1389 vprotd $13, %xmm6, %xmm6
1390 vprotd $13, %xmm7, %xmm7
1391 vpshufd $0x93, %xmm3, %xmm3
1392 vpshufd $0x93, %xmm11, %xmm11
1393 vpshufd $0x93, %xmm15, %xmm15
1394 vpxor %xmm4, %xmm1, %xmm1
1395 vpxor %xmm6, %xmm9, %xmm9
1396 vpxor %xmm7, %xmm13, %xmm13
1398 vpaddd %xmm1, %xmm2, %xmm4
1399 vpaddd %xmm9, %xmm10, %xmm6
1400 vpaddd %xmm13, %xmm14, %xmm7
1401 vprotd $18, %xmm4, %xmm4
1402 vprotd $18, %xmm6, %xmm6
1403 vprotd $18, %xmm7, %xmm7
1404 vpshufd $0x4e, %xmm2, %xmm2
1405 vpshufd $0x4e, %xmm10, %xmm10
1406 vpshufd $0x4e, %xmm14, %xmm14
1407 vpxor %xmm6, %xmm8, %xmm8
1408 vpxor %xmm4, %xmm0, %xmm0
1409 vpxor %xmm7, %xmm12, %xmm12
1411 vpaddd %xmm0, %xmm3, %xmm4
1412 vpaddd %xmm8, %xmm11, %xmm6
1413 vpaddd %xmm12, %xmm15, %xmm7
1414 vprotd $7, %xmm4, %xmm4
1415 vprotd $7, %xmm6, %xmm6
1416 vprotd $7, %xmm7, %xmm7
1417 vpshufd $0x39, %xmm1, %xmm1
1418 vpshufd $0x39, %xmm9, %xmm9
1419 vpshufd $0x39, %xmm13, %xmm13
1420 vpxor %xmm4, %xmm1, %xmm1
1421 vpxor %xmm6, %xmm9, %xmm9
1422 vpxor %xmm7, %xmm13, %xmm13
1424 vpaddd %xmm1, %xmm0, %xmm4
1425 vpaddd %xmm9, %xmm8, %xmm6
1426 vpaddd %xmm13, %xmm12, %xmm7
1427 vprotd $9, %xmm4, %xmm4
1428 vprotd $9, %xmm6, %xmm6
1429 vprotd $9, %xmm7, %xmm7
1430 vpxor %xmm4, %xmm2, %xmm2
1431 vpxor %xmm6, %xmm10, %xmm10
1432 vpxor %xmm7, %xmm14, %xmm14
1434 vpaddd %xmm2, %xmm1, %xmm4
1435 vpaddd %xmm10, %xmm9, %xmm6
1436 vpaddd %xmm14, %xmm13, %xmm7
1437 vprotd $13, %xmm4, %xmm4
1438 vprotd $13, %xmm6, %xmm6
1439 vprotd $13, %xmm7, %xmm7
1440 vpshufd $0x93, %xmm1, %xmm1
1441 vpshufd $0x93, %xmm9, %xmm9
1442 vpshufd $0x93, %xmm13, %xmm13
1443 vpxor %xmm4, %xmm3, %xmm3
1444 vpxor %xmm6, %xmm11, %xmm11
1445 vpxor %xmm7, %xmm15, %xmm15
1447 vpaddd %xmm3, %xmm2, %xmm4
1448 vpaddd %xmm11, %xmm10, %xmm6
1449 vpaddd %xmm15, %xmm14, %xmm7
1450 vprotd $18, %xmm4, %xmm4
1451 vprotd $18, %xmm6, %xmm6
1452 vprotd $18, %xmm7, %xmm7
1453 vpshufd $0x4e, %xmm2, %xmm2
1454 vpshufd $0x4e, %xmm10, %xmm10
1455 vpshufd $0x4e, %xmm14, %xmm14
1456 vpxor %xmm4, %xmm0, %xmm0
1457 vpxor %xmm6, %xmm8, %xmm8
1458 vpxor %xmm7, %xmm12, %xmm12
1459 vpshufd $0x39, %xmm3, %xmm3
1460 vpshufd $0x39, %xmm11, %xmm11
1461 vpshufd $0x39, %xmm15, %xmm15
1464 .macro salsa8_core_3way_xop
1465 salsa8_core_3way_xop_doubleround
1466 salsa8_core_3way_xop_doubleround
1467 salsa8_core_3way_xop_doubleround
1468 salsa8_core_3way_xop_doubleround
1472 scrypt_core_3way_xop:
1473 scrypt_shuffle %rdi, 0, %rsp, 0
1474 scrypt_shuffle %rdi, 64, %rsp, 64
1475 scrypt_shuffle %rdi, 128, %rsp, 128
1476 scrypt_shuffle %rdi, 192, %rsp, 192
1477 scrypt_shuffle %rdi, 256, %rsp, 256
1478 scrypt_shuffle %rdi, 320, %rsp, 320
1480 movdqa 64(%rsp), %xmm0
1481 movdqa 80(%rsp), %xmm1
1482 movdqa 96(%rsp), %xmm2
1483 movdqa 112(%rsp), %xmm3
1484 movdqa 128+64(%rsp), %xmm8
1485 movdqa 128+80(%rsp), %xmm9
1486 movdqa 128+96(%rsp), %xmm10
1487 movdqa 128+112(%rsp), %xmm11
1488 movdqa 256+64(%rsp), %xmm12
1489 movdqa 256+80(%rsp), %xmm13
1490 movdqa 256+96(%rsp), %xmm14
1491 movdqa 256+112(%rsp), %xmm15
1494 leaq 3*131072(%rsi), %rax
1495 scrypt_core_3way_xop_loop1:
1496 movdqa %xmm0, 64(%rbx)
1497 movdqa %xmm1, 80(%rbx)
1498 movdqa %xmm2, 96(%rbx)
1499 movdqa %xmm3, 112(%rbx)
1501 pxor 16(%rsp), %xmm1
1502 pxor 32(%rsp), %xmm2
1503 pxor 48(%rsp), %xmm3
1504 movdqa %xmm8, 128+64(%rbx)
1505 movdqa %xmm9, 128+80(%rbx)
1506 movdqa %xmm10, 128+96(%rbx)
1507 movdqa %xmm11, 128+112(%rbx)
1508 pxor 128+0(%rsp), %xmm8
1509 pxor 128+16(%rsp), %xmm9
1510 pxor 128+32(%rsp), %xmm10
1511 pxor 128+48(%rsp), %xmm11
1512 movdqa %xmm12, 256+64(%rbx)
1513 movdqa %xmm13, 256+80(%rbx)
1514 movdqa %xmm14, 256+96(%rbx)
1515 movdqa %xmm15, 256+112(%rbx)
1516 pxor 256+0(%rsp), %xmm12
1517 pxor 256+16(%rsp), %xmm13
1518 pxor 256+32(%rsp), %xmm14
1519 pxor 256+48(%rsp), %xmm15
1520 movdqa %xmm0, 0(%rbx)
1521 movdqa %xmm1, 16(%rbx)
1522 movdqa %xmm2, 32(%rbx)
1523 movdqa %xmm3, 48(%rbx)
1524 movdqa %xmm8, 128+0(%rbx)
1525 movdqa %xmm9, 128+16(%rbx)
1526 movdqa %xmm10, 128+32(%rbx)
1527 movdqa %xmm11, 128+48(%rbx)
1528 movdqa %xmm12, 256+0(%rbx)
1529 movdqa %xmm13, 256+16(%rbx)
1530 movdqa %xmm14, 256+32(%rbx)
1531 movdqa %xmm15, 256+48(%rbx)
1533 salsa8_core_3way_xop
1534 paddd 0(%rbx), %xmm0
1535 paddd 16(%rbx), %xmm1
1536 paddd 32(%rbx), %xmm2
1537 paddd 48(%rbx), %xmm3
1538 paddd 128+0(%rbx), %xmm8
1539 paddd 128+16(%rbx), %xmm9
1540 paddd 128+32(%rbx), %xmm10
1541 paddd 128+48(%rbx), %xmm11
1542 paddd 256+0(%rbx), %xmm12
1543 paddd 256+16(%rbx), %xmm13
1544 paddd 256+32(%rbx), %xmm14
1545 paddd 256+48(%rbx), %xmm15
1546 movdqa %xmm0, 0(%rsp)
1547 movdqa %xmm1, 16(%rsp)
1548 movdqa %xmm2, 32(%rsp)
1549 movdqa %xmm3, 48(%rsp)
1550 movdqa %xmm8, 128+0(%rsp)
1551 movdqa %xmm9, 128+16(%rsp)
1552 movdqa %xmm10, 128+32(%rsp)
1553 movdqa %xmm11, 128+48(%rsp)
1554 movdqa %xmm12, 256+0(%rsp)
1555 movdqa %xmm13, 256+16(%rsp)
1556 movdqa %xmm14, 256+32(%rsp)
1557 movdqa %xmm15, 256+48(%rsp)
1559 pxor 64(%rbx), %xmm0
1560 pxor 80(%rbx), %xmm1
1561 pxor 96(%rbx), %xmm2
1562 pxor 112(%rbx), %xmm3
1563 pxor 128+64(%rbx), %xmm8
1564 pxor 128+80(%rbx), %xmm9
1565 pxor 128+96(%rbx), %xmm10
1566 pxor 128+112(%rbx), %xmm11
1567 pxor 256+64(%rbx), %xmm12
1568 pxor 256+80(%rbx), %xmm13
1569 pxor 256+96(%rbx), %xmm14
1570 pxor 256+112(%rbx), %xmm15
1571 movdqa %xmm0, 64(%rsp)
1572 movdqa %xmm1, 80(%rsp)
1573 movdqa %xmm2, 96(%rsp)
1574 movdqa %xmm3, 112(%rsp)
1575 movdqa %xmm8, 128+64(%rsp)
1576 movdqa %xmm9, 128+80(%rsp)
1577 movdqa %xmm10, 128+96(%rsp)
1578 movdqa %xmm11, 128+112(%rsp)
1579 movdqa %xmm12, 256+64(%rsp)
1580 movdqa %xmm13, 256+80(%rsp)
1581 movdqa %xmm14, 256+96(%rsp)
1582 movdqa %xmm15, 256+112(%rsp)
1583 salsa8_core_3way_xop
1584 paddd 64(%rsp), %xmm0
1585 paddd 80(%rsp), %xmm1
1586 paddd 96(%rsp), %xmm2
1587 paddd 112(%rsp), %xmm3
1588 paddd 128+64(%rsp), %xmm8
1589 paddd 128+80(%rsp), %xmm9
1590 paddd 128+96(%rsp), %xmm10
1591 paddd 128+112(%rsp), %xmm11
1592 paddd 256+64(%rsp), %xmm12
1593 paddd 256+80(%rsp), %xmm13
1594 paddd 256+96(%rsp), %xmm14
1595 paddd 256+112(%rsp), %xmm15
1599 jne scrypt_core_3way_xop_loop1
1601 movdqa %xmm0, 64(%rsp)
1602 movdqa %xmm1, 80(%rsp)
1603 movdqa %xmm2, 96(%rsp)
1604 movdqa %xmm3, 112(%rsp)
1605 movdqa %xmm8, 128+64(%rsp)
1606 movdqa %xmm9, 128+80(%rsp)
1607 movdqa %xmm10, 128+96(%rsp)
1608 movdqa %xmm11, 128+112(%rsp)
1609 movdqa %xmm12, 256+64(%rsp)
1610 movdqa %xmm13, 256+80(%rsp)
1611 movdqa %xmm14, 256+96(%rsp)
1612 movdqa %xmm15, 256+112(%rsp)
1615 scrypt_core_3way_xop_loop2:
1620 pxor 16(%rsp), %xmm1
1621 pxor 32(%rsp), %xmm2
1622 pxor 48(%rsp), %xmm3
1623 pxor 128+0(%rsp), %xmm8
1624 pxor 128+16(%rsp), %xmm9
1625 pxor 128+32(%rsp), %xmm10
1626 pxor 128+48(%rsp), %xmm11
1627 pxor 256+0(%rsp), %xmm12
1628 pxor 256+16(%rsp), %xmm13
1629 pxor 256+32(%rsp), %xmm14
1630 pxor 256+48(%rsp), %xmm15
1632 leaq (%rbp, %rbp, 2), %rbp
1635 leaq 1(%rbx, %rbx, 2), %rbx
1638 leaq 2(%rax, %rax, 2), %rax
1640 pxor 0(%rsi, %rbp), %xmm0
1641 pxor 16(%rsi, %rbp), %xmm1
1642 pxor 32(%rsi, %rbp), %xmm2
1643 pxor 48(%rsi, %rbp), %xmm3
1644 pxor 0(%rsi, %rbx), %xmm8
1645 pxor 16(%rsi, %rbx), %xmm9
1646 pxor 32(%rsi, %rbx), %xmm10
1647 pxor 48(%rsi, %rbx), %xmm11
1648 pxor 0(%rsi, %rax), %xmm12
1649 pxor 16(%rsi, %rax), %xmm13
1650 pxor 32(%rsi, %rax), %xmm14
1651 pxor 48(%rsi, %rax), %xmm15
1653 movdqa %xmm0, 0(%rsp)
1654 movdqa %xmm1, 16(%rsp)
1655 movdqa %xmm2, 32(%rsp)
1656 movdqa %xmm3, 48(%rsp)
1657 movdqa %xmm8, 128+0(%rsp)
1658 movdqa %xmm9, 128+16(%rsp)
1659 movdqa %xmm10, 128+32(%rsp)
1660 movdqa %xmm11, 128+48(%rsp)
1661 movdqa %xmm12, 256+0(%rsp)
1662 movdqa %xmm13, 256+16(%rsp)
1663 movdqa %xmm14, 256+32(%rsp)
1664 movdqa %xmm15, 256+48(%rsp)
1665 salsa8_core_3way_xop
1666 paddd 0(%rsp), %xmm0
1667 paddd 16(%rsp), %xmm1
1668 paddd 32(%rsp), %xmm2
1669 paddd 48(%rsp), %xmm3
1670 paddd 128+0(%rsp), %xmm8
1671 paddd 128+16(%rsp), %xmm9
1672 paddd 128+32(%rsp), %xmm10
1673 paddd 128+48(%rsp), %xmm11
1674 paddd 256+0(%rsp), %xmm12
1675 paddd 256+16(%rsp), %xmm13
1676 paddd 256+32(%rsp), %xmm14
1677 paddd 256+48(%rsp), %xmm15
1678 movdqa %xmm0, 0(%rsp)
1679 movdqa %xmm1, 16(%rsp)
1680 movdqa %xmm2, 32(%rsp)
1681 movdqa %xmm3, 48(%rsp)
1682 movdqa %xmm8, 128+0(%rsp)
1683 movdqa %xmm9, 128+16(%rsp)
1684 movdqa %xmm10, 128+32(%rsp)
1685 movdqa %xmm11, 128+48(%rsp)
1686 movdqa %xmm12, 256+0(%rsp)
1687 movdqa %xmm13, 256+16(%rsp)
1688 movdqa %xmm14, 256+32(%rsp)
1689 movdqa %xmm15, 256+48(%rsp)
1691 pxor 64(%rsi, %rbp), %xmm0
1692 pxor 80(%rsi, %rbp), %xmm1
1693 pxor 96(%rsi, %rbp), %xmm2
1694 pxor 112(%rsi, %rbp), %xmm3
1695 pxor 64(%rsi, %rbx), %xmm8
1696 pxor 80(%rsi, %rbx), %xmm9
1697 pxor 96(%rsi, %rbx), %xmm10
1698 pxor 112(%rsi, %rbx), %xmm11
1699 pxor 64(%rsi, %rax), %xmm12
1700 pxor 80(%rsi, %rax), %xmm13
1701 pxor 96(%rsi, %rax), %xmm14
1702 pxor 112(%rsi, %rax), %xmm15
1703 pxor 64(%rsp), %xmm0
1704 pxor 80(%rsp), %xmm1
1705 pxor 96(%rsp), %xmm2
1706 pxor 112(%rsp), %xmm3
1707 pxor 128+64(%rsp), %xmm8
1708 pxor 128+80(%rsp), %xmm9
1709 pxor 128+96(%rsp), %xmm10
1710 pxor 128+112(%rsp), %xmm11
1711 pxor 256+64(%rsp), %xmm12
1712 pxor 256+80(%rsp), %xmm13
1713 pxor 256+96(%rsp), %xmm14
1714 pxor 256+112(%rsp), %xmm15
1715 movdqa %xmm0, 64(%rsp)
1716 movdqa %xmm1, 80(%rsp)
1717 movdqa %xmm2, 96(%rsp)
1718 movdqa %xmm3, 112(%rsp)
1719 movdqa %xmm8, 128+64(%rsp)
1720 movdqa %xmm9, 128+80(%rsp)
1721 movdqa %xmm10, 128+96(%rsp)
1722 movdqa %xmm11, 128+112(%rsp)
1723 movdqa %xmm12, 256+64(%rsp)
1724 movdqa %xmm13, 256+80(%rsp)
1725 movdqa %xmm14, 256+96(%rsp)
1726 movdqa %xmm15, 256+112(%rsp)
1727 salsa8_core_3way_xop
1728 paddd 64(%rsp), %xmm0
1729 paddd 80(%rsp), %xmm1
1730 paddd 96(%rsp), %xmm2
1731 paddd 112(%rsp), %xmm3
1732 paddd 128+64(%rsp), %xmm8
1733 paddd 128+80(%rsp), %xmm9
1734 paddd 128+96(%rsp), %xmm10
1735 paddd 128+112(%rsp), %xmm11
1736 paddd 256+64(%rsp), %xmm12
1737 paddd 256+80(%rsp), %xmm13
1738 paddd 256+96(%rsp), %xmm14
1739 paddd 256+112(%rsp), %xmm15
1740 movdqa %xmm0, 64(%rsp)
1741 movdqa %xmm1, 80(%rsp)
1742 movdqa %xmm2, 96(%rsp)
1743 movdqa %xmm3, 112(%rsp)
1744 movdqa %xmm8, 128+64(%rsp)
1745 movdqa %xmm9, 128+80(%rsp)
1746 movdqa %xmm10, 128+96(%rsp)
1747 movdqa %xmm11, 128+112(%rsp)
1748 movdqa %xmm12, 256+64(%rsp)
1749 movdqa %xmm13, 256+80(%rsp)
1750 movdqa %xmm14, 256+96(%rsp)
1751 movdqa %xmm15, 256+112(%rsp)
1754 ja scrypt_core_3way_xop_loop2
1756 scrypt_shuffle %rsp, 0, %rdi, 0
1757 scrypt_shuffle %rsp, 64, %rdi, 64
1758 scrypt_shuffle %rsp, 128, %rdi, 128
1759 scrypt_shuffle %rsp, 192, %rdi, 192
1760 scrypt_shuffle %rsp, 256, %rdi, 256
1761 scrypt_shuffle %rsp, 320, %rdi, 320
1763 scrypt_core_3way_cleanup
1765 #endif /* USE_XOP */
1766 #endif /* USE_AVX */
1768 .macro salsa8_core_3way_xmm_doubleround
1771 movdqa %xmm13, %xmm7
1792 movdqa %xmm12, %xmm7
1802 pshufd $0x93, %xmm3, %xmm3
1808 movdqa %xmm11, %xmm6
1809 pshufd $0x93, %xmm11, %xmm11
1815 movdqa %xmm15, %xmm7
1817 pshufd $0x93, %xmm15, %xmm15
1827 pshufd $0x4e, %xmm2, %xmm2
1833 movdqa %xmm10, %xmm6
1834 pshufd $0x4e, %xmm10, %xmm10
1840 movdqa %xmm14, %xmm7
1841 pshufd $0x4e, %xmm14, %xmm14
1851 pshufd $0x39, %xmm1, %xmm1
1858 pshufd $0x39, %xmm9, %xmm9
1860 movdqa %xmm11, %xmm6
1865 movdqa %xmm15, %xmm7
1867 pshufd $0x39, %xmm13, %xmm13
1889 movdqa %xmm12, %xmm7
1899 pshufd $0x93, %xmm1, %xmm1
1906 pshufd $0x93, %xmm9, %xmm9
1912 movdqa %xmm13, %xmm7
1913 pshufd $0x93, %xmm13, %xmm13
1924 pshufd $0x4e, %xmm2, %xmm2
1930 movdqa %xmm10, %xmm6
1931 pshufd $0x4e, %xmm10, %xmm10
1937 movdqa %xmm14, %xmm7
1938 pshufd $0x4e, %xmm14, %xmm14
1948 pshufd $0x39, %xmm3, %xmm3
1954 pshufd $0x39, %xmm11, %xmm11
1960 pshufd $0x39, %xmm15, %xmm15
1964 .macro salsa8_core_3way_xmm
1965 salsa8_core_3way_xmm_doubleround
1966 salsa8_core_3way_xmm_doubleround
1967 salsa8_core_3way_xmm_doubleround
1968 salsa8_core_3way_xmm_doubleround
1972 scrypt_core_3way_xmm:
1973 scrypt_shuffle %rdi, 0, %rsp, 0
1974 scrypt_shuffle %rdi, 64, %rsp, 64
1975 scrypt_shuffle %rdi, 128, %rsp, 128
1976 scrypt_shuffle %rdi, 192, %rsp, 192
1977 scrypt_shuffle %rdi, 256, %rsp, 256
1978 scrypt_shuffle %rdi, 320, %rsp, 320
1980 movdqa 64(%rsp), %xmm0
1981 movdqa 80(%rsp), %xmm1
1982 movdqa 96(%rsp), %xmm2
1983 movdqa 112(%rsp), %xmm3
1984 movdqa 128+64(%rsp), %xmm8
1985 movdqa 128+80(%rsp), %xmm9
1986 movdqa 128+96(%rsp), %xmm10
1987 movdqa 128+112(%rsp), %xmm11
1988 movdqa 256+64(%rsp), %xmm12
1989 movdqa 256+80(%rsp), %xmm13
1990 movdqa 256+96(%rsp), %xmm14
1991 movdqa 256+112(%rsp), %xmm15
1994 leaq 3*131072(%rsi), %rax
1995 scrypt_core_3way_xmm_loop1:
1996 movdqa %xmm0, 64(%rbx)
1997 movdqa %xmm1, 80(%rbx)
1998 movdqa %xmm2, 96(%rbx)
1999 movdqa %xmm3, 112(%rbx)
2001 pxor 16(%rsp), %xmm1
2002 pxor 32(%rsp), %xmm2
2003 pxor 48(%rsp), %xmm3
2004 movdqa %xmm8, 128+64(%rbx)
2005 movdqa %xmm9, 128+80(%rbx)
2006 movdqa %xmm10, 128+96(%rbx)
2007 movdqa %xmm11, 128+112(%rbx)
2008 pxor 128+0(%rsp), %xmm8
2009 pxor 128+16(%rsp), %xmm9
2010 pxor 128+32(%rsp), %xmm10
2011 pxor 128+48(%rsp), %xmm11
2012 movdqa %xmm12, 256+64(%rbx)
2013 movdqa %xmm13, 256+80(%rbx)
2014 movdqa %xmm14, 256+96(%rbx)
2015 movdqa %xmm15, 256+112(%rbx)
2016 pxor 256+0(%rsp), %xmm12
2017 pxor 256+16(%rsp), %xmm13
2018 pxor 256+32(%rsp), %xmm14
2019 pxor 256+48(%rsp), %xmm15
2020 movdqa %xmm0, 0(%rbx)
2021 movdqa %xmm1, 16(%rbx)
2022 movdqa %xmm2, 32(%rbx)
2023 movdqa %xmm3, 48(%rbx)
2024 movdqa %xmm8, 128+0(%rbx)
2025 movdqa %xmm9, 128+16(%rbx)
2026 movdqa %xmm10, 128+32(%rbx)
2027 movdqa %xmm11, 128+48(%rbx)
2028 movdqa %xmm12, 256+0(%rbx)
2029 movdqa %xmm13, 256+16(%rbx)
2030 movdqa %xmm14, 256+32(%rbx)
2031 movdqa %xmm15, 256+48(%rbx)
2033 salsa8_core_3way_xmm
2034 paddd 0(%rbx), %xmm0
2035 paddd 16(%rbx), %xmm1
2036 paddd 32(%rbx), %xmm2
2037 paddd 48(%rbx), %xmm3
2038 paddd 128+0(%rbx), %xmm8
2039 paddd 128+16(%rbx), %xmm9
2040 paddd 128+32(%rbx), %xmm10
2041 paddd 128+48(%rbx), %xmm11
2042 paddd 256+0(%rbx), %xmm12
2043 paddd 256+16(%rbx), %xmm13
2044 paddd 256+32(%rbx), %xmm14
2045 paddd 256+48(%rbx), %xmm15
2046 movdqa %xmm0, 0(%rsp)
2047 movdqa %xmm1, 16(%rsp)
2048 movdqa %xmm2, 32(%rsp)
2049 movdqa %xmm3, 48(%rsp)
2050 movdqa %xmm8, 128+0(%rsp)
2051 movdqa %xmm9, 128+16(%rsp)
2052 movdqa %xmm10, 128+32(%rsp)
2053 movdqa %xmm11, 128+48(%rsp)
2054 movdqa %xmm12, 256+0(%rsp)
2055 movdqa %xmm13, 256+16(%rsp)
2056 movdqa %xmm14, 256+32(%rsp)
2057 movdqa %xmm15, 256+48(%rsp)
2059 pxor 64(%rbx), %xmm0
2060 pxor 80(%rbx), %xmm1
2061 pxor 96(%rbx), %xmm2
2062 pxor 112(%rbx), %xmm3
2063 pxor 128+64(%rbx), %xmm8
2064 pxor 128+80(%rbx), %xmm9
2065 pxor 128+96(%rbx), %xmm10
2066 pxor 128+112(%rbx), %xmm11
2067 pxor 256+64(%rbx), %xmm12
2068 pxor 256+80(%rbx), %xmm13
2069 pxor 256+96(%rbx), %xmm14
2070 pxor 256+112(%rbx), %xmm15
2071 movdqa %xmm0, 64(%rsp)
2072 movdqa %xmm1, 80(%rsp)
2073 movdqa %xmm2, 96(%rsp)
2074 movdqa %xmm3, 112(%rsp)
2075 movdqa %xmm8, 128+64(%rsp)
2076 movdqa %xmm9, 128+80(%rsp)
2077 movdqa %xmm10, 128+96(%rsp)
2078 movdqa %xmm11, 128+112(%rsp)
2079 movdqa %xmm12, 256+64(%rsp)
2080 movdqa %xmm13, 256+80(%rsp)
2081 movdqa %xmm14, 256+96(%rsp)
2082 movdqa %xmm15, 256+112(%rsp)
2083 salsa8_core_3way_xmm
2084 paddd 64(%rsp), %xmm0
2085 paddd 80(%rsp), %xmm1
2086 paddd 96(%rsp), %xmm2
2087 paddd 112(%rsp), %xmm3
2088 paddd 128+64(%rsp), %xmm8
2089 paddd 128+80(%rsp), %xmm9
2090 paddd 128+96(%rsp), %xmm10
2091 paddd 128+112(%rsp), %xmm11
2092 paddd 256+64(%rsp), %xmm12
2093 paddd 256+80(%rsp), %xmm13
2094 paddd 256+96(%rsp), %xmm14
2095 paddd 256+112(%rsp), %xmm15
2099 jne scrypt_core_3way_xmm_loop1
2101 movdqa %xmm0, 64(%rsp)
2102 movdqa %xmm1, 80(%rsp)
2103 movdqa %xmm2, 96(%rsp)
2104 movdqa %xmm3, 112(%rsp)
2105 movdqa %xmm8, 128+64(%rsp)
2106 movdqa %xmm9, 128+80(%rsp)
2107 movdqa %xmm10, 128+96(%rsp)
2108 movdqa %xmm11, 128+112(%rsp)
2109 movdqa %xmm12, 256+64(%rsp)
2110 movdqa %xmm13, 256+80(%rsp)
2111 movdqa %xmm14, 256+96(%rsp)
2112 movdqa %xmm15, 256+112(%rsp)
2115 scrypt_core_3way_xmm_loop2:
2120 pxor 16(%rsp), %xmm1
2121 pxor 32(%rsp), %xmm2
2122 pxor 48(%rsp), %xmm3
2123 pxor 128+0(%rsp), %xmm8
2124 pxor 128+16(%rsp), %xmm9
2125 pxor 128+32(%rsp), %xmm10
2126 pxor 128+48(%rsp), %xmm11
2127 pxor 256+0(%rsp), %xmm12
2128 pxor 256+16(%rsp), %xmm13
2129 pxor 256+32(%rsp), %xmm14
2130 pxor 256+48(%rsp), %xmm15
2132 leaq (%rbp, %rbp, 2), %rbp
2135 leaq 1(%rbx, %rbx, 2), %rbx
2138 leaq 2(%rax, %rax, 2), %rax
2140 pxor 0(%rsi, %rbp), %xmm0
2141 pxor 16(%rsi, %rbp), %xmm1
2142 pxor 32(%rsi, %rbp), %xmm2
2143 pxor 48(%rsi, %rbp), %xmm3
2144 pxor 0(%rsi, %rbx), %xmm8
2145 pxor 16(%rsi, %rbx), %xmm9
2146 pxor 32(%rsi, %rbx), %xmm10
2147 pxor 48(%rsi, %rbx), %xmm11
2148 pxor 0(%rsi, %rax), %xmm12
2149 pxor 16(%rsi, %rax), %xmm13
2150 pxor 32(%rsi, %rax), %xmm14
2151 pxor 48(%rsi, %rax), %xmm15
2153 movdqa %xmm0, 0(%rsp)
2154 movdqa %xmm1, 16(%rsp)
2155 movdqa %xmm2, 32(%rsp)
2156 movdqa %xmm3, 48(%rsp)
2157 movdqa %xmm8, 128+0(%rsp)
2158 movdqa %xmm9, 128+16(%rsp)
2159 movdqa %xmm10, 128+32(%rsp)
2160 movdqa %xmm11, 128+48(%rsp)
2161 movdqa %xmm12, 256+0(%rsp)
2162 movdqa %xmm13, 256+16(%rsp)
2163 movdqa %xmm14, 256+32(%rsp)
2164 movdqa %xmm15, 256+48(%rsp)
2165 salsa8_core_3way_xmm
2166 paddd 0(%rsp), %xmm0
2167 paddd 16(%rsp), %xmm1
2168 paddd 32(%rsp), %xmm2
2169 paddd 48(%rsp), %xmm3
2170 paddd 128+0(%rsp), %xmm8
2171 paddd 128+16(%rsp), %xmm9
2172 paddd 128+32(%rsp), %xmm10
2173 paddd 128+48(%rsp), %xmm11
2174 paddd 256+0(%rsp), %xmm12
2175 paddd 256+16(%rsp), %xmm13
2176 paddd 256+32(%rsp), %xmm14
2177 paddd 256+48(%rsp), %xmm15
2178 movdqa %xmm0, 0(%rsp)
2179 movdqa %xmm1, 16(%rsp)
2180 movdqa %xmm2, 32(%rsp)
2181 movdqa %xmm3, 48(%rsp)
2182 movdqa %xmm8, 128+0(%rsp)
2183 movdqa %xmm9, 128+16(%rsp)
2184 movdqa %xmm10, 128+32(%rsp)
2185 movdqa %xmm11, 128+48(%rsp)
2186 movdqa %xmm12, 256+0(%rsp)
2187 movdqa %xmm13, 256+16(%rsp)
2188 movdqa %xmm14, 256+32(%rsp)
2189 movdqa %xmm15, 256+48(%rsp)
2191 pxor 64(%rsi, %rbp), %xmm0
2192 pxor 80(%rsi, %rbp), %xmm1
2193 pxor 96(%rsi, %rbp), %xmm2
2194 pxor 112(%rsi, %rbp), %xmm3
2195 pxor 64(%rsi, %rbx), %xmm8
2196 pxor 80(%rsi, %rbx), %xmm9
2197 pxor 96(%rsi, %rbx), %xmm10
2198 pxor 112(%rsi, %rbx), %xmm11
2199 pxor 64(%rsi, %rax), %xmm12
2200 pxor 80(%rsi, %rax), %xmm13
2201 pxor 96(%rsi, %rax), %xmm14
2202 pxor 112(%rsi, %rax), %xmm15
2203 pxor 64(%rsp), %xmm0
2204 pxor 80(%rsp), %xmm1
2205 pxor 96(%rsp), %xmm2
2206 pxor 112(%rsp), %xmm3
2207 pxor 128+64(%rsp), %xmm8
2208 pxor 128+80(%rsp), %xmm9
2209 pxor 128+96(%rsp), %xmm10
2210 pxor 128+112(%rsp), %xmm11
2211 pxor 256+64(%rsp), %xmm12
2212 pxor 256+80(%rsp), %xmm13
2213 pxor 256+96(%rsp), %xmm14
2214 pxor 256+112(%rsp), %xmm15
2215 movdqa %xmm0, 64(%rsp)
2216 movdqa %xmm1, 80(%rsp)
2217 movdqa %xmm2, 96(%rsp)
2218 movdqa %xmm3, 112(%rsp)
2219 movdqa %xmm8, 128+64(%rsp)
2220 movdqa %xmm9, 128+80(%rsp)
2221 movdqa %xmm10, 128+96(%rsp)
2222 movdqa %xmm11, 128+112(%rsp)
2223 movdqa %xmm12, 256+64(%rsp)
2224 movdqa %xmm13, 256+80(%rsp)
2225 movdqa %xmm14, 256+96(%rsp)
2226 movdqa %xmm15, 256+112(%rsp)
2227 salsa8_core_3way_xmm
2228 paddd 64(%rsp), %xmm0
2229 paddd 80(%rsp), %xmm1
2230 paddd 96(%rsp), %xmm2
2231 paddd 112(%rsp), %xmm3
2232 paddd 128+64(%rsp), %xmm8
2233 paddd 128+80(%rsp), %xmm9
2234 paddd 128+96(%rsp), %xmm10
2235 paddd 128+112(%rsp), %xmm11
2236 paddd 256+64(%rsp), %xmm12
2237 paddd 256+80(%rsp), %xmm13
2238 paddd 256+96(%rsp), %xmm14
2239 paddd 256+112(%rsp), %xmm15
2240 movdqa %xmm0, 64(%rsp)
2241 movdqa %xmm1, 80(%rsp)
2242 movdqa %xmm2, 96(%rsp)
2243 movdqa %xmm3, 112(%rsp)
2244 movdqa %xmm8, 128+64(%rsp)
2245 movdqa %xmm9, 128+80(%rsp)
2246 movdqa %xmm10, 128+96(%rsp)
2247 movdqa %xmm11, 128+112(%rsp)
2248 movdqa %xmm12, 256+64(%rsp)
2249 movdqa %xmm13, 256+80(%rsp)
2250 movdqa %xmm14, 256+96(%rsp)
2251 movdqa %xmm15, 256+112(%rsp)
2254 ja scrypt_core_3way_xmm_loop2
2256 scrypt_shuffle %rsp, 0, %rdi, 0
2257 scrypt_shuffle %rsp, 64, %rdi, 64
2258 scrypt_shuffle %rsp, 128, %rdi, 128
2259 scrypt_shuffle %rsp, 192, %rdi, 192
2260 scrypt_shuffle %rsp, 256, %rdi, 256
2261 scrypt_shuffle %rsp, 320, %rdi, 320
2263 scrypt_core_3way_cleanup
2267 #if defined(USE_AVX2)
2269 .macro salsa8_core_6way_avx2_doubleround
2270 vpaddd %ymm0, %ymm1, %ymm4
2271 vpaddd %ymm8, %ymm9, %ymm6
2272 vpaddd %ymm12, %ymm13, %ymm7
2273 vpslld $7, %ymm4, %ymm5
2274 vpsrld $25, %ymm4, %ymm4
2275 vpxor %ymm5, %ymm3, %ymm3
2276 vpxor %ymm4, %ymm3, %ymm3
2277 vpslld $7, %ymm6, %ymm5
2278 vpsrld $25, %ymm6, %ymm6
2279 vpxor %ymm5, %ymm11, %ymm11
2280 vpxor %ymm6, %ymm11, %ymm11
2281 vpslld $7, %ymm7, %ymm5
2282 vpsrld $25, %ymm7, %ymm7
2283 vpxor %ymm5, %ymm15, %ymm15
2284 vpxor %ymm7, %ymm15, %ymm15
2286 vpaddd %ymm3, %ymm0, %ymm4
2287 vpaddd %ymm11, %ymm8, %ymm6
2288 vpaddd %ymm15, %ymm12, %ymm7
2289 vpslld $9, %ymm4, %ymm5
2290 vpsrld $23, %ymm4, %ymm4
2291 vpxor %ymm5, %ymm2, %ymm2
2292 vpxor %ymm4, %ymm2, %ymm2
2293 vpslld $9, %ymm6, %ymm5
2294 vpsrld $23, %ymm6, %ymm6
2295 vpxor %ymm5, %ymm10, %ymm10
2296 vpxor %ymm6, %ymm10, %ymm10
2297 vpslld $9, %ymm7, %ymm5
2298 vpsrld $23, %ymm7, %ymm7
2299 vpxor %ymm5, %ymm14, %ymm14
2300 vpxor %ymm7, %ymm14, %ymm14
2302 vpaddd %ymm2, %ymm3, %ymm4
2303 vpaddd %ymm10, %ymm11, %ymm6
2304 vpaddd %ymm14, %ymm15, %ymm7
2305 vpslld $13, %ymm4, %ymm5
2306 vpsrld $19, %ymm4, %ymm4
2307 vpshufd $0x93, %ymm3, %ymm3
2308 vpshufd $0x93, %ymm11, %ymm11
2309 vpshufd $0x93, %ymm15, %ymm15
2310 vpxor %ymm5, %ymm1, %ymm1
2311 vpxor %ymm4, %ymm1, %ymm1
2312 vpslld $13, %ymm6, %ymm5
2313 vpsrld $19, %ymm6, %ymm6
2314 vpxor %ymm5, %ymm9, %ymm9
2315 vpxor %ymm6, %ymm9, %ymm9
2316 vpslld $13, %ymm7, %ymm5
2317 vpsrld $19, %ymm7, %ymm7
2318 vpxor %ymm5, %ymm13, %ymm13
2319 vpxor %ymm7, %ymm13, %ymm13
2321 vpaddd %ymm1, %ymm2, %ymm4
2322 vpaddd %ymm9, %ymm10, %ymm6
2323 vpaddd %ymm13, %ymm14, %ymm7
2324 vpslld $18, %ymm4, %ymm5
2325 vpsrld $14, %ymm4, %ymm4
2326 vpshufd $0x4e, %ymm2, %ymm2
2327 vpshufd $0x4e, %ymm10, %ymm10
2328 vpshufd $0x4e, %ymm14, %ymm14
2329 vpxor %ymm5, %ymm0, %ymm0
2330 vpxor %ymm4, %ymm0, %ymm0
2331 vpslld $18, %ymm6, %ymm5
2332 vpsrld $14, %ymm6, %ymm6
2333 vpxor %ymm5, %ymm8, %ymm8
2334 vpxor %ymm6, %ymm8, %ymm8
2335 vpslld $18, %ymm7, %ymm5
2336 vpsrld $14, %ymm7, %ymm7
2337 vpxor %ymm5, %ymm12, %ymm12
2338 vpxor %ymm7, %ymm12, %ymm12
2340 vpaddd %ymm0, %ymm3, %ymm4
2341 vpaddd %ymm8, %ymm11, %ymm6
2342 vpaddd %ymm12, %ymm15, %ymm7
2343 vpslld $7, %ymm4, %ymm5
2344 vpsrld $25, %ymm4, %ymm4
2345 vpshufd $0x39, %ymm1, %ymm1
2346 vpxor %ymm5, %ymm1, %ymm1
2347 vpxor %ymm4, %ymm1, %ymm1
2348 vpslld $7, %ymm6, %ymm5
2349 vpsrld $25, %ymm6, %ymm6
2350 vpshufd $0x39, %ymm9, %ymm9
2351 vpxor %ymm5, %ymm9, %ymm9
2352 vpxor %ymm6, %ymm9, %ymm9
2353 vpslld $7, %ymm7, %ymm5
2354 vpsrld $25, %ymm7, %ymm7
2355 vpshufd $0x39, %ymm13, %ymm13
2356 vpxor %ymm5, %ymm13, %ymm13
2357 vpxor %ymm7, %ymm13, %ymm13
2359 vpaddd %ymm1, %ymm0, %ymm4
2360 vpaddd %ymm9, %ymm8, %ymm6
2361 vpaddd %ymm13, %ymm12, %ymm7
2362 vpslld $9, %ymm4, %ymm5
2363 vpsrld $23, %ymm4, %ymm4
2364 vpxor %ymm5, %ymm2, %ymm2
2365 vpxor %ymm4, %ymm2, %ymm2
2366 vpslld $9, %ymm6, %ymm5
2367 vpsrld $23, %ymm6, %ymm6
2368 vpxor %ymm5, %ymm10, %ymm10
2369 vpxor %ymm6, %ymm10, %ymm10
2370 vpslld $9, %ymm7, %ymm5
2371 vpsrld $23, %ymm7, %ymm7
2372 vpxor %ymm5, %ymm14, %ymm14
2373 vpxor %ymm7, %ymm14, %ymm14
2375 vpaddd %ymm2, %ymm1, %ymm4
2376 vpaddd %ymm10, %ymm9, %ymm6
2377 vpaddd %ymm14, %ymm13, %ymm7
2378 vpslld $13, %ymm4, %ymm5
2379 vpsrld $19, %ymm4, %ymm4
2380 vpshufd $0x93, %ymm1, %ymm1
2381 vpshufd $0x93, %ymm9, %ymm9
2382 vpshufd $0x93, %ymm13, %ymm13
2383 vpxor %ymm5, %ymm3, %ymm3
2384 vpxor %ymm4, %ymm3, %ymm3
2385 vpslld $13, %ymm6, %ymm5
2386 vpsrld $19, %ymm6, %ymm6
2387 vpxor %ymm5, %ymm11, %ymm11
2388 vpxor %ymm6, %ymm11, %ymm11
2389 vpslld $13, %ymm7, %ymm5
2390 vpsrld $19, %ymm7, %ymm7
2391 vpxor %ymm5, %ymm15, %ymm15
2392 vpxor %ymm7, %ymm15, %ymm15
2394 vpaddd %ymm3, %ymm2, %ymm4
2395 vpaddd %ymm11, %ymm10, %ymm6
2396 vpaddd %ymm15, %ymm14, %ymm7
2397 vpslld $18, %ymm4, %ymm5
2398 vpsrld $14, %ymm4, %ymm4
2399 vpshufd $0x4e, %ymm2, %ymm2
2400 vpshufd $0x4e, %ymm10, %ymm10
2401 vpxor %ymm5, %ymm0, %ymm0
2402 vpxor %ymm4, %ymm0, %ymm0
2403 vpslld $18, %ymm6, %ymm5
2404 vpsrld $14, %ymm6, %ymm6
2405 vpshufd $0x4e, %ymm14, %ymm14
2406 vpshufd $0x39, %ymm11, %ymm11
2407 vpxor %ymm5, %ymm8, %ymm8
2408 vpxor %ymm6, %ymm8, %ymm8
2409 vpslld $18, %ymm7, %ymm5
2410 vpsrld $14, %ymm7, %ymm7
2411 vpshufd $0x39, %ymm3, %ymm3
2412 vpshufd $0x39, %ymm15, %ymm15
2413 vpxor %ymm5, %ymm12, %ymm12
2414 vpxor %ymm7, %ymm12, %ymm12
2417 .macro salsa8_core_6way_avx2
2418 salsa8_core_6way_avx2_doubleround
2419 salsa8_core_6way_avx2_doubleround
2420 salsa8_core_6way_avx2_doubleround
2421 salsa8_core_6way_avx2_doubleround
2426 .globl scrypt_core_6way
2427 .globl _scrypt_core_6way
2432 #if defined(_WIN64) || defined(__CYGWIN__)
2434 vmovdqa %xmm6, 8(%rsp)
2435 vmovdqa %xmm7, 24(%rsp)
2436 vmovdqa %xmm8, 40(%rsp)
2437 vmovdqa %xmm9, 56(%rsp)
2438 vmovdqa %xmm10, 72(%rsp)
2439 vmovdqa %xmm11, 88(%rsp)
2440 vmovdqa %xmm12, 104(%rsp)
2441 vmovdqa %xmm13, 120(%rsp)
2442 vmovdqa %xmm14, 136(%rsp)
2443 vmovdqa %xmm15, 152(%rsp)
2453 .macro scrypt_core_6way_cleanup
2455 #if defined(_WIN64) || defined(__CYGWIN__)
2458 vmovdqa 8(%rsp), %xmm6
2459 vmovdqa 24(%rsp), %xmm7
2460 vmovdqa 40(%rsp), %xmm8
2461 vmovdqa 56(%rsp), %xmm9
2462 vmovdqa 72(%rsp), %xmm10
2463 vmovdqa 88(%rsp), %xmm11
2464 vmovdqa 104(%rsp), %xmm12
2465 vmovdqa 120(%rsp), %xmm13
2466 vmovdqa 136(%rsp), %xmm14
2467 vmovdqa 152(%rsp), %xmm15
2474 .macro scrypt_shuffle_pack2 src, so, dest, do
2475 vmovdqa \so+0*16(\src), %xmm0
2476 vmovdqa \so+1*16(\src), %xmm1
2477 vmovdqa \so+2*16(\src), %xmm2
2478 vmovdqa \so+3*16(\src), %xmm3
2479 vinserti128 $1, \so+128+0*16(\src), %ymm0, %ymm0
2480 vinserti128 $1, \so+128+1*16(\src), %ymm1, %ymm1
2481 vinserti128 $1, \so+128+2*16(\src), %ymm2, %ymm2
2482 vinserti128 $1, \so+128+3*16(\src), %ymm3, %ymm3
2483 vpblendd $0x33, %ymm0, %ymm2, %ymm4
2484 vpblendd $0xcc, %ymm1, %ymm3, %ymm5
2485 vpblendd $0x33, %ymm2, %ymm0, %ymm6
2486 vpblendd $0xcc, %ymm3, %ymm1, %ymm7
2487 vpblendd $0x55, %ymm7, %ymm6, %ymm3
2488 vpblendd $0x55, %ymm6, %ymm5, %ymm2
2489 vpblendd $0x55, %ymm5, %ymm4, %ymm1
2490 vpblendd $0x55, %ymm4, %ymm7, %ymm0
2491 vmovdqa %ymm0, \do+0*32(\dest)
2492 vmovdqa %ymm1, \do+1*32(\dest)
2493 vmovdqa %ymm2, \do+2*32(\dest)
2494 vmovdqa %ymm3, \do+3*32(\dest)
2497 .macro scrypt_shuffle_unpack2 src, so, dest, do
2498 vmovdqa \so+0*32(\src), %ymm0
2499 vmovdqa \so+1*32(\src), %ymm1
2500 vmovdqa \so+2*32(\src), %ymm2
2501 vmovdqa \so+3*32(\src), %ymm3
2502 vpblendd $0x33, %ymm0, %ymm2, %ymm4
2503 vpblendd $0xcc, %ymm1, %ymm3, %ymm5
2504 vpblendd $0x33, %ymm2, %ymm0, %ymm6
2505 vpblendd $0xcc, %ymm3, %ymm1, %ymm7
2506 vpblendd $0x55, %ymm7, %ymm6, %ymm3
2507 vpblendd $0x55, %ymm6, %ymm5, %ymm2
2508 vpblendd $0x55, %ymm5, %ymm4, %ymm1
2509 vpblendd $0x55, %ymm4, %ymm7, %ymm0
2510 vmovdqa %xmm0, \do+0*16(\dest)
2511 vmovdqa %xmm1, \do+1*16(\dest)
2512 vmovdqa %xmm2, \do+2*16(\dest)
2513 vmovdqa %xmm3, \do+3*16(\dest)
2514 vextracti128 $1, %ymm0, \do+128+0*16(\dest)
2515 vextracti128 $1, %ymm1, \do+128+1*16(\dest)
2516 vextracti128 $1, %ymm2, \do+128+2*16(\dest)
2517 vextracti128 $1, %ymm3, \do+128+3*16(\dest)
2520 scrypt_core_6way_avx2:
2521 scrypt_shuffle_pack2 %rdi, 0*256+0, %rsp, 0*128
2522 scrypt_shuffle_pack2 %rdi, 0*256+64, %rsp, 1*128
2523 scrypt_shuffle_pack2 %rdi, 1*256+0, %rsp, 2*128
2524 scrypt_shuffle_pack2 %rdi, 1*256+64, %rsp, 3*128
2525 scrypt_shuffle_pack2 %rdi, 2*256+0, %rsp, 4*128
2526 scrypt_shuffle_pack2 %rdi, 2*256+64, %rsp, 5*128
2528 vmovdqa 0*256+4*32(%rsp), %ymm0
2529 vmovdqa 0*256+5*32(%rsp), %ymm1
2530 vmovdqa 0*256+6*32(%rsp), %ymm2
2531 vmovdqa 0*256+7*32(%rsp), %ymm3
2532 vmovdqa 1*256+4*32(%rsp), %ymm8
2533 vmovdqa 1*256+5*32(%rsp), %ymm9
2534 vmovdqa 1*256+6*32(%rsp), %ymm10
2535 vmovdqa 1*256+7*32(%rsp), %ymm11
2536 vmovdqa 2*256+4*32(%rsp), %ymm12
2537 vmovdqa 2*256+5*32(%rsp), %ymm13
2538 vmovdqa 2*256+6*32(%rsp), %ymm14
2539 vmovdqa 2*256+7*32(%rsp), %ymm15
2542 leaq 6*131072(%rsi), %rax
2543 scrypt_core_6way_avx2_loop1:
2544 vmovdqa %ymm0, 0*256+4*32(%rbx)
2545 vmovdqa %ymm1, 0*256+5*32(%rbx)
2546 vmovdqa %ymm2, 0*256+6*32(%rbx)
2547 vmovdqa %ymm3, 0*256+7*32(%rbx)
2548 vpxor 0*256+0*32(%rsp), %ymm0, %ymm0
2549 vpxor 0*256+1*32(%rsp), %ymm1, %ymm1
2550 vpxor 0*256+2*32(%rsp), %ymm2, %ymm2
2551 vpxor 0*256+3*32(%rsp), %ymm3, %ymm3
2552 vmovdqa %ymm8, 1*256+4*32(%rbx)
2553 vmovdqa %ymm9, 1*256+5*32(%rbx)
2554 vmovdqa %ymm10, 1*256+6*32(%rbx)
2555 vmovdqa %ymm11, 1*256+7*32(%rbx)
2556 vpxor 1*256+0*32(%rsp), %ymm8, %ymm8
2557 vpxor 1*256+1*32(%rsp), %ymm9, %ymm9
2558 vpxor 1*256+2*32(%rsp), %ymm10, %ymm10
2559 vpxor 1*256+3*32(%rsp), %ymm11, %ymm11
2560 vmovdqa %ymm12, 2*256+4*32(%rbx)
2561 vmovdqa %ymm13, 2*256+5*32(%rbx)
2562 vmovdqa %ymm14, 2*256+6*32(%rbx)
2563 vmovdqa %ymm15, 2*256+7*32(%rbx)
2564 vpxor 2*256+0*32(%rsp), %ymm12, %ymm12
2565 vpxor 2*256+1*32(%rsp), %ymm13, %ymm13
2566 vpxor 2*256+2*32(%rsp), %ymm14, %ymm14
2567 vpxor 2*256+3*32(%rsp), %ymm15, %ymm15
2568 vmovdqa %ymm0, 0*256+0*32(%rbx)
2569 vmovdqa %ymm1, 0*256+1*32(%rbx)
2570 vmovdqa %ymm2, 0*256+2*32(%rbx)
2571 vmovdqa %ymm3, 0*256+3*32(%rbx)
2572 vmovdqa %ymm8, 1*256+0*32(%rbx)
2573 vmovdqa %ymm9, 1*256+1*32(%rbx)
2574 vmovdqa %ymm10, 1*256+2*32(%rbx)
2575 vmovdqa %ymm11, 1*256+3*32(%rbx)
2576 vmovdqa %ymm12, 2*256+0*32(%rbx)
2577 vmovdqa %ymm13, 2*256+1*32(%rbx)
2578 vmovdqa %ymm14, 2*256+2*32(%rbx)
2579 vmovdqa %ymm15, 2*256+3*32(%rbx)
2581 salsa8_core_6way_avx2
2582 vpaddd 0*256+0*32(%rbx), %ymm0, %ymm0
2583 vpaddd 0*256+1*32(%rbx), %ymm1, %ymm1
2584 vpaddd 0*256+2*32(%rbx), %ymm2, %ymm2
2585 vpaddd 0*256+3*32(%rbx), %ymm3, %ymm3
2586 vpaddd 1*256+0*32(%rbx), %ymm8, %ymm8
2587 vpaddd 1*256+1*32(%rbx), %ymm9, %ymm9
2588 vpaddd 1*256+2*32(%rbx), %ymm10, %ymm10
2589 vpaddd 1*256+3*32(%rbx), %ymm11, %ymm11
2590 vpaddd 2*256+0*32(%rbx), %ymm12, %ymm12
2591 vpaddd 2*256+1*32(%rbx), %ymm13, %ymm13
2592 vpaddd 2*256+2*32(%rbx), %ymm14, %ymm14
2593 vpaddd 2*256+3*32(%rbx), %ymm15, %ymm15
2594 vmovdqa %ymm0, 0*256+0*32(%rsp)
2595 vmovdqa %ymm1, 0*256+1*32(%rsp)
2596 vmovdqa %ymm2, 0*256+2*32(%rsp)
2597 vmovdqa %ymm3, 0*256+3*32(%rsp)
2598 vmovdqa %ymm8, 1*256+0*32(%rsp)
2599 vmovdqa %ymm9, 1*256+1*32(%rsp)
2600 vmovdqa %ymm10, 1*256+2*32(%rsp)
2601 vmovdqa %ymm11, 1*256+3*32(%rsp)
2602 vmovdqa %ymm12, 2*256+0*32(%rsp)
2603 vmovdqa %ymm13, 2*256+1*32(%rsp)
2604 vmovdqa %ymm14, 2*256+2*32(%rsp)
2605 vmovdqa %ymm15, 2*256+3*32(%rsp)
2607 vpxor 0*256+4*32(%rbx), %ymm0, %ymm0
2608 vpxor 0*256+5*32(%rbx), %ymm1, %ymm1
2609 vpxor 0*256+6*32(%rbx), %ymm2, %ymm2
2610 vpxor 0*256+7*32(%rbx), %ymm3, %ymm3
2611 vpxor 1*256+4*32(%rbx), %ymm8, %ymm8
2612 vpxor 1*256+5*32(%rbx), %ymm9, %ymm9
2613 vpxor 1*256+6*32(%rbx), %ymm10, %ymm10
2614 vpxor 1*256+7*32(%rbx), %ymm11, %ymm11
2615 vpxor 2*256+4*32(%rbx), %ymm12, %ymm12
2616 vpxor 2*256+5*32(%rbx), %ymm13, %ymm13
2617 vpxor 2*256+6*32(%rbx), %ymm14, %ymm14
2618 vpxor 2*256+7*32(%rbx), %ymm15, %ymm15
2619 vmovdqa %ymm0, 0*256+4*32(%rsp)
2620 vmovdqa %ymm1, 0*256+5*32(%rsp)
2621 vmovdqa %ymm2, 0*256+6*32(%rsp)
2622 vmovdqa %ymm3, 0*256+7*32(%rsp)
2623 vmovdqa %ymm8, 1*256+4*32(%rsp)
2624 vmovdqa %ymm9, 1*256+5*32(%rsp)
2625 vmovdqa %ymm10, 1*256+6*32(%rsp)
2626 vmovdqa %ymm11, 1*256+7*32(%rsp)
2627 vmovdqa %ymm12, 2*256+4*32(%rsp)
2628 vmovdqa %ymm13, 2*256+5*32(%rsp)
2629 vmovdqa %ymm14, 2*256+6*32(%rsp)
2630 vmovdqa %ymm15, 2*256+7*32(%rsp)
2631 salsa8_core_6way_avx2
2632 vpaddd 0*256+4*32(%rsp), %ymm0, %ymm0
2633 vpaddd 0*256+5*32(%rsp), %ymm1, %ymm1
2634 vpaddd 0*256+6*32(%rsp), %ymm2, %ymm2
2635 vpaddd 0*256+7*32(%rsp), %ymm3, %ymm3
2636 vpaddd 1*256+4*32(%rsp), %ymm8, %ymm8
2637 vpaddd 1*256+5*32(%rsp), %ymm9, %ymm9
2638 vpaddd 1*256+6*32(%rsp), %ymm10, %ymm10
2639 vpaddd 1*256+7*32(%rsp), %ymm11, %ymm11
2640 vpaddd 2*256+4*32(%rsp), %ymm12, %ymm12
2641 vpaddd 2*256+5*32(%rsp), %ymm13, %ymm13
2642 vpaddd 2*256+6*32(%rsp), %ymm14, %ymm14
2643 vpaddd 2*256+7*32(%rsp), %ymm15, %ymm15
2647 jne scrypt_core_6way_avx2_loop1
2649 vmovdqa %ymm0, 0*256+4*32(%rsp)
2650 vmovdqa %ymm1, 0*256+5*32(%rsp)
2651 vmovdqa %ymm2, 0*256+6*32(%rsp)
2652 vmovdqa %ymm3, 0*256+7*32(%rsp)
2653 vmovdqa %ymm8, 1*256+4*32(%rsp)
2654 vmovdqa %ymm9, 1*256+5*32(%rsp)
2655 vmovdqa %ymm10, 1*256+6*32(%rsp)
2656 vmovdqa %ymm11, 1*256+7*32(%rsp)
2657 vmovdqa %ymm12, 2*256+4*32(%rsp)
2658 vmovdqa %ymm13, 2*256+5*32(%rsp)
2659 vmovdqa %ymm14, 2*256+6*32(%rsp)
2660 vmovdqa %ymm15, 2*256+7*32(%rsp)
2663 scrypt_core_6way_avx2_loop2:
2667 vextracti128 $1, %ymm0, %xmm4
2668 vextracti128 $1, %ymm8, %xmm5
2669 vextracti128 $1, %ymm12, %xmm6
2673 vpxor 0*256+0*32(%rsp), %ymm0, %ymm0
2674 vpxor 0*256+1*32(%rsp), %ymm1, %ymm1
2675 vpxor 0*256+2*32(%rsp), %ymm2, %ymm2
2676 vpxor 0*256+3*32(%rsp), %ymm3, %ymm3
2677 vpxor 1*256+0*32(%rsp), %ymm8, %ymm8
2678 vpxor 1*256+1*32(%rsp), %ymm9, %ymm9
2679 vpxor 1*256+2*32(%rsp), %ymm10, %ymm10
2680 vpxor 1*256+3*32(%rsp), %ymm11, %ymm11
2681 vpxor 2*256+0*32(%rsp), %ymm12, %ymm12
2682 vpxor 2*256+1*32(%rsp), %ymm13, %ymm13
2683 vpxor 2*256+2*32(%rsp), %ymm14, %ymm14
2684 vpxor 2*256+3*32(%rsp), %ymm15, %ymm15
2686 leaq 0(%rbp, %rbp, 2), %rbp
2689 leaq 1(%rbx, %rbx, 2), %rbx
2692 leaq 2(%rax, %rax, 2), %rax
2695 leaq 0(%r8, %r8, 2), %r8
2698 leaq 1(%r9, %r9, 2), %r9
2701 leaq 2(%r10, %r10, 2), %r10
2703 vmovdqa 0*32(%rsi, %rbp), %xmm4
2704 vinserti128 $1, 0*32+16(%rsi, %r8), %ymm4, %ymm4
2705 vmovdqa 1*32(%rsi, %rbp), %xmm5
2706 vinserti128 $1, 1*32+16(%rsi, %r8), %ymm5, %ymm5
2707 vmovdqa 2*32(%rsi, %rbp), %xmm6
2708 vinserti128 $1, 2*32+16(%rsi, %r8), %ymm6, %ymm6
2709 vmovdqa 3*32(%rsi, %rbp), %xmm7
2710 vinserti128 $1, 3*32+16(%rsi, %r8), %ymm7, %ymm7
2711 vpxor %ymm4, %ymm0, %ymm0
2712 vpxor %ymm5, %ymm1, %ymm1
2713 vpxor %ymm6, %ymm2, %ymm2
2714 vpxor %ymm7, %ymm3, %ymm3
2715 vmovdqa 0*32(%rsi, %rbx), %xmm4
2716 vinserti128 $1, 0*32+16(%rsi, %r9), %ymm4, %ymm4
2717 vmovdqa 1*32(%rsi, %rbx), %xmm5
2718 vinserti128 $1, 1*32+16(%rsi, %r9), %ymm5, %ymm5
2719 vmovdqa 2*32(%rsi, %rbx), %xmm6
2720 vinserti128 $1, 2*32+16(%rsi, %r9), %ymm6, %ymm6
2721 vmovdqa 3*32(%rsi, %rbx), %xmm7
2722 vinserti128 $1, 3*32+16(%rsi, %r9), %ymm7, %ymm7
2723 vpxor %ymm4, %ymm8, %ymm8
2724 vpxor %ymm5, %ymm9, %ymm9
2725 vpxor %ymm6, %ymm10, %ymm10
2726 vpxor %ymm7, %ymm11, %ymm11
2727 vmovdqa 0*32(%rsi, %rax), %xmm4
2728 vinserti128 $1, 0*32+16(%rsi, %r10), %ymm4, %ymm4
2729 vmovdqa 1*32(%rsi, %rax), %xmm5
2730 vinserti128 $1, 1*32+16(%rsi, %r10), %ymm5, %ymm5
2731 vmovdqa 2*32(%rsi, %rax), %xmm6
2732 vinserti128 $1, 2*32+16(%rsi, %r10), %ymm6, %ymm6
2733 vmovdqa 3*32(%rsi, %rax), %xmm7
2734 vinserti128 $1, 3*32+16(%rsi, %r10), %ymm7, %ymm7
2735 vpxor %ymm4, %ymm12, %ymm12
2736 vpxor %ymm5, %ymm13, %ymm13
2737 vpxor %ymm6, %ymm14, %ymm14
2738 vpxor %ymm7, %ymm15, %ymm15
2740 vmovdqa %ymm0, 0*256+0*32(%rsp)
2741 vmovdqa %ymm1, 0*256+1*32(%rsp)
2742 vmovdqa %ymm2, 0*256+2*32(%rsp)
2743 vmovdqa %ymm3, 0*256+3*32(%rsp)
2744 vmovdqa %ymm8, 1*256+0*32(%rsp)
2745 vmovdqa %ymm9, 1*256+1*32(%rsp)
2746 vmovdqa %ymm10, 1*256+2*32(%rsp)
2747 vmovdqa %ymm11, 1*256+3*32(%rsp)
2748 vmovdqa %ymm12, 2*256+0*32(%rsp)
2749 vmovdqa %ymm13, 2*256+1*32(%rsp)
2750 vmovdqa %ymm14, 2*256+2*32(%rsp)
2751 vmovdqa %ymm15, 2*256+3*32(%rsp)
2752 salsa8_core_6way_avx2
2753 vpaddd 0*256+0*32(%rsp), %ymm0, %ymm0
2754 vpaddd 0*256+1*32(%rsp), %ymm1, %ymm1
2755 vpaddd 0*256+2*32(%rsp), %ymm2, %ymm2
2756 vpaddd 0*256+3*32(%rsp), %ymm3, %ymm3
2757 vpaddd 1*256+0*32(%rsp), %ymm8, %ymm8
2758 vpaddd 1*256+1*32(%rsp), %ymm9, %ymm9
2759 vpaddd 1*256+2*32(%rsp), %ymm10, %ymm10
2760 vpaddd 1*256+3*32(%rsp), %ymm11, %ymm11
2761 vpaddd 2*256+0*32(%rsp), %ymm12, %ymm12
2762 vpaddd 2*256+1*32(%rsp), %ymm13, %ymm13
2763 vpaddd 2*256+2*32(%rsp), %ymm14, %ymm14
2764 vpaddd 2*256+3*32(%rsp), %ymm15, %ymm15
2765 vmovdqa %ymm0, 0*256+0*32(%rsp)
2766 vmovdqa %ymm1, 0*256+1*32(%rsp)
2767 vmovdqa %ymm2, 0*256+2*32(%rsp)
2768 vmovdqa %ymm3, 0*256+3*32(%rsp)
2769 vmovdqa %ymm8, 1*256+0*32(%rsp)
2770 vmovdqa %ymm9, 1*256+1*32(%rsp)
2771 vmovdqa %ymm10, 1*256+2*32(%rsp)
2772 vmovdqa %ymm11, 1*256+3*32(%rsp)
2773 vmovdqa %ymm12, 2*256+0*32(%rsp)
2774 vmovdqa %ymm13, 2*256+1*32(%rsp)
2775 vmovdqa %ymm14, 2*256+2*32(%rsp)
2776 vmovdqa %ymm15, 2*256+3*32(%rsp)
2778 vmovdqa 4*32(%rsi, %rbp), %xmm4
2779 vinserti128 $1, 4*32+16(%rsi, %r8), %ymm4, %ymm4
2780 vmovdqa 5*32(%rsi, %rbp), %xmm5
2781 vinserti128 $1, 5*32+16(%rsi, %r8), %ymm5, %ymm5
2782 vmovdqa 6*32(%rsi, %rbp), %xmm6
2783 vinserti128 $1, 6*32+16(%rsi, %r8), %ymm6, %ymm6
2784 vmovdqa 7*32(%rsi, %rbp), %xmm7
2785 vinserti128 $1, 7*32+16(%rsi, %r8), %ymm7, %ymm7
2786 vpxor %ymm4, %ymm0, %ymm0
2787 vpxor %ymm5, %ymm1, %ymm1
2788 vpxor %ymm6, %ymm2, %ymm2
2789 vpxor %ymm7, %ymm3, %ymm3
2790 vmovdqa 4*32(%rsi, %rbx), %xmm4
2791 vinserti128 $1, 4*32+16(%rsi, %r9), %ymm4, %ymm4
2792 vmovdqa 5*32(%rsi, %rbx), %xmm5
2793 vinserti128 $1, 5*32+16(%rsi, %r9), %ymm5, %ymm5
2794 vmovdqa 6*32(%rsi, %rbx), %xmm6
2795 vinserti128 $1, 6*32+16(%rsi, %r9), %ymm6, %ymm6
2796 vmovdqa 7*32(%rsi, %rbx), %xmm7
2797 vinserti128 $1, 7*32+16(%rsi, %r9), %ymm7, %ymm7
2798 vpxor %ymm4, %ymm8, %ymm8
2799 vpxor %ymm5, %ymm9, %ymm9
2800 vpxor %ymm6, %ymm10, %ymm10
2801 vpxor %ymm7, %ymm11, %ymm11
2802 vmovdqa 4*32(%rsi, %rax), %xmm4
2803 vinserti128 $1, 4*32+16(%rsi, %r10), %ymm4, %ymm4
2804 vmovdqa 5*32(%rsi, %rax), %xmm5
2805 vinserti128 $1, 5*32+16(%rsi, %r10), %ymm5, %ymm5
2806 vmovdqa 6*32(%rsi, %rax), %xmm6
2807 vinserti128 $1, 6*32+16(%rsi, %r10), %ymm6, %ymm6
2808 vmovdqa 7*32(%rsi, %rax), %xmm7
2809 vinserti128 $1, 7*32+16(%rsi, %r10), %ymm7, %ymm7
2810 vpxor %ymm4, %ymm12, %ymm12
2811 vpxor %ymm5, %ymm13, %ymm13
2812 vpxor %ymm6, %ymm14, %ymm14
2813 vpxor %ymm7, %ymm15, %ymm15
2814 vpxor 0*256+4*32(%rsp), %ymm0, %ymm0
2815 vpxor 0*256+5*32(%rsp), %ymm1, %ymm1
2816 vpxor 0*256+6*32(%rsp), %ymm2, %ymm2
2817 vpxor 0*256+7*32(%rsp), %ymm3, %ymm3
2818 vpxor 1*256+4*32(%rsp), %ymm8, %ymm8
2819 vpxor 1*256+5*32(%rsp), %ymm9, %ymm9
2820 vpxor 1*256+6*32(%rsp), %ymm10, %ymm10
2821 vpxor 1*256+7*32(%rsp), %ymm11, %ymm11
2822 vpxor 2*256+4*32(%rsp), %ymm12, %ymm12
2823 vpxor 2*256+5*32(%rsp), %ymm13, %ymm13
2824 vpxor 2*256+6*32(%rsp), %ymm14, %ymm14
2825 vpxor 2*256+7*32(%rsp), %ymm15, %ymm15
2826 vmovdqa %ymm0, 0*256+4*32(%rsp)
2827 vmovdqa %ymm1, 0*256+5*32(%rsp)
2828 vmovdqa %ymm2, 0*256+6*32(%rsp)
2829 vmovdqa %ymm3, 0*256+7*32(%rsp)
2830 vmovdqa %ymm8, 1*256+4*32(%rsp)
2831 vmovdqa %ymm9, 1*256+5*32(%rsp)
2832 vmovdqa %ymm10, 1*256+6*32(%rsp)
2833 vmovdqa %ymm11, 1*256+7*32(%rsp)
2834 vmovdqa %ymm12, 2*256+4*32(%rsp)
2835 vmovdqa %ymm13, 2*256+5*32(%rsp)
2836 vmovdqa %ymm14, 2*256+6*32(%rsp)
2837 vmovdqa %ymm15, 2*256+7*32(%rsp)
2838 salsa8_core_6way_avx2
2839 vpaddd 0*256+4*32(%rsp), %ymm0, %ymm0
2840 vpaddd 0*256+5*32(%rsp), %ymm1, %ymm1
2841 vpaddd 0*256+6*32(%rsp), %ymm2, %ymm2
2842 vpaddd 0*256+7*32(%rsp), %ymm3, %ymm3
2843 vpaddd 1*256+4*32(%rsp), %ymm8, %ymm8
2844 vpaddd 1*256+5*32(%rsp), %ymm9, %ymm9
2845 vpaddd 1*256+6*32(%rsp), %ymm10, %ymm10
2846 vpaddd 1*256+7*32(%rsp), %ymm11, %ymm11
2847 vpaddd 2*256+4*32(%rsp), %ymm12, %ymm12
2848 vpaddd 2*256+5*32(%rsp), %ymm13, %ymm13
2849 vpaddd 2*256+6*32(%rsp), %ymm14, %ymm14
2850 vpaddd 2*256+7*32(%rsp), %ymm15, %ymm15
2851 vmovdqa %ymm0, 0*256+4*32(%rsp)
2852 vmovdqa %ymm1, 0*256+5*32(%rsp)
2853 vmovdqa %ymm2, 0*256+6*32(%rsp)
2854 vmovdqa %ymm3, 0*256+7*32(%rsp)
2855 vmovdqa %ymm8, 1*256+4*32(%rsp)
2856 vmovdqa %ymm9, 1*256+5*32(%rsp)
2857 vmovdqa %ymm10, 1*256+6*32(%rsp)
2858 vmovdqa %ymm11, 1*256+7*32(%rsp)
2859 vmovdqa %ymm12, 2*256+4*32(%rsp)
2860 vmovdqa %ymm13, 2*256+5*32(%rsp)
2861 vmovdqa %ymm14, 2*256+6*32(%rsp)
2862 vmovdqa %ymm15, 2*256+7*32(%rsp)
2865 ja scrypt_core_6way_avx2_loop2
2867 scrypt_shuffle_unpack2 %rsp, 0*128, %rdi, 0*256+0
2868 scrypt_shuffle_unpack2 %rsp, 1*128, %rdi, 0*256+64
2869 scrypt_shuffle_unpack2 %rsp, 2*128, %rdi, 1*256+0
2870 scrypt_shuffle_unpack2 %rsp, 3*128, %rdi, 1*256+64
2871 scrypt_shuffle_unpack2 %rsp, 4*128, %rdi, 2*256+0
2872 scrypt_shuffle_unpack2 %rsp, 5*128, %rdi, 2*256+64
2874 scrypt_core_6way_cleanup
2877 #endif /* USE_AVX2 */