e2f46a7df8759a47fbab9b85f0ae90da19e6ad3b
[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 .macro salsa8_core_doubleround_body
17         ldr     r8, [sp, #8*4]
18         add     r11, r11, r10
19         ldr     lr, [sp, #13*4]
20         add     r12, r12, r3
21         eor     r2, r2, r11, ror #23
22         add     r11, r4, r0
23         eor     r7, r7, r12, ror #23
24         add     r12, r9, r5
25         str     r9, [sp, #9*4]
26         eor     r8, r8, r11, ror #23
27         str     r10, [sp, #14*4]
28         eor     lr, lr, r12, ror #23
29         
30         ldr     r11, [sp, #11*4]
31         add     r9, lr, r9
32         ldr     r12, [sp, #12*4]
33         add     r10, r2, r10
34         eor     r1, r1, r9, ror #19
35         add     r9, r7, r3
36         eor     r6, r6, r10, ror #19
37         add     r10, r8, r4
38         str     r8, [sp, #8*4]
39         eor     r11, r11, r9, ror #19
40         str     lr, [sp, #13*4]
41         eor     r12, r12, r10, ror #19
42         
43         ldr     r9, [sp, #10*4]
44         add     r8, r12, r8
45         ldr     r10, [sp, #15*4]
46         add     lr, r1, lr
47         eor     r0, r0, r8, ror #14
48         add     r8, r6, r2
49         eor     r5, r5, lr, ror #14
50         add     lr, r11, r7
51         eor     r9, r9, r8, ror #14
52         ldr     r8, [sp, #9*4]
53         eor     r10, r10, lr, ror #14
54         ldr     lr, [sp, #14*4]
55         
56         
57         add     r8, r9, r8
58         str     r9, [sp, #10*4]
59         add     lr, r10, lr
60         str     r10, [sp, #15*4]
61         eor     r11, r11, r8, ror #25
62         add     r8, r0, r3
63         eor     r12, r12, lr, ror #25
64         add     lr, r5, r4
65         eor     r1, r1, r8, ror #25
66         ldr     r8, [sp, #8*4]
67         eor     r6, r6, lr, ror #25
68         
69         add     r9, r11, r9
70         ldr     lr, [sp, #13*4]
71         add     r10, r12, r10
72         eor     r8, r8, r9, ror #23
73         add     r9, r1, r0
74         eor     lr, lr, r10, ror #23
75         add     r10, r6, r5
76         str     r11, [sp, #11*4]
77         eor     r2, r2, r9, ror #23
78         str     r12, [sp, #12*4]
79         eor     r7, r7, r10, ror #23
80         
81         ldr     r9, [sp, #9*4]
82         add     r11, r8, r11
83         ldr     r10, [sp, #14*4]
84         add     r12, lr, r12
85         eor     r9, r9, r11, ror #19
86         add     r11, r2, r1
87         eor     r10, r10, r12, ror #19
88         add     r12, r7, r6
89         str     r8, [sp, #8*4]
90         eor     r3, r3, r11, ror #19
91         str     lr, [sp, #13*4]
92         eor     r4, r4, r12, ror #19
93 .endm
94
95 .macro salsa8_core
96         ldmia   sp, {r0-r7}
97         
98         ldr     r12, [sp, #15*4]
99         ldr     r8, [sp, #11*4]
100         ldr     lr, [sp, #12*4]
101         
102         ldr     r9, [sp, #9*4]
103         add     r8, r8, r12
104         ldr     r11, [sp, #10*4]
105         add     lr, lr, r0
106         eor     r3, r3, r8, ror #25
107         add     r8, r5, r1
108         ldr     r10, [sp, #14*4]
109         eor     r4, r4, lr, ror #25
110         add     lr, r11, r6
111         eor     r9, r9, r8, ror #25
112         eor     r10, r10, lr, ror #25
113         
114         salsa8_core_doubleround_body
115         
116         ldr     r11, [sp, #10*4]
117         add     r8, r9, r8
118         ldr     r12, [sp, #15*4]
119         add     lr, r10, lr
120         eor     r11, r11, r8, ror #14
121         str     r9, [sp, #9*4]
122         eor     r12, r12, lr, ror #14
123         add     r8, r3, r2
124         add     lr, r4, r7
125         str     r10, [sp, #14*4]
126         eor     r0, r0, r8, ror #14
127         ldr     r8, [sp, #11*4]
128         eor     r5, r5, lr, ror #14
129         ldr     lr, [sp, #12*4]
130         
131         add     r8, r8, r12
132         str     r11, [sp, #10*4]
133         add     lr, lr, r0
134         str     r12, [sp, #15*4]
135         eor     r3, r3, r8, ror #25
136         add     r8, r5, r1
137         eor     r4, r4, lr, ror #25
138         add     lr, r11, r6
139         eor     r9, r9, r8, ror #25
140         eor     r10, r10, lr, ror #25
141         
142         salsa8_core_doubleround_body
143         
144         ldr     r11, [sp, #10*4]
145         add     r8, r9, r8
146         ldr     r12, [sp, #15*4]
147         add     lr, r10, lr
148         eor     r11, r11, r8, ror #14
149         str     r9, [sp, #9*4]
150         eor     r12, r12, lr, ror #14
151         add     r8, r3, r2
152         add     lr, r4, r7
153         str     r10, [sp, #14*4]
154         eor     r0, r0, r8, ror #14
155         ldr     r8, [sp, #11*4]
156         eor     r5, r5, lr, ror #14
157         ldr     lr, [sp, #12*4]
158         
159         add     r8, r8, r12
160         str     r11, [sp, #10*4]
161         add     lr, lr, r0
162         str     r12, [sp, #15*4]
163         eor     r3, r3, r8, ror #25
164         add     r8, r5, r1
165         eor     r4, r4, lr, ror #25
166         add     lr, r11, r6
167         eor     r9, r9, r8, ror #25
168         eor     r10, r10, lr, ror #25
169         
170         salsa8_core_doubleround_body
171         
172         ldr     r11, [sp, #10*4]
173         add     r8, r9, r8
174         ldr     r12, [sp, #15*4]
175         add     lr, r10, lr
176         eor     r11, r11, r8, ror #14
177         str     r9, [sp, #9*4]
178         eor     r12, r12, lr, ror #14
179         add     r8, r3, r2
180         add     lr, r4, r7
181         str     r10, [sp, #14*4]
182         eor     r0, r0, r8, ror #14
183         ldr     r8, [sp, #11*4]
184         eor     r5, r5, lr, ror #14
185         ldr     lr, [sp, #12*4]
186         
187         add     r8, r8, r12
188         str     r11, [sp, #10*4]
189         add     lr, lr, r0
190         str     r12, [sp, #15*4]
191         eor     r3, r3, r8, ror #25
192         add     r8, r5, r1
193         eor     r4, r4, lr, ror #25
194         add     lr, r11, r6
195         eor     r9, r9, r8, ror #25
196         eor     r10, r10, lr, ror #25
197         
198         salsa8_core_doubleround_body
199         
200         ldr     r11, [sp, #10*4]
201         add     r8, r9, r8
202         ldr     r12, [sp, #15*4]
203         add     lr, r10, lr
204         str     r9, [sp, #9*4]
205         eor     r11, r11, r8, ror #14
206         eor     r12, r12, lr, ror #14
207         add     r8, r3, r2
208         str     r10, [sp, #14*4]
209         add     lr, r4, r7
210         str     r11, [sp, #10*4]
211         eor     r0, r0, r8, ror #14
212         str     r12, [sp, #15*4]
213         eor     r5, r5, lr, ror #14
214         
215         stmia   sp, {r0-r7}
216 .endm
217
218
219 .macro scrypt_core_macro1a_x4
220         ldmia   r0, {r4-r7}
221         ldmia   lr!, {r8-r11}
222         stmia   r1!, {r4-r7}
223         stmia   r3!, {r8-r11}
224         eor     r4, r4, r8
225         eor     r5, r5, r9
226         eor     r6, r6, r10
227         eor     r7, r7, r11
228         stmia   r0!, {r4-r7}
229         stmia   r12!, {r4-r7}
230 .endm
231
232 .macro scrypt_core_macro1b_x4
233         ldmia   r3!, {r8-r11}
234         ldmia   r2, {r4-r7}
235         eor     r8, r8, r4
236         eor     r9, r9, r5
237         eor     r10, r10, r6
238         eor     r11, r11, r7
239         ldmia   r0, {r4-r7}
240         stmia   r2!, {r8-r11}
241         eor     r4, r4, r8
242         eor     r5, r5, r9
243         eor     r6, r6, r10
244         eor     r7, r7, r11
245         ldmia   r1!, {r8-r11}
246         eor     r4, r4, r8
247         eor     r5, r5, r9
248         eor     r6, r6, r10
249         eor     r7, r7, r11
250         stmia   r0!, {r4-r7}
251         stmia   r12!, {r4-r7}
252 .endm
253
254 .macro scrypt_core_macro2_x4
255         ldmia   r12, {r4-r7}
256         ldmia   r0, {r8-r11}
257         add     r4, r4, r8
258         add     r5, r5, r9
259         add     r6, r6, r10
260         add     r7, r7, r11
261         stmia   r0!, {r4-r7}
262         ldmia   r2, {r8-r11}
263         eor     r4, r4, r8
264         eor     r5, r5, r9
265         eor     r6, r6, r10
266         eor     r7, r7, r11
267         stmia   r2!, {r4-r7}
268         stmia   r12!, {r4-r7}
269 .endm
270
271 .macro scrypt_core_macro3_x4
272         ldmia   r1!, {r4-r7}
273         ldmia   r0, {r8-r11}
274         add     r4, r4, r8
275         add     r5, r5, r9
276         add     r6, r6, r10
277         add     r7, r7, r11
278         stmia   r0!, {r4-r7}
279 .endm
280
281 .macro scrypt_core_macro3_x6
282         ldmia   r1!, {r2-r7}
283         ldmia   r0, {r8-r12, lr}
284         add     r2, r2, r8
285         add     r3, r3, r9
286         add     r4, r4, r10
287         add     r5, r5, r11
288         add     r6, r6, r12
289         add     r7, r7, lr
290         stmia   r0!, {r2-r7}
291 .endm
292
293
294         .text
295         .code 32
296         .align 2
297         .globl scrypt_core
298         .globl _scrypt_core
299 #ifdef __ELF__
300         .type scrypt_core, %function
301 #endif
302 scrypt_core:
303 _scrypt_core:
304         stmfd   sp!, {r4-r11, lr}
305         sub     sp, sp, #20*4
306         
307         str     r0, [sp, #16*4]
308         add     r12, r1, #1024*32*4
309         str     r12, [sp, #18*4]
310 scrypt_core_loop1:
311         add     lr, r0, #16*4
312         add     r3, r1, #16*4
313         mov     r12, sp
314         scrypt_core_macro1a_x4
315         scrypt_core_macro1a_x4
316         scrypt_core_macro1a_x4
317         scrypt_core_macro1a_x4
318         str     r1, [sp, #17*4]
319         
320         salsa8_core
321         
322         ldr     r0, [sp, #16*4]
323         mov     r12, sp
324         add     r2, r0, #16*4
325         scrypt_core_macro2_x4
326         scrypt_core_macro2_x4
327         scrypt_core_macro2_x4
328         scrypt_core_macro2_x4
329         
330         salsa8_core
331         
332         ldr     r0, [sp, #16*4]
333         mov     r1, sp
334         add     r0, r0, #16*4
335         scrypt_core_macro3_x6
336         scrypt_core_macro3_x6
337         ldr     r3, [sp, #17*4]
338         ldr     r12, [sp, #18*4]
339         scrypt_core_macro3_x4
340         
341         add     r1, r3, #16*4
342         sub     r0, r0, #32*4
343         cmp     r1, r12
344         bne     scrypt_core_loop1
345         
346         sub     r1, r1, #1024*32*4
347         str     r1, [sp, #17*4]
348         mov     r12, #1024
349 scrypt_core_loop2:
350         str     r12, [sp, #18*4]
351         
352         ldr     r4, [r0, #16*4]
353         mov     r4, r4, lsl #32-10
354         add     r1, r1, r4, lsr #32-10-7
355         
356         add     r2, r0, #16*4
357         add     r3, r1, #16*4
358         mov     r12, sp
359         scrypt_core_macro1b_x4
360         scrypt_core_macro1b_x4
361         scrypt_core_macro1b_x4
362         scrypt_core_macro1b_x4
363         
364         salsa8_core
365         
366         ldr     r0, [sp, #16*4]
367         mov     r12, sp
368         add     r2, r0, #16*4
369         scrypt_core_macro2_x4
370         scrypt_core_macro2_x4
371         scrypt_core_macro2_x4
372         scrypt_core_macro2_x4
373         
374         salsa8_core
375         
376         ldr     r0, [sp, #16*4]
377         mov     r1, sp
378         add     r0, r0, #16*4
379         scrypt_core_macro3_x6
380         scrypt_core_macro3_x6
381         scrypt_core_macro3_x4
382         
383         ldr     r12, [sp, #18*4]
384         sub     r0, r0, #32*4
385         ldr     r1, [sp, #17*4]
386         subs    r12, r12, #1
387         bne     scrypt_core_loop2
388         
389         add     sp, sp, #20*4
390 #ifdef __thumb__
391         ldmfd   sp!, {r4-r11, lr}
392         bx      lr
393 #else
394         ldmfd   sp!, {r4-r11, pc}
395 #endif
396
397 #endif