]> Git Repo - cpuminer-multi.git/blob - scrypt-x64.S
Update README.md
[cpuminer-multi.git] / scrypt-x64.S
1 /*
2  * Copyright 2011-2013 [email protected]
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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.
13  *
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
24  * SUCH DAMAGE.
25  */
26
27 #include "cpuminer-config.h"
28
29 #if defined(__linux__) && defined(__ELF__)
30         .section .note.GNU-stack,"",%progbits
31 #endif
32
33 #if defined(__x86_64__)
34
35         .text
36         .p2align 6
37         .globl scrypt_best_throughput
38         .globl _scrypt_best_throughput
39 scrypt_best_throughput:
40 _scrypt_best_throughput:
41         pushq   %rbx
42 #if defined(USE_AVX2)
43         /* Check for AVX and OSXSAVE support */
44         movl    $1, %eax
45         cpuid
46         andl    $0x18000000, %ecx
47         cmpl    $0x18000000, %ecx
48         jne scrypt_best_throughput_no_avx2
49         /* Check for AVX2 support */
50         movl    $7, %eax
51         xorl    %ecx, %ecx
52         cpuid
53         andl    $0x00000020, %ebx
54         cmpl    $0x00000020, %ebx
55         jne scrypt_best_throughput_no_avx2
56         /* Check for XMM and YMM state support */
57         xorl    %ecx, %ecx
58         xgetbv
59         andl    $0x00000006, %eax
60         cmpl    $0x00000006, %eax
61         jne scrypt_best_throughput_no_avx2
62         movl    $6, %eax
63         jmp scrypt_best_throughput_exit
64 scrypt_best_throughput_no_avx2:
65 #endif
66         /* Check for AuthenticAMD */
67         xorq    %rax, %rax
68         cpuid
69         movl    $3, %eax
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 */
77         movl    $1, %eax
78         cpuid
79         andl    $0x0ff00000, %eax
80         jz scrypt_best_throughput_one
81         cmpl    $0x00500000, %eax
82         je scrypt_best_throughput_one
83         movl    $3, %eax
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 */
94         movl    $1, %eax
95         cpuid
96         movl    %eax, %edx
97         andl    $0x0ff00f00, %eax
98         cmpl    $0x00000600, %eax
99         movl    $3, %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:
109         movl    $1, %eax
110 scrypt_best_throughput_exit:
111         popq    %rbx
112         ret
113         
114         
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)
148 .endm
149
150
151 .macro salsa8_core_gen_doubleround
152         movq    72(%rsp), %r15
153         
154         leaq    (%r14, %rdx), %rbp
155         roll    $7, %ebp
156         xorl    %ebp, %r9d
157         leaq    (%rdi, %r15), %rbp
158         roll    $7, %ebp
159         xorl    %ebp, %r10d
160         leaq    (%rdx, %r9), %rbp
161         roll    $9, %ebp
162         xorl    %ebp, %r11d
163         leaq    (%r15, %r10), %rbp
164         roll    $9, %ebp
165         xorl    %ebp, %r13d
166         
167         leaq    (%r9, %r11), %rbp
168         roll    $13, %ebp
169         xorl    %ebp, %r14d
170         leaq    (%r10, %r13), %rbp
171         roll    $13, %ebp
172         xorl    %ebp, %edi
173         leaq    (%r11, %r14), %rbp
174         roll    $18, %ebp
175         xorl    %ebp, %edx
176         leaq    (%r13, %rdi), %rbp
177         roll    $18, %ebp
178         xorl    %ebp, %r15d
179         
180         movq    48(%rsp), %rbp
181         movq    %r15, 72(%rsp)
182         
183         leaq    (%rax, %rbp), %r15
184         roll    $7, %r15d
185         xorl    %r15d, %ebx
186         leaq    (%rbp, %rbx), %r15
187         roll    $9, %r15d
188         xorl    %r15d, %ecx
189         leaq    (%rbx, %rcx), %r15
190         roll    $13, %r15d
191         xorl    %r15d, %eax
192         leaq    (%rcx, %rax), %r15
193         roll    $18, %r15d
194         xorl    %r15d, %ebp
195         
196         movq    88(%rsp), %r15
197         movq    %rbp, 48(%rsp)
198         
199         leaq    (%r12, %r15), %rbp
200         roll    $7, %ebp
201         xorl    %ebp, %esi
202         leaq    (%r15, %rsi), %rbp
203         roll    $9, %ebp
204         xorl    %ebp, %r8d
205         leaq    (%rsi, %r8), %rbp
206         roll    $13, %ebp
207         xorl    %ebp, %r12d
208         leaq    (%r8, %r12), %rbp
209         roll    $18, %ebp
210         xorl    %ebp, %r15d
211         
212         movq    %r15, 88(%rsp)
213         movq    72(%rsp), %r15
214         
215         leaq    (%rsi, %rdx), %rbp
216         roll    $7, %ebp
217         xorl    %ebp, %edi
218         leaq    (%r9, %r15), %rbp
219         roll    $7, %ebp
220         xorl    %ebp, %eax
221         leaq    (%rdx, %rdi), %rbp
222         roll    $9, %ebp
223         xorl    %ebp, %ecx
224         leaq    (%r15, %rax), %rbp
225         roll    $9, %ebp
226         xorl    %ebp, %r8d
227         
228         leaq    (%rdi, %rcx), %rbp
229         roll    $13, %ebp
230         xorl    %ebp, %esi
231         leaq    (%rax, %r8), %rbp
232         roll    $13, %ebp
233         xorl    %ebp, %r9d
234         leaq    (%rcx, %rsi), %rbp
235         roll    $18, %ebp
236         xorl    %ebp, %edx
237         leaq    (%r8, %r9), %rbp
238         roll    $18, %ebp
239         xorl    %ebp, %r15d
240         
241         movq    48(%rsp), %rbp
242         movq    %r15, 72(%rsp)
243         
244         leaq    (%r10, %rbp), %r15
245         roll    $7, %r15d
246         xorl    %r15d, %r12d
247         leaq    (%rbp, %r12), %r15
248         roll    $9, %r15d
249         xorl    %r15d, %r11d
250         leaq    (%r12, %r11), %r15
251         roll    $13, %r15d
252         xorl    %r15d, %r10d
253         leaq    (%r11, %r10), %r15
254         roll    $18, %r15d
255         xorl    %r15d, %ebp
256         
257         movq    88(%rsp), %r15
258         movq    %rbp, 48(%rsp)
259         
260         leaq    (%rbx, %r15), %rbp
261         roll    $7, %ebp
262         xorl    %ebp, %r14d
263         leaq    (%r15, %r14), %rbp
264         roll    $9, %ebp
265         xorl    %ebp, %r13d
266         leaq    (%r14, %r13), %rbp
267         roll    $13, %ebp
268         xorl    %ebp, %ebx
269         leaq    (%r13, %rbx), %rbp
270         roll    $18, %ebp
271         xorl    %ebp, %r15d
272         
273         movq    %r15, 88(%rsp)
274 .endm
275
276         .text
277         .p2align 6
278 salsa8_core_gen:
279         /* 0: %rdx, %rdi, %rcx, %rsi */
280         movq    8(%rsp), %rdi
281         movq    %rdi, %rdx
282         shrq    $32, %rdi
283         movq    16(%rsp), %rsi
284         movq    %rsi, %rcx
285         shrq    $32, %rsi
286         /* 1: %r9, 72(%rsp), %rax, %r8 */
287         movq    24(%rsp), %r8
288         movq    %r8, %r9
289         shrq    $32, %r8
290         movq    %r8, 72(%rsp)
291         movq    32(%rsp), %r8
292         movq    %r8, %rax
293         shrq    $32, %r8
294         /* 2: %r11, %r10, 48(%rsp), %r12 */
295         movq    40(%rsp), %r10
296         movq    %r10, %r11
297         shrq    $32, %r10
298         movq    48(%rsp), %r12
299         /* movq %r12, %r13 */
300         /* movq %r13, 48(%rsp) */
301         shrq    $32, %r12
302         /* 3: %r14, %r13, %rbx, 88(%rsp) */
303         movq    56(%rsp), %r13
304         movq    %r13, %r14
305         shrq    $32, %r13
306         movq    64(%rsp), %r15
307         movq    %r15, %rbx
308         shrq    $32, %r15
309         movq    %r15, 88(%rsp)
310         
311         salsa8_core_gen_doubleround
312         salsa8_core_gen_doubleround
313         salsa8_core_gen_doubleround
314         salsa8_core_gen_doubleround
315         
316         shlq    $32, %rdi
317         xorq    %rdi, %rdx
318         movq    %rdx, 24(%rsp)
319         
320         shlq    $32, %rsi
321         xorq    %rsi, %rcx
322         movq    %rcx, 32(%rsp)
323         
324         movl    72(%rsp), %edi
325         shlq    $32, %rdi
326         xorq    %rdi, %r9
327         movq    %r9, 40(%rsp)
328         
329         movl    48(%rsp), %ebp
330         shlq    $32, %r8
331         xorq    %r8, %rax
332         movq    %rax, 48(%rsp)
333         
334         shlq    $32, %r10
335         xorq    %r10, %r11
336         movq    %r11, 56(%rsp)
337         
338         shlq    $32, %r12
339         xorq    %r12, %rbp
340         movq    %rbp, 64(%rsp)
341         
342         shlq    $32, %r13
343         xorq    %r13, %r14
344         movq    %r14, 72(%rsp)
345         
346         movdqa  24(%rsp), %xmm0
347         
348         shlq    $32, %r15
349         xorq    %r15, %rbx
350         movq    %rbx, 80(%rsp)
351         
352         movdqa  40(%rsp), %xmm1
353         movdqa  56(%rsp), %xmm2
354         movdqa  72(%rsp), %xmm3
355         
356         ret
357         
358         
359         .text
360         .p2align 6
361         .globl scrypt_core
362         .globl _scrypt_core
363 scrypt_core:
364 _scrypt_core:
365         pushq   %rbx
366         pushq   %rbp
367         pushq   %r12
368         pushq   %r13
369         pushq   %r14
370         pushq   %r15
371 #if defined(_WIN64) || defined(__CYGWIN__)
372         subq    $176, %rsp
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)
383         pushq   %rdi
384         pushq   %rsi
385         movq    %rcx, %rdi
386         movq    %rdx, %rsi
387 #endif
388
389 .macro scrypt_core_cleanup
390 #if defined(_WIN64) || defined(__CYGWIN__)
391         popq    %rsi
392         popq    %rdi
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
403         addq    $176, %rsp
404 #endif
405         popq    %r15
406         popq    %r14
407         popq    %r13
408         popq    %r12
409         popq    %rbp
410         popq    %rbx
411 .endm
412         
413         /* GenuineIntel processors have fast SIMD */
414         xorl    %eax, %eax
415         cpuid
416         cmpl    $0x6c65746e, %ecx
417         jne scrypt_core_gen
418         cmpl    $0x49656e69, %edx
419         jne scrypt_core_gen
420         cmpl    $0x756e6547, %ebx
421         je scrypt_core_xmm
422         
423         .p2align 6
424 scrypt_core_gen:
425         subq    $136, %rsp
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
434         
435         leaq    131072(%rsi), %rcx
436         movq    %rdi, 104(%rsp)
437         movq    %rsi, 112(%rsp)
438         movq    %rcx, 120(%rsp)
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)
448         
449         pxor    %xmm12, %xmm8
450         pxor    %xmm13, %xmm9
451         pxor    %xmm14, %xmm10
452         pxor    %xmm15, %xmm11
453         movdqa  %xmm8, 0(%rsp)
454         movdqa  %xmm9, 16(%rsp)
455         movdqa  %xmm10, 32(%rsp)
456         movdqa  %xmm11, 48(%rsp)
457         movq    %rsi, 128(%rsp)
458         call salsa8_core_gen
459         paddd   %xmm0, %xmm8
460         paddd   %xmm1, %xmm9
461         paddd   %xmm2, %xmm10
462         paddd   %xmm3, %xmm11
463         
464         pxor    %xmm8, %xmm12
465         pxor    %xmm9, %xmm13
466         pxor    %xmm10, %xmm14
467         pxor    %xmm11, %xmm15
468         movdqa  %xmm12, 0(%rsp)
469         movdqa  %xmm13, 16(%rsp)
470         movdqa  %xmm14, 32(%rsp)
471         movdqa  %xmm15, 48(%rsp)
472         call salsa8_core_gen
473         movq    128(%rsp), %rsi
474         paddd   %xmm0, %xmm12
475         paddd   %xmm1, %xmm13
476         paddd   %xmm2, %xmm14
477         paddd   %xmm3, %xmm15
478         
479         addq    $128, %rsi
480         movq    120(%rsp), %rcx
481         cmpq    %rcx, %rsi
482         jne scrypt_core_gen_loop1
483         
484         movq    $1024, %rcx
485         movd    %xmm12, %edx
486 scrypt_core_gen_loop2:
487         movq    112(%rsp), %rsi
488         andl    $1023, %edx
489         shll    $7, %edx
490         addq    %rsi, %rdx
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
499         pxor    %xmm0, %xmm8
500         pxor    %xmm1, %xmm9
501         pxor    %xmm2, %xmm10
502         pxor    %xmm3, %xmm11
503         pxor    %xmm4, %xmm12
504         pxor    %xmm5, %xmm13
505         pxor    %xmm6, %xmm14
506         pxor    %xmm7, %xmm15
507         
508         pxor    %xmm12, %xmm8
509         pxor    %xmm13, %xmm9
510         pxor    %xmm14, %xmm10
511         pxor    %xmm15, %xmm11
512         movdqa  %xmm8, 0(%rsp)
513         movdqa  %xmm9, 16(%rsp)
514         movdqa  %xmm10, 32(%rsp)
515         movdqa  %xmm11, 48(%rsp)
516         movq    %rcx, 128(%rsp)
517         call salsa8_core_gen
518         paddd   %xmm0, %xmm8
519         paddd   %xmm1, %xmm9
520         paddd   %xmm2, %xmm10
521         paddd   %xmm3, %xmm11
522         
523         pxor    %xmm8, %xmm12
524         pxor    %xmm9, %xmm13
525         pxor    %xmm10, %xmm14
526         pxor    %xmm11, %xmm15
527         movdqa  %xmm12, 0(%rsp)
528         movdqa  %xmm13, 16(%rsp)
529         movdqa  %xmm14, 32(%rsp)
530         movdqa  %xmm15, 48(%rsp)
531         call salsa8_core_gen
532         movq    128(%rsp), %rcx
533         addl    0(%rsp), %edx
534         paddd   %xmm0, %xmm12
535         paddd   %xmm1, %xmm13
536         paddd   %xmm2, %xmm14
537         paddd   %xmm3, %xmm15
538         
539         subq    $1, %rcx
540         ja scrypt_core_gen_loop2
541         
542         movq    104(%rsp), %rdi
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)
551         
552         addq    $136, %rsp
553         scrypt_core_cleanup
554         ret
555
556
557 .macro salsa8_core_xmm_doubleround
558         movdqa  %xmm1, %xmm4
559         paddd   %xmm0, %xmm4
560         movdqa  %xmm4, %xmm5
561         pslld   $7, %xmm4
562         psrld   $25, %xmm5
563         pxor    %xmm4, %xmm3
564         movdqa  %xmm0, %xmm4
565         pxor    %xmm5, %xmm3
566         
567         paddd   %xmm3, %xmm4
568         movdqa  %xmm4, %xmm5
569         pslld   $9, %xmm4
570         psrld   $23, %xmm5
571         pxor    %xmm4, %xmm2
572         movdqa  %xmm3, %xmm4
573         pxor    %xmm5, %xmm2
574         pshufd  $0x93, %xmm3, %xmm3
575         
576         paddd   %xmm2, %xmm4
577         movdqa  %xmm4, %xmm5
578         pslld   $13, %xmm4
579         psrld   $19, %xmm5
580         pxor    %xmm4, %xmm1
581         movdqa  %xmm2, %xmm4
582         pxor    %xmm5, %xmm1
583         pshufd  $0x4e, %xmm2, %xmm2
584         
585         paddd   %xmm1, %xmm4
586         movdqa  %xmm4, %xmm5
587         pslld   $18, %xmm4
588         psrld   $14, %xmm5
589         pxor    %xmm4, %xmm0
590         movdqa  %xmm3, %xmm4
591         pxor    %xmm5, %xmm0
592         pshufd  $0x39, %xmm1, %xmm1
593         
594         paddd   %xmm0, %xmm4
595         movdqa  %xmm4, %xmm5
596         pslld   $7, %xmm4
597         psrld   $25, %xmm5
598         pxor    %xmm4, %xmm1
599         movdqa  %xmm0, %xmm4
600         pxor    %xmm5, %xmm1
601         
602         paddd   %xmm1, %xmm4
603         movdqa  %xmm4, %xmm5
604         pslld   $9, %xmm4
605         psrld   $23, %xmm5
606         pxor    %xmm4, %xmm2
607         movdqa  %xmm1, %xmm4
608         pxor    %xmm5, %xmm2
609         pshufd  $0x93, %xmm1, %xmm1
610         
611         paddd   %xmm2, %xmm4
612         movdqa  %xmm4, %xmm5
613         pslld   $13, %xmm4
614         psrld   $19, %xmm5
615         pxor    %xmm4, %xmm3
616         movdqa  %xmm2, %xmm4
617         pxor    %xmm5, %xmm3
618         pshufd  $0x4e, %xmm2, %xmm2
619         
620         paddd   %xmm3, %xmm4
621         movdqa  %xmm4, %xmm5
622         pslld   $18, %xmm4
623         psrld   $14, %xmm5
624         pxor    %xmm4, %xmm0
625         pshufd  $0x39, %xmm3, %xmm3
626         pxor    %xmm5, %xmm0
627 .endm
628
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
634 .endm
635         
636         .p2align 6
637 scrypt_core_xmm:
638         pcmpeqw %xmm1, %xmm1
639         psrlq   $32, %xmm1
640         
641         movdqa  0(%rdi), %xmm8
642         movdqa  16(%rdi), %xmm11
643         movdqa  32(%rdi), %xmm10
644         movdqa  48(%rdi), %xmm9
645         movdqa  %xmm8, %xmm0
646         pxor    %xmm11, %xmm8
647         pand    %xmm1, %xmm8
648         pxor    %xmm11, %xmm8
649         pxor    %xmm10, %xmm11
650         pand    %xmm1, %xmm11
651         pxor    %xmm10, %xmm11
652         pxor    %xmm9, %xmm10
653         pand    %xmm1, %xmm10
654         pxor    %xmm9, %xmm10
655         pxor    %xmm0, %xmm9
656         pand    %xmm1, %xmm9
657         pxor    %xmm0, %xmm9
658         movdqa  %xmm8, %xmm0
659         pshufd  $0x4e, %xmm10, %xmm10
660         punpcklqdq      %xmm10, %xmm8
661         punpckhqdq      %xmm0, %xmm10
662         movdqa  %xmm11, %xmm0
663         pshufd  $0x4e, %xmm9, %xmm9
664         punpcklqdq      %xmm9, %xmm11
665         punpckhqdq      %xmm0, %xmm9
666         
667         movdqa  64(%rdi), %xmm12
668         movdqa  80(%rdi), %xmm15
669         movdqa  96(%rdi), %xmm14
670         movdqa  112(%rdi), %xmm13
671         movdqa  %xmm12, %xmm0
672         pxor    %xmm15, %xmm12
673         pand    %xmm1, %xmm12
674         pxor    %xmm15, %xmm12
675         pxor    %xmm14, %xmm15
676         pand    %xmm1, %xmm15
677         pxor    %xmm14, %xmm15
678         pxor    %xmm13, %xmm14
679         pand    %xmm1, %xmm14
680         pxor    %xmm13, %xmm14
681         pxor    %xmm0, %xmm13
682         pand    %xmm1, %xmm13
683         pxor    %xmm0, %xmm13
684         movdqa  %xmm12, %xmm0
685         pshufd  $0x4e, %xmm14, %xmm14
686         punpcklqdq      %xmm14, %xmm12
687         punpckhqdq      %xmm0, %xmm14
688         movdqa  %xmm15, %xmm0
689         pshufd  $0x4e, %xmm13, %xmm13
690         punpcklqdq      %xmm13, %xmm15
691         punpckhqdq      %xmm0, %xmm13
692         
693         movq    %rsi, %rdx
694         leaq    131072(%rsi), %rcx
695 scrypt_core_xmm_loop1:
696         pxor    %xmm12, %xmm8
697         pxor    %xmm13, %xmm9
698         pxor    %xmm14, %xmm10
699         pxor    %xmm15, %xmm11
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)
708         
709         movdqa  %xmm8, %xmm0
710         movdqa  %xmm9, %xmm1
711         movdqa  %xmm10, %xmm2
712         movdqa  %xmm11, %xmm3
713         salsa8_core_xmm
714         paddd   %xmm0, %xmm8
715         paddd   %xmm1, %xmm9
716         paddd   %xmm2, %xmm10
717         paddd   %xmm3, %xmm11
718         
719         pxor    %xmm8, %xmm12
720         pxor    %xmm9, %xmm13
721         pxor    %xmm10, %xmm14
722         pxor    %xmm11, %xmm15
723         movdqa  %xmm12, %xmm0
724         movdqa  %xmm13, %xmm1
725         movdqa  %xmm14, %xmm2
726         movdqa  %xmm15, %xmm3
727         salsa8_core_xmm
728         paddd   %xmm0, %xmm12
729         paddd   %xmm1, %xmm13
730         paddd   %xmm2, %xmm14
731         paddd   %xmm3, %xmm15
732         
733         addq    $128, %rdx
734         cmpq    %rcx, %rdx
735         jne scrypt_core_xmm_loop1
736         
737         movq    $1024, %rcx
738 scrypt_core_xmm_loop2:
739         movd    %xmm12, %edx
740         andl    $1023, %edx
741         shll    $7, %edx
742         pxor    0(%rsi, %rdx), %xmm8
743         pxor    16(%rsi, %rdx), %xmm9
744         pxor    32(%rsi, %rdx), %xmm10
745         pxor    48(%rsi, %rdx), %xmm11
746         
747         pxor    %xmm12, %xmm8
748         pxor    %xmm13, %xmm9
749         pxor    %xmm14, %xmm10
750         pxor    %xmm15, %xmm11
751         movdqa  %xmm8, %xmm0
752         movdqa  %xmm9, %xmm1
753         movdqa  %xmm10, %xmm2
754         movdqa  %xmm11, %xmm3
755         salsa8_core_xmm
756         paddd   %xmm0, %xmm8
757         paddd   %xmm1, %xmm9
758         paddd   %xmm2, %xmm10
759         paddd   %xmm3, %xmm11
760         
761         pxor    64(%rsi, %rdx), %xmm12
762         pxor    80(%rsi, %rdx), %xmm13
763         pxor    96(%rsi, %rdx), %xmm14
764         pxor    112(%rsi, %rdx), %xmm15
765         pxor    %xmm8, %xmm12
766         pxor    %xmm9, %xmm13
767         pxor    %xmm10, %xmm14
768         pxor    %xmm11, %xmm15
769         movdqa  %xmm12, %xmm0
770         movdqa  %xmm13, %xmm1
771         movdqa  %xmm14, %xmm2
772         movdqa  %xmm15, %xmm3
773         salsa8_core_xmm
774         paddd   %xmm0, %xmm12
775         paddd   %xmm1, %xmm13
776         paddd   %xmm2, %xmm14
777         paddd   %xmm3, %xmm15
778         
779         subq    $1, %rcx
780         ja scrypt_core_xmm_loop2
781         
782         pcmpeqw %xmm1, %xmm1
783         psrlq   $32, %xmm1
784         
785         movdqa  %xmm8, %xmm0
786         pxor    %xmm9, %xmm8
787         pand    %xmm1, %xmm8
788         pxor    %xmm9, %xmm8
789         pxor    %xmm10, %xmm9
790         pand    %xmm1, %xmm9
791         pxor    %xmm10, %xmm9
792         pxor    %xmm11, %xmm10
793         pand    %xmm1, %xmm10
794         pxor    %xmm11, %xmm10
795         pxor    %xmm0, %xmm11
796         pand    %xmm1, %xmm11
797         pxor    %xmm0, %xmm11
798         movdqa  %xmm8, %xmm0
799         pshufd  $0x4e, %xmm10, %xmm10
800         punpcklqdq      %xmm10, %xmm8
801         punpckhqdq      %xmm0, %xmm10
802         movdqa  %xmm9, %xmm0
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)
810         
811         movdqa  %xmm12, %xmm0
812         pxor    %xmm13, %xmm12
813         pand    %xmm1, %xmm12
814         pxor    %xmm13, %xmm12
815         pxor    %xmm14, %xmm13
816         pand    %xmm1, %xmm13
817         pxor    %xmm14, %xmm13
818         pxor    %xmm15, %xmm14
819         pand    %xmm1, %xmm14
820         pxor    %xmm15, %xmm14
821         pxor    %xmm0, %xmm15
822         pand    %xmm1, %xmm15
823         pxor    %xmm0, %xmm15
824         movdqa  %xmm12, %xmm0
825         pshufd  $0x4e, %xmm14, %xmm14
826         punpcklqdq      %xmm14, %xmm12
827         punpckhqdq      %xmm0, %xmm14
828         movdqa  %xmm13, %xmm0
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)
836         
837         scrypt_core_cleanup
838         ret
839         
840         
841 #if defined(USE_AVX)
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
858         
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
874         
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
893         
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
912         
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
931         
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
947         
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
966         
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
988 .endm
989
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
995 .endm
996 #endif /* USE_AVX */
997         
998         .text
999         .p2align 6
1000         .globl scrypt_core_3way
1001         .globl _scrypt_core_3way
1002 scrypt_core_3way:
1003 _scrypt_core_3way:
1004         pushq   %rbx
1005         pushq   %rbp
1006 #if defined(_WIN64) || defined(__CYGWIN__)
1007         subq    $176, %rsp
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)
1018         pushq   %rdi
1019         pushq   %rsi
1020         movq    %rcx, %rdi
1021         movq    %rdx, %rsi
1022 #endif
1023         subq    $392, %rsp
1024         
1025 .macro scrypt_core_3way_cleanup
1026         addq    $392, %rsp
1027 #if defined(_WIN64) || defined(__CYGWIN__)
1028         popq    %rsi
1029         popq    %rdi
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
1040         addq    $176, %rsp
1041 #endif
1042         popq    %rbp
1043         popq    %rbx
1044 .endm
1045         
1046 #if !defined(USE_AVX)
1047         jmp scrypt_core_3way_xmm
1048 #else
1049         /* Check for AVX and OSXSAVE support */
1050         movl    $1, %eax
1051         cpuid
1052         andl    $0x18000000, %ecx
1053         cmpl    $0x18000000, %ecx
1054         jne scrypt_core_3way_xmm
1055         /* Check for XMM and YMM state support */
1056         xorl    %ecx, %ecx
1057         xgetbv
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
1064         cpuid
1065         andl    $0x00000800, %ecx
1066         jnz scrypt_core_3way_xop
1067 #endif
1068         
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
1076         
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
1089         
1090         movq    %rsi, %rbx
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)
1097         pxor    0(%rsp), %xmm0
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)
1129         
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)
1155         
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
1193         
1194         addq    $3*128, %rbx
1195         cmpq    %rax, %rbx
1196         jne scrypt_core_3way_avx_loop1
1197         
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)
1210         
1211         movq    $1024, %rcx
1212 scrypt_core_3way_avx_loop2:
1213         movd    %xmm0, %ebp
1214         movd    %xmm8, %ebx
1215         movd    %xmm12, %eax
1216         pxor    0(%rsp), %xmm0
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
1228         andl    $1023, %ebp
1229         leaq    (%rbp, %rbp, 2), %rbp
1230         shll    $7, %ebp
1231         andl    $1023, %ebx
1232         leaq    1(%rbx, %rbx, 2), %rbx
1233         shll    $7, %ebx
1234         andl    $1023, %eax
1235         leaq    2(%rax, %rax, 2), %rax
1236         shll    $7, %eax
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
1249         
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)
1287         
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)
1349         
1350         subq    $1, %rcx
1351         ja scrypt_core_3way_avx_loop2
1352         
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
1359         
1360         scrypt_core_3way_cleanup
1361         ret
1362
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
1374         
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
1384         
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
1397         
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
1410         
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
1423         
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
1433         
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
1446         
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
1462 .endm
1463
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
1469 .endm
1470         
1471         .p2align 6
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
1479         
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
1492         
1493         movq    %rsi, %rbx
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)
1500         pxor    0(%rsp), %xmm0
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)
1532         
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)
1558         
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
1596         
1597         addq    $3*128, %rbx
1598         cmpq    %rax, %rbx
1599         jne scrypt_core_3way_xop_loop1
1600         
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)
1613         
1614         movq    $1024, %rcx
1615 scrypt_core_3way_xop_loop2:
1616         movd    %xmm0, %ebp
1617         movd    %xmm8, %ebx
1618         movd    %xmm12, %eax
1619         pxor    0(%rsp), %xmm0
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
1631         andl    $1023, %ebp
1632         leaq    (%rbp, %rbp, 2), %rbp
1633         shll    $7, %ebp
1634         andl    $1023, %ebx
1635         leaq    1(%rbx, %rbx, 2), %rbx
1636         shll    $7, %ebx
1637         andl    $1023, %eax
1638         leaq    2(%rax, %rax, 2), %rax
1639         shll    $7, %eax
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
1652         
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)
1690         
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)
1752         
1753         subq    $1, %rcx
1754         ja scrypt_core_3way_xop_loop2
1755         
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
1762         
1763         scrypt_core_3way_cleanup
1764         ret
1765 #endif /* USE_XOP */
1766 #endif /* USE_AVX */
1767         
1768 .macro salsa8_core_3way_xmm_doubleround
1769         movdqa  %xmm1, %xmm4
1770         movdqa  %xmm9, %xmm6
1771         movdqa  %xmm13, %xmm7
1772         paddd   %xmm0, %xmm4
1773         paddd   %xmm8, %xmm6
1774         paddd   %xmm12, %xmm7
1775         movdqa  %xmm4, %xmm5
1776         pslld   $7, %xmm4
1777         psrld   $25, %xmm5
1778         pxor    %xmm4, %xmm3
1779         pxor    %xmm5, %xmm3
1780         movdqa  %xmm0, %xmm4
1781         movdqa  %xmm6, %xmm5
1782         pslld   $7, %xmm6
1783         psrld   $25, %xmm5
1784         pxor    %xmm6, %xmm11
1785         pxor    %xmm5, %xmm11
1786         movdqa  %xmm8, %xmm6
1787         movdqa  %xmm7, %xmm5
1788         pslld   $7, %xmm7
1789         psrld   $25, %xmm5
1790         pxor    %xmm7, %xmm15
1791         pxor    %xmm5, %xmm15
1792         movdqa  %xmm12, %xmm7
1793         
1794         paddd   %xmm3, %xmm4
1795         paddd   %xmm11, %xmm6
1796         paddd   %xmm15, %xmm7
1797         movdqa  %xmm4, %xmm5
1798         pslld   $9, %xmm4
1799         psrld   $23, %xmm5
1800         pxor    %xmm4, %xmm2
1801         movdqa  %xmm3, %xmm4
1802         pshufd  $0x93, %xmm3, %xmm3
1803         pxor    %xmm5, %xmm2
1804         movdqa  %xmm6, %xmm5
1805         pslld   $9, %xmm6
1806         psrld   $23, %xmm5
1807         pxor    %xmm6, %xmm10
1808         movdqa  %xmm11, %xmm6
1809         pshufd  $0x93, %xmm11, %xmm11
1810         pxor    %xmm5, %xmm10
1811         movdqa  %xmm7, %xmm5
1812         pslld   $9, %xmm7
1813         psrld   $23, %xmm5
1814         pxor    %xmm7, %xmm14
1815         movdqa  %xmm15, %xmm7
1816         pxor    %xmm5, %xmm14
1817         pshufd  $0x93, %xmm15, %xmm15
1818         
1819         paddd   %xmm2, %xmm4
1820         paddd   %xmm10, %xmm6
1821         paddd   %xmm14, %xmm7
1822         movdqa  %xmm4, %xmm5
1823         pslld   $13, %xmm4
1824         psrld   $19, %xmm5
1825         pxor    %xmm4, %xmm1
1826         movdqa  %xmm2, %xmm4
1827         pshufd  $0x4e, %xmm2, %xmm2
1828         pxor    %xmm5, %xmm1
1829         movdqa  %xmm6, %xmm5
1830         pslld   $13, %xmm6
1831         psrld   $19, %xmm5
1832         pxor    %xmm6, %xmm9
1833         movdqa  %xmm10, %xmm6
1834         pshufd  $0x4e, %xmm10, %xmm10
1835         pxor    %xmm5, %xmm9
1836         movdqa  %xmm7, %xmm5
1837         pslld   $13, %xmm7
1838         psrld   $19, %xmm5
1839         pxor    %xmm7, %xmm13
1840         movdqa  %xmm14, %xmm7
1841         pshufd  $0x4e, %xmm14, %xmm14
1842         pxor    %xmm5, %xmm13
1843         
1844         paddd   %xmm1, %xmm4
1845         paddd   %xmm9, %xmm6
1846         paddd   %xmm13, %xmm7
1847         movdqa  %xmm4, %xmm5
1848         pslld   $18, %xmm4
1849         psrld   $14, %xmm5
1850         pxor    %xmm4, %xmm0
1851         pshufd  $0x39, %xmm1, %xmm1
1852         pxor    %xmm5, %xmm0
1853         movdqa  %xmm3, %xmm4
1854         movdqa  %xmm6, %xmm5
1855         pslld   $18, %xmm6
1856         psrld   $14, %xmm5
1857         pxor    %xmm6, %xmm8
1858         pshufd  $0x39, %xmm9, %xmm9
1859         pxor    %xmm5, %xmm8
1860         movdqa  %xmm11, %xmm6
1861         movdqa  %xmm7, %xmm5
1862         pslld   $18, %xmm7
1863         psrld   $14, %xmm5
1864         pxor    %xmm7, %xmm12
1865         movdqa  %xmm15, %xmm7
1866         pxor    %xmm5, %xmm12
1867         pshufd  $0x39, %xmm13, %xmm13
1868         
1869         paddd   %xmm0, %xmm4
1870         paddd   %xmm8, %xmm6
1871         paddd   %xmm12, %xmm7
1872         movdqa  %xmm4, %xmm5
1873         pslld   $7, %xmm4
1874         psrld   $25, %xmm5
1875         pxor    %xmm4, %xmm1
1876         pxor    %xmm5, %xmm1
1877         movdqa  %xmm0, %xmm4
1878         movdqa  %xmm6, %xmm5
1879         pslld   $7, %xmm6
1880         psrld   $25, %xmm5
1881         pxor    %xmm6, %xmm9
1882         pxor    %xmm5, %xmm9
1883         movdqa  %xmm8, %xmm6
1884         movdqa  %xmm7, %xmm5
1885         pslld   $7, %xmm7
1886         psrld   $25, %xmm5
1887         pxor    %xmm7, %xmm13
1888         pxor    %xmm5, %xmm13
1889         movdqa  %xmm12, %xmm7
1890         
1891         paddd   %xmm1, %xmm4
1892         paddd   %xmm9, %xmm6
1893         paddd   %xmm13, %xmm7
1894         movdqa  %xmm4, %xmm5
1895         pslld   $9, %xmm4
1896         psrld   $23, %xmm5
1897         pxor    %xmm4, %xmm2
1898         movdqa  %xmm1, %xmm4
1899         pshufd  $0x93, %xmm1, %xmm1
1900         pxor    %xmm5, %xmm2
1901         movdqa  %xmm6, %xmm5
1902         pslld   $9, %xmm6
1903         psrld   $23, %xmm5
1904         pxor    %xmm6, %xmm10
1905         movdqa  %xmm9, %xmm6
1906         pshufd  $0x93, %xmm9, %xmm9
1907         pxor    %xmm5, %xmm10
1908         movdqa  %xmm7, %xmm5
1909         pslld   $9, %xmm7
1910         psrld   $23, %xmm5
1911         pxor    %xmm7, %xmm14
1912         movdqa  %xmm13, %xmm7
1913         pshufd  $0x93, %xmm13, %xmm13
1914         pxor    %xmm5, %xmm14
1915         
1916         paddd   %xmm2, %xmm4
1917         paddd   %xmm10, %xmm6
1918         paddd   %xmm14, %xmm7
1919         movdqa  %xmm4, %xmm5
1920         pslld   $13, %xmm4
1921         psrld   $19, %xmm5
1922         pxor    %xmm4, %xmm3
1923         movdqa  %xmm2, %xmm4
1924         pshufd  $0x4e, %xmm2, %xmm2
1925         pxor    %xmm5, %xmm3
1926         movdqa  %xmm6, %xmm5
1927         pslld   $13, %xmm6
1928         psrld   $19, %xmm5
1929         pxor    %xmm6, %xmm11
1930         movdqa  %xmm10, %xmm6
1931         pshufd  $0x4e, %xmm10, %xmm10
1932         pxor    %xmm5, %xmm11
1933         movdqa  %xmm7, %xmm5
1934         pslld   $13, %xmm7
1935         psrld   $19, %xmm5
1936         pxor    %xmm7, %xmm15
1937         movdqa  %xmm14, %xmm7
1938         pshufd  $0x4e, %xmm14, %xmm14
1939         pxor    %xmm5, %xmm15
1940         
1941         paddd   %xmm3, %xmm4
1942         paddd   %xmm11, %xmm6
1943         paddd   %xmm15, %xmm7
1944         movdqa  %xmm4, %xmm5
1945         pslld   $18, %xmm4
1946         psrld   $14, %xmm5
1947         pxor    %xmm4, %xmm0
1948         pshufd  $0x39, %xmm3, %xmm3
1949         pxor    %xmm5, %xmm0
1950         movdqa  %xmm6, %xmm5
1951         pslld   $18, %xmm6
1952         psrld   $14, %xmm5
1953         pxor    %xmm6, %xmm8
1954         pshufd  $0x39, %xmm11, %xmm11
1955         pxor    %xmm5, %xmm8
1956         movdqa  %xmm7, %xmm5
1957         pslld   $18, %xmm7
1958         psrld   $14, %xmm5
1959         pxor    %xmm7, %xmm12
1960         pshufd  $0x39, %xmm15, %xmm15
1961         pxor    %xmm5, %xmm12
1962 .endm
1963
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
1969 .endm
1970         
1971         .p2align 6
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
1979         
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
1992         
1993         movq    %rsi, %rbx
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)
2000         pxor    0(%rsp), %xmm0
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)
2032         
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)
2058         
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
2096         
2097         addq    $3*128, %rbx
2098         cmpq    %rax, %rbx
2099         jne scrypt_core_3way_xmm_loop1
2100         
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)
2113         
2114         movq    $1024, %rcx
2115 scrypt_core_3way_xmm_loop2:
2116         movd    %xmm0, %ebp
2117         movd    %xmm8, %ebx
2118         movd    %xmm12, %eax
2119         pxor    0(%rsp), %xmm0
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
2131         andl    $1023, %ebp
2132         leaq    (%rbp, %rbp, 2), %rbp
2133         shll    $7, %ebp
2134         andl    $1023, %ebx
2135         leaq    1(%rbx, %rbx, 2), %rbx
2136         shll    $7, %ebx
2137         andl    $1023, %eax
2138         leaq    2(%rax, %rax, 2), %rax
2139         shll    $7, %eax
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
2152         
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)
2190         
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)
2252         
2253         subq    $1, %rcx
2254         ja scrypt_core_3way_xmm_loop2
2255         
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
2262         
2263         scrypt_core_3way_cleanup
2264         ret
2265
2266
2267 #if defined(USE_AVX2)
2268
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
2285         
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
2301         
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
2320         
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
2339         
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
2358         
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
2374         
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
2393         
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
2415 .endm
2416
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
2422 .endm
2423         
2424         .text
2425         .p2align 6
2426         .globl scrypt_core_6way
2427         .globl _scrypt_core_6way
2428 scrypt_core_6way:
2429 _scrypt_core_6way:
2430         pushq   %rbx
2431         pushq   %rbp
2432 #if defined(_WIN64) || defined(__CYGWIN__)
2433         subq    $176, %rsp
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)
2444         pushq   %rdi
2445         pushq   %rsi
2446         movq    %rcx, %rdi
2447         movq    %rdx, %rsi
2448 #endif
2449         movq    %rsp, %rdx
2450         subq    $768, %rsp
2451         andq    $-128, %rsp
2452         
2453 .macro scrypt_core_6way_cleanup
2454         movq    %rdx, %rsp
2455 #if defined(_WIN64) || defined(__CYGWIN__)
2456         popq    %rsi
2457         popq    %rdi
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
2468         addq    $176, %rsp
2469 #endif
2470         popq    %rbp
2471         popq    %rbx
2472 .endm
2473
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)
2495 .endm
2496
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)
2518 .endm
2519         
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
2527         
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
2540         
2541         movq    %rsi, %rbx
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)
2580         
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)
2606         
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
2644         
2645         addq    $6*128, %rbx
2646         cmpq    %rax, %rbx
2647         jne scrypt_core_6way_avx2_loop1
2648         
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)
2661         
2662         movq    $1024, %rcx
2663 scrypt_core_6way_avx2_loop2:
2664         vmovd   %xmm0, %ebp
2665         vmovd   %xmm8, %ebx
2666         vmovd   %xmm12, %eax
2667         vextracti128    $1, %ymm0, %xmm4
2668         vextracti128    $1, %ymm8, %xmm5
2669         vextracti128    $1, %ymm12, %xmm6
2670         vmovd   %xmm4, %r8d
2671         vmovd   %xmm5, %r9d
2672         vmovd   %xmm6, %r10d
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
2685         andl    $1023, %ebp
2686         leaq    0(%rbp, %rbp, 2), %rbp
2687         shll    $8, %ebp
2688         andl    $1023, %ebx
2689         leaq    1(%rbx, %rbx, 2), %rbx
2690         shll    $8, %ebx
2691         andl    $1023, %eax
2692         leaq    2(%rax, %rax, 2), %rax
2693         shll    $8, %eax
2694         andl    $1023, %r8d
2695         leaq    0(%r8, %r8, 2), %r8
2696         shll    $8, %r8d
2697         andl    $1023, %r9d
2698         leaq    1(%r9, %r9, 2), %r9
2699         shll    $8, %r9d
2700         andl    $1023, %r10d
2701         leaq    2(%r10, %r10, 2), %r10
2702         shll    $8, %r10d
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
2739         
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)
2777         
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)
2863         
2864         subq    $1, %rcx
2865         ja scrypt_core_6way_avx2_loop2
2866         
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
2873         
2874         scrypt_core_6way_cleanup
2875         ret
2876
2877 #endif /* USE_AVX2 */
2878
2879 #endif
This page took 0.183628 seconds and 4 git commands to generate.