Cache scrypt hashes on disk
[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 #define 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
65
66 #define gen_salsa8_core_doubleround() \
67         movq    72(%rsp), %r15; \
68         leaq    (%r14, %rdx), %rbp; \
69         roll    $7, %ebp; \
70         xorq    %rbp, %r9; \
71         leaq    (%rdi, %r15), %rbp; \
72         roll    $7, %ebp; \
73         xorq    %rbp, %r10; \
74         leaq    (%rdx, %r9), %rbp; \
75         roll    $9, %ebp; \
76         xorq    %rbp, %r11; \
77         leaq    (%r15, %r10), %rbp; \
78         roll    $9, %ebp; \
79         xorq    %rbp, %r13; \
80         leaq    (%r9, %r11), %rbp; \
81         roll    $13, %ebp; \
82         xorq    %rbp, %r14; \
83         leaq    (%r10, %r13), %rbp; \
84         roll    $13, %ebp; \
85         xorq    %rbp, %rdi; \
86         leaq    (%r11, %r14), %rbp; \
87         roll    $18, %ebp; \
88         xorq    %rbp, %rdx; \
89         leaq    (%r13, %rdi), %rbp; \
90         roll    $18, %ebp; \
91         xorq    %rbp, %r15; \
92         movq    48(%rsp), %rbp; \
93         movq    %r15, 72(%rsp); \
94         leaq    (%rax, %rbp), %r15; \
95         roll    $7, %r15d; \
96         xorq    %r15, %rbx; \
97         leaq    (%rbp, %rbx), %r15; \
98         roll    $9, %r15d; \
99         xorq    %r15, %rcx; \
100         leaq    (%rbx, %rcx), %r15; \
101         roll    $13, %r15d; \
102         xorq    %r15, %rax; \
103         leaq    (%rcx, %rax), %r15; \
104         roll    $18, %r15d; \
105         xorq    %r15, %rbp; \
106         movq    88(%rsp), %r15; \
107         movq    %rbp, 48(%rsp); \
108         leaq    (%r12, %r15), %rbp; \
109         roll    $7, %ebp; \
110         xorq    %rbp, %rsi; \
111         leaq    (%r15, %rsi), %rbp; \
112         roll    $9, %ebp; \
113         xorq    %rbp, %r8; \
114         leaq    (%rsi, %r8), %rbp; \
115         roll    $13, %ebp; \
116         xorq    %rbp, %r12; \
117         leaq    (%r8, %r12), %rbp; \
118         roll    $18, %ebp; \
119         xorq    %rbp, %r15; \
120         movq    %r15, 88(%rsp); \
121         movq    72(%rsp), %r15; \
122         leaq    (%rsi, %rdx), %rbp; \
123         roll    $7, %ebp; \
124         xorq    %rbp, %rdi; \
125         leaq    (%r9, %r15), %rbp; \
126         roll    $7, %ebp; \
127         xorq    %rbp, %rax; \
128         leaq    (%rdx, %rdi), %rbp; \
129         roll    $9, %ebp; \
130         xorq    %rbp, %rcx; \
131         leaq    (%r15, %rax), %rbp; \
132         roll    $9, %ebp; \
133         xorq    %rbp, %r8; \
134         leaq    (%rdi, %rcx), %rbp; \
135         roll    $13, %ebp; \
136         xorq    %rbp, %rsi; \
137         leaq    (%rax, %r8), %rbp; \
138         roll    $13, %ebp; \
139         xorq    %rbp, %r9; \
140         leaq    (%rcx, %rsi), %rbp; \
141         roll    $18, %ebp; \
142         xorq    %rbp, %rdx; \
143         leaq    (%r8, %r9), %rbp; \
144         roll    $18, %ebp; \
145         xorq    %rbp, %r15; \
146         movq    48(%rsp), %rbp; \
147         movq    %r15, 72(%rsp); \
148         leaq    (%r10, %rbp), %r15; \
149         roll    $7, %r15d; \
150         xorq    %r15, %r12; \
151         leaq    (%rbp, %r12), %r15; \
152         roll    $9, %r15d; \
153         xorq    %r15, %r11; \
154         leaq    (%r12, %r11), %r15; \
155         roll    $13, %r15d; \
156         xorq    %r15, %r10; \
157         leaq    (%r11, %r10), %r15; \
158         roll    $18, %r15d; \
159         xorq    %r15, %rbp; \
160         movq    88(%rsp), %r15; \
161         movq    %rbp, 48(%rsp); \
162         leaq    (%rbx, %r15), %rbp; \
163         roll    $7, %ebp; \
164         xorq    %rbp, %r14; \
165         leaq    (%r15, %r14), %rbp; \
166         roll    $9, %ebp; \
167         xorq    %rbp, %r13; \
168         leaq    (%r14, %r13), %rbp; \
169         roll    $13, %ebp; \
170         xorq    %rbp, %rbx; \
171         leaq    (%r13, %rbx), %rbp; \
172         roll    $18, %ebp; \
173         xorq    %rbp, %r15; \
174         movq    %r15, 88(%rsp); \
175
176
177         .text
178         .align 32
179 gen_salsa8_core:
180         # 0: %rdx, %rdi, %rcx, %rsi
181         movq    8(%rsp), %rdi
182         movq    %rdi, %rdx
183         shrq    $32, %rdi
184         movq    16(%rsp), %rsi
185         movq    %rsi, %rcx
186         shrq    $32, %rsi
187         # 1: %r9, 72(%rsp), %rax, %r8
188         movq    24(%rsp), %r8
189         movq    %r8, %r9
190         shrq    $32, %r8
191         movq    %r8, 72(%rsp)
192         movq    32(%rsp), %r8
193         movq    %r8, %rax
194         shrq    $32, %r8
195         # 2: %r11, %r10, 48(%rsp), %r12
196         movq    40(%rsp), %r10
197         movq    %r10, %r11
198         shrq    $32, %r10
199         movq    48(%rsp), %r12
200         #movq   %r12, %r13
201         #movq   %r13, 48(%rsp)
202         shrq    $32, %r12
203         # 3: %r14, %r13, %rbx, 88(%rsp)
204         movq    56(%rsp), %r13
205         movq    %r13, %r14
206         shrq    $32, %r13
207         movq    64(%rsp), %r15
208         movq    %r15, %rbx
209         shrq    $32, %r15
210         movq    %r15, 88(%rsp)
211
212         gen_salsa8_core_doubleround()
213         gen_salsa8_core_doubleround()
214         gen_salsa8_core_doubleround()
215         gen_salsa8_core_doubleround()
216
217         movl    %edx, %edx
218         shlq    $32, %rdi
219         addq    %rdi, %rdx
220         movd    %rdx, %xmm0
221
222         movl    %ecx, %ecx
223         shlq    $32, %rsi
224         addq    %rsi, %rcx
225         movd    %rcx, %xmm4
226
227         movq    72(%rsp), %rdi
228         movl    %r9d, %r9d
229         shlq    $32, %rdi
230         addq    %rdi, %r9
231         movd    %r9, %xmm1
232
233         movl    %eax, %eax
234         shlq    $32, %r8
235         addq    %r8, %rax
236         movd    %rax, %xmm5
237
238         movl    %r11d, %r11d
239         shlq    $32, %r10
240         addq    %r10, %r11
241         movd    %r11, %xmm2
242
243         movl    48(%rsp), %r8d
244         shlq    $32, %r12
245         addq    %r12, %r8
246         movd    %r8, %xmm6
247
248         movl    %r14d, %r14d
249         shlq    $32, %r13
250         addq    %r13, %r14
251         movd    %r14, %xmm3
252
253         movq    88(%rsp), %rdi
254         movl    %ebx, %ebx
255         shlq    $32, %rdi
256         addq    %rdi, %rbx
257         movd    %rbx, %xmm7
258
259         punpcklqdq      %xmm4, %xmm0
260         punpcklqdq      %xmm5, %xmm1
261         punpcklqdq      %xmm6, %xmm2
262         punpcklqdq      %xmm7, %xmm3
263
264         #movq   %rdx, 8(%rsp)
265         #movq   %rcx, 16(%rsp)
266         #movq   %r9, 24(%rsp)
267         #movq   %rax, 32(%rsp)
268         #movq   %r11, 40(%rsp)
269         #movq   %r8, 48(%rsp)
270         #movq   %r14, 56(%rsp)
271         #movq   %rbx, 64(%rsp)
272
273         ret
274
275
276         .text
277         .align 32
278         .globl scrypt_core
279         .globl _scrypt_core
280 scrypt_core:
281 _scrypt_core:
282         pushq   %rbx
283         pushq   %rbp
284         pushq   %r12
285         pushq   %r13
286         pushq   %r14
287         pushq   %r15
288 #if defined(WIN64)
289         subq    $176, %rsp
290         movdqa  %xmm6, 8(%rsp)
291         movdqa  %xmm7, 24(%rsp)
292         movdqa  %xmm8, 40(%rsp)
293         movdqa  %xmm9, 56(%rsp)
294         movdqa  %xmm10, 72(%rsp)
295         movdqa  %xmm11, 88(%rsp)
296         movdqa  %xmm12, 104(%rsp)
297         movdqa  %xmm13, 120(%rsp)
298         movdqa  %xmm14, 136(%rsp)
299         movdqa  %xmm15, 152(%rsp)
300         pushq   %rdi
301         pushq   %rsi
302         movq    %rcx, %rdi
303         movq    %rdx, %rsi
304 #endif
305
306 #define scrypt_core_cleanup() \
307         popq    %r15; \
308         popq    %r14; \
309         popq    %r13; \
310         popq    %r12; \
311         popq    %rbp; \
312         popq    %rbx; \
313
314
315         # GenuineIntel processors have fast SIMD
316         xorl    %eax, %eax
317         cpuid
318         cmpl    $0x6c65746e, %ecx
319         jne gen_scrypt_core
320         cmpl    $0x49656e69, %edx
321         jne gen_scrypt_core
322         cmpl    $0x756e6547, %ebx
323         je xmm_scrypt_core
324
325 gen_scrypt_core:
326         subq    $136, %rsp
327         movdqa  0(%rdi), %xmm8
328         movdqa  16(%rdi), %xmm9
329         movdqa  32(%rdi), %xmm10
330         movdqa  48(%rdi), %xmm11
331         movdqa  64(%rdi), %xmm12
332         movdqa  80(%rdi), %xmm13
333         movdqa  96(%rdi), %xmm14
334         movdqa  112(%rdi), %xmm15
335
336         leaq    131072(%rsi), %rcx
337         movq    %rdi, 104(%rsp)
338         movq    %rsi, 112(%rsp)
339         movq    %rcx, 120(%rsp)
340 gen_scrypt_core_loop1:
341         movdqa  %xmm8, 0(%rsi)
342         movdqa  %xmm9, 16(%rsi)
343         movdqa  %xmm10, 32(%rsi)
344         movdqa  %xmm11, 48(%rsi)
345         movdqa  %xmm12, 64(%rsi)
346         movdqa  %xmm13, 80(%rsi)
347         movdqa  %xmm14, 96(%rsi)
348         movdqa  %xmm15, 112(%rsi)
349
350         pxor    %xmm12, %xmm8
351         pxor    %xmm13, %xmm9
352         pxor    %xmm14, %xmm10
353         pxor    %xmm15, %xmm11
354         movdqa  %xmm8, 0(%rsp)
355         movdqa  %xmm9, 16(%rsp)
356         movdqa  %xmm10, 32(%rsp)
357         movdqa  %xmm11, 48(%rsp)
358         movq    %rsi, 128(%rsp)
359         call gen_salsa8_core
360         paddd   %xmm0, %xmm8
361         paddd   %xmm1, %xmm9
362         paddd   %xmm2, %xmm10
363         paddd   %xmm3, %xmm11
364
365         pxor    %xmm8, %xmm12
366         pxor    %xmm9, %xmm13
367         pxor    %xmm10, %xmm14
368         pxor    %xmm11, %xmm15
369         movdqa  %xmm12, 0(%rsp)
370         movdqa  %xmm13, 16(%rsp)
371         movdqa  %xmm14, 32(%rsp)
372         movdqa  %xmm15, 48(%rsp)
373         call gen_salsa8_core
374         movq    128(%rsp), %rsi
375         paddd   %xmm0, %xmm12
376         paddd   %xmm1, %xmm13
377         paddd   %xmm2, %xmm14
378         paddd   %xmm3, %xmm15
379
380         addq    $128, %rsi
381         movq    120(%rsp), %rcx
382         cmpq    %rcx, %rsi
383         jne gen_scrypt_core_loop1
384
385         movq    $1024, %rcx
386 gen_scrypt_core_loop2:
387         movq    112(%rsp), %rsi
388         movd    %xmm12, %edx
389         andl    $1023, %edx
390         shll    $7, %edx
391         movdqa  0(%rsi, %rdx), %xmm0
392         movdqa  16(%rsi, %rdx), %xmm1
393         movdqa  32(%rsi, %rdx), %xmm2
394         movdqa  48(%rsi, %rdx), %xmm3
395         movdqa  64(%rsi, %rdx), %xmm4
396         movdqa  80(%rsi, %rdx), %xmm5
397         movdqa  96(%rsi, %rdx), %xmm6
398         movdqa  112(%rsi, %rdx), %xmm7
399         pxor    %xmm0, %xmm8
400         pxor    %xmm1, %xmm9
401         pxor    %xmm2, %xmm10
402         pxor    %xmm3, %xmm11
403         pxor    %xmm4, %xmm12
404         pxor    %xmm5, %xmm13
405         pxor    %xmm6, %xmm14
406         pxor    %xmm7, %xmm15
407
408         pxor    %xmm12, %xmm8
409         pxor    %xmm13, %xmm9
410         pxor    %xmm14, %xmm10
411         pxor    %xmm15, %xmm11
412         movdqa  %xmm8, 0(%rsp)
413         movdqa  %xmm9, 16(%rsp)
414         movdqa  %xmm10, 32(%rsp)
415         movdqa  %xmm11, 48(%rsp)
416         movq    %rcx, 128(%rsp)
417         call gen_salsa8_core
418         paddd   %xmm0, %xmm8
419         paddd   %xmm1, %xmm9
420         paddd   %xmm2, %xmm10
421         paddd   %xmm3, %xmm11
422
423         pxor    %xmm8, %xmm12
424         pxor    %xmm9, %xmm13
425         pxor    %xmm10, %xmm14
426         pxor    %xmm11, %xmm15
427         movdqa  %xmm12, 0(%rsp)
428         movdqa  %xmm13, 16(%rsp)
429         movdqa  %xmm14, 32(%rsp)
430         movdqa  %xmm15, 48(%rsp)
431         call gen_salsa8_core
432         movq    128(%rsp), %rcx
433         paddd   %xmm0, %xmm12
434         paddd   %xmm1, %xmm13
435         paddd   %xmm2, %xmm14
436         paddd   %xmm3, %xmm15
437
438         subq    $1, %rcx
439         ja gen_scrypt_core_loop2
440
441         movq    104(%rsp), %rdi
442         movdqa  %xmm8, 0(%rdi)
443         movdqa  %xmm9, 16(%rdi)
444         movdqa  %xmm10, 32(%rdi)
445         movdqa  %xmm11, 48(%rdi)
446         movdqa  %xmm12, 64(%rdi)
447         movdqa  %xmm13, 80(%rdi)
448         movdqa  %xmm14, 96(%rdi)
449         movdqa  %xmm15, 112(%rdi)
450
451         addq    $136, %rsp
452         scrypt_core_cleanup()
453         ret
454
455
456 #define xmm_salsa8_core_doubleround() \
457         movdqa  %xmm1, %xmm4; \
458         paddd   %xmm0, %xmm4; \
459         movdqa  %xmm4, %xmm5; \
460         pslld   $7, %xmm4; \
461         psrld   $25, %xmm5; \
462         pxor    %xmm4, %xmm3; \
463         pxor    %xmm5, %xmm3; \
464         movdqa  %xmm0, %xmm4; \
465         paddd   %xmm3, %xmm4; \
466         movdqa  %xmm4, %xmm5; \
467         pslld   $9, %xmm4; \
468         psrld   $23, %xmm5; \
469         pxor    %xmm4, %xmm2; \
470         movdqa  %xmm3, %xmm4; \
471         pshufd  $0x93, %xmm3, %xmm3; \
472         pxor    %xmm5, %xmm2; \
473         paddd   %xmm2, %xmm4; \
474         movdqa  %xmm4, %xmm5; \
475         pslld   $13, %xmm4; \
476         psrld   $19, %xmm5; \
477         pxor    %xmm4, %xmm1; \
478         movdqa  %xmm2, %xmm4; \
479         pshufd  $0x4e, %xmm2, %xmm2; \
480         pxor    %xmm5, %xmm1; \
481         paddd   %xmm1, %xmm4; \
482         movdqa  %xmm4, %xmm5; \
483         pslld   $18, %xmm4; \
484         psrld   $14, %xmm5; \
485         pxor    %xmm4, %xmm0; \
486         pshufd  $0x39, %xmm1, %xmm1; \
487         pxor    %xmm5, %xmm0; \
488         movdqa  %xmm3, %xmm4; \
489         paddd   %xmm0, %xmm4; \
490         movdqa  %xmm4, %xmm5; \
491         pslld   $7, %xmm4; \
492         psrld   $25, %xmm5; \
493         pxor    %xmm4, %xmm1; \
494         pxor    %xmm5, %xmm1; \
495         movdqa  %xmm0, %xmm4; \
496         paddd   %xmm1, %xmm4; \
497         movdqa  %xmm4, %xmm5; \
498         pslld   $9, %xmm4; \
499         psrld   $23, %xmm5; \
500         pxor    %xmm4, %xmm2; \
501         movdqa  %xmm1, %xmm4; \
502         pshufd  $0x93, %xmm1, %xmm1; \
503         pxor    %xmm5, %xmm2; \
504         paddd   %xmm2, %xmm4; \
505         movdqa  %xmm4, %xmm5; \
506         pslld   $13, %xmm4; \
507         psrld   $19, %xmm5; \
508         pxor    %xmm4, %xmm3; \
509         movdqa  %xmm2, %xmm4; \
510         pshufd  $0x4e, %xmm2, %xmm2; \
511         pxor    %xmm5, %xmm3; \
512         paddd   %xmm3, %xmm4; \
513         movdqa  %xmm4, %xmm5; \
514         pslld   $18, %xmm4; \
515         psrld   $14, %xmm5; \
516         pxor    %xmm4, %xmm0; \
517         pshufd  $0x39, %xmm3, %xmm3; \
518         pxor    %xmm5, %xmm0; \
519
520
521 #define xmm_salsa8_core() \
522         xmm_salsa8_core_doubleround(); \
523         xmm_salsa8_core_doubleround(); \
524         xmm_salsa8_core_doubleround(); \
525         xmm_salsa8_core_doubleround(); \
526
527
528         .align 32
529 xmm_scrypt_core:
530         # shuffle 1st block into %xmm8-%xmm11
531         movl    60(%rdi), %edx
532         movl    44(%rdi), %ecx
533         movl    28(%rdi), %ebx
534         movl    12(%rdi), %eax
535         movd    %edx, %xmm0
536         movd    %ecx, %xmm1
537         movd    %ebx, %xmm2
538         movd    %eax, %xmm3
539         movl    40(%rdi), %ecx
540         movl    24(%rdi), %ebx
541         movl    8(%rdi), %eax
542         movl    56(%rdi), %edx
543         pshufd  $0x93, %xmm0, %xmm0
544         pshufd  $0x93, %xmm1, %xmm1
545         pshufd  $0x93, %xmm2, %xmm2
546         pshufd  $0x93, %xmm3, %xmm3
547         movd    %ecx, %xmm4
548         movd    %ebx, %xmm5
549         movd    %eax, %xmm6
550         movd    %edx, %xmm7
551         paddd   %xmm4, %xmm0
552         paddd   %xmm5, %xmm1
553         paddd   %xmm6, %xmm2
554         paddd   %xmm7, %xmm3
555         movl    20(%rdi), %ebx
556         movl    4(%rdi), %eax
557         movl    52(%rdi), %edx
558         movl    36(%rdi), %ecx
559         pshufd  $0x93, %xmm0, %xmm0
560         pshufd  $0x93, %xmm1, %xmm1
561         pshufd  $0x93, %xmm2, %xmm2
562         pshufd  $0x93, %xmm3, %xmm3
563         movd    %ebx, %xmm4
564         movd    %eax, %xmm5
565         movd    %edx, %xmm6
566         movd    %ecx, %xmm7
567         paddd   %xmm4, %xmm0
568         paddd   %xmm5, %xmm1
569         paddd   %xmm6, %xmm2
570         paddd   %xmm7, %xmm3
571         movl    0(%rdi), %eax
572         movl    48(%rdi), %edx
573         movl    32(%rdi), %ecx
574         movl    16(%rdi), %ebx
575         pshufd  $0x93, %xmm0, %xmm0
576         pshufd  $0x93, %xmm1, %xmm1
577         pshufd  $0x93, %xmm2, %xmm2
578         pshufd  $0x93, %xmm3, %xmm3
579         movd    %eax, %xmm8
580         movd    %edx, %xmm9
581         movd    %ecx, %xmm10
582         movd    %ebx, %xmm11
583         paddd   %xmm0, %xmm8
584         paddd   %xmm1, %xmm9
585         paddd   %xmm2, %xmm10
586         paddd   %xmm3, %xmm11
587
588         # shuffle 2nd block into %xmm12-%xmm15
589         movl    124(%rdi), %edx
590         movl    108(%rdi), %ecx
591         movl    92(%rdi), %ebx
592         movl    76(%rdi), %eax
593         movd    %edx, %xmm0
594         movd    %ecx, %xmm1
595         movd    %ebx, %xmm2
596         movd    %eax, %xmm3
597         movl    104(%rdi), %ecx
598         movl    88(%rdi), %ebx
599         movl    72(%rdi), %eax
600         movl    120(%rdi), %edx
601         pshufd  $0x93, %xmm0, %xmm0
602         pshufd  $0x93, %xmm1, %xmm1
603         pshufd  $0x93, %xmm2, %xmm2
604         pshufd  $0x93, %xmm3, %xmm3
605         movd    %ecx, %xmm4
606         movd    %ebx, %xmm5
607         movd    %eax, %xmm6
608         movd    %edx, %xmm7
609         paddd   %xmm4, %xmm0
610         paddd   %xmm5, %xmm1
611         paddd   %xmm6, %xmm2
612         paddd   %xmm7, %xmm3
613         movl    84(%rdi), %ebx
614         movl    68(%rdi), %eax
615         movl    116(%rdi), %edx
616         movl    100(%rdi), %ecx
617         pshufd  $0x93, %xmm0, %xmm0
618         pshufd  $0x93, %xmm1, %xmm1
619         pshufd  $0x93, %xmm2, %xmm2
620         pshufd  $0x93, %xmm3, %xmm3
621         movd    %ebx, %xmm4
622         movd    %eax, %xmm5
623         movd    %edx, %xmm6
624         movd    %ecx, %xmm7
625         paddd   %xmm4, %xmm0
626         paddd   %xmm5, %xmm1
627         paddd   %xmm6, %xmm2
628         paddd   %xmm7, %xmm3
629         movl    64(%rdi), %eax
630         movl    112(%rdi), %edx
631         movl    96(%rdi), %ecx
632         movl    80(%rdi), %ebx
633         pshufd  $0x93, %xmm0, %xmm0
634         pshufd  $0x93, %xmm1, %xmm1
635         pshufd  $0x93, %xmm2, %xmm2
636         pshufd  $0x93, %xmm3, %xmm3
637         movd    %eax, %xmm12
638         movd    %edx, %xmm13
639         movd    %ecx, %xmm14
640         movd    %ebx, %xmm15
641         paddd   %xmm0, %xmm12
642         paddd   %xmm1, %xmm13
643         paddd   %xmm2, %xmm14
644         paddd   %xmm3, %xmm15
645
646         movq    %rsi, %rdx
647         leaq    131072(%rsi), %rcx
648 xmm_scrypt_core_loop1:
649         movdqa  %xmm8, 0(%rdx)
650         movdqa  %xmm9, 16(%rdx)
651         movdqa  %xmm10, 32(%rdx)
652         movdqa  %xmm11, 48(%rdx)
653         movdqa  %xmm12, 64(%rdx)
654         movdqa  %xmm13, 80(%rdx)
655         movdqa  %xmm14, 96(%rdx)
656         movdqa  %xmm15, 112(%rdx)
657
658         pxor    %xmm12, %xmm8
659         pxor    %xmm13, %xmm9
660         pxor    %xmm14, %xmm10
661         pxor    %xmm15, %xmm11
662         movdqa  %xmm8, %xmm0
663         movdqa  %xmm9, %xmm1
664         movdqa  %xmm10, %xmm2
665         movdqa  %xmm11, %xmm3
666         xmm_salsa8_core()
667         paddd   %xmm0, %xmm8
668         paddd   %xmm1, %xmm9
669         paddd   %xmm2, %xmm10
670         paddd   %xmm3, %xmm11
671
672         pxor    %xmm8, %xmm12
673         pxor    %xmm9, %xmm13
674         pxor    %xmm10, %xmm14
675         pxor    %xmm11, %xmm15
676         movdqa  %xmm12, %xmm0
677         movdqa  %xmm13, %xmm1
678         movdqa  %xmm14, %xmm2
679         movdqa  %xmm15, %xmm3
680         xmm_salsa8_core()
681         paddd   %xmm0, %xmm12
682         paddd   %xmm1, %xmm13
683         paddd   %xmm2, %xmm14
684         paddd   %xmm3, %xmm15
685
686         addq    $128, %rdx
687         cmpq    %rcx, %rdx
688         jne xmm_scrypt_core_loop1
689
690         movq    $1024, %rcx
691 xmm_scrypt_core_loop2:
692         movd    %xmm12, %edx
693         andl    $1023, %edx
694         shll    $7, %edx
695         movdqa  0(%rsi, %rdx), %xmm0
696         movdqa  16(%rsi, %rdx), %xmm1
697         movdqa  32(%rsi, %rdx), %xmm2
698         movdqa  48(%rsi, %rdx), %xmm3
699         movdqa  64(%rsi, %rdx), %xmm4
700         movdqa  80(%rsi, %rdx), %xmm5
701         movdqa  96(%rsi, %rdx), %xmm6
702         movdqa  112(%rsi, %rdx), %xmm7
703         pxor    %xmm0, %xmm8
704         pxor    %xmm1, %xmm9
705         pxor    %xmm2, %xmm10
706         pxor    %xmm3, %xmm11
707         pxor    %xmm4, %xmm12
708         pxor    %xmm5, %xmm13
709         pxor    %xmm6, %xmm14
710         pxor    %xmm7, %xmm15
711
712         pxor    %xmm12, %xmm8
713         pxor    %xmm13, %xmm9
714         pxor    %xmm14, %xmm10
715         pxor    %xmm15, %xmm11
716         movdqa  %xmm8, %xmm0
717         movdqa  %xmm9, %xmm1
718         movdqa  %xmm10, %xmm2
719         movdqa  %xmm11, %xmm3
720         xmm_salsa8_core()
721         paddd   %xmm0, %xmm8
722         paddd   %xmm1, %xmm9
723         paddd   %xmm2, %xmm10
724         paddd   %xmm3, %xmm11
725
726         pxor    %xmm8, %xmm12
727         pxor    %xmm9, %xmm13
728         pxor    %xmm10, %xmm14
729         pxor    %xmm11, %xmm15
730         movdqa  %xmm12, %xmm0
731         movdqa  %xmm13, %xmm1
732         movdqa  %xmm14, %xmm2
733         movdqa  %xmm15, %xmm3
734         xmm_salsa8_core()
735         paddd   %xmm0, %xmm12
736         paddd   %xmm1, %xmm13
737         paddd   %xmm2, %xmm14
738         paddd   %xmm3, %xmm15
739
740         subq    $1, %rcx
741         ja xmm_scrypt_core_loop2
742
743         # re-shuffle 1st block back
744         movd    %xmm8, %eax
745         movd    %xmm9, %edx
746         movd    %xmm10, %ecx
747         movd    %xmm11, %ebx
748         pshufd  $0x39, %xmm8, %xmm8
749         pshufd  $0x39, %xmm9, %xmm9
750         pshufd  $0x39, %xmm10, %xmm10
751         pshufd  $0x39, %xmm11, %xmm11
752         movl    %eax, 0(%rdi)
753         movl    %edx, 48(%rdi)
754         movl    %ecx, 32(%rdi)
755         movl    %ebx, 16(%rdi)
756         movd    %xmm8, %ebx
757         movd    %xmm9, %eax
758         movd    %xmm10, %edx
759         movd    %xmm11, %ecx
760         pshufd  $0x39, %xmm8, %xmm8
761         pshufd  $0x39, %xmm9, %xmm9
762         pshufd  $0x39, %xmm10, %xmm10
763         pshufd  $0x39, %xmm11, %xmm11
764         movl    %ebx, 20(%rdi)
765         movl    %eax, 4(%rdi)
766         movl    %edx, 52(%rdi)
767         movl    %ecx, 36(%rdi)
768         movd    %xmm8, %ecx
769         movd    %xmm9, %ebx
770         movd    %xmm10, %eax
771         movd    %xmm11, %edx
772         pshufd  $0x39, %xmm8, %xmm8
773         pshufd  $0x39, %xmm9, %xmm9
774         pshufd  $0x39, %xmm10, %xmm10
775         pshufd  $0x39, %xmm11, %xmm11
776         movl    %ecx, 40(%rdi)
777         movl    %ebx, 24(%rdi)
778         movl    %eax, 8(%rdi)
779         movl    %edx, 56(%rdi)
780         movd    %xmm8, %edx
781         movd    %xmm9, %ecx
782         movd    %xmm10, %ebx
783         movd    %xmm11, %eax
784         movl    %edx, 60(%rdi)
785         movl    %ecx, 44(%rdi)
786         movl    %ebx, 28(%rdi)
787         movl    %eax, 12(%rdi)
788
789         # re-shuffle 2nd block back
790         movd    %xmm12, %eax
791         movd    %xmm13, %edx
792         movd    %xmm14, %ecx
793         movd    %xmm15, %ebx
794         pshufd  $0x39, %xmm12, %xmm12
795         pshufd  $0x39, %xmm13, %xmm13
796         pshufd  $0x39, %xmm14, %xmm14
797         pshufd  $0x39, %xmm15, %xmm15
798         movl    %eax, 64(%rdi)
799         movl    %edx, 112(%rdi)
800         movl    %ecx, 96(%rdi)
801         movl    %ebx, 80(%rdi)
802         movd    %xmm12, %ebx
803         movd    %xmm13, %eax
804         movd    %xmm14, %edx
805         movd    %xmm15, %ecx
806         pshufd  $0x39, %xmm12, %xmm12
807         pshufd  $0x39, %xmm13, %xmm13
808         pshufd  $0x39, %xmm14, %xmm14
809         pshufd  $0x39, %xmm15, %xmm15
810         movl    %ebx, 84(%rdi)
811         movl    %eax, 68(%rdi)
812         movl    %edx, 116(%rdi)
813         movl    %ecx, 100(%rdi)
814         movd    %xmm12, %ecx
815         movd    %xmm13, %ebx
816         movd    %xmm14, %eax
817         movd    %xmm15, %edx
818         pshufd  $0x39, %xmm12, %xmm12
819         pshufd  $0x39, %xmm13, %xmm13
820         pshufd  $0x39, %xmm14, %xmm14
821         pshufd  $0x39, %xmm15, %xmm15
822         movl    %ecx, 104(%rdi)
823         movl    %ebx, 88(%rdi)
824         movl    %eax, 72(%rdi)
825         movl    %edx, 120(%rdi)
826         movd    %xmm12, %edx
827         movd    %xmm13, %ecx
828         movd    %xmm14, %ebx
829         movd    %xmm15, %eax
830         movl    %edx, 124(%rdi)
831         movl    %ecx, 108(%rdi)
832         movl    %ebx, 92(%rdi)
833         movl    %eax, 76(%rdi)
834
835         scrypt_core_cleanup()
836         ret
837
838         addq    $392, %rsp
839 #if defined(WIN64)
840         popq    %rsi
841         popq    %rdi
842         movdqa  8(%rsp), %xmm6
843         movdqa  24(%rsp), %xmm7
844         movdqa  40(%rsp), %xmm8
845         movdqa  56(%rsp), %xmm9
846         movdqa  72(%rsp), %xmm10
847         movdqa  88(%rsp), %xmm11
848         movdqa  104(%rsp), %xmm12
849         movdqa  120(%rsp), %xmm13
850         movdqa  136(%rsp), %xmm14
851         movdqa  152(%rsp), %xmm15
852         addq    $176, %rsp
853 #endif
854         popq    %rbp
855         popq    %rbx
856         ret
857
858 #endif