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