Init net subsystem
[novacoin.git] / src / crypto / scrypt / asm / scrypt-x86_64.S
1 /*
2  * Copyright 2011-2012 pooler@litecoinpool.org
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #if defined(__linux__) && defined(__ELF__)
28         .section .note.GNU-stack,"",%progbits
29 #endif
30
31 #if defined(__x86_64__)
32
33 .macro scrypt_shuffle src, so, dest, do
34         movl    \so+60(\src), %r8d
35         movl    \so+44(\src), %r9d
36         movl    \so+28(\src), %r10d
37         movl    \so+12(\src), %r11d
38         movl    %r8d, \do+12(\dest)
39         movl    %r9d, \do+28(\dest)
40         movl    %r10d, \do+44(\dest)
41         movl    %r11d, \do+60(\dest)
42         movl    \so+40(\src), %r8d
43         movl    \so+8(\src), %r9d
44         movl    \so+48(\src), %r10d
45         movl    \so+16(\src), %r11d
46         movl    %r8d, \do+8(\dest)
47         movl    %r9d, \do+40(\dest)
48         movl    %r10d, \do+16(\dest)
49         movl    %r11d, \do+48(\dest)
50         movl    \so+20(\src), %r8d
51         movl    \so+4(\src), %r9d
52         movl    \so+52(\src), %r10d
53         movl    \so+36(\src), %r11d
54         movl    %r8d, \do+4(\dest)
55         movl    %r9d, \do+20(\dest)
56         movl    %r10d, \do+36(\dest)
57         movl    %r11d, \do+52(\dest)
58         movl    \so+0(\src), %r8d
59         movl    \so+24(\src), %r9d
60         movl    \so+32(\src), %r10d
61         movl    \so+56(\src), %r11d
62         movl    %r8d, \do+0(\dest)
63         movl    %r9d, \do+24(\dest)
64         movl    %r10d, \do+32(\dest)
65         movl    %r11d, \do+56(\dest)
66 .endm
67
68
69 .macro salsa8_core_gen_doubleround
70         movq    72(%rsp), %r15
71         
72         leaq    (%r14, %rdx), %rbp
73         roll    $7, %ebp
74         xorl    %ebp, %r9d
75         leaq    (%rdi, %r15), %rbp
76         roll    $7, %ebp
77         xorl    %ebp, %r10d
78         leaq    (%rdx, %r9), %rbp
79         roll    $9, %ebp
80         xorl    %ebp, %r11d
81         leaq    (%r15, %r10), %rbp
82         roll    $9, %ebp
83         xorl    %ebp, %r13d
84         
85         leaq    (%r9, %r11), %rbp
86         roll    $13, %ebp
87         xorl    %ebp, %r14d
88         leaq    (%r10, %r13), %rbp
89         roll    $13, %ebp
90         xorl    %ebp, %edi
91         leaq    (%r11, %r14), %rbp
92         roll    $18, %ebp
93         xorl    %ebp, %edx
94         leaq    (%r13, %rdi), %rbp
95         roll    $18, %ebp
96         xorl    %ebp, %r15d
97         
98         movq    48(%rsp), %rbp
99         movq    %r15, 72(%rsp)
100         
101         leaq    (%rax, %rbp), %r15
102         roll    $7, %r15d
103         xorl    %r15d, %ebx
104         leaq    (%rbp, %rbx), %r15
105         roll    $9, %r15d
106         xorl    %r15d, %ecx
107         leaq    (%rbx, %rcx), %r15
108         roll    $13, %r15d
109         xorl    %r15d, %eax
110         leaq    (%rcx, %rax), %r15
111         roll    $18, %r15d
112         xorl    %r15d, %ebp
113         
114         movq    88(%rsp), %r15
115         movq    %rbp, 48(%rsp)
116         
117         leaq    (%r12, %r15), %rbp
118         roll    $7, %ebp
119         xorl    %ebp, %esi
120         leaq    (%r15, %rsi), %rbp
121         roll    $9, %ebp
122         xorl    %ebp, %r8d
123         leaq    (%rsi, %r8), %rbp
124         roll    $13, %ebp
125         xorl    %ebp, %r12d
126         leaq    (%r8, %r12), %rbp
127         roll    $18, %ebp
128         xorl    %ebp, %r15d
129         
130         movq    %r15, 88(%rsp)
131         movq    72(%rsp), %r15
132         
133         leaq    (%rsi, %rdx), %rbp
134         roll    $7, %ebp
135         xorl    %ebp, %edi
136         leaq    (%r9, %r15), %rbp
137         roll    $7, %ebp
138         xorl    %ebp, %eax
139         leaq    (%rdx, %rdi), %rbp
140         roll    $9, %ebp
141         xorl    %ebp, %ecx
142         leaq    (%r15, %rax), %rbp
143         roll    $9, %ebp
144         xorl    %ebp, %r8d
145         
146         leaq    (%rdi, %rcx), %rbp
147         roll    $13, %ebp
148         xorl    %ebp, %esi
149         leaq    (%rax, %r8), %rbp
150         roll    $13, %ebp
151         xorl    %ebp, %r9d
152         leaq    (%rcx, %rsi), %rbp
153         roll    $18, %ebp
154         xorl    %ebp, %edx
155         leaq    (%r8, %r9), %rbp
156         roll    $18, %ebp
157         xorl    %ebp, %r15d
158         
159         movq    48(%rsp), %rbp
160         movq    %r15, 72(%rsp)
161         
162         leaq    (%r10, %rbp), %r15
163         roll    $7, %r15d
164         xorl    %r15d, %r12d
165         leaq    (%rbp, %r12), %r15
166         roll    $9, %r15d
167         xorl    %r15d, %r11d
168         leaq    (%r12, %r11), %r15
169         roll    $13, %r15d
170         xorl    %r15d, %r10d
171         leaq    (%r11, %r10), %r15
172         roll    $18, %r15d
173         xorl    %r15d, %ebp
174         
175         movq    88(%rsp), %r15
176         movq    %rbp, 48(%rsp)
177         
178         leaq    (%rbx, %r15), %rbp
179         roll    $7, %ebp
180         xorl    %ebp, %r14d
181         leaq    (%r15, %r14), %rbp
182         roll    $9, %ebp
183         xorl    %ebp, %r13d
184         leaq    (%r14, %r13), %rbp
185         roll    $13, %ebp
186         xorl    %ebp, %ebx
187         leaq    (%r13, %rbx), %rbp
188         roll    $18, %ebp
189         xorl    %ebp, %r15d
190         
191         movq    %r15, 88(%rsp)
192 .endm
193
194         .text
195         .p2align 6
196 salsa8_core_gen:
197         /* 0: %rdx, %rdi, %rcx, %rsi */
198         movq    8(%rsp), %rdi
199         movq    %rdi, %rdx
200         shrq    $32, %rdi
201         movq    16(%rsp), %rsi
202         movq    %rsi, %rcx
203         shrq    $32, %rsi
204         /* 1: %r9, 72(%rsp), %rax, %r8 */
205         movq    24(%rsp), %r8
206         movq    %r8, %r9
207         shrq    $32, %r8
208         movq    %r8, 72(%rsp)
209         movq    32(%rsp), %r8
210         movq    %r8, %rax
211         shrq    $32, %r8
212         /* 2: %r11, %r10, 48(%rsp), %r12 */
213         movq    40(%rsp), %r10
214         movq    %r10, %r11
215         shrq    $32, %r10
216         movq    48(%rsp), %r12
217         /* movq %r12, %r13 */
218         /* movq %r13, 48(%rsp) */
219         shrq    $32, %r12
220         /* 3: %r14, %r13, %rbx, 88(%rsp) */
221         movq    56(%rsp), %r13
222         movq    %r13, %r14
223         shrq    $32, %r13
224         movq    64(%rsp), %r15
225         movq    %r15, %rbx
226         shrq    $32, %r15
227         movq    %r15, 88(%rsp)
228         
229         salsa8_core_gen_doubleround
230         salsa8_core_gen_doubleround
231         salsa8_core_gen_doubleround
232         salsa8_core_gen_doubleround
233         
234         shlq    $32, %rdi
235         xorq    %rdi, %rdx
236         movq    %rdx, 24(%rsp)
237         
238         shlq    $32, %rsi
239         xorq    %rsi, %rcx
240         movq    %rcx, 32(%rsp)
241         
242         movl    72(%rsp), %edi
243         shlq    $32, %rdi
244         xorq    %rdi, %r9
245         movq    %r9, 40(%rsp)
246         
247         movl    48(%rsp), %ebp
248         shlq    $32, %r8
249         xorq    %r8, %rax
250         movq    %rax, 48(%rsp)
251         
252         shlq    $32, %r10
253         xorq    %r10, %r11
254         movq    %r11, 56(%rsp)
255         
256         shlq    $32, %r12
257         xorq    %r12, %rbp
258         movq    %rbp, 64(%rsp)
259         
260         shlq    $32, %r13
261         xorq    %r13, %r14
262         movq    %r14, 72(%rsp)
263         
264         movdqa  24(%rsp), %xmm0
265         
266         shlq    $32, %r15
267         xorq    %r15, %rbx
268         movq    %rbx, 80(%rsp)
269         
270         movdqa  40(%rsp), %xmm1
271         movdqa  56(%rsp), %xmm2
272         movdqa  72(%rsp), %xmm3
273         
274         ret
275         
276         
277         .text
278         .p2align 6
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 .macro scrypt_core_cleanup
308 #if defined(WIN64)
309         popq    %rsi
310         popq    %rdi
311         movdqa  8(%rsp), %xmm6
312         movdqa  24(%rsp), %xmm7
313         movdqa  40(%rsp), %xmm8
314         movdqa  56(%rsp), %xmm9
315         movdqa  72(%rsp), %xmm10
316         movdqa  88(%rsp), %xmm11
317         movdqa  104(%rsp), %xmm12
318         movdqa  120(%rsp), %xmm13
319         movdqa  136(%rsp), %xmm14
320         movdqa  152(%rsp), %xmm15
321         addq    $176, %rsp
322 #endif
323         popq    %r15
324         popq    %r14
325         popq    %r13
326         popq    %r12
327         popq    %rbp
328         popq    %rbx
329 .endm
330         
331         /* GenuineIntel processors have fast SIMD */
332         xorl    %eax, %eax
333         cpuid
334         cmpl    $0x6c65746e, %ecx
335         jne scrypt_core_gen
336         cmpl    $0x49656e69, %edx
337         jne scrypt_core_gen
338         cmpl    $0x756e6547, %ebx
339         je scrypt_core_xmm
340         
341         .p2align 6
342 scrypt_core_gen:
343         subq    $136, %rsp
344         movdqa  0(%rdi), %xmm8
345         movdqa  16(%rdi), %xmm9
346         movdqa  32(%rdi), %xmm10
347         movdqa  48(%rdi), %xmm11
348         movdqa  64(%rdi), %xmm12
349         movdqa  80(%rdi), %xmm13
350         movdqa  96(%rdi), %xmm14
351         movdqa  112(%rdi), %xmm15
352         
353         leaq    131072(%rsi), %rcx
354         movq    %rdi, 104(%rsp)
355         movq    %rsi, 112(%rsp)
356         movq    %rcx, 120(%rsp)
357 scrypt_core_gen_loop1:
358         movdqa  %xmm8, 0(%rsi)
359         movdqa  %xmm9, 16(%rsi)
360         movdqa  %xmm10, 32(%rsi)
361         movdqa  %xmm11, 48(%rsi)
362         movdqa  %xmm12, 64(%rsi)
363         movdqa  %xmm13, 80(%rsi)
364         movdqa  %xmm14, 96(%rsi)
365         movdqa  %xmm15, 112(%rsi)
366         
367         pxor    %xmm12, %xmm8
368         pxor    %xmm13, %xmm9
369         pxor    %xmm14, %xmm10
370         pxor    %xmm15, %xmm11
371         movdqa  %xmm8, 0(%rsp)
372         movdqa  %xmm9, 16(%rsp)
373         movdqa  %xmm10, 32(%rsp)
374         movdqa  %xmm11, 48(%rsp)
375         movq    %rsi, 128(%rsp)
376         call salsa8_core_gen
377         paddd   %xmm0, %xmm8
378         paddd   %xmm1, %xmm9
379         paddd   %xmm2, %xmm10
380         paddd   %xmm3, %xmm11
381         
382         pxor    %xmm8, %xmm12
383         pxor    %xmm9, %xmm13
384         pxor    %xmm10, %xmm14
385         pxor    %xmm11, %xmm15
386         movdqa  %xmm12, 0(%rsp)
387         movdqa  %xmm13, 16(%rsp)
388         movdqa  %xmm14, 32(%rsp)
389         movdqa  %xmm15, 48(%rsp)
390         call salsa8_core_gen
391         movq    128(%rsp), %rsi
392         paddd   %xmm0, %xmm12
393         paddd   %xmm1, %xmm13
394         paddd   %xmm2, %xmm14
395         paddd   %xmm3, %xmm15
396         
397         addq    $128, %rsi
398         movq    120(%rsp), %rcx
399         cmpq    %rcx, %rsi
400         jne scrypt_core_gen_loop1
401         
402         movq    $1024, %rcx
403         movd    %xmm12, %edx
404 scrypt_core_gen_loop2:
405         movq    112(%rsp), %rsi
406         andl    $1023, %edx
407         shll    $7, %edx
408         addq    %rsi, %rdx
409         movdqa  0(%rdx), %xmm0
410         movdqa  16(%rdx), %xmm1
411         movdqa  32(%rdx), %xmm2
412         movdqa  48(%rdx), %xmm3
413         movdqa  64(%rdx), %xmm4
414         movdqa  80(%rdx), %xmm5
415         movdqa  96(%rdx), %xmm6
416         movdqa  112(%rdx), %xmm7
417         pxor    %xmm0, %xmm8
418         pxor    %xmm1, %xmm9
419         pxor    %xmm2, %xmm10
420         pxor    %xmm3, %xmm11
421         pxor    %xmm4, %xmm12
422         pxor    %xmm5, %xmm13
423         pxor    %xmm6, %xmm14
424         pxor    %xmm7, %xmm15
425         
426         pxor    %xmm12, %xmm8
427         pxor    %xmm13, %xmm9
428         pxor    %xmm14, %xmm10
429         pxor    %xmm15, %xmm11
430         movdqa  %xmm8, 0(%rsp)
431         movdqa  %xmm9, 16(%rsp)
432         movdqa  %xmm10, 32(%rsp)
433         movdqa  %xmm11, 48(%rsp)
434         movq    %rcx, 128(%rsp)
435         call salsa8_core_gen
436         paddd   %xmm0, %xmm8
437         paddd   %xmm1, %xmm9
438         paddd   %xmm2, %xmm10
439         paddd   %xmm3, %xmm11
440         
441         pxor    %xmm8, %xmm12
442         pxor    %xmm9, %xmm13
443         pxor    %xmm10, %xmm14
444         pxor    %xmm11, %xmm15
445         movdqa  %xmm12, 0(%rsp)
446         movdqa  %xmm13, 16(%rsp)
447         movdqa  %xmm14, 32(%rsp)
448         movdqa  %xmm15, 48(%rsp)
449         call salsa8_core_gen
450         movq    128(%rsp), %rcx
451         addl    0(%rsp), %edx
452         paddd   %xmm0, %xmm12
453         paddd   %xmm1, %xmm13
454         paddd   %xmm2, %xmm14
455         paddd   %xmm3, %xmm15
456         
457         subq    $1, %rcx
458         ja scrypt_core_gen_loop2
459         
460         movq    104(%rsp), %rdi
461         movdqa  %xmm8, 0(%rdi)
462         movdqa  %xmm9, 16(%rdi)
463         movdqa  %xmm10, 32(%rdi)
464         movdqa  %xmm11, 48(%rdi)
465         movdqa  %xmm12, 64(%rdi)
466         movdqa  %xmm13, 80(%rdi)
467         movdqa  %xmm14, 96(%rdi)
468         movdqa  %xmm15, 112(%rdi)
469         
470         addq    $136, %rsp
471         scrypt_core_cleanup
472         ret
473
474
475 .macro salsa8_core_xmm_doubleround
476         movdqa  %xmm1, %xmm4
477         paddd   %xmm0, %xmm4
478         movdqa  %xmm4, %xmm5
479         pslld   $7, %xmm4
480         psrld   $25, %xmm5
481         pxor    %xmm4, %xmm3
482         movdqa  %xmm0, %xmm4
483         pxor    %xmm5, %xmm3
484         
485         paddd   %xmm3, %xmm4
486         movdqa  %xmm4, %xmm5
487         pslld   $9, %xmm4
488         psrld   $23, %xmm5
489         pxor    %xmm4, %xmm2
490         movdqa  %xmm3, %xmm4
491         pxor    %xmm5, %xmm2
492         pshufd  $0x93, %xmm3, %xmm3
493         
494         paddd   %xmm2, %xmm4
495         movdqa  %xmm4, %xmm5
496         pslld   $13, %xmm4
497         psrld   $19, %xmm5
498         pxor    %xmm4, %xmm1
499         movdqa  %xmm2, %xmm4
500         pxor    %xmm5, %xmm1
501         pshufd  $0x4e, %xmm2, %xmm2
502         
503         paddd   %xmm1, %xmm4
504         movdqa  %xmm4, %xmm5
505         pslld   $18, %xmm4
506         psrld   $14, %xmm5
507         pxor    %xmm4, %xmm0
508         movdqa  %xmm3, %xmm4
509         pxor    %xmm5, %xmm0
510         pshufd  $0x39, %xmm1, %xmm1
511         
512         paddd   %xmm0, %xmm4
513         movdqa  %xmm4, %xmm5
514         pslld   $7, %xmm4
515         psrld   $25, %xmm5
516         pxor    %xmm4, %xmm1
517         movdqa  %xmm0, %xmm4
518         pxor    %xmm5, %xmm1
519         
520         paddd   %xmm1, %xmm4
521         movdqa  %xmm4, %xmm5
522         pslld   $9, %xmm4
523         psrld   $23, %xmm5
524         pxor    %xmm4, %xmm2
525         movdqa  %xmm1, %xmm4
526         pxor    %xmm5, %xmm2
527         pshufd  $0x93, %xmm1, %xmm1
528         
529         paddd   %xmm2, %xmm4
530         movdqa  %xmm4, %xmm5
531         pslld   $13, %xmm4
532         psrld   $19, %xmm5
533         pxor    %xmm4, %xmm3
534         movdqa  %xmm2, %xmm4
535         pxor    %xmm5, %xmm3
536         pshufd  $0x4e, %xmm2, %xmm2
537         
538         paddd   %xmm3, %xmm4
539         movdqa  %xmm4, %xmm5
540         pslld   $18, %xmm4
541         psrld   $14, %xmm5
542         pxor    %xmm4, %xmm0
543         pshufd  $0x39, %xmm3, %xmm3
544         pxor    %xmm5, %xmm0
545 .endm
546
547 .macro salsa8_core_xmm
548         salsa8_core_xmm_doubleround
549         salsa8_core_xmm_doubleround
550         salsa8_core_xmm_doubleround
551         salsa8_core_xmm_doubleround
552 .endm
553         
554         .p2align 6
555 scrypt_core_xmm:
556         pcmpeqw %xmm1, %xmm1
557         psrlq   $32, %xmm1
558         
559         movdqa  0(%rdi), %xmm8
560         movdqa  16(%rdi), %xmm11
561         movdqa  32(%rdi), %xmm10
562         movdqa  48(%rdi), %xmm9
563         movdqa  %xmm8, %xmm0
564         pxor    %xmm11, %xmm8
565         pand    %xmm1, %xmm8
566         pxor    %xmm11, %xmm8
567         pxor    %xmm10, %xmm11
568         pand    %xmm1, %xmm11
569         pxor    %xmm10, %xmm11
570         pxor    %xmm9, %xmm10
571         pand    %xmm1, %xmm10
572         pxor    %xmm9, %xmm10
573         pxor    %xmm0, %xmm9
574         pand    %xmm1, %xmm9
575         pxor    %xmm0, %xmm9
576         movdqa  %xmm8, %xmm0
577         pshufd  $0x4e, %xmm10, %xmm10
578         punpcklqdq      %xmm10, %xmm8
579         punpckhqdq      %xmm0, %xmm10
580         movdqa  %xmm11, %xmm0
581         pshufd  $0x4e, %xmm9, %xmm9
582         punpcklqdq      %xmm9, %xmm11
583         punpckhqdq      %xmm0, %xmm9
584         
585         movdqa  64(%rdi), %xmm12
586         movdqa  80(%rdi), %xmm15
587         movdqa  96(%rdi), %xmm14
588         movdqa  112(%rdi), %xmm13
589         movdqa  %xmm12, %xmm0
590         pxor    %xmm15, %xmm12
591         pand    %xmm1, %xmm12
592         pxor    %xmm15, %xmm12
593         pxor    %xmm14, %xmm15
594         pand    %xmm1, %xmm15
595         pxor    %xmm14, %xmm15
596         pxor    %xmm13, %xmm14
597         pand    %xmm1, %xmm14
598         pxor    %xmm13, %xmm14
599         pxor    %xmm0, %xmm13
600         pand    %xmm1, %xmm13
601         pxor    %xmm0, %xmm13
602         movdqa  %xmm12, %xmm0
603         pshufd  $0x4e, %xmm14, %xmm14
604         punpcklqdq      %xmm14, %xmm12
605         punpckhqdq      %xmm0, %xmm14
606         movdqa  %xmm15, %xmm0
607         pshufd  $0x4e, %xmm13, %xmm13
608         punpcklqdq      %xmm13, %xmm15
609         punpckhqdq      %xmm0, %xmm13
610         
611         movq    %rsi, %rdx
612         leaq    131072(%rsi), %rcx
613 scrypt_core_xmm_loop1:
614         pxor    %xmm12, %xmm8
615         pxor    %xmm13, %xmm9
616         pxor    %xmm14, %xmm10
617         pxor    %xmm15, %xmm11
618         movdqa  %xmm8, 0(%rdx)
619         movdqa  %xmm9, 16(%rdx)
620         movdqa  %xmm10, 32(%rdx)
621         movdqa  %xmm11, 48(%rdx)
622         movdqa  %xmm12, 64(%rdx)
623         movdqa  %xmm13, 80(%rdx)
624         movdqa  %xmm14, 96(%rdx)
625         movdqa  %xmm15, 112(%rdx)
626         
627         movdqa  %xmm8, %xmm0
628         movdqa  %xmm9, %xmm1
629         movdqa  %xmm10, %xmm2
630         movdqa  %xmm11, %xmm3
631         salsa8_core_xmm
632         paddd   %xmm0, %xmm8
633         paddd   %xmm1, %xmm9
634         paddd   %xmm2, %xmm10
635         paddd   %xmm3, %xmm11
636         
637         pxor    %xmm8, %xmm12
638         pxor    %xmm9, %xmm13
639         pxor    %xmm10, %xmm14
640         pxor    %xmm11, %xmm15
641         movdqa  %xmm12, %xmm0
642         movdqa  %xmm13, %xmm1
643         movdqa  %xmm14, %xmm2
644         movdqa  %xmm15, %xmm3
645         salsa8_core_xmm
646         paddd   %xmm0, %xmm12
647         paddd   %xmm1, %xmm13
648         paddd   %xmm2, %xmm14
649         paddd   %xmm3, %xmm15
650         
651         addq    $128, %rdx
652         cmpq    %rcx, %rdx
653         jne scrypt_core_xmm_loop1
654         
655         movq    $1024, %rcx
656 scrypt_core_xmm_loop2:
657         movd    %xmm12, %edx
658         andl    $1023, %edx
659         shll    $7, %edx
660         pxor    0(%rsi, %rdx), %xmm8
661         pxor    16(%rsi, %rdx), %xmm9
662         pxor    32(%rsi, %rdx), %xmm10
663         pxor    48(%rsi, %rdx), %xmm11
664         
665         pxor    %xmm12, %xmm8
666         pxor    %xmm13, %xmm9
667         pxor    %xmm14, %xmm10
668         pxor    %xmm15, %xmm11
669         movdqa  %xmm8, %xmm0
670         movdqa  %xmm9, %xmm1
671         movdqa  %xmm10, %xmm2
672         movdqa  %xmm11, %xmm3
673         salsa8_core_xmm
674         paddd   %xmm0, %xmm8
675         paddd   %xmm1, %xmm9
676         paddd   %xmm2, %xmm10
677         paddd   %xmm3, %xmm11
678         
679         pxor    64(%rsi, %rdx), %xmm12
680         pxor    80(%rsi, %rdx), %xmm13
681         pxor    96(%rsi, %rdx), %xmm14
682         pxor    112(%rsi, %rdx), %xmm15
683         pxor    %xmm8, %xmm12
684         pxor    %xmm9, %xmm13
685         pxor    %xmm10, %xmm14
686         pxor    %xmm11, %xmm15
687         movdqa  %xmm12, %xmm0
688         movdqa  %xmm13, %xmm1
689         movdqa  %xmm14, %xmm2
690         movdqa  %xmm15, %xmm3
691         salsa8_core_xmm
692         paddd   %xmm0, %xmm12
693         paddd   %xmm1, %xmm13
694         paddd   %xmm2, %xmm14
695         paddd   %xmm3, %xmm15
696         
697         subq    $1, %rcx
698         ja scrypt_core_xmm_loop2
699         
700         pcmpeqw %xmm1, %xmm1
701         psrlq   $32, %xmm1
702         
703         movdqa  %xmm8, %xmm0
704         pxor    %xmm9, %xmm8
705         pand    %xmm1, %xmm8
706         pxor    %xmm9, %xmm8
707         pxor    %xmm10, %xmm9
708         pand    %xmm1, %xmm9
709         pxor    %xmm10, %xmm9
710         pxor    %xmm11, %xmm10
711         pand    %xmm1, %xmm10
712         pxor    %xmm11, %xmm10
713         pxor    %xmm0, %xmm11
714         pand    %xmm1, %xmm11
715         pxor    %xmm0, %xmm11
716         movdqa  %xmm8, %xmm0
717         pshufd  $0x4e, %xmm10, %xmm10
718         punpcklqdq      %xmm10, %xmm8
719         punpckhqdq      %xmm0, %xmm10
720         movdqa  %xmm9, %xmm0
721         pshufd  $0x4e, %xmm11, %xmm11
722         punpcklqdq      %xmm11, %xmm9
723         punpckhqdq      %xmm0, %xmm11
724         movdqa  %xmm8, 0(%rdi)
725         movdqa  %xmm11, 16(%rdi)
726         movdqa  %xmm10, 32(%rdi)
727         movdqa  %xmm9, 48(%rdi)
728         
729         movdqa  %xmm12, %xmm0
730         pxor    %xmm13, %xmm12
731         pand    %xmm1, %xmm12
732         pxor    %xmm13, %xmm12
733         pxor    %xmm14, %xmm13
734         pand    %xmm1, %xmm13
735         pxor    %xmm14, %xmm13
736         pxor    %xmm15, %xmm14
737         pand    %xmm1, %xmm14
738         pxor    %xmm15, %xmm14
739         pxor    %xmm0, %xmm15
740         pand    %xmm1, %xmm15
741         pxor    %xmm0, %xmm15
742         movdqa  %xmm12, %xmm0
743         pshufd  $0x4e, %xmm14, %xmm14
744         punpcklqdq      %xmm14, %xmm12
745         punpckhqdq      %xmm0, %xmm14
746         movdqa  %xmm13, %xmm0
747         pshufd  $0x4e, %xmm15, %xmm15
748         punpcklqdq      %xmm15, %xmm13
749         punpckhqdq      %xmm0, %xmm15
750         movdqa  %xmm12, 64(%rdi)
751         movdqa  %xmm15, 80(%rdi)
752         movdqa  %xmm14, 96(%rdi)
753         movdqa  %xmm13, 112(%rdi)
754         
755         scrypt_core_cleanup
756         ret
757
758 #endif