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