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