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