Update to 0.3.0 (New upstream + new RPC calls)
[novacoin.git] / src / scrypt-x86_64.S
1 # Copyright 2011-2012 pooler@litecoinpool.org
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7 # 1. Redistributions of source code must retain the above copyright
8 #    notice, this list of conditions and the following disclaimer.
9 # 2. Redistributions in binary form must reproduce the above copyright
10 #    notice, this list of conditions and the following disclaimer in the
11 #    documentation and/or other materials provided with the distribution.
12 #
13 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 # SUCH DAMAGE.
24
25 #if defined(__linux__) && defined(__ELF__)
26         .section .note.GNU-stack,"",%progbits
27 #endif
28
29 #if defined(__x86_64__)
30
31 .macro scrypt_shuffle src, so, dest, do
32         movl    \so+60(\src), %r8d
33         movl    \so+44(\src), %r9d
34         movl    \so+28(\src), %r10d
35         movl    \so+12(\src), %r11d
36         movl    %r8d, \do+12(\dest)
37         movl    %r9d, \do+28(\dest)
38         movl    %r10d, \do+44(\dest)
39         movl    %r11d, \do+60(\dest)
40         movl    \so+40(\src), %r8d
41         movl    \so+8(\src), %r9d
42         movl    \so+48(\src), %r10d
43         movl    \so+16(\src), %r11d
44         movl    %r8d, \do+8(\dest)
45         movl    %r9d, \do+40(\dest)
46         movl    %r10d, \do+16(\dest)
47         movl    %r11d, \do+48(\dest)
48         movl    \so+20(\src), %r8d
49         movl    \so+4(\src), %r9d
50         movl    \so+52(\src), %r10d
51         movl    \so+36(\src), %r11d
52         movl    %r8d, \do+4(\dest)
53         movl    %r9d, \do+20(\dest)
54         movl    %r10d, \do+36(\dest)
55         movl    %r11d, \do+52(\dest)
56         movl    \so+0(\src), %r8d
57         movl    \so+24(\src), %r9d
58         movl    \so+32(\src), %r10d
59         movl    \so+56(\src), %r11d
60         movl    %r8d, \do+0(\dest)
61         movl    %r9d, \do+24(\dest)
62         movl    %r10d, \do+32(\dest)
63         movl    %r11d, \do+56(\dest)
64 .endm
65
66 .macro gen_salsa8_core_doubleround
67         movq    72(%rsp), %r15
68
69         leaq    (%r14, %rdx), %rbp
70         roll    $7, %ebp
71         xorq    %rbp, %r9
72         leaq    (%rdi, %r15), %rbp
73         roll    $7, %ebp
74         xorq    %rbp, %r10
75         leaq    (%rdx, %r9), %rbp
76         roll    $9, %ebp
77         xorq    %rbp, %r11
78         leaq    (%r15, %r10), %rbp
79         roll    $9, %ebp
80         xorq    %rbp, %r13
81         leaq    (%r9, %r11), %rbp
82         roll    $13, %ebp
83         xorq    %rbp, %r14
84         leaq    (%r10, %r13), %rbp
85         roll    $13, %ebp
86         xorq    %rbp, %rdi
87         leaq    (%r11, %r14), %rbp
88         roll    $18, %ebp
89         xorq    %rbp, %rdx
90         leaq    (%r13, %rdi), %rbp
91         roll    $18, %ebp
92         xorq    %rbp, %r15
93
94         movq    48(%rsp), %rbp
95         movq    %r15, 72(%rsp)
96
97         leaq    (%rax, %rbp), %r15
98         roll    $7, %r15d
99         xorq    %r15, %rbx
100         leaq    (%rbp, %rbx), %r15
101         roll    $9, %r15d
102         xorq    %r15, %rcx
103         leaq    (%rbx, %rcx), %r15
104         roll    $13, %r15d
105         xorq    %r15, %rax
106         leaq    (%rcx, %rax), %r15
107         roll    $18, %r15d
108         xorq    %r15, %rbp
109
110         movq    88(%rsp), %r15
111         movq    %rbp, 48(%rsp)
112
113         leaq    (%r12, %r15), %rbp
114         roll    $7, %ebp
115         xorq    %rbp, %rsi
116         leaq    (%r15, %rsi), %rbp
117         roll    $9, %ebp
118         xorq    %rbp, %r8
119         leaq    (%rsi, %r8), %rbp
120         roll    $13, %ebp
121         xorq    %rbp, %r12
122         leaq    (%r8, %r12), %rbp
123         roll    $18, %ebp
124         xorq    %rbp, %r15
125
126         movq    %r15, 88(%rsp)
127         movq    72(%rsp), %r15
128
129         leaq    (%rsi, %rdx), %rbp
130         roll    $7, %ebp
131         xorq    %rbp, %rdi
132         leaq    (%r9, %r15), %rbp
133         roll    $7, %ebp
134         xorq    %rbp, %rax
135         leaq    (%rdx, %rdi), %rbp
136         roll    $9, %ebp
137         xorq    %rbp, %rcx
138         leaq    (%r15, %rax), %rbp
139         roll    $9, %ebp
140         xorq    %rbp, %r8
141         leaq    (%rdi, %rcx), %rbp
142         roll    $13, %ebp
143         xorq    %rbp, %rsi
144         leaq    (%rax, %r8), %rbp
145         roll    $13, %ebp
146         xorq    %rbp, %r9
147         leaq    (%rcx, %rsi), %rbp
148         roll    $18, %ebp
149         xorq    %rbp, %rdx
150         leaq    (%r8, %r9), %rbp
151         roll    $18, %ebp
152         xorq    %rbp, %r15
153
154         movq    48(%rsp), %rbp
155         movq    %r15, 72(%rsp)
156
157         leaq    (%r10, %rbp), %r15
158         roll    $7, %r15d
159         xorq    %r15, %r12
160         leaq    (%rbp, %r12), %r15
161         roll    $9, %r15d
162         xorq    %r15, %r11
163         leaq    (%r12, %r11), %r15
164         roll    $13, %r15d
165         xorq    %r15, %r10
166         leaq    (%r11, %r10), %r15
167         roll    $18, %r15d
168         xorq    %r15, %rbp
169
170         movq    88(%rsp), %r15
171         movq    %rbp, 48(%rsp)
172
173         leaq    (%rbx, %r15), %rbp
174         roll    $7, %ebp
175         xorq    %rbp, %r14
176         leaq    (%r15, %r14), %rbp
177         roll    $9, %ebp
178         xorq    %rbp, %r13
179         leaq    (%r14, %r13), %rbp
180         roll    $13, %ebp
181         xorq    %rbp, %rbx
182         leaq    (%r13, %rbx), %rbp
183         roll    $18, %ebp
184         xorq    %rbp, %r15
185
186         movq    %r15, 88(%rsp)
187 .endm
188
189         .text
190         .align 32
191 gen_salsa8_core:
192         # 0: %rdx, %rdi, %rcx, %rsi
193         movq    8(%rsp), %rdi
194         movq    %rdi, %rdx
195         shrq    $32, %rdi
196         movq    16(%rsp), %rsi
197         movq    %rsi, %rcx
198         shrq    $32, %rsi
199         # 1: %r9, 72(%rsp), %rax, %r8
200         movq    24(%rsp), %r8
201         movq    %r8, %r9
202         shrq    $32, %r8
203         movq    %r8, 72(%rsp)
204         movq    32(%rsp), %r8
205         movq    %r8, %rax
206         shrq    $32, %r8
207         # 2: %r11, %r10, 48(%rsp), %r12
208         movq    40(%rsp), %r10
209         movq    %r10, %r11
210         shrq    $32, %r10
211         movq    48(%rsp), %r12
212         #movq   %r12, %r13
213         #movq   %r13, 48(%rsp)
214         shrq    $32, %r12
215         # 3: %r14, %r13, %rbx, 88(%rsp)
216         movq    56(%rsp), %r13
217         movq    %r13, %r14
218         shrq    $32, %r13
219         movq    64(%rsp), %r15
220         movq    %r15, %rbx
221         shrq    $32, %r15
222         movq    %r15, 88(%rsp)
223
224         gen_salsa8_core_doubleround
225         gen_salsa8_core_doubleround
226         gen_salsa8_core_doubleround
227         gen_salsa8_core_doubleround
228
229         movl    %edx, %edx
230         shlq    $32, %rdi
231         addq    %rdi, %rdx
232         movd    %rdx, %xmm0
233
234         movl    %ecx, %ecx
235         shlq    $32, %rsi
236         addq    %rsi, %rcx
237         movd    %rcx, %xmm4
238
239         movq    72(%rsp), %rdi
240         movl    %r9d, %r9d
241         shlq    $32, %rdi
242         addq    %rdi, %r9
243         movd    %r9, %xmm1
244
245         movl    %eax, %eax
246         shlq    $32, %r8
247         addq    %r8, %rax
248         movd    %rax, %xmm5
249
250         movl    %r11d, %r11d
251         shlq    $32, %r10
252         addq    %r10, %r11
253         movd    %r11, %xmm2
254
255         movl    48(%rsp), %r8d
256         shlq    $32, %r12
257         addq    %r12, %r8
258         movd    %r8, %xmm6
259
260         movl    %r14d, %r14d
261         shlq    $32, %r13
262         addq    %r13, %r14
263         movd    %r14, %xmm3
264
265         movq    88(%rsp), %rdi
266         movl    %ebx, %ebx
267         shlq    $32, %rdi
268         addq    %rdi, %rbx
269         movd    %rbx, %xmm7
270
271         punpcklqdq      %xmm4, %xmm0
272         punpcklqdq      %xmm5, %xmm1
273         punpcklqdq      %xmm6, %xmm2
274         punpcklqdq      %xmm7, %xmm3
275
276         #movq   %rdx, 8(%rsp)
277         #movq   %rcx, 16(%rsp)
278         #movq   %r9, 24(%rsp)
279         #movq   %rax, 32(%rsp)
280         #movq   %r11, 40(%rsp)
281         #movq   %r8, 48(%rsp)
282         #movq   %r14, 56(%rsp)
283         #movq   %rbx, 64(%rsp)
284
285         ret
286
287
288         .text
289         .align 32
290         .globl scrypt_core
291         .globl _scrypt_core
292 scrypt_core:
293 _scrypt_core:
294         pushq   %rbx
295         pushq   %rbp
296         pushq   %r12
297         pushq   %r13
298         pushq   %r14
299         pushq   %r15
300 #if defined(WIN64)
301         subq    $176, %rsp
302         movdqa  %xmm6, 8(%rsp)
303         movdqa  %xmm7, 24(%rsp)
304         movdqa  %xmm8, 40(%rsp)
305         movdqa  %xmm9, 56(%rsp)
306         movdqa  %xmm10, 72(%rsp)
307         movdqa  %xmm11, 88(%rsp)
308         movdqa  %xmm12, 104(%rsp)
309         movdqa  %xmm13, 120(%rsp)
310         movdqa  %xmm14, 136(%rsp)
311         movdqa  %xmm15, 152(%rsp)
312         pushq   %rdi
313         pushq   %rsi
314         movq    %rcx, %rdi
315         movq    %rdx, %rsi
316 #endif
317
318 .macro scrypt_core_cleanup
319 #if defined(WIN64)
320         popq    %rsi
321         popq    %rdi
322         movdqa  8(%rsp), %xmm6
323         movdqa  24(%rsp), %xmm7
324         movdqa  40(%rsp), %xmm8
325         movdqa  56(%rsp), %xmm9
326         movdqa  72(%rsp), %xmm10
327         movdqa  88(%rsp), %xmm11
328         movdqa  104(%rsp), %xmm12
329         movdqa  120(%rsp), %xmm13
330         movdqa  136(%rsp), %xmm14
331         movdqa  152(%rsp), %xmm15
332         addq    $176, %rsp
333 #endif
334         popq    %r15
335         popq    %r14
336         popq    %r13
337         popq    %r12
338         popq    %rbp
339         popq    %rbx
340 .endm
341
342         # GenuineIntel processors have fast SIMD
343         xorl    %eax, %eax
344         cpuid
345         cmpl    $0x6c65746e, %ecx
346         jne gen_scrypt_core
347         cmpl    $0x49656e69, %edx
348         jne gen_scrypt_core
349         cmpl    $0x756e6547, %ebx
350         je xmm_scrypt_core
351
352 gen_scrypt_core:
353         subq    $136, %rsp
354         movdqa  0(%rdi), %xmm8
355         movdqa  16(%rdi), %xmm9
356         movdqa  32(%rdi), %xmm10
357         movdqa  48(%rdi), %xmm11
358         movdqa  64(%rdi), %xmm12
359         movdqa  80(%rdi), %xmm13
360         movdqa  96(%rdi), %xmm14
361         movdqa  112(%rdi), %xmm15
362
363         leaq    131072(%rsi), %rcx
364         movq    %rdi, 104(%rsp)
365         movq    %rsi, 112(%rsp)
366         movq    %rcx, 120(%rsp)
367 gen_scrypt_core_loop1:
368         movdqa  %xmm8, 0(%rsi)
369         movdqa  %xmm9, 16(%rsi)
370         movdqa  %xmm10, 32(%rsi)
371         movdqa  %xmm11, 48(%rsi)
372         movdqa  %xmm12, 64(%rsi)
373         movdqa  %xmm13, 80(%rsi)
374         movdqa  %xmm14, 96(%rsi)
375         movdqa  %xmm15, 112(%rsi)
376
377         pxor    %xmm12, %xmm8
378         pxor    %xmm13, %xmm9
379         pxor    %xmm14, %xmm10
380         pxor    %xmm15, %xmm11
381         movdqa  %xmm8, 0(%rsp)
382         movdqa  %xmm9, 16(%rsp)
383         movdqa  %xmm10, 32(%rsp)
384         movdqa  %xmm11, 48(%rsp)
385         movq    %rsi, 128(%rsp)
386         call gen_salsa8_core
387         paddd   %xmm0, %xmm8
388         paddd   %xmm1, %xmm9
389         paddd   %xmm2, %xmm10
390         paddd   %xmm3, %xmm11
391
392         pxor    %xmm8, %xmm12
393         pxor    %xmm9, %xmm13
394         pxor    %xmm10, %xmm14
395         pxor    %xmm11, %xmm15
396         movdqa  %xmm12, 0(%rsp)
397         movdqa  %xmm13, 16(%rsp)
398         movdqa  %xmm14, 32(%rsp)
399         movdqa  %xmm15, 48(%rsp)
400         call gen_salsa8_core
401         movq    128(%rsp), %rsi
402         paddd   %xmm0, %xmm12
403         paddd   %xmm1, %xmm13
404         paddd   %xmm2, %xmm14
405         paddd   %xmm3, %xmm15
406
407         addq    $128, %rsi
408         movq    120(%rsp), %rcx
409         cmpq    %rcx, %rsi
410         jne gen_scrypt_core_loop1
411
412         movq    $1024, %rcx
413 gen_scrypt_core_loop2:
414         movq    112(%rsp), %rsi
415         movd    %xmm12, %edx
416         andl    $1023, %edx
417         shll    $7, %edx
418         movdqa  0(%rsi, %rdx), %xmm0
419         movdqa  16(%rsi, %rdx), %xmm1
420         movdqa  32(%rsi, %rdx), %xmm2
421         movdqa  48(%rsi, %rdx), %xmm3
422         movdqa  64(%rsi, %rdx), %xmm4
423         movdqa  80(%rsi, %rdx), %xmm5
424         movdqa  96(%rsi, %rdx), %xmm6
425         movdqa  112(%rsi, %rdx), %xmm7
426         pxor    %xmm0, %xmm8
427         pxor    %xmm1, %xmm9
428         pxor    %xmm2, %xmm10
429         pxor    %xmm3, %xmm11
430         pxor    %xmm4, %xmm12
431         pxor    %xmm5, %xmm13
432         pxor    %xmm6, %xmm14
433         pxor    %xmm7, %xmm15
434
435         pxor    %xmm12, %xmm8
436         pxor    %xmm13, %xmm9
437         pxor    %xmm14, %xmm10
438         pxor    %xmm15, %xmm11
439         movdqa  %xmm8, 0(%rsp)
440         movdqa  %xmm9, 16(%rsp)
441         movdqa  %xmm10, 32(%rsp)
442         movdqa  %xmm11, 48(%rsp)
443         movq    %rcx, 128(%rsp)
444         call gen_salsa8_core
445         paddd   %xmm0, %xmm8
446         paddd   %xmm1, %xmm9
447         paddd   %xmm2, %xmm10
448         paddd   %xmm3, %xmm11
449
450         pxor    %xmm8, %xmm12
451         pxor    %xmm9, %xmm13
452         pxor    %xmm10, %xmm14
453         pxor    %xmm11, %xmm15
454         movdqa  %xmm12, 0(%rsp)
455         movdqa  %xmm13, 16(%rsp)
456         movdqa  %xmm14, 32(%rsp)
457         movdqa  %xmm15, 48(%rsp)
458         call gen_salsa8_core
459         movq    128(%rsp), %rcx
460         paddd   %xmm0, %xmm12
461         paddd   %xmm1, %xmm13
462         paddd   %xmm2, %xmm14
463         paddd   %xmm3, %xmm15
464
465         subq    $1, %rcx
466         ja gen_scrypt_core_loop2
467
468         movq    104(%rsp), %rdi
469         movdqa  %xmm8, 0(%rdi)
470         movdqa  %xmm9, 16(%rdi)
471         movdqa  %xmm10, 32(%rdi)
472         movdqa  %xmm11, 48(%rdi)
473         movdqa  %xmm12, 64(%rdi)
474         movdqa  %xmm13, 80(%rdi)
475         movdqa  %xmm14, 96(%rdi)
476         movdqa  %xmm15, 112(%rdi)
477
478         addq    $136, %rsp
479         scrypt_core_cleanup
480         ret
481
482
483 .macro xmm_salsa8_core_doubleround
484         movdqa  %xmm1, %xmm4
485         paddd   %xmm0, %xmm4
486         movdqa  %xmm4, %xmm5
487         pslld   $7, %xmm4
488         psrld   $25, %xmm5
489         pxor    %xmm4, %xmm3
490         pxor    %xmm5, %xmm3
491         movdqa  %xmm0, %xmm4
492
493         paddd   %xmm3, %xmm4
494         movdqa  %xmm4, %xmm5
495         pslld   $9, %xmm4
496         psrld   $23, %xmm5
497         pxor    %xmm4, %xmm2
498         movdqa  %xmm3, %xmm4
499         pshufd  $0x93, %xmm3, %xmm3
500         pxor    %xmm5, %xmm2
501
502         paddd   %xmm2, %xmm4
503         movdqa  %xmm4, %xmm5
504         pslld   $13, %xmm4
505         psrld   $19, %xmm5
506         pxor    %xmm4, %xmm1
507         movdqa  %xmm2, %xmm4
508         pshufd  $0x4e, %xmm2, %xmm2
509         pxor    %xmm5, %xmm1
510
511         paddd   %xmm1, %xmm4
512         movdqa  %xmm4, %xmm5
513         pslld   $18, %xmm4
514         psrld   $14, %xmm5
515         pxor    %xmm4, %xmm0
516         pshufd  $0x39, %xmm1, %xmm1
517         pxor    %xmm5, %xmm0
518         movdqa  %xmm3, %xmm4
519
520         paddd   %xmm0, %xmm4
521         movdqa  %xmm4, %xmm5
522         pslld   $7, %xmm4
523         psrld   $25, %xmm5
524         pxor    %xmm4, %xmm1
525         pxor    %xmm5, %xmm1
526         movdqa  %xmm0, %xmm4
527
528         paddd   %xmm1, %xmm4
529         movdqa  %xmm4, %xmm5
530         pslld   $9, %xmm4
531         psrld   $23, %xmm5
532         pxor    %xmm4, %xmm2
533         movdqa  %xmm1, %xmm4
534         pshufd  $0x93, %xmm1, %xmm1
535         pxor    %xmm5, %xmm2
536
537         paddd   %xmm2, %xmm4
538         movdqa  %xmm4, %xmm5
539         pslld   $13, %xmm4
540         psrld   $19, %xmm5
541         pxor    %xmm4, %xmm3
542         movdqa  %xmm2, %xmm4
543         pshufd  $0x4e, %xmm2, %xmm2
544         pxor    %xmm5, %xmm3
545
546         paddd   %xmm3, %xmm4
547         movdqa  %xmm4, %xmm5
548         pslld   $18, %xmm4
549         psrld   $14, %xmm5
550         pxor    %xmm4, %xmm0
551         pshufd  $0x39, %xmm3, %xmm3
552         pxor    %xmm5, %xmm0
553 .endm
554
555 .macro xmm_salsa8_core
556         xmm_salsa8_core_doubleround
557         xmm_salsa8_core_doubleround
558         xmm_salsa8_core_doubleround
559         xmm_salsa8_core_doubleround
560 .endm
561
562         .align 32
563 xmm_scrypt_core:
564         # shuffle 1st block into %xmm8-%xmm11
565         movl    60(%rdi), %edx
566         movl    44(%rdi), %ecx
567         movl    28(%rdi), %ebx
568         movl    12(%rdi), %eax
569         movd    %edx, %xmm0
570         movd    %ecx, %xmm1
571         movd    %ebx, %xmm2
572         movd    %eax, %xmm3
573         movl    40(%rdi), %ecx
574         movl    24(%rdi), %ebx
575         movl    8(%rdi), %eax
576         movl    56(%rdi), %edx
577         pshufd  $0x93, %xmm0, %xmm0
578         pshufd  $0x93, %xmm1, %xmm1
579         pshufd  $0x93, %xmm2, %xmm2
580         pshufd  $0x93, %xmm3, %xmm3
581         movd    %ecx, %xmm4
582         movd    %ebx, %xmm5
583         movd    %eax, %xmm6
584         movd    %edx, %xmm7
585         paddd   %xmm4, %xmm0
586         paddd   %xmm5, %xmm1
587         paddd   %xmm6, %xmm2
588         paddd   %xmm7, %xmm3
589         movl    20(%rdi), %ebx
590         movl    4(%rdi), %eax
591         movl    52(%rdi), %edx
592         movl    36(%rdi), %ecx
593         pshufd  $0x93, %xmm0, %xmm0
594         pshufd  $0x93, %xmm1, %xmm1
595         pshufd  $0x93, %xmm2, %xmm2
596         pshufd  $0x93, %xmm3, %xmm3
597         movd    %ebx, %xmm4
598         movd    %eax, %xmm5
599         movd    %edx, %xmm6
600         movd    %ecx, %xmm7
601         paddd   %xmm4, %xmm0
602         paddd   %xmm5, %xmm1
603         paddd   %xmm6, %xmm2
604         paddd   %xmm7, %xmm3
605         movl    0(%rdi), %eax
606         movl    48(%rdi), %edx
607         movl    32(%rdi), %ecx
608         movl    16(%rdi), %ebx
609         pshufd  $0x93, %xmm0, %xmm0
610         pshufd  $0x93, %xmm1, %xmm1
611         pshufd  $0x93, %xmm2, %xmm2
612         pshufd  $0x93, %xmm3, %xmm3
613         movd    %eax, %xmm8
614         movd    %edx, %xmm9
615         movd    %ecx, %xmm10
616         movd    %ebx, %xmm11
617         paddd   %xmm0, %xmm8
618         paddd   %xmm1, %xmm9
619         paddd   %xmm2, %xmm10
620         paddd   %xmm3, %xmm11
621
622         # shuffle 2nd block into %xmm12-%xmm15
623         movl    124(%rdi), %edx
624         movl    108(%rdi), %ecx
625         movl    92(%rdi), %ebx
626         movl    76(%rdi), %eax
627         movd    %edx, %xmm0
628         movd    %ecx, %xmm1
629         movd    %ebx, %xmm2
630         movd    %eax, %xmm3
631         movl    104(%rdi), %ecx
632         movl    88(%rdi), %ebx
633         movl    72(%rdi), %eax
634         movl    120(%rdi), %edx
635         pshufd  $0x93, %xmm0, %xmm0
636         pshufd  $0x93, %xmm1, %xmm1
637         pshufd  $0x93, %xmm2, %xmm2
638         pshufd  $0x93, %xmm3, %xmm3
639         movd    %ecx, %xmm4
640         movd    %ebx, %xmm5
641         movd    %eax, %xmm6
642         movd    %edx, %xmm7
643         paddd   %xmm4, %xmm0
644         paddd   %xmm5, %xmm1
645         paddd   %xmm6, %xmm2
646         paddd   %xmm7, %xmm3
647         movl    84(%rdi), %ebx
648         movl    68(%rdi), %eax
649         movl    116(%rdi), %edx
650         movl    100(%rdi), %ecx
651         pshufd  $0x93, %xmm0, %xmm0
652         pshufd  $0x93, %xmm1, %xmm1
653         pshufd  $0x93, %xmm2, %xmm2
654         pshufd  $0x93, %xmm3, %xmm3
655         movd    %ebx, %xmm4
656         movd    %eax, %xmm5
657         movd    %edx, %xmm6
658         movd    %ecx, %xmm7
659         paddd   %xmm4, %xmm0
660         paddd   %xmm5, %xmm1
661         paddd   %xmm6, %xmm2
662         paddd   %xmm7, %xmm3
663         movl    64(%rdi), %eax
664         movl    112(%rdi), %edx
665         movl    96(%rdi), %ecx
666         movl    80(%rdi), %ebx
667         pshufd  $0x93, %xmm0, %xmm0
668         pshufd  $0x93, %xmm1, %xmm1
669         pshufd  $0x93, %xmm2, %xmm2
670         pshufd  $0x93, %xmm3, %xmm3
671         movd    %eax, %xmm12
672         movd    %edx, %xmm13
673         movd    %ecx, %xmm14
674         movd    %ebx, %xmm15
675         paddd   %xmm0, %xmm12
676         paddd   %xmm1, %xmm13
677         paddd   %xmm2, %xmm14
678         paddd   %xmm3, %xmm15
679
680         movq    %rsi, %rdx
681         leaq    131072(%rsi), %rcx
682 xmm_scrypt_core_loop1:
683         movdqa  %xmm8, 0(%rdx)
684         movdqa  %xmm9, 16(%rdx)
685         movdqa  %xmm10, 32(%rdx)
686         movdqa  %xmm11, 48(%rdx)
687         movdqa  %xmm12, 64(%rdx)
688         movdqa  %xmm13, 80(%rdx)
689         movdqa  %xmm14, 96(%rdx)
690         movdqa  %xmm15, 112(%rdx)
691
692         pxor    %xmm12, %xmm8
693         pxor    %xmm13, %xmm9
694         pxor    %xmm14, %xmm10
695         pxor    %xmm15, %xmm11
696         movdqa  %xmm8, %xmm0
697         movdqa  %xmm9, %xmm1
698         movdqa  %xmm10, %xmm2
699         movdqa  %xmm11, %xmm3
700         xmm_salsa8_core
701         paddd   %xmm0, %xmm8
702         paddd   %xmm1, %xmm9
703         paddd   %xmm2, %xmm10
704         paddd   %xmm3, %xmm11
705
706         pxor    %xmm8, %xmm12
707         pxor    %xmm9, %xmm13
708         pxor    %xmm10, %xmm14
709         pxor    %xmm11, %xmm15
710         movdqa  %xmm12, %xmm0
711         movdqa  %xmm13, %xmm1
712         movdqa  %xmm14, %xmm2
713         movdqa  %xmm15, %xmm3
714         xmm_salsa8_core
715         paddd   %xmm0, %xmm12
716         paddd   %xmm1, %xmm13
717         paddd   %xmm2, %xmm14
718         paddd   %xmm3, %xmm15
719
720         addq    $128, %rdx
721         cmpq    %rcx, %rdx
722         jne xmm_scrypt_core_loop1
723
724         movq    $1024, %rcx
725 xmm_scrypt_core_loop2:
726         movd    %xmm12, %edx
727         andl    $1023, %edx
728         shll    $7, %edx
729         movdqa  0(%rsi, %rdx), %xmm0
730         movdqa  16(%rsi, %rdx), %xmm1
731         movdqa  32(%rsi, %rdx), %xmm2
732         movdqa  48(%rsi, %rdx), %xmm3
733         movdqa  64(%rsi, %rdx), %xmm4
734         movdqa  80(%rsi, %rdx), %xmm5
735         movdqa  96(%rsi, %rdx), %xmm6
736         movdqa  112(%rsi, %rdx), %xmm7
737         pxor    %xmm0, %xmm8
738         pxor    %xmm1, %xmm9
739         pxor    %xmm2, %xmm10
740         pxor    %xmm3, %xmm11
741         pxor    %xmm4, %xmm12
742         pxor    %xmm5, %xmm13
743         pxor    %xmm6, %xmm14
744         pxor    %xmm7, %xmm15
745
746         pxor    %xmm12, %xmm8
747         pxor    %xmm13, %xmm9
748         pxor    %xmm14, %xmm10
749         pxor    %xmm15, %xmm11
750         movdqa  %xmm8, %xmm0
751         movdqa  %xmm9, %xmm1
752         movdqa  %xmm10, %xmm2
753         movdqa  %xmm11, %xmm3
754         xmm_salsa8_core
755         paddd   %xmm0, %xmm8
756         paddd   %xmm1, %xmm9
757         paddd   %xmm2, %xmm10
758         paddd   %xmm3, %xmm11
759
760         pxor    %xmm8, %xmm12
761         pxor    %xmm9, %xmm13
762         pxor    %xmm10, %xmm14
763         pxor    %xmm11, %xmm15
764         movdqa  %xmm12, %xmm0
765         movdqa  %xmm13, %xmm1
766         movdqa  %xmm14, %xmm2
767         movdqa  %xmm15, %xmm3
768         xmm_salsa8_core
769         paddd   %xmm0, %xmm12
770         paddd   %xmm1, %xmm13
771         paddd   %xmm2, %xmm14
772         paddd   %xmm3, %xmm15
773
774         subq    $1, %rcx
775         ja xmm_scrypt_core_loop2
776
777         # re-shuffle 1st block back
778         movd    %xmm8, %eax
779         movd    %xmm9, %edx
780         movd    %xmm10, %ecx
781         movd    %xmm11, %ebx
782         pshufd  $0x39, %xmm8, %xmm8
783         pshufd  $0x39, %xmm9, %xmm9
784         pshufd  $0x39, %xmm10, %xmm10
785         pshufd  $0x39, %xmm11, %xmm11
786         movl    %eax, 0(%rdi)
787         movl    %edx, 48(%rdi)
788         movl    %ecx, 32(%rdi)
789         movl    %ebx, 16(%rdi)
790         movd    %xmm8, %ebx
791         movd    %xmm9, %eax
792         movd    %xmm10, %edx
793         movd    %xmm11, %ecx
794         pshufd  $0x39, %xmm8, %xmm8
795         pshufd  $0x39, %xmm9, %xmm9
796         pshufd  $0x39, %xmm10, %xmm10
797         pshufd  $0x39, %xmm11, %xmm11
798         movl    %ebx, 20(%rdi)
799         movl    %eax, 4(%rdi)
800         movl    %edx, 52(%rdi)
801         movl    %ecx, 36(%rdi)
802         movd    %xmm8, %ecx
803         movd    %xmm9, %ebx
804         movd    %xmm10, %eax
805         movd    %xmm11, %edx
806         pshufd  $0x39, %xmm8, %xmm8
807         pshufd  $0x39, %xmm9, %xmm9
808         pshufd  $0x39, %xmm10, %xmm10
809         pshufd  $0x39, %xmm11, %xmm11
810         movl    %ecx, 40(%rdi)
811         movl    %ebx, 24(%rdi)
812         movl    %eax, 8(%rdi)
813         movl    %edx, 56(%rdi)
814         movd    %xmm8, %edx
815         movd    %xmm9, %ecx
816         movd    %xmm10, %ebx
817         movd    %xmm11, %eax
818         movl    %edx, 60(%rdi)
819         movl    %ecx, 44(%rdi)
820         movl    %ebx, 28(%rdi)
821         movl    %eax, 12(%rdi)
822
823         # re-shuffle 2nd block back
824         movd    %xmm12, %eax
825         movd    %xmm13, %edx
826         movd    %xmm14, %ecx
827         movd    %xmm15, %ebx
828         pshufd  $0x39, %xmm12, %xmm12
829         pshufd  $0x39, %xmm13, %xmm13
830         pshufd  $0x39, %xmm14, %xmm14
831         pshufd  $0x39, %xmm15, %xmm15
832         movl    %eax, 64(%rdi)
833         movl    %edx, 112(%rdi)
834         movl    %ecx, 96(%rdi)
835         movl    %ebx, 80(%rdi)
836         movd    %xmm12, %ebx
837         movd    %xmm13, %eax
838         movd    %xmm14, %edx
839         movd    %xmm15, %ecx
840         pshufd  $0x39, %xmm12, %xmm12
841         pshufd  $0x39, %xmm13, %xmm13
842         pshufd  $0x39, %xmm14, %xmm14
843         pshufd  $0x39, %xmm15, %xmm15
844         movl    %ebx, 84(%rdi)
845         movl    %eax, 68(%rdi)
846         movl    %edx, 116(%rdi)
847         movl    %ecx, 100(%rdi)
848         movd    %xmm12, %ecx
849         movd    %xmm13, %ebx
850         movd    %xmm14, %eax
851         movd    %xmm15, %edx
852         pshufd  $0x39, %xmm12, %xmm12
853         pshufd  $0x39, %xmm13, %xmm13
854         pshufd  $0x39, %xmm14, %xmm14
855         pshufd  $0x39, %xmm15, %xmm15
856         movl    %ecx, 104(%rdi)
857         movl    %ebx, 88(%rdi)
858         movl    %eax, 72(%rdi)
859         movl    %edx, 120(%rdi)
860         movd    %xmm12, %edx
861         movd    %xmm13, %ecx
862         movd    %xmm14, %ebx
863         movd    %xmm15, %eax
864         movl    %edx, 124(%rdi)
865         movl    %ecx, 108(%rdi)
866         movl    %ebx, 92(%rdi)
867         movl    %eax, 76(%rdi)
868
869         scrypt_core_cleanup
870         ret
871
872
873         .text
874         .align 32
875         .globl scrypt_best_throughput
876         .globl _scrypt_best_throughput
877 scrypt_best_throughput:
878 _scrypt_best_throughput:
879         pushq   %rbx
880         xorq    %rax, %rax
881         cpuid
882         movl    $3, %eax
883         cmpl    $0x444d4163, %ecx
884         jne scrypt_best_throughput_exit
885         cmpl    $0x69746e65, %edx
886         jne scrypt_best_throughput_exit
887         cmpl    $0x68747541, %ebx
888         jne scrypt_best_throughput_exit
889         movl    $1, %eax
890         cpuid
891         andl    $0x0ff00000, %eax
892         movl    $3, %eax
893         jnz scrypt_best_throughput_exit
894         movl    $1, %eax
895 scrypt_best_throughput_exit:
896         popq    %rbx
897         ret
898
899
900 .macro xmm_salsa8_core_2way_doubleround
901         movdqa  %xmm1, %xmm4
902         movdqa  %xmm9, %xmm6
903         paddd   %xmm0, %xmm4
904         paddd   %xmm8, %xmm6
905         movdqa  %xmm4, %xmm5
906         movdqa  %xmm6, %xmm7
907         pslld   $7, %xmm4
908         pslld   $7, %xmm6
909         psrld   $25, %xmm5
910         psrld   $25, %xmm7
911         pxor    %xmm4, %xmm3
912         pxor    %xmm6, %xmm11
913         pxor    %xmm5, %xmm3
914         pxor    %xmm7, %xmm11
915         movdqa  %xmm0, %xmm4
916         movdqa  %xmm8, %xmm6
917
918         paddd   %xmm3, %xmm4
919         paddd   %xmm11, %xmm6
920         movdqa  %xmm4, %xmm5
921         movdqa  %xmm6, %xmm7
922         pslld   $9, %xmm4
923         pslld   $9, %xmm6
924         psrld   $23, %xmm5
925         psrld   $23, %xmm7
926         pxor    %xmm4, %xmm2
927         pxor    %xmm6, %xmm10
928         movdqa  %xmm3, %xmm4
929         movdqa  %xmm11, %xmm6
930         pshufd  $0x93, %xmm3, %xmm3
931         pshufd  $0x93, %xmm11, %xmm11
932         pxor    %xmm5, %xmm2
933         pxor    %xmm7, %xmm10
934
935         paddd   %xmm2, %xmm4
936         paddd   %xmm10, %xmm6
937         movdqa  %xmm4, %xmm5
938         movdqa  %xmm6, %xmm7
939         pslld   $13, %xmm4
940         pslld   $13, %xmm6
941         psrld   $19, %xmm5
942         psrld   $19, %xmm7
943         pxor    %xmm4, %xmm1
944         pxor    %xmm6, %xmm9
945         movdqa  %xmm2, %xmm4
946         movdqa  %xmm10, %xmm6
947         pshufd  $0x4e, %xmm2, %xmm2
948         pshufd  $0x4e, %xmm10, %xmm10
949         pxor    %xmm5, %xmm1
950         pxor    %xmm7, %xmm9
951
952         paddd   %xmm1, %xmm4
953         paddd   %xmm9, %xmm6
954         movdqa  %xmm4, %xmm5
955         movdqa  %xmm6, %xmm7
956         pslld   $18, %xmm4
957         pslld   $18, %xmm6
958         psrld   $14, %xmm5
959         psrld   $14, %xmm7
960         pxor    %xmm4, %xmm0
961         pxor    %xmm6, %xmm8
962         pshufd  $0x39, %xmm1, %xmm1
963         pshufd  $0x39, %xmm9, %xmm9
964         pxor    %xmm5, %xmm0
965         pxor    %xmm7, %xmm8
966         movdqa  %xmm3, %xmm4
967         movdqa  %xmm11, %xmm6
968
969         paddd   %xmm0, %xmm4
970         paddd   %xmm8, %xmm6
971         movdqa  %xmm4, %xmm5
972         movdqa  %xmm6, %xmm7
973         pslld   $7, %xmm4
974         pslld   $7, %xmm6
975         psrld   $25, %xmm5
976         psrld   $25, %xmm7
977         pxor    %xmm4, %xmm1
978         pxor    %xmm6, %xmm9
979         pxor    %xmm5, %xmm1
980         pxor    %xmm7, %xmm9
981         movdqa  %xmm0, %xmm4
982         movdqa  %xmm8, %xmm6
983
984         paddd   %xmm1, %xmm4
985         paddd   %xmm9, %xmm6
986         movdqa  %xmm4, %xmm5
987         movdqa  %xmm6, %xmm7
988         pslld   $9, %xmm4
989         pslld   $9, %xmm6
990         psrld   $23, %xmm5
991         psrld   $23, %xmm7
992         pxor    %xmm4, %xmm2
993         pxor    %xmm6, %xmm10
994         movdqa  %xmm1, %xmm4
995         movdqa  %xmm9, %xmm6
996         pshufd  $0x93, %xmm1, %xmm1
997         pshufd  $0x93, %xmm9, %xmm9
998         pxor    %xmm5, %xmm2
999         pxor    %xmm7, %xmm10
1000
1001         paddd   %xmm2, %xmm4
1002         paddd   %xmm10, %xmm6
1003         movdqa  %xmm4, %xmm5
1004         movdqa  %xmm6, %xmm7
1005         pslld   $13, %xmm4
1006         pslld   $13, %xmm6
1007         psrld   $19, %xmm5
1008         psrld   $19, %xmm7
1009         pxor    %xmm4, %xmm3
1010         pxor    %xmm6, %xmm11
1011         movdqa  %xmm2, %xmm4
1012         movdqa  %xmm10, %xmm6
1013         pshufd  $0x4e, %xmm2, %xmm2
1014         pshufd  $0x4e, %xmm10, %xmm10
1015         pxor    %xmm5, %xmm3
1016         pxor    %xmm7, %xmm11
1017
1018         paddd   %xmm3, %xmm4
1019         paddd   %xmm11, %xmm6
1020         movdqa  %xmm4, %xmm5
1021         movdqa  %xmm6, %xmm7
1022         pslld   $18, %xmm4
1023         pslld   $18, %xmm6
1024         psrld   $14, %xmm5
1025         psrld   $14, %xmm7
1026         pxor    %xmm4, %xmm0
1027         pxor    %xmm6, %xmm8
1028         pshufd  $0x39, %xmm3, %xmm3
1029         pshufd  $0x39, %xmm11, %xmm11
1030         pxor    %xmm5, %xmm0
1031         pxor    %xmm7, %xmm8
1032 .endm
1033
1034 .macro xmm_salsa8_core_2way
1035         xmm_salsa8_core_2way_doubleround
1036         xmm_salsa8_core_2way_doubleround
1037         xmm_salsa8_core_2way_doubleround
1038         xmm_salsa8_core_2way_doubleround
1039 .endm
1040
1041
1042         .text
1043         .align 32
1044         .globl scrypt_core_2way
1045         .globl _scrypt_core_2way
1046 scrypt_core_2way:
1047 _scrypt_core_2way:
1048         pushq   %rbx
1049         pushq   %rbp
1050 #if defined(WIN64)
1051         subq    $176, %rsp
1052         movdqa  %xmm6, 8(%rsp)
1053         movdqa  %xmm7, 24(%rsp)
1054         movdqa  %xmm8, 40(%rsp)
1055         movdqa  %xmm9, 56(%rsp)
1056         movdqa  %xmm10, 72(%rsp)
1057         movdqa  %xmm11, 88(%rsp)
1058         movdqa  %xmm12, 104(%rsp)
1059         movdqa  %xmm13, 120(%rsp)
1060         movdqa  %xmm14, 136(%rsp)
1061         movdqa  %xmm15, 152(%rsp)
1062         pushq   %rdi
1063         pushq   %rsi
1064         movq    %rcx, %rdi
1065         movq    %rdx, %rsi
1066         movq    %r8, %rdx
1067 #endif
1068         subq    $264, %rsp
1069
1070         scrypt_shuffle %rdi, 0, %rsp, 0
1071         scrypt_shuffle %rdi, 64, %rsp, 64
1072         scrypt_shuffle %rsi, 0, %rsp, 128
1073         scrypt_shuffle %rsi, 64, %rsp, 192
1074
1075         movdqa  192(%rsp), %xmm12
1076         movdqa  208(%rsp), %xmm13
1077         movdqa  224(%rsp), %xmm14
1078         movdqa  240(%rsp), %xmm15
1079
1080         movq    %rdx, %rbp
1081         leaq    262144(%rdx), %rcx
1082 scrypt_core_2way_loop1:
1083         movdqa  0(%rsp), %xmm0
1084         movdqa  16(%rsp), %xmm1
1085         movdqa  32(%rsp), %xmm2
1086         movdqa  48(%rsp), %xmm3
1087         movdqa  64(%rsp), %xmm4
1088         movdqa  80(%rsp), %xmm5
1089         movdqa  96(%rsp), %xmm6
1090         movdqa  112(%rsp), %xmm7
1091         movdqa  128(%rsp), %xmm8
1092         movdqa  144(%rsp), %xmm9
1093         movdqa  160(%rsp), %xmm10
1094         movdqa  176(%rsp), %xmm11
1095         pxor    %xmm4, %xmm0
1096         pxor    %xmm5, %xmm1
1097         pxor    %xmm6, %xmm2
1098         pxor    %xmm7, %xmm3
1099         movdqa  %xmm0, 0(%rbp)
1100         movdqa  %xmm1, 16(%rbp)
1101         movdqa  %xmm2, 32(%rbp)
1102         movdqa  %xmm3, 48(%rbp)
1103         movdqa  %xmm4, 64(%rbp)
1104         movdqa  %xmm5, 80(%rbp)
1105         movdqa  %xmm6, 96(%rbp)
1106         movdqa  %xmm7, 112(%rbp)
1107         pxor    %xmm12, %xmm8
1108         pxor    %xmm13, %xmm9
1109         pxor    %xmm14, %xmm10
1110         pxor    %xmm15, %xmm11
1111         movdqa  %xmm8, 128(%rbp)
1112         movdqa  %xmm9, 144(%rbp)
1113         movdqa  %xmm10, 160(%rbp)
1114         movdqa  %xmm11, 176(%rbp)
1115         movdqa  %xmm12, 192(%rbp)
1116         movdqa  %xmm13, 208(%rbp)
1117         movdqa  %xmm14, 224(%rbp)
1118         movdqa  %xmm15, 240(%rbp)
1119
1120         xmm_salsa8_core_2way
1121         paddd   0(%rbp), %xmm0
1122         paddd   16(%rbp), %xmm1
1123         paddd   32(%rbp), %xmm2
1124         paddd   48(%rbp), %xmm3
1125         paddd   128(%rbp), %xmm8
1126         paddd   144(%rbp), %xmm9
1127         paddd   160(%rbp), %xmm10
1128         paddd   176(%rbp), %xmm11
1129         movdqa  %xmm0, 0(%rsp)
1130         movdqa  %xmm1, 16(%rsp)
1131         movdqa  %xmm2, 32(%rsp)
1132         movdqa  %xmm3, 48(%rsp)
1133         movdqa  %xmm8, 128(%rsp)
1134         movdqa  %xmm9, 144(%rsp)
1135         movdqa  %xmm10, 160(%rsp)
1136         movdqa  %xmm11, 176(%rsp)
1137
1138         pxor    64(%rsp), %xmm0
1139         pxor    80(%rsp), %xmm1
1140         pxor    96(%rsp), %xmm2
1141         pxor    112(%rsp), %xmm3
1142         pxor    %xmm12, %xmm8
1143         pxor    %xmm13, %xmm9
1144         pxor    %xmm14, %xmm10
1145         pxor    %xmm15, %xmm11
1146         movdqa  %xmm0, 64(%rsp)
1147         movdqa  %xmm1, 80(%rsp)
1148         movdqa  %xmm2, 96(%rsp)
1149         movdqa  %xmm3, 112(%rsp)
1150         movdqa  %xmm8, %xmm12
1151         movdqa  %xmm9, %xmm13
1152         movdqa  %xmm10, %xmm14
1153         movdqa  %xmm11, %xmm15
1154         xmm_salsa8_core_2way
1155         paddd   64(%rsp), %xmm0
1156         paddd   80(%rsp), %xmm1
1157         paddd   96(%rsp), %xmm2
1158         paddd   112(%rsp), %xmm3
1159         paddd   %xmm8, %xmm12
1160         paddd   %xmm9, %xmm13
1161         paddd   %xmm10, %xmm14
1162         paddd   %xmm11, %xmm15
1163         movdqa  %xmm0, 64(%rsp)
1164         movdqa  %xmm1, 80(%rsp)
1165         movdqa  %xmm2, 96(%rsp)
1166         movdqa  %xmm3, 112(%rsp)
1167
1168         addq    $256, %rbp
1169         cmpq    %rcx, %rbp
1170         jne scrypt_core_2way_loop1
1171
1172         movq    $1024, %rcx
1173 scrypt_core_2way_loop2:
1174         movdqa  0(%rsp), %xmm0
1175         movdqa  16(%rsp), %xmm1
1176         movdqa  32(%rsp), %xmm2
1177         movdqa  48(%rsp), %xmm3
1178         movdqa  64(%rsp), %xmm4
1179         movdqa  80(%rsp), %xmm5
1180         movdqa  96(%rsp), %xmm6
1181         movdqa  112(%rsp), %xmm7
1182         movdqa  128(%rsp), %xmm8
1183         movdqa  144(%rsp), %xmm9
1184         movdqa  160(%rsp), %xmm10
1185         movdqa  176(%rsp), %xmm11
1186         movd    %xmm4, %ebp
1187         andl    $1023, %ebp
1188         shll    $8, %ebp
1189         pxor    0(%rdx, %rbp), %xmm0
1190         pxor    16(%rdx, %rbp), %xmm1
1191         pxor    32(%rdx, %rbp), %xmm2
1192         pxor    48(%rdx, %rbp), %xmm3
1193         movd    %xmm12, %ebx
1194         andl    $1023, %ebx
1195         shll    $8, %ebx
1196         addl    $128, %ebx
1197         pxor    0(%rdx, %rbx), %xmm8
1198         pxor    16(%rdx, %rbx), %xmm9
1199         pxor    32(%rdx, %rbx), %xmm10
1200         pxor    48(%rdx, %rbx), %xmm11
1201
1202         pxor    %xmm4, %xmm0
1203         pxor    %xmm5, %xmm1
1204         pxor    %xmm6, %xmm2
1205         pxor    %xmm7, %xmm3
1206         pxor    %xmm12, %xmm8
1207         pxor    %xmm13, %xmm9
1208         pxor    %xmm14, %xmm10
1209         pxor    %xmm15, %xmm11
1210         movdqa  %xmm0, 0(%rsp)
1211         movdqa  %xmm1, 16(%rsp)
1212         movdqa  %xmm2, 32(%rsp)
1213         movdqa  %xmm3, 48(%rsp)
1214         movdqa  %xmm8, 128(%rsp)
1215         movdqa  %xmm9, 144(%rsp)
1216         movdqa  %xmm10, 160(%rsp)
1217         movdqa  %xmm11, 176(%rsp)
1218         xmm_salsa8_core_2way
1219         paddd   0(%rsp), %xmm0
1220         paddd   16(%rsp), %xmm1
1221         paddd   32(%rsp), %xmm2
1222         paddd   48(%rsp), %xmm3
1223         paddd   128(%rsp), %xmm8
1224         paddd   144(%rsp), %xmm9
1225         paddd   160(%rsp), %xmm10
1226         paddd   176(%rsp), %xmm11
1227         movdqa  %xmm0, 0(%rsp)
1228         movdqa  %xmm1, 16(%rsp)
1229         movdqa  %xmm2, 32(%rsp)
1230         movdqa  %xmm3, 48(%rsp)
1231         movdqa  %xmm8, 128(%rsp)
1232         movdqa  %xmm9, 144(%rsp)
1233         movdqa  %xmm10, 160(%rsp)
1234         movdqa  %xmm11, 176(%rsp)
1235
1236         pxor    64(%rdx, %rbp), %xmm0
1237         pxor    80(%rdx, %rbp), %xmm1
1238         pxor    96(%rdx, %rbp), %xmm2
1239         pxor    112(%rdx, %rbp), %xmm3
1240         pxor    64(%rdx, %rbx), %xmm8
1241         pxor    80(%rdx, %rbx), %xmm9
1242         pxor    96(%rdx, %rbx), %xmm10
1243         pxor    112(%rdx, %rbx), %xmm11
1244         pxor    64(%rsp), %xmm0
1245         pxor    80(%rsp), %xmm1
1246         pxor    96(%rsp), %xmm2
1247         pxor    112(%rsp), %xmm3
1248         pxor    %xmm12, %xmm8
1249         pxor    %xmm13, %xmm9
1250         pxor    %xmm14, %xmm10
1251         pxor    %xmm15, %xmm11
1252         movdqa  %xmm0, 64(%rsp)
1253         movdqa  %xmm1, 80(%rsp)
1254         movdqa  %xmm2, 96(%rsp)
1255         movdqa  %xmm3, 112(%rsp)
1256         movdqa  %xmm8, %xmm12
1257         movdqa  %xmm9, %xmm13
1258         movdqa  %xmm10, %xmm14
1259         movdqa  %xmm11, %xmm15
1260         xmm_salsa8_core_2way
1261         paddd   64(%rsp), %xmm0
1262         paddd   80(%rsp), %xmm1
1263         paddd   96(%rsp), %xmm2
1264         paddd   112(%rsp), %xmm3
1265         paddd   %xmm8, %xmm12
1266         paddd   %xmm9, %xmm13
1267         paddd   %xmm10, %xmm14
1268         paddd   %xmm11, %xmm15
1269         movdqa  %xmm0, 64(%rsp)
1270         movdqa  %xmm1, 80(%rsp)
1271         movdqa  %xmm2, 96(%rsp)
1272         movdqa  %xmm3, 112(%rsp)
1273
1274         subq    $1, %rcx
1275         ja scrypt_core_2way_loop2
1276
1277         movdqa  %xmm12, 192(%rsp)
1278         movdqa  %xmm13, 208(%rsp)
1279         movdqa  %xmm14, 224(%rsp)
1280         movdqa  %xmm15, 240(%rsp)
1281
1282         scrypt_shuffle %rsp, 0, %rdi, 0
1283         scrypt_shuffle %rsp, 64, %rdi, 64
1284         scrypt_shuffle %rsp, 128, %rsi, 0
1285         scrypt_shuffle %rsp, 192, %rsi, 64
1286
1287         addq    $264, %rsp
1288 #if defined(WIN64)
1289         popq    %rsi
1290         popq    %rdi
1291         movdqa  8(%rsp), %xmm6
1292         movdqa  24(%rsp), %xmm7
1293         movdqa  40(%rsp), %xmm8
1294         movdqa  56(%rsp), %xmm9
1295         movdqa  72(%rsp), %xmm10
1296         movdqa  88(%rsp), %xmm11
1297         movdqa  104(%rsp), %xmm12
1298         movdqa  120(%rsp), %xmm13
1299         movdqa  136(%rsp), %xmm14
1300         movdqa  152(%rsp), %xmm15
1301         addq    $176, %rsp
1302 #endif
1303         popq    %rbp
1304         popq    %rbx
1305         ret
1306
1307
1308 .macro xmm_salsa8_core_3way_doubleround
1309         movdqa  %xmm1, %xmm4
1310         movdqa  %xmm9, %xmm6
1311         movdqa  %xmm13, %xmm7
1312         paddd   %xmm0, %xmm4
1313         paddd   %xmm8, %xmm6
1314         paddd   %xmm12, %xmm7
1315         movdqa  %xmm4, %xmm5
1316         pslld   $7, %xmm4
1317         psrld   $25, %xmm5
1318         pxor    %xmm4, %xmm3
1319         pxor    %xmm5, %xmm3
1320         movdqa  %xmm0, %xmm4
1321         movdqa  %xmm6, %xmm5
1322         pslld   $7, %xmm6
1323         psrld   $25, %xmm5
1324         pxor    %xmm6, %xmm11
1325         pxor    %xmm5, %xmm11
1326         movdqa  %xmm8, %xmm6
1327         movdqa  %xmm7, %xmm5
1328         pslld   $7, %xmm7
1329         psrld   $25, %xmm5
1330         pxor    %xmm7, %xmm15
1331         pxor    %xmm5, %xmm15
1332         movdqa  %xmm12, %xmm7
1333
1334         paddd   %xmm3, %xmm4
1335         paddd   %xmm11, %xmm6
1336         paddd   %xmm15, %xmm7
1337         movdqa  %xmm4, %xmm5
1338         pslld   $9, %xmm4
1339         psrld   $23, %xmm5
1340         pxor    %xmm4, %xmm2
1341         movdqa  %xmm3, %xmm4
1342         pshufd  $0x93, %xmm3, %xmm3
1343         pxor    %xmm5, %xmm2
1344         movdqa  %xmm6, %xmm5
1345         pslld   $9, %xmm6
1346         psrld   $23, %xmm5
1347         pxor    %xmm6, %xmm10
1348         movdqa  %xmm11, %xmm6
1349         pshufd  $0x93, %xmm11, %xmm11
1350         pxor    %xmm5, %xmm10
1351         movdqa  %xmm7, %xmm5
1352         pslld   $9, %xmm7
1353         psrld   $23, %xmm5
1354         pxor    %xmm7, %xmm14
1355         movdqa  %xmm15, %xmm7
1356         pshufd  $0x93, %xmm15, %xmm15
1357         pxor    %xmm5, %xmm14
1358
1359         paddd   %xmm2, %xmm4
1360         paddd   %xmm10, %xmm6
1361         paddd   %xmm14, %xmm7
1362         movdqa  %xmm4, %xmm5
1363         pslld   $13, %xmm4
1364         psrld   $19, %xmm5
1365         pxor    %xmm4, %xmm1
1366         movdqa  %xmm2, %xmm4
1367         pshufd  $0x4e, %xmm2, %xmm2
1368         pxor    %xmm5, %xmm1
1369         movdqa  %xmm6, %xmm5
1370         pslld   $13, %xmm6
1371         psrld   $19, %xmm5
1372         pxor    %xmm6, %xmm9
1373         movdqa  %xmm10, %xmm6
1374         pshufd  $0x4e, %xmm10, %xmm10
1375         pxor    %xmm5, %xmm9
1376         movdqa  %xmm7, %xmm5
1377         pslld   $13, %xmm7
1378         psrld   $19, %xmm5
1379         pxor    %xmm7, %xmm13
1380         movdqa  %xmm14, %xmm7
1381         pshufd  $0x4e, %xmm14, %xmm14
1382         pxor    %xmm5, %xmm13
1383
1384         paddd   %xmm1, %xmm4
1385         paddd   %xmm9, %xmm6
1386         paddd   %xmm13, %xmm7
1387         movdqa  %xmm4, %xmm5
1388         pslld   $18, %xmm4
1389         psrld   $14, %xmm5
1390         pxor    %xmm4, %xmm0
1391         pshufd  $0x39, %xmm1, %xmm1
1392         pxor    %xmm5, %xmm0
1393         movdqa  %xmm3, %xmm4
1394         movdqa  %xmm6, %xmm5
1395         pslld   $18, %xmm6
1396         psrld   $14, %xmm5
1397         pxor    %xmm6, %xmm8
1398         pshufd  $0x39, %xmm9, %xmm9
1399         pxor    %xmm5, %xmm8
1400         movdqa  %xmm11, %xmm6
1401         movdqa  %xmm7, %xmm5
1402         pslld   $18, %xmm7
1403         psrld   $14, %xmm5
1404         pxor    %xmm7, %xmm12
1405         pshufd  $0x39, %xmm13, %xmm13
1406         pxor    %xmm5, %xmm12
1407         movdqa  %xmm15, %xmm7
1408
1409         paddd   %xmm0, %xmm4
1410         paddd   %xmm8, %xmm6
1411         paddd   %xmm12, %xmm7
1412         movdqa  %xmm4, %xmm5
1413         pslld   $7, %xmm4
1414         psrld   $25, %xmm5
1415         pxor    %xmm4, %xmm1
1416         pxor    %xmm5, %xmm1
1417         movdqa  %xmm0, %xmm4
1418         movdqa  %xmm6, %xmm5
1419         pslld   $7, %xmm6
1420         psrld   $25, %xmm5
1421         pxor    %xmm6, %xmm9
1422         pxor    %xmm5, %xmm9
1423         movdqa  %xmm8, %xmm6
1424         movdqa  %xmm7, %xmm5
1425         pslld   $7, %xmm7
1426         psrld   $25, %xmm5
1427         pxor    %xmm7, %xmm13
1428         pxor    %xmm5, %xmm13
1429         movdqa  %xmm12, %xmm7
1430
1431         paddd   %xmm1, %xmm4
1432         paddd   %xmm9, %xmm6
1433         paddd   %xmm13, %xmm7
1434         movdqa  %xmm4, %xmm5
1435         pslld   $9, %xmm4
1436         psrld   $23, %xmm5
1437         pxor    %xmm4, %xmm2
1438         movdqa  %xmm1, %xmm4
1439         pshufd  $0x93, %xmm1, %xmm1
1440         pxor    %xmm5, %xmm2
1441         movdqa  %xmm6, %xmm5
1442         pslld   $9, %xmm6
1443         psrld   $23, %xmm5
1444         pxor    %xmm6, %xmm10
1445         movdqa  %xmm9, %xmm6
1446         pshufd  $0x93, %xmm9, %xmm9
1447         pxor    %xmm5, %xmm10
1448         movdqa  %xmm7, %xmm5
1449         pslld   $9, %xmm7
1450         psrld   $23, %xmm5
1451         pxor    %xmm7, %xmm14
1452         movdqa  %xmm13, %xmm7
1453         pshufd  $0x93, %xmm13, %xmm13
1454         pxor    %xmm5, %xmm14
1455
1456         paddd   %xmm2, %xmm4
1457         paddd   %xmm10, %xmm6
1458         paddd   %xmm14, %xmm7
1459         movdqa  %xmm4, %xmm5
1460         pslld   $13, %xmm4
1461         psrld   $19, %xmm5
1462         pxor    %xmm4, %xmm3
1463         movdqa  %xmm2, %xmm4
1464         pshufd  $0x4e, %xmm2, %xmm2
1465         pxor    %xmm5, %xmm3
1466         movdqa  %xmm6, %xmm5
1467         pslld   $13, %xmm6
1468         psrld   $19, %xmm5
1469         pxor    %xmm6, %xmm11
1470         movdqa  %xmm10, %xmm6
1471         pshufd  $0x4e, %xmm10, %xmm10
1472         pxor    %xmm5, %xmm11
1473         movdqa  %xmm7, %xmm5
1474         pslld   $13, %xmm7
1475         psrld   $19, %xmm5
1476         pxor    %xmm7, %xmm15
1477         movdqa  %xmm14, %xmm7
1478         pshufd  $0x4e, %xmm14, %xmm14
1479         pxor    %xmm5, %xmm15
1480
1481         paddd   %xmm3, %xmm4
1482         paddd   %xmm11, %xmm6
1483         paddd   %xmm15, %xmm7
1484         movdqa  %xmm4, %xmm5
1485         pslld   $18, %xmm4
1486         psrld   $14, %xmm5
1487         pxor    %xmm4, %xmm0
1488         pshufd  $0x39, %xmm3, %xmm3
1489         pxor    %xmm5, %xmm0
1490         movdqa  %xmm6, %xmm5
1491         pslld   $18, %xmm6
1492         psrld   $14, %xmm5
1493         pxor    %xmm6, %xmm8
1494         pshufd  $0x39, %xmm11, %xmm11
1495         pxor    %xmm5, %xmm8
1496         movdqa  %xmm7, %xmm5
1497         pslld   $18, %xmm7
1498         psrld   $14, %xmm5
1499         pxor    %xmm7, %xmm12
1500         pshufd  $0x39, %xmm15, %xmm15
1501         pxor    %xmm5, %xmm12
1502 .endm
1503
1504 .macro xmm_salsa8_core_3way
1505         xmm_salsa8_core_3way_doubleround
1506         xmm_salsa8_core_3way_doubleround
1507         xmm_salsa8_core_3way_doubleround
1508         xmm_salsa8_core_3way_doubleround
1509 .endm
1510
1511         .text
1512         .align 32
1513         .globl scrypt_core_3way
1514         .globl _scrypt_core_3way
1515 scrypt_core_3way:
1516 _scrypt_core_3way:
1517         pushq   %rbx
1518         pushq   %rbp
1519 #if defined(WIN64)
1520         subq    $176, %rsp
1521         movdqa  %xmm6, 8(%rsp)
1522         movdqa  %xmm7, 24(%rsp)
1523         movdqa  %xmm8, 40(%rsp)
1524         movdqa  %xmm9, 56(%rsp)
1525         movdqa  %xmm10, 72(%rsp)
1526         movdqa  %xmm11, 88(%rsp)
1527         movdqa  %xmm12, 104(%rsp)
1528         movdqa  %xmm13, 120(%rsp)
1529         movdqa  %xmm14, 136(%rsp)
1530         movdqa  %xmm15, 152(%rsp)
1531         pushq   %rdi
1532         pushq   %rsi
1533         movq    %rcx, %rdi
1534         movq    %rdx, %rsi
1535         movq    %r8, %rdx
1536         movq    %r9, %rcx
1537 #endif
1538         subq    $392, %rsp
1539
1540         scrypt_shuffle %rdi, 0, %rsp, 0
1541         scrypt_shuffle %rdi, 64, %rsp, 64
1542         scrypt_shuffle %rsi, 0, %rsp, 128
1543         scrypt_shuffle %rsi, 64, %rsp, 192
1544         scrypt_shuffle %rdx, 0, %rsp, 256
1545         scrypt_shuffle %rdx, 64, %rsp, 320
1546
1547         movdqa  128+64(%rsp), %xmm8
1548         movdqa  128+80(%rsp), %xmm9
1549         movdqa  128+96(%rsp), %xmm10
1550         movdqa  128+112(%rsp), %xmm11
1551
1552         movq    %rcx, %rbp
1553         leaq    3*131072(%rcx), %rax
1554 scrypt_core_3way_loop1:
1555         movdqa  %xmm8, %xmm12
1556         movdqa  %xmm9, %xmm13
1557         movdqa  %xmm10, %xmm14
1558         movdqa  %xmm11, %xmm15
1559         movdqa  0(%rsp), %xmm0
1560         movdqa  16(%rsp), %xmm1
1561         movdqa  32(%rsp), %xmm2
1562         movdqa  48(%rsp), %xmm3
1563         movdqa  64(%rsp), %xmm4
1564         movdqa  80(%rsp), %xmm5
1565         movdqa  96(%rsp), %xmm6
1566         movdqa  112(%rsp), %xmm7
1567         movdqa  128+0(%rsp), %xmm8
1568         movdqa  128+16(%rsp), %xmm9
1569         movdqa  128+32(%rsp), %xmm10
1570         movdqa  128+48(%rsp), %xmm11
1571         pxor    %xmm4, %xmm0
1572         pxor    %xmm5, %xmm1
1573         pxor    %xmm6, %xmm2
1574         pxor    %xmm7, %xmm3
1575         movdqa  %xmm0, 0(%rbp)
1576         movdqa  %xmm1, 16(%rbp)
1577         movdqa  %xmm2, 32(%rbp)
1578         movdqa  %xmm3, 48(%rbp)
1579         movdqa  %xmm4, 64(%rbp)
1580         movdqa  %xmm5, 80(%rbp)
1581         movdqa  %xmm6, 96(%rbp)
1582         movdqa  %xmm7, 112(%rbp)
1583         pxor    %xmm12, %xmm8
1584         pxor    %xmm13, %xmm9
1585         pxor    %xmm14, %xmm10
1586         pxor    %xmm15, %xmm11
1587         movdqa  %xmm8, 128+0(%rbp)
1588         movdqa  %xmm9, 128+16(%rbp)
1589         movdqa  %xmm10, 128+32(%rbp)
1590         movdqa  %xmm11, 128+48(%rbp)
1591         movdqa  %xmm12, 128+64(%rbp)
1592         movdqa  %xmm13, 128+80(%rbp)
1593         movdqa  %xmm14, 128+96(%rbp)
1594         movdqa  %xmm15, 128+112(%rbp)
1595         movdqa  256+0(%rsp), %xmm12
1596         movdqa  256+16(%rsp), %xmm13
1597         movdqa  256+32(%rsp), %xmm14
1598         movdqa  256+48(%rsp), %xmm15
1599         movdqa  256+64(%rsp), %xmm4
1600         movdqa  256+80(%rsp), %xmm5
1601         movdqa  256+96(%rsp), %xmm6
1602         movdqa  256+112(%rsp), %xmm7
1603         pxor    %xmm4, %xmm12
1604         pxor    %xmm5, %xmm13
1605         pxor    %xmm6, %xmm14
1606         pxor    %xmm7, %xmm15
1607         movdqa  %xmm12, 256+0(%rbp)
1608         movdqa  %xmm13, 256+16(%rbp)
1609         movdqa  %xmm14, 256+32(%rbp)
1610         movdqa  %xmm15, 256+48(%rbp)
1611         movdqa  %xmm4, 256+64(%rbp)
1612         movdqa  %xmm5, 256+80(%rbp)
1613         movdqa  %xmm6, 256+96(%rbp)
1614         movdqa  %xmm7, 256+112(%rbp)
1615
1616         xmm_salsa8_core_3way
1617         paddd   0(%rbp), %xmm0
1618         paddd   16(%rbp), %xmm1
1619         paddd   32(%rbp), %xmm2
1620         paddd   48(%rbp), %xmm3
1621         paddd   128+0(%rbp), %xmm8
1622         paddd   128+16(%rbp), %xmm9
1623         paddd   128+32(%rbp), %xmm10
1624         paddd   128+48(%rbp), %xmm11
1625         paddd   256+0(%rbp), %xmm12
1626         paddd   256+16(%rbp), %xmm13
1627         paddd   256+32(%rbp), %xmm14
1628         paddd   256+48(%rbp), %xmm15
1629         movdqa  %xmm0, 0(%rsp)
1630         movdqa  %xmm1, 16(%rsp)
1631         movdqa  %xmm2, 32(%rsp)
1632         movdqa  %xmm3, 48(%rsp)
1633         movdqa  %xmm8, 128+0(%rsp)
1634         movdqa  %xmm9, 128+16(%rsp)
1635         movdqa  %xmm10, 128+32(%rsp)
1636         movdqa  %xmm11, 128+48(%rsp)
1637         movdqa  %xmm12, 256+0(%rsp)
1638         movdqa  %xmm13, 256+16(%rsp)
1639         movdqa  %xmm14, 256+32(%rsp)
1640         movdqa  %xmm15, 256+48(%rsp)
1641
1642         pxor    64(%rsp), %xmm0
1643         pxor    80(%rsp), %xmm1
1644         pxor    96(%rsp), %xmm2
1645         pxor    112(%rsp), %xmm3
1646         pxor    128+64(%rsp), %xmm8
1647         pxor    128+80(%rsp), %xmm9
1648         pxor    128+96(%rsp), %xmm10
1649         pxor    128+112(%rsp), %xmm11
1650         pxor    256+64(%rsp), %xmm12
1651         pxor    256+80(%rsp), %xmm13
1652         pxor    256+96(%rsp), %xmm14
1653         pxor    256+112(%rsp), %xmm15
1654         movdqa  %xmm0, 64(%rsp)
1655         movdqa  %xmm1, 80(%rsp)
1656         movdqa  %xmm2, 96(%rsp)
1657         movdqa  %xmm3, 112(%rsp)
1658         movdqa  %xmm8, 128+64(%rsp)
1659         movdqa  %xmm9, 128+80(%rsp)
1660         movdqa  %xmm10, 128+96(%rsp)
1661         movdqa  %xmm11, 128+112(%rsp)
1662         movdqa  %xmm12, 256+64(%rsp)
1663         movdqa  %xmm13, 256+80(%rsp)
1664         movdqa  %xmm14, 256+96(%rsp)
1665         movdqa  %xmm15, 256+112(%rsp)
1666         xmm_salsa8_core_3way
1667         paddd   64(%rsp), %xmm0
1668         paddd   80(%rsp), %xmm1
1669         paddd   96(%rsp), %xmm2
1670         paddd   112(%rsp), %xmm3
1671         paddd   128+64(%rsp), %xmm8
1672         paddd   128+80(%rsp), %xmm9
1673         paddd   128+96(%rsp), %xmm10
1674         paddd   128+112(%rsp), %xmm11
1675         paddd   256+64(%rsp), %xmm12
1676         paddd   256+80(%rsp), %xmm13
1677         paddd   256+96(%rsp), %xmm14
1678         paddd   256+112(%rsp), %xmm15
1679         movdqa  %xmm0, 64(%rsp)
1680         movdqa  %xmm1, 80(%rsp)
1681         movdqa  %xmm2, 96(%rsp)
1682         movdqa  %xmm3, 112(%rsp)
1683         movdqa  %xmm8, 128+64(%rsp)
1684         movdqa  %xmm9, 128+80(%rsp)
1685         movdqa  %xmm10, 128+96(%rsp)
1686         movdqa  %xmm11, 128+112(%rsp)
1687         movdqa  %xmm12, 256+64(%rsp)
1688         movdqa  %xmm13, 256+80(%rsp)
1689         movdqa  %xmm14, 256+96(%rsp)
1690         movdqa  %xmm15, 256+112(%rsp)
1691
1692         addq    $3*128, %rbp
1693         cmpq    %rax, %rbp
1694         jne scrypt_core_3way_loop1
1695
1696         movq    $1024, %rax
1697 scrypt_core_3way_loop2:
1698         movl    64(%rsp), %ebp
1699         andl    $1023, %ebp
1700         leal    (%ebp, %ebp, 2), %ebp
1701         shll    $7, %ebp
1702         movl    128+64(%rsp), %ebx
1703         andl    $1023, %ebx
1704         leal    (%ebx, %ebx, 2), %ebx
1705         shll    $7, %ebx
1706         addl    $128, %ebx
1707         movl    256+64(%rsp), %r8d
1708         andl    $1023, %r8d
1709         leal    (%r8d, %r8d, 2), %r8d
1710         shll    $7, %r8d
1711         addl    $256, %r8d
1712         movdqa  0(%rsp), %xmm0
1713         movdqa  16(%rsp), %xmm1
1714         movdqa  32(%rsp), %xmm2
1715         movdqa  48(%rsp), %xmm3
1716         movdqa  128+0(%rsp), %xmm8
1717         movdqa  128+16(%rsp), %xmm9
1718         movdqa  128+32(%rsp), %xmm10
1719         movdqa  128+48(%rsp), %xmm11
1720         movdqa  256+0(%rsp), %xmm12
1721         movdqa  256+16(%rsp), %xmm13
1722         movdqa  256+32(%rsp), %xmm14
1723         movdqa  256+48(%rsp), %xmm15
1724         pxor    0(%rcx, %rbp), %xmm0
1725         pxor    16(%rcx, %rbp), %xmm1
1726         pxor    32(%rcx, %rbp), %xmm2
1727         pxor    48(%rcx, %rbp), %xmm3
1728         pxor    0(%rcx, %rbx), %xmm8
1729         pxor    16(%rcx, %rbx), %xmm9
1730         pxor    32(%rcx, %rbx), %xmm10
1731         pxor    48(%rcx, %rbx), %xmm11
1732         pxor    0(%rcx, %r8), %xmm12
1733         pxor    16(%rcx, %r8), %xmm13
1734         pxor    32(%rcx, %r8), %xmm14
1735         pxor    48(%rcx, %r8), %xmm15
1736
1737         pxor    64(%rsp), %xmm0
1738         pxor    80(%rsp), %xmm1
1739         pxor    96(%rsp), %xmm2
1740         pxor    112(%rsp), %xmm3
1741         pxor    128+64(%rsp), %xmm8
1742         pxor    128+80(%rsp), %xmm9
1743         pxor    128+96(%rsp), %xmm10
1744         pxor    128+112(%rsp), %xmm11
1745         pxor    256+64(%rsp), %xmm12
1746         pxor    256+80(%rsp), %xmm13
1747         pxor    256+96(%rsp), %xmm14
1748         pxor    256+112(%rsp), %xmm15
1749         movdqa  %xmm0, 0(%rsp)
1750         movdqa  %xmm1, 16(%rsp)
1751         movdqa  %xmm2, 32(%rsp)
1752         movdqa  %xmm3, 48(%rsp)
1753         movdqa  %xmm8, 128+0(%rsp)
1754         movdqa  %xmm9, 128+16(%rsp)
1755         movdqa  %xmm10, 128+32(%rsp)
1756         movdqa  %xmm11, 128+48(%rsp)
1757         movdqa  %xmm12, 256+0(%rsp)
1758         movdqa  %xmm13, 256+16(%rsp)
1759         movdqa  %xmm14, 256+32(%rsp)
1760         movdqa  %xmm15, 256+48(%rsp)
1761         xmm_salsa8_core_3way
1762         paddd   0(%rsp), %xmm0
1763         paddd   16(%rsp), %xmm1
1764         paddd   32(%rsp), %xmm2
1765         paddd   48(%rsp), %xmm3
1766         paddd   128+0(%rsp), %xmm8
1767         paddd   128+16(%rsp), %xmm9
1768         paddd   128+32(%rsp), %xmm10
1769         paddd   128+48(%rsp), %xmm11
1770         paddd   256+0(%rsp), %xmm12
1771         paddd   256+16(%rsp), %xmm13
1772         paddd   256+32(%rsp), %xmm14
1773         paddd   256+48(%rsp), %xmm15
1774         movdqa  %xmm0, 0(%rsp)
1775         movdqa  %xmm1, 16(%rsp)
1776         movdqa  %xmm2, 32(%rsp)
1777         movdqa  %xmm3, 48(%rsp)
1778         movdqa  %xmm8, 128+0(%rsp)
1779         movdqa  %xmm9, 128+16(%rsp)
1780         movdqa  %xmm10, 128+32(%rsp)
1781         movdqa  %xmm11, 128+48(%rsp)
1782         movdqa  %xmm12, 256+0(%rsp)
1783         movdqa  %xmm13, 256+16(%rsp)
1784         movdqa  %xmm14, 256+32(%rsp)
1785         movdqa  %xmm15, 256+48(%rsp)
1786
1787         pxor    64(%rcx, %rbp), %xmm0
1788         pxor    80(%rcx, %rbp), %xmm1
1789         pxor    96(%rcx, %rbp), %xmm2
1790         pxor    112(%rcx, %rbp), %xmm3
1791         pxor    64(%rcx, %rbx), %xmm8
1792         pxor    80(%rcx, %rbx), %xmm9
1793         pxor    96(%rcx, %rbx), %xmm10
1794         pxor    112(%rcx, %rbx), %xmm11
1795         pxor    64(%rcx, %r8), %xmm12
1796         pxor    80(%rcx, %r8), %xmm13
1797         pxor    96(%rcx, %r8), %xmm14
1798         pxor    112(%rcx, %r8), %xmm15
1799         pxor    64(%rsp), %xmm0
1800         pxor    80(%rsp), %xmm1
1801         pxor    96(%rsp), %xmm2
1802         pxor    112(%rsp), %xmm3
1803         pxor    128+64(%rsp), %xmm8
1804         pxor    128+80(%rsp), %xmm9
1805         pxor    128+96(%rsp), %xmm10
1806         pxor    128+112(%rsp), %xmm11
1807         pxor    256+64(%rsp), %xmm12
1808         pxor    256+80(%rsp), %xmm13
1809         pxor    256+96(%rsp), %xmm14
1810         pxor    256+112(%rsp), %xmm15
1811         movdqa  %xmm0, 64(%rsp)
1812         movdqa  %xmm1, 80(%rsp)
1813         movdqa  %xmm2, 96(%rsp)
1814         movdqa  %xmm3, 112(%rsp)
1815         movdqa  %xmm8, 128+64(%rsp)
1816         movdqa  %xmm9, 128+80(%rsp)
1817         movdqa  %xmm10, 128+96(%rsp)
1818         movdqa  %xmm11, 128+112(%rsp)
1819         movdqa  %xmm12, 256+64(%rsp)
1820         movdqa  %xmm13, 256+80(%rsp)
1821         movdqa  %xmm14, 256+96(%rsp)
1822         movdqa  %xmm15, 256+112(%rsp)
1823         xmm_salsa8_core_3way
1824         paddd   64(%rsp), %xmm0
1825         paddd   80(%rsp), %xmm1
1826         paddd   96(%rsp), %xmm2
1827         paddd   112(%rsp), %xmm3
1828         paddd   128+64(%rsp), %xmm8
1829         paddd   128+80(%rsp), %xmm9
1830         paddd   128+96(%rsp), %xmm10
1831         paddd   128+112(%rsp), %xmm11
1832         paddd   256+64(%rsp), %xmm12
1833         paddd   256+80(%rsp), %xmm13
1834         paddd   256+96(%rsp), %xmm14
1835         paddd   256+112(%rsp), %xmm15
1836         movdqa  %xmm0, 64(%rsp)
1837         movdqa  %xmm1, 80(%rsp)
1838         movdqa  %xmm2, 96(%rsp)
1839         movdqa  %xmm3, 112(%rsp)
1840         movdqa  %xmm8, 128+64(%rsp)
1841         movdqa  %xmm9, 128+80(%rsp)
1842         movdqa  %xmm10, 128+96(%rsp)
1843         movdqa  %xmm11, 128+112(%rsp)
1844         movdqa  %xmm12, 256+64(%rsp)
1845         movdqa  %xmm13, 256+80(%rsp)
1846         movdqa  %xmm14, 256+96(%rsp)
1847         movdqa  %xmm15, 256+112(%rsp)
1848
1849         subq    $1, %rax
1850         ja scrypt_core_3way_loop2
1851
1852         scrypt_shuffle %rsp, 0, %rdi, 0
1853         scrypt_shuffle %rsp, 64, %rdi, 64
1854         scrypt_shuffle %rsp, 128, %rsi, 0
1855         scrypt_shuffle %rsp, 192, %rsi, 64
1856         scrypt_shuffle %rsp, 256, %rdx, 0
1857         scrypt_shuffle %rsp, 320, %rdx, 64
1858
1859         addq    $392, %rsp
1860 #if defined(WIN64)
1861         popq    %rsi
1862         popq    %rdi
1863         movdqa  8(%rsp), %xmm6
1864         movdqa  24(%rsp), %xmm7
1865         movdqa  40(%rsp), %xmm8
1866         movdqa  56(%rsp), %xmm9
1867         movdqa  72(%rsp), %xmm10
1868         movdqa  88(%rsp), %xmm11
1869         movdqa  104(%rsp), %xmm12
1870         movdqa  120(%rsp), %xmm13
1871         movdqa  136(%rsp), %xmm14
1872         movdqa  152(%rsp), %xmm15
1873         addq    $176, %rsp
1874 #endif
1875         popq    %rbp
1876         popq    %rbx
1877         ret
1878
1879 #endif