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