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