14f2a7ee376f6c14ce0aac4eb0c2cae31160ec73
[novacoin.git] / src / scrypt-arm.S
1 /*
2  * Copyright 2012 pooler@litecoinpool.org
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.  See COPYING for more details.
8  */
9
10 #if defined(__linux__) && defined(__ELF__)
11 .section .note.GNU-stack,"",%progbits
12 #endif
13
14 #if defined(__arm__) && defined(__APCS_32__)
15
16 #if defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
17         defined(__ARM_ARCH_5TEJ__) || defined(__ARM_ARCH_6__) || \
18         defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
19         defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_6T2__) || \
20         defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
21 #define __ARM_ARCH_5E_OR_6__
22 #endif
23
24 #if defined(__ARM_ARCH_5E_OR_6__) || defined(__ARM_ARCH_7__) || \
25         defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \
26         defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
27 #define __ARM_ARCH_5E_OR_6_OR_7__
28 #endif
29
30 #ifdef __ARM_ARCH_5E_OR_6__
31
32 .macro scrypt_shuffle
33         add     lr, r0, #9*4
34         ldmia   r0, {r2-r7}
35         ldmia   lr, {r2, r8-r12, lr}
36         str     r3, [r0, #5*4]
37         str     r5, [r0, #15*4]
38         str     r6, [r0, #12*4]
39         str     r7, [r0, #1*4]
40         ldr r5, [r0, #7*4]
41         str     r2, [r0, #13*4]
42         str     r8, [r0, #2*4]
43         strd    r4, [r0, #10*4]
44         str     r9, [r0, #7*4]
45         str     r10, [r0, #4*4]
46         str     r11, [r0, #9*4]
47         str     lr, [r0, #3*4]
48         
49         add     r2, r0, #64+0*4
50         add     lr, r0, #64+9*4
51         ldmia   r2, {r2-r7}
52         ldmia   lr, {r2, r8-r12, lr}
53         str     r3, [r0, #64+5*4]
54         str     r5, [r0, #64+15*4]
55         str     r6, [r0, #64+12*4]
56         str     r7, [r0, #64+1*4]
57         ldr r5, [r0, #64+7*4]
58         str     r2, [r0, #64+13*4]
59         str     r8, [r0, #64+2*4]
60         strd    r4, [r0, #64+10*4]
61         str     r9, [r0, #64+7*4]
62         str     r10, [r0, #64+4*4]
63         str     r11, [r0, #64+9*4]
64         str     lr, [r0, #64+3*4]
65 .endm
66
67 .macro salsa8_core_doubleround_body
68         add     r6, r2, r6
69         add     r7, r3, r7
70         eor     r10, r10, r6, ror #25
71         add     r6, r0, r4
72         eor     r11, r11, r7, ror #25
73         add     r7, r1, r5
74         strd    r10, [sp, #14*4]
75         eor     r12, r12, r6, ror #25
76         eor     lr, lr, r7, ror #25
77         
78         ldrd    r6, [sp, #10*4]
79         add     r2, r10, r2
80         add     r3, r11, r3
81         eor     r6, r6, r2, ror #23
82         add     r2, r12, r0
83         eor     r7, r7, r3, ror #23
84         add     r3, lr, r1
85         strd    r6, [sp, #10*4]
86         eor     r8, r8, r2, ror #23
87         eor     r9, r9, r3, ror #23
88         
89         ldrd    r2, [sp, #6*4]
90         add     r10, r6, r10
91         add     r11, r7, r11
92         eor     r2, r2, r10, ror #19
93         add     r10, r8, r12
94         eor     r3, r3, r11, ror #19
95         add     r11, r9, lr
96         eor     r4, r4, r10, ror #19
97         eor     r5, r5, r11, ror #19
98         
99         ldrd    r10, [sp, #2*4]
100         add     r6, r2, r6
101         add     r7, r3, r7
102         eor     r10, r10, r6, ror #14
103         add     r6, r4, r8
104         eor     r11, r11, r7, ror #14
105         add     r7, r5, r9
106         eor     r0, r0, r6, ror #14
107         eor     r1, r1, r7, ror #14
108         
109         
110         ldrd    r6, [sp, #14*4]
111         strd    r2, [sp, #6*4]
112         strd    r10, [sp, #2*4]
113         add     r6, r11, r6
114         add     r7, r0, r7
115         eor     r4, r4, r6, ror #25
116         add     r6, r1, r12
117         eor     r5, r5, r7, ror #25
118         add     r7, r10, lr
119         eor     r2, r2, r6, ror #25
120         eor     r3, r3, r7, ror #25
121         strd    r2, [sp, #6*4]
122         
123         add     r10, r3, r10
124         ldrd    r6, [sp, #10*4]
125         add     r11, r4, r11
126         eor     r8, r8, r10, ror #23
127         add     r10, r5, r0
128         eor     r9, r9, r11, ror #23
129         add     r11, r2, r1
130         eor     r6, r6, r10, ror #23
131         eor     r7, r7, r11, ror #23
132         strd    r6, [sp, #10*4]
133         
134         add     r2, r7, r2
135         ldrd    r10, [sp, #14*4]
136         add     r3, r8, r3
137         eor     r12, r12, r2, ror #19
138         add     r2, r9, r4
139         eor     lr, lr, r3, ror #19
140         add     r3, r6, r5
141         eor     r10, r10, r2, ror #19
142         eor     r11, r11, r3, ror #19
143         
144         ldrd    r2, [sp, #2*4]
145         add     r6, r11, r6
146         add     r7, r12, r7
147         eor     r0, r0, r6, ror #14
148         add     r6, lr, r8
149         eor     r1, r1, r7, ror #14
150         add     r7, r10, r9
151         eor     r2, r2, r6, ror #14
152         eor     r3, r3, r7, ror #14
153 .endm
154
155 .macro salsa8_core
156         ldmia   sp, {r0-r12, lr}
157         
158         ldrd    r10, [sp, #14*4]
159         salsa8_core_doubleround_body
160         ldrd    r6, [sp, #6*4]
161         strd    r2, [sp, #2*4]
162         strd    r10, [sp, #14*4]
163         salsa8_core_doubleround_body
164         ldrd    r6, [sp, #6*4]
165         strd    r2, [sp, #2*4]
166         strd    r10, [sp, #14*4]
167         salsa8_core_doubleround_body
168         ldrd    r6, [sp, #6*4]
169         strd    r2, [sp, #2*4]
170         strd    r10, [sp, #14*4]
171         salsa8_core_doubleround_body
172         
173         stmia   sp, {r0-r5}
174         strd    r8, [sp, #8*4]
175         str     r12, [sp, #12*4]
176         str     lr, [sp, #13*4]
177         strd    r10, [sp, #14*4]
178 .endm
179
180 #else
181
182 .macro scrypt_shuffle
183 .endm
184
185 .macro salsa8_core_doubleround_body
186         ldr     r8, [sp, #8*4]
187         add     r11, r11, r10
188         ldr     lr, [sp, #13*4]
189         add     r12, r12, r3
190         eor     r2, r2, r11, ror #23
191         add     r11, r4, r0
192         eor     r7, r7, r12, ror #23
193         add     r12, r9, r5
194         str     r9, [sp, #9*4]
195         eor     r8, r8, r11, ror #23
196         str     r10, [sp, #14*4]
197         eor     lr, lr, r12, ror #23
198         
199         ldr     r11, [sp, #11*4]
200         add     r9, lr, r9
201         ldr     r12, [sp, #12*4]
202         add     r10, r2, r10
203         eor     r1, r1, r9, ror #19
204         add     r9, r7, r3
205         eor     r6, r6, r10, ror #19
206         add     r10, r8, r4
207         str     r8, [sp, #8*4]
208         eor     r11, r11, r9, ror #19
209         str     lr, [sp, #13*4]
210         eor     r12, r12, r10, ror #19
211         
212         ldr     r9, [sp, #10*4]
213         add     r8, r12, r8
214         ldr     r10, [sp, #15*4]
215         add     lr, r1, lr
216         eor     r0, r0, r8, ror #14
217         add     r8, r6, r2
218         eor     r5, r5, lr, ror #14
219         add     lr, r11, r7
220         eor     r9, r9, r8, ror #14
221         ldr     r8, [sp, #9*4]
222         eor     r10, r10, lr, ror #14
223         ldr     lr, [sp, #14*4]
224         
225         
226         add     r8, r9, r8
227         str     r9, [sp, #10*4]
228         add     lr, r10, lr
229         str     r10, [sp, #15*4]
230         eor     r11, r11, r8, ror #25
231         add     r8, r0, r3
232         eor     r12, r12, lr, ror #25
233         add     lr, r5, r4
234         eor     r1, r1, r8, ror #25
235         ldr     r8, [sp, #8*4]
236         eor     r6, r6, lr, ror #25
237         
238         add     r9, r11, r9
239         ldr     lr, [sp, #13*4]
240         add     r10, r12, r10
241         eor     r8, r8, r9, ror #23
242         add     r9, r1, r0
243         eor     lr, lr, r10, ror #23
244         add     r10, r6, r5
245         str     r11, [sp, #11*4]
246         eor     r2, r2, r9, ror #23
247         str     r12, [sp, #12*4]
248         eor     r7, r7, r10, ror #23
249         
250         ldr     r9, [sp, #9*4]
251         add     r11, r8, r11
252         ldr     r10, [sp, #14*4]
253         add     r12, lr, r12
254         eor     r9, r9, r11, ror #19
255         add     r11, r2, r1
256         eor     r10, r10, r12, ror #19
257         add     r12, r7, r6
258         str     r8, [sp, #8*4]
259         eor     r3, r3, r11, ror #19
260         str     lr, [sp, #13*4]
261         eor     r4, r4, r12, ror #19
262 .endm
263
264 .macro salsa8_core
265         ldmia   sp, {r0-r7}
266         
267         ldr     r12, [sp, #15*4]
268         ldr     r8, [sp, #11*4]
269         ldr     lr, [sp, #12*4]
270         
271         ldr     r9, [sp, #9*4]
272         add     r8, r8, r12
273         ldr     r11, [sp, #10*4]
274         add     lr, lr, r0
275         eor     r3, r3, r8, ror #25
276         add     r8, r5, r1
277         ldr     r10, [sp, #14*4]
278         eor     r4, r4, lr, ror #25
279         add     lr, r11, r6
280         eor     r9, r9, r8, ror #25
281         eor     r10, r10, lr, ror #25
282         
283         salsa8_core_doubleround_body
284         
285         ldr     r11, [sp, #10*4]
286         add     r8, r9, r8
287         ldr     r12, [sp, #15*4]
288         add     lr, r10, lr
289         eor     r11, r11, r8, ror #14
290         add     r8, r3, r2
291         eor     r12, r12, lr, ror #14
292         add     lr, r4, r7
293         eor     r0, r0, r8, ror #14
294         ldr     r8, [sp, #11*4]
295         eor     r5, r5, lr, ror #14
296         ldr     lr, [sp, #12*4]
297         
298         add     r8, r8, r12
299         str     r11, [sp, #10*4]
300         add     lr, lr, r0
301         str     r12, [sp, #15*4]
302         eor     r3, r3, r8, ror #25
303         add     r8, r5, r1
304         eor     r4, r4, lr, ror #25
305         add     lr, r11, r6
306         str     r9, [sp, #9*4]
307         eor     r9, r9, r8, ror #25
308         str     r10, [sp, #14*4]
309         eor     r10, r10, lr, ror #25
310         
311         salsa8_core_doubleround_body
312         
313         ldr     r11, [sp, #10*4]
314         add     r8, r9, r8
315         ldr     r12, [sp, #15*4]
316         add     lr, r10, lr
317         eor     r11, r11, r8, ror #14
318         add     r8, r3, r2
319         eor     r12, r12, lr, ror #14
320         add     lr, r4, r7
321         eor     r0, r0, r8, ror #14
322         ldr     r8, [sp, #11*4]
323         eor     r5, r5, lr, ror #14
324         ldr     lr, [sp, #12*4]
325         
326         add     r8, r8, r12
327         str     r11, [sp, #10*4]
328         add     lr, lr, r0
329         str     r12, [sp, #15*4]
330         eor     r3, r3, r8, ror #25
331         add     r8, r5, r1
332         eor     r4, r4, lr, ror #25
333         add     lr, r11, r6
334         str     r9, [sp, #9*4]
335         eor     r9, r9, r8, ror #25
336         str     r10, [sp, #14*4]
337         eor     r10, r10, lr, ror #25
338         
339         salsa8_core_doubleround_body
340         
341         ldr     r11, [sp, #10*4]
342         add     r8, r9, r8
343         ldr     r12, [sp, #15*4]
344         add     lr, r10, lr
345         eor     r11, r11, r8, ror #14
346         add     r8, r3, r2
347         eor     r12, r12, lr, ror #14
348         add     lr, r4, r7
349         eor     r0, r0, r8, ror #14
350         ldr     r8, [sp, #11*4]
351         eor     r5, r5, lr, ror #14
352         ldr     lr, [sp, #12*4]
353         
354         add     r8, r8, r12
355         str     r11, [sp, #10*4]
356         add     lr, lr, r0
357         str     r12, [sp, #15*4]
358         eor     r3, r3, r8, ror #25
359         add     r8, r5, r1
360         eor     r4, r4, lr, ror #25
361         add     lr, r11, r6
362         str     r9, [sp, #9*4]
363         eor     r9, r9, r8, ror #25
364         str     r10, [sp, #14*4]
365         eor     r10, r10, lr, ror #25
366         
367         salsa8_core_doubleround_body
368         
369         ldr     r11, [sp, #10*4]
370         add     r8, r9, r8
371         ldr     r12, [sp, #15*4]
372         add     lr, r10, lr
373         str     r9, [sp, #9*4]
374         eor     r11, r11, r8, ror #14
375         eor     r12, r12, lr, ror #14
376         add     r8, r3, r2
377         str     r10, [sp, #14*4]
378         add     lr, r4, r7
379         str     r11, [sp, #10*4]
380         eor     r0, r0, r8, ror #14
381         str     r12, [sp, #15*4]
382         eor     r5, r5, lr, ror #14
383         
384         stmia   sp, {r0-r7}
385 .endm
386
387 #endif
388
389
390 .macro scrypt_core_macro1a_x4
391         ldmia   r0, {r4-r7}
392         ldmia   lr!, {r8-r11}
393         stmia   r1!, {r4-r7}
394         stmia   r3!, {r8-r11}
395         eor     r4, r4, r8
396         eor     r5, r5, r9
397         eor     r6, r6, r10
398         eor     r7, r7, r11
399         stmia   r0!, {r4-r7}
400         stmia   r12!, {r4-r7}
401 .endm
402
403 .macro scrypt_core_macro1b_x4
404         ldmia   r3!, {r8-r11}
405         ldmia   r2, {r4-r7}
406         eor     r8, r8, r4
407         eor     r9, r9, r5
408         eor     r10, r10, r6
409         eor     r11, r11, r7
410         ldmia   r0, {r4-r7}
411         stmia   r2!, {r8-r11}
412         eor     r4, r4, r8
413         eor     r5, r5, r9
414         eor     r6, r6, r10
415         eor     r7, r7, r11
416         ldmia   r1!, {r8-r11}
417         eor     r4, r4, r8
418         eor     r5, r5, r9
419         eor     r6, r6, r10
420         eor     r7, r7, r11
421         stmia   r0!, {r4-r7}
422         stmia   r12!, {r4-r7}
423 .endm
424
425 .macro scrypt_core_macro2_x4
426         ldmia   r12, {r4-r7}
427         ldmia   r0, {r8-r11}
428         add     r4, r4, r8
429         add     r5, r5, r9
430         add     r6, r6, r10
431         add     r7, r7, r11
432         stmia   r0!, {r4-r7}
433         ldmia   r2, {r8-r11}
434         eor     r4, r4, r8
435         eor     r5, r5, r9
436         eor     r6, r6, r10
437         eor     r7, r7, r11
438         stmia   r2!, {r4-r7}
439         stmia   r12!, {r4-r7}
440 .endm
441
442 .macro scrypt_core_macro3_x4
443         ldmia   r1!, {r4-r7}
444         ldmia   r0, {r8-r11}
445         add     r4, r4, r8
446         add     r5, r5, r9
447         add     r6, r6, r10
448         add     r7, r7, r11
449         stmia   r0!, {r4-r7}
450 .endm
451
452 .macro scrypt_core_macro3_x6
453         ldmia   r1!, {r2-r7}
454         ldmia   r0, {r8-r12, lr}
455         add     r2, r2, r8
456         add     r3, r3, r9
457         add     r4, r4, r10
458         add     r5, r5, r11
459         add     r6, r6, r12
460         add     r7, r7, lr
461         stmia   r0!, {r2-r7}
462 .endm
463
464
465         .text
466         .code 32
467         .align 2
468         .globl scrypt_core
469         .globl _scrypt_core
470 #ifdef __ELF__
471         .type scrypt_core, %function
472 #endif
473 scrypt_core:
474 _scrypt_core:
475         stmfd   sp!, {r4-r11, lr}
476         mov     r12, sp
477         sub     sp, sp, #21*4
478         bic     sp, sp, #63
479         str     r12, [sp, #20*4]
480         
481         scrypt_shuffle
482         
483         str     r0, [sp, #16*4]
484         add     r12, r1, #1024*32*4
485         str     r12, [sp, #18*4]
486 scrypt_core_loop1:
487         add     lr, r0, #16*4
488         add     r3, r1, #16*4
489         mov     r12, sp
490         scrypt_core_macro1a_x4
491         scrypt_core_macro1a_x4
492         scrypt_core_macro1a_x4
493         scrypt_core_macro1a_x4
494         str     r1, [sp, #17*4]
495         
496         salsa8_core
497         
498         ldr     r0, [sp, #16*4]
499         mov     r12, sp
500         add     r2, r0, #16*4
501         scrypt_core_macro2_x4
502         scrypt_core_macro2_x4
503         scrypt_core_macro2_x4
504         scrypt_core_macro2_x4
505         
506         salsa8_core
507         
508         ldr     r0, [sp, #16*4]
509         mov     r1, sp
510         add     r0, r0, #16*4
511         scrypt_core_macro3_x6
512         scrypt_core_macro3_x6
513         ldr     r3, [sp, #17*4]
514         ldr     r12, [sp, #18*4]
515         scrypt_core_macro3_x4
516         
517         add     r1, r3, #16*4
518         sub     r0, r0, #32*4
519         cmp     r1, r12
520         bne     scrypt_core_loop1
521         
522         ldr     r4, [r0, #16*4]
523         sub     r1, r1, #1024*32*4
524         str     r1, [sp, #17*4]
525         mov     r4, r4, lsl #32-10
526         mov     r12, #1024
527         add     r1, r1, r4, lsr #32-10-7
528 scrypt_core_loop2:
529         add     r2, r0, #16*4
530         add     r3, r1, #16*4
531         str     r12, [sp, #18*4]
532         mov     r12, sp
533 #ifdef __ARM_ARCH_5E_OR_6_OR_7__
534         pld [r1, #24*4]
535         pld [r1, #8*4]
536 #endif
537         scrypt_core_macro1b_x4
538         scrypt_core_macro1b_x4
539         scrypt_core_macro1b_x4
540         scrypt_core_macro1b_x4
541         
542         salsa8_core
543         
544         ldr     r0, [sp, #16*4]
545         mov     r12, sp
546         add     r2, r0, #16*4
547         scrypt_core_macro2_x4
548         scrypt_core_macro2_x4
549         scrypt_core_macro2_x4
550         scrypt_core_macro2_x4
551         
552         salsa8_core
553         
554         ldr     r0, [sp, #16*4]
555         mov     r1, sp
556         ldr     r3, [sp, #17*4]
557         add     r0, r0, #16*4
558         scrypt_core_macro3_x4
559         mov     r4, r4, lsl #32-10
560         add     r3, r3, r4, lsr #32-10-7
561         str     r3, [sp, #19*4]
562 #ifdef __ARM_ARCH_5E_OR_6_OR_7__
563         pld     [r3, #16*4]
564         pld     [r3]
565 #endif
566         scrypt_core_macro3_x6
567         scrypt_core_macro3_x6
568         
569         ldr     r12, [sp, #18*4]
570         sub     r0, r0, #32*4
571         ldr     r1, [sp, #19*4]
572         subs    r12, r12, #1
573         bne     scrypt_core_loop2
574         
575         scrypt_shuffle
576         
577         ldr     sp, [sp, #20*4]
578 #ifdef __thumb__
579         ldmfd   sp!, {r4-r11, lr}
580         bx      lr
581 #else
582         ldmfd   sp!, {r4-r11, pc}
583 #endif
584
585 #endif