2 * Copyright 2012 pooler@litecoinpool.org
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.
10 #if defined(__linux__) && defined(__ELF__)
11 .section .note.GNU-stack,"",%progbits
14 #if defined(__arm__) && defined(__APCS_32__)
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__
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__
30 #ifdef __ARM_ARCH_5E_OR_6__
35 ldmia lr, {r2, r8-r12, lr}
52 ldmia lr, {r2, r8-r12, lr}
54 str r5, [r0, #64+15*4]
55 str r6, [r0, #64+12*4]
58 str r2, [r0, #64+13*4]
60 strd r4, [r0, #64+10*4]
62 str r10, [r0, #64+4*4]
63 str r11, [r0, #64+9*4]
67 .macro salsa8_core_doubleround_body
70 eor r10, r10, r6, ror #25
72 eor r11, r11, r7, ror #25
75 eor r12, r12, r6, ror #25
76 eor lr, lr, r7, ror #25
81 eor r6, r6, r2, ror #23
83 eor r7, r7, r3, ror #23
86 eor r8, r8, r2, ror #23
87 eor r9, r9, r3, ror #23
92 eor r2, r2, r10, ror #19
94 eor r3, r3, r11, ror #19
96 eor r4, r4, r10, ror #19
97 eor r5, r5, r11, ror #19
102 eor r10, r10, r6, ror #14
104 eor r11, r11, r7, ror #14
106 eor r0, r0, r6, ror #14
107 eor r1, r1, r7, ror #14
115 eor r4, r4, r6, ror #25
117 eor r5, r5, r7, ror #25
119 eor r2, r2, r6, ror #25
120 eor r3, r3, r7, ror #25
126 eor r8, r8, r10, ror #23
128 eor r9, r9, r11, ror #23
130 eor r6, r6, r10, ror #23
131 eor r7, r7, r11, ror #23
135 ldrd r10, [sp, #14*4]
137 eor r12, r12, r2, ror #19
139 eor lr, lr, r3, ror #19
141 eor r10, r10, r2, ror #19
142 eor r11, r11, r3, ror #19
147 eor r0, r0, r6, ror #14
149 eor r1, r1, r7, ror #14
151 eor r2, r2, r6, ror #14
152 eor r3, r3, r7, ror #14
156 ldmia sp, {r0-r12, lr}
158 ldrd r10, [sp, #14*4]
159 salsa8_core_doubleround_body
162 strd r10, [sp, #14*4]
163 salsa8_core_doubleround_body
166 strd r10, [sp, #14*4]
167 salsa8_core_doubleround_body
170 strd r10, [sp, #14*4]
171 salsa8_core_doubleround_body
177 strd r10, [sp, #14*4]
182 .macro scrypt_shuffle
185 .macro salsa8_core_doubleround_body
190 eor r2, r2, r11, ror #23
192 eor r7, r7, r12, ror #23
195 eor r8, r8, r11, ror #23
197 eor lr, lr, r12, ror #23
203 eor r1, r1, r9, ror #19
205 eor r6, r6, r10, ror #19
208 eor r11, r11, r9, ror #19
210 eor r12, r12, r10, ror #19
216 eor r0, r0, r8, ror #14
218 eor r5, r5, lr, ror #14
220 eor r9, r9, r8, ror #14
222 eor r10, r10, lr, ror #14
230 eor r11, r11, r8, ror #25
232 eor r12, r12, lr, ror #25
234 eor r1, r1, r8, ror #25
236 eor r6, r6, lr, ror #25
241 eor r8, r8, r9, ror #23
243 eor lr, lr, r10, ror #23
246 eor r2, r2, r9, ror #23
248 eor r7, r7, r10, ror #23
254 eor r9, r9, r11, ror #19
256 eor r10, r10, r12, ror #19
259 eor r3, r3, r11, ror #19
261 eor r4, r4, r12, ror #19
275 eor r3, r3, r8, ror #25
278 eor r4, r4, lr, ror #25
280 eor r9, r9, r8, ror #25
281 eor r10, r10, lr, ror #25
283 salsa8_core_doubleround_body
289 eor r11, r11, r8, ror #14
291 eor r12, r12, lr, ror #14
293 eor r0, r0, r8, ror #14
295 eor r5, r5, lr, ror #14
302 eor r3, r3, r8, ror #25
304 eor r4, r4, lr, ror #25
307 eor r9, r9, r8, ror #25
309 eor r10, r10, lr, ror #25
311 salsa8_core_doubleround_body
317 eor r11, r11, r8, ror #14
319 eor r12, r12, lr, ror #14
321 eor r0, r0, r8, ror #14
323 eor r5, r5, lr, ror #14
330 eor r3, r3, r8, ror #25
332 eor r4, r4, lr, ror #25
335 eor r9, r9, r8, ror #25
337 eor r10, r10, lr, ror #25
339 salsa8_core_doubleround_body
345 eor r11, r11, r8, ror #14
347 eor r12, r12, lr, ror #14
349 eor r0, r0, r8, ror #14
351 eor r5, r5, lr, ror #14
358 eor r3, r3, r8, ror #25
360 eor r4, r4, lr, ror #25
363 eor r9, r9, r8, ror #25
365 eor r10, r10, lr, ror #25
367 salsa8_core_doubleround_body
374 eor r11, r11, r8, ror #14
375 eor r12, r12, lr, ror #14
380 eor r0, r0, r8, ror #14
382 eor r5, r5, lr, ror #14
390 .macro scrypt_core_macro1a_x4
403 .macro scrypt_core_macro1b_x4
425 .macro scrypt_core_macro2_x4
442 .macro scrypt_core_macro3_x4
452 .macro scrypt_core_macro3_x6
454 ldmia r0, {r8-r12, lr}
471 .type scrypt_core, %function
475 stmfd sp!, {r4-r11, lr}
484 add r12, r1, #1024*32*4
490 scrypt_core_macro1a_x4
491 scrypt_core_macro1a_x4
492 scrypt_core_macro1a_x4
493 scrypt_core_macro1a_x4
501 scrypt_core_macro2_x4
502 scrypt_core_macro2_x4
503 scrypt_core_macro2_x4
504 scrypt_core_macro2_x4
511 scrypt_core_macro3_x6
512 scrypt_core_macro3_x6
515 scrypt_core_macro3_x4
520 bne scrypt_core_loop1
523 sub r1, r1, #1024*32*4
525 mov r4, r4, lsl #32-10
527 add r1, r1, r4, lsr #32-10-7
533 #ifdef __ARM_ARCH_5E_OR_6_OR_7__
537 scrypt_core_macro1b_x4
538 scrypt_core_macro1b_x4
539 scrypt_core_macro1b_x4
540 scrypt_core_macro1b_x4
547 scrypt_core_macro2_x4
548 scrypt_core_macro2_x4
549 scrypt_core_macro2_x4
550 scrypt_core_macro2_x4
558 scrypt_core_macro3_x4
559 mov r4, r4, lsl #32-10
560 add r3, r3, r4, lsr #32-10-7
562 #ifdef __ARM_ARCH_5E_OR_6_OR_7__
566 scrypt_core_macro3_x6
567 scrypt_core_macro3_x6
573 bne scrypt_core_loop2
579 ldmfd sp!, {r4-r11, lr}
582 ldmfd sp!, {r4-r11, pc}