Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tpruvot
GitHub Repository: tpruvot/cpuminer-multi
Path: blob/linux/asm/scrypt-arm.S
1201 views
1
/*
2
* Copyright 2012, 2014 [email protected]
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
#include <cpuminer-config.h>
11
12
#if defined(USE_ASM) && defined(__arm__) && defined(__APCS_32__)
13
14
#if defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
15
defined(__ARM_ARCH_5TEJ__) || defined(__ARM_ARCH_6__) || \
16
defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
17
defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_6T2__) || \
18
defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
19
#define __ARM_ARCH_5E_OR_6__
20
#endif
21
22
#if defined(__ARM_ARCH_5E_OR_6__) || defined(__ARM_ARCH_7__) || \
23
defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \
24
defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
25
#define __ARM_ARCH_5E_OR_6_OR_7__
26
#endif
27
28
#ifdef __ARM_ARCH_5E_OR_6__
29
30
.macro scrypt_shuffle
31
add lr, r0, #9*4
32
ldmia r0, {r2-r7}
33
ldmia lr, {r2, r8-r12, lr}
34
str r3, [r0, #5*4]
35
str r5, [r0, #15*4]
36
str r6, [r0, #12*4]
37
str r7, [r0, #1*4]
38
ldr r5, [r0, #7*4]
39
str r2, [r0, #13*4]
40
str r8, [r0, #2*4]
41
strd r4, [r0, #10*4]
42
str r9, [r0, #7*4]
43
str r10, [r0, #4*4]
44
str r11, [r0, #9*4]
45
str lr, [r0, #3*4]
46
47
add r2, r0, #64+0*4
48
add lr, r0, #64+9*4
49
ldmia r2, {r2-r7}
50
ldmia lr, {r2, r8-r12, lr}
51
str r3, [r0, #64+5*4]
52
str r5, [r0, #64+15*4]
53
str r6, [r0, #64+12*4]
54
str r7, [r0, #64+1*4]
55
ldr r5, [r0, #64+7*4]
56
str r2, [r0, #64+13*4]
57
str r8, [r0, #64+2*4]
58
strd r4, [r0, #64+10*4]
59
str r9, [r0, #64+7*4]
60
str r10, [r0, #64+4*4]
61
str r11, [r0, #64+9*4]
62
str lr, [r0, #64+3*4]
63
.endm
64
65
.macro salsa8_core_doubleround_body
66
add r6, r2, r6
67
add r7, r3, r7
68
eor r10, r10, r6, ror #25
69
add r6, r0, r4
70
eor r11, r11, r7, ror #25
71
add r7, r1, r5
72
strd r10, [sp, #14*4]
73
eor r12, r12, r6, ror #25
74
eor lr, lr, r7, ror #25
75
76
ldrd r6, [sp, #10*4]
77
add r2, r10, r2
78
add r3, r11, r3
79
eor r6, r6, r2, ror #23
80
add r2, r12, r0
81
eor r7, r7, r3, ror #23
82
add r3, lr, r1
83
strd r6, [sp, #10*4]
84
eor r8, r8, r2, ror #23
85
eor r9, r9, r3, ror #23
86
87
ldrd r2, [sp, #6*4]
88
add r10, r6, r10
89
add r11, r7, r11
90
eor r2, r2, r10, ror #19
91
add r10, r8, r12
92
eor r3, r3, r11, ror #19
93
add r11, r9, lr
94
eor r4, r4, r10, ror #19
95
eor r5, r5, r11, ror #19
96
97
ldrd r10, [sp, #2*4]
98
add r6, r2, r6
99
add r7, r3, r7
100
eor r10, r10, r6, ror #14
101
add r6, r4, r8
102
eor r11, r11, r7, ror #14
103
add r7, r5, r9
104
eor r0, r0, r6, ror #14
105
eor r1, r1, r7, ror #14
106
107
108
ldrd r6, [sp, #14*4]
109
strd r2, [sp, #6*4]
110
strd r10, [sp, #2*4]
111
add r6, r11, r6
112
add r7, r0, r7
113
eor r4, r4, r6, ror #25
114
add r6, r1, r12
115
eor r5, r5, r7, ror #25
116
add r7, r10, lr
117
eor r2, r2, r6, ror #25
118
eor r3, r3, r7, ror #25
119
strd r2, [sp, #6*4]
120
121
add r10, r3, r10
122
ldrd r6, [sp, #10*4]
123
add r11, r4, r11
124
eor r8, r8, r10, ror #23
125
add r10, r5, r0
126
eor r9, r9, r11, ror #23
127
add r11, r2, r1
128
eor r6, r6, r10, ror #23
129
eor r7, r7, r11, ror #23
130
strd r6, [sp, #10*4]
131
132
add r2, r7, r2
133
ldrd r10, [sp, #14*4]
134
add r3, r8, r3
135
eor r12, r12, r2, ror #19
136
add r2, r9, r4
137
eor lr, lr, r3, ror #19
138
add r3, r6, r5
139
eor r10, r10, r2, ror #19
140
eor r11, r11, r3, ror #19
141
142
ldrd r2, [sp, #2*4]
143
add r6, r11, r6
144
add r7, r12, r7
145
eor r0, r0, r6, ror #14
146
add r6, lr, r8
147
eor r1, r1, r7, ror #14
148
add r7, r10, r9
149
eor r2, r2, r6, ror #14
150
eor r3, r3, r7, ror #14
151
.endm
152
153
.macro salsa8_core
154
ldmia sp, {r0-r12, lr}
155
156
ldrd r10, [sp, #14*4]
157
salsa8_core_doubleround_body
158
ldrd r6, [sp, #6*4]
159
strd r2, [sp, #2*4]
160
strd r10, [sp, #14*4]
161
salsa8_core_doubleround_body
162
ldrd r6, [sp, #6*4]
163
strd r2, [sp, #2*4]
164
strd r10, [sp, #14*4]
165
salsa8_core_doubleround_body
166
ldrd r6, [sp, #6*4]
167
strd r2, [sp, #2*4]
168
strd r10, [sp, #14*4]
169
salsa8_core_doubleround_body
170
171
stmia sp, {r0-r5}
172
strd r8, [sp, #8*4]
173
str r12, [sp, #12*4]
174
str lr, [sp, #13*4]
175
strd r10, [sp, #14*4]
176
.endm
177
178
#else
179
180
.macro scrypt_shuffle
181
.endm
182
183
.macro salsa8_core_doubleround_body
184
ldr r8, [sp, #8*4]
185
add r11, r11, r10
186
ldr lr, [sp, #13*4]
187
add r12, r12, r3
188
eor r2, r2, r11, ror #23
189
add r11, r4, r0
190
eor r7, r7, r12, ror #23
191
add r12, r9, r5
192
str r9, [sp, #9*4]
193
eor r8, r8, r11, ror #23
194
str r10, [sp, #14*4]
195
eor lr, lr, r12, ror #23
196
197
ldr r11, [sp, #11*4]
198
add r9, lr, r9
199
ldr r12, [sp, #12*4]
200
add r10, r2, r10
201
eor r1, r1, r9, ror #19
202
add r9, r7, r3
203
eor r6, r6, r10, ror #19
204
add r10, r8, r4
205
str r8, [sp, #8*4]
206
eor r11, r11, r9, ror #19
207
str lr, [sp, #13*4]
208
eor r12, r12, r10, ror #19
209
210
ldr r9, [sp, #10*4]
211
add r8, r12, r8
212
ldr r10, [sp, #15*4]
213
add lr, r1, lr
214
eor r0, r0, r8, ror #14
215
add r8, r6, r2
216
eor r5, r5, lr, ror #14
217
add lr, r11, r7
218
eor r9, r9, r8, ror #14
219
ldr r8, [sp, #9*4]
220
eor r10, r10, lr, ror #14
221
ldr lr, [sp, #14*4]
222
223
224
add r8, r9, r8
225
str r9, [sp, #10*4]
226
add lr, r10, lr
227
str r10, [sp, #15*4]
228
eor r11, r11, r8, ror #25
229
add r8, r0, r3
230
eor r12, r12, lr, ror #25
231
add lr, r5, r4
232
eor r1, r1, r8, ror #25
233
ldr r8, [sp, #8*4]
234
eor r6, r6, lr, ror #25
235
236
add r9, r11, r9
237
ldr lr, [sp, #13*4]
238
add r10, r12, r10
239
eor r8, r8, r9, ror #23
240
add r9, r1, r0
241
eor lr, lr, r10, ror #23
242
add r10, r6, r5
243
str r11, [sp, #11*4]
244
eor r2, r2, r9, ror #23
245
str r12, [sp, #12*4]
246
eor r7, r7, r10, ror #23
247
248
ldr r9, [sp, #9*4]
249
add r11, r8, r11
250
ldr r10, [sp, #14*4]
251
add r12, lr, r12
252
eor r9, r9, r11, ror #19
253
add r11, r2, r1
254
eor r10, r10, r12, ror #19
255
add r12, r7, r6
256
str r8, [sp, #8*4]
257
eor r3, r3, r11, ror #19
258
str lr, [sp, #13*4]
259
eor r4, r4, r12, ror #19
260
.endm
261
262
.macro salsa8_core
263
ldmia sp, {r0-r7}
264
265
ldr r12, [sp, #15*4]
266
ldr r8, [sp, #11*4]
267
ldr lr, [sp, #12*4]
268
269
ldr r9, [sp, #9*4]
270
add r8, r8, r12
271
ldr r11, [sp, #10*4]
272
add lr, lr, r0
273
eor r3, r3, r8, ror #25
274
add r8, r5, r1
275
ldr r10, [sp, #14*4]
276
eor r4, r4, lr, ror #25
277
add lr, r11, r6
278
eor r9, r9, r8, ror #25
279
eor r10, r10, lr, ror #25
280
281
salsa8_core_doubleround_body
282
283
ldr r11, [sp, #10*4]
284
add r8, r9, r8
285
ldr r12, [sp, #15*4]
286
add lr, r10, lr
287
eor r11, r11, r8, ror #14
288
add r8, r3, r2
289
eor r12, r12, lr, ror #14
290
add lr, r4, r7
291
eor r0, r0, r8, ror #14
292
ldr r8, [sp, #11*4]
293
eor r5, r5, lr, ror #14
294
ldr lr, [sp, #12*4]
295
296
add r8, r8, r12
297
str r11, [sp, #10*4]
298
add lr, lr, r0
299
str r12, [sp, #15*4]
300
eor r3, r3, r8, ror #25
301
add r8, r5, r1
302
eor r4, r4, lr, ror #25
303
add lr, r11, r6
304
str r9, [sp, #9*4]
305
eor r9, r9, r8, ror #25
306
str r10, [sp, #14*4]
307
eor r10, r10, lr, ror #25
308
309
salsa8_core_doubleround_body
310
311
ldr r11, [sp, #10*4]
312
add r8, r9, r8
313
ldr r12, [sp, #15*4]
314
add lr, r10, lr
315
eor r11, r11, r8, ror #14
316
add r8, r3, r2
317
eor r12, r12, lr, ror #14
318
add lr, r4, r7
319
eor r0, r0, r8, ror #14
320
ldr r8, [sp, #11*4]
321
eor r5, r5, lr, ror #14
322
ldr lr, [sp, #12*4]
323
324
add r8, r8, r12
325
str r11, [sp, #10*4]
326
add lr, lr, r0
327
str r12, [sp, #15*4]
328
eor r3, r3, r8, ror #25
329
add r8, r5, r1
330
eor r4, r4, lr, ror #25
331
add lr, r11, r6
332
str r9, [sp, #9*4]
333
eor r9, r9, r8, ror #25
334
str r10, [sp, #14*4]
335
eor r10, r10, lr, ror #25
336
337
salsa8_core_doubleround_body
338
339
ldr r11, [sp, #10*4]
340
add r8, r9, r8
341
ldr r12, [sp, #15*4]
342
add lr, r10, lr
343
eor r11, r11, r8, ror #14
344
add r8, r3, r2
345
eor r12, r12, lr, ror #14
346
add lr, r4, r7
347
eor r0, r0, r8, ror #14
348
ldr r8, [sp, #11*4]
349
eor r5, r5, lr, ror #14
350
ldr lr, [sp, #12*4]
351
352
add r8, r8, r12
353
str r11, [sp, #10*4]
354
add lr, lr, r0
355
str r12, [sp, #15*4]
356
eor r3, r3, r8, ror #25
357
add r8, r5, r1
358
eor r4, r4, lr, ror #25
359
add lr, r11, r6
360
str r9, [sp, #9*4]
361
eor r9, r9, r8, ror #25
362
str r10, [sp, #14*4]
363
eor r10, r10, lr, ror #25
364
365
salsa8_core_doubleround_body
366
367
ldr r11, [sp, #10*4]
368
add r8, r9, r8
369
ldr r12, [sp, #15*4]
370
add lr, r10, lr
371
str r9, [sp, #9*4]
372
eor r11, r11, r8, ror #14
373
eor r12, r12, lr, ror #14
374
add r8, r3, r2
375
str r10, [sp, #14*4]
376
add lr, r4, r7
377
str r11, [sp, #10*4]
378
eor r0, r0, r8, ror #14
379
str r12, [sp, #15*4]
380
eor r5, r5, lr, ror #14
381
382
stmia sp, {r0-r7}
383
.endm
384
385
#endif
386
387
388
.macro scrypt_core_macro1a_x4
389
ldmia r0, {r4-r7}
390
ldmia lr!, {r8-r11}
391
stmia r1!, {r4-r7}
392
stmia r3!, {r8-r11}
393
eor r4, r4, r8
394
eor r5, r5, r9
395
eor r6, r6, r10
396
eor r7, r7, r11
397
stmia r0!, {r4-r7}
398
stmia r12!, {r4-r7}
399
.endm
400
401
.macro scrypt_core_macro1b_x4
402
ldmia r3!, {r8-r11}
403
ldmia r2, {r4-r7}
404
eor r8, r8, r4
405
eor r9, r9, r5
406
eor r10, r10, r6
407
eor r11, r11, r7
408
ldmia r0, {r4-r7}
409
stmia r2!, {r8-r11}
410
eor r4, r4, r8
411
eor r5, r5, r9
412
eor r6, r6, r10
413
eor r7, r7, r11
414
ldmia r1!, {r8-r11}
415
eor r4, r4, r8
416
eor r5, r5, r9
417
eor r6, r6, r10
418
eor r7, r7, r11
419
stmia r0!, {r4-r7}
420
stmia r12!, {r4-r7}
421
.endm
422
423
.macro scrypt_core_macro2_x4
424
ldmia r12, {r4-r7}
425
ldmia r0, {r8-r11}
426
add r4, r4, r8
427
add r5, r5, r9
428
add r6, r6, r10
429
add r7, r7, r11
430
stmia r0!, {r4-r7}
431
ldmia r2, {r8-r11}
432
eor r4, r4, r8
433
eor r5, r5, r9
434
eor r6, r6, r10
435
eor r7, r7, r11
436
stmia r2!, {r4-r7}
437
stmia r12!, {r4-r7}
438
.endm
439
440
.macro scrypt_core_macro3_x4
441
ldmia r1!, {r4-r7}
442
ldmia r0, {r8-r11}
443
add r4, r4, r8
444
add r5, r5, r9
445
add r6, r6, r10
446
add r7, r7, r11
447
stmia r0!, {r4-r7}
448
.endm
449
450
.macro scrypt_core_macro3_x6
451
ldmia r1!, {r2-r7}
452
ldmia r0, {r8-r12, lr}
453
add r2, r2, r8
454
add r3, r3, r9
455
add r4, r4, r10
456
add r5, r5, r11
457
add r6, r6, r12
458
add r7, r7, lr
459
stmia r0!, {r2-r7}
460
.endm
461
462
463
.text
464
.code 32
465
.align 2
466
.globl scrypt_core
467
.globl _scrypt_core
468
#ifdef __ELF__
469
.type scrypt_core, %function
470
#endif
471
scrypt_core:
472
_scrypt_core:
473
stmfd sp!, {r4-r11, lr}
474
mov r12, sp
475
sub sp, sp, #22*4
476
bic sp, sp, #63
477
str r12, [sp, #20*4]
478
str r2, [sp, #21*4]
479
480
scrypt_shuffle
481
482
ldr r2, [sp, #21*4]
483
str r0, [sp, #16*4]
484
add r12, r1, r2, lsl #7
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 r12, [sp, #21*4]
523
ldr r4, [r0, #16*4]
524
sub r2, r12, #1
525
str r2, [sp, #21*4]
526
sub r1, r1, r12, lsl #7
527
str r1, [sp, #17*4]
528
and r4, r4, r2
529
add r1, r1, r4, lsl #7
530
scrypt_core_loop2:
531
add r2, r0, #16*4
532
add r3, r1, #16*4
533
str r12, [sp, #18*4]
534
mov r12, sp
535
#ifdef __ARM_ARCH_5E_OR_6_OR_7__
536
pld [r1, #24*4]
537
pld [r1, #8*4]
538
#endif
539
scrypt_core_macro1b_x4
540
scrypt_core_macro1b_x4
541
scrypt_core_macro1b_x4
542
scrypt_core_macro1b_x4
543
544
salsa8_core
545
546
ldr r0, [sp, #16*4]
547
mov r12, sp
548
add r2, r0, #16*4
549
scrypt_core_macro2_x4
550
scrypt_core_macro2_x4
551
scrypt_core_macro2_x4
552
scrypt_core_macro2_x4
553
554
salsa8_core
555
556
ldr r0, [sp, #16*4]
557
mov r1, sp
558
ldr r3, [sp, #17*4]
559
add r0, r0, #16*4
560
ldr r2, [sp, #21*4]
561
scrypt_core_macro3_x4
562
and r4, r4, r2
563
add r3, r3, r4, lsl #7
564
str r3, [sp, #19*4]
565
#ifdef __ARM_ARCH_5E_OR_6_OR_7__
566
pld [r3, #16*4]
567
pld [r3]
568
#endif
569
scrypt_core_macro3_x6
570
scrypt_core_macro3_x6
571
572
ldr r12, [sp, #18*4]
573
sub r0, r0, #32*4
574
ldr r1, [sp, #19*4]
575
subs r12, r12, #1
576
bne scrypt_core_loop2
577
578
scrypt_shuffle
579
580
ldr sp, [sp, #20*4]
581
#ifdef __thumb__
582
ldmfd sp!, {r4-r11, lr}
583
bx lr
584
#else
585
ldmfd sp!, {r4-r11, pc}
586
#endif
587
588
589
#ifdef __ARM_NEON__
590
591
.macro salsa8_core_3way_doubleround
592
ldrd r6, [sp, #6*4]
593
vadd.u32 q4, q0, q1
594
add r6, r2, r6
595
vadd.u32 q6, q8, q9
596
add r7, r3, r7
597
vshl.u32 q5, q4, #7
598
eor r10, r10, r6, ror #25
599
vshl.u32 q7, q6, #7
600
add r6, r0, r4
601
vshr.u32 q4, q4, #32-7
602
eor r11, r11, r7, ror #25
603
vshr.u32 q6, q6, #32-7
604
add r7, r1, r5
605
veor.u32 q3, q3, q5
606
strd r10, [sp, #14*4]
607
veor.u32 q11, q11, q7
608
eor r12, r12, r6, ror #25
609
veor.u32 q3, q3, q4
610
eor lr, lr, r7, ror #25
611
veor.u32 q11, q11, q6
612
613
ldrd r6, [sp, #10*4]
614
vadd.u32 q4, q3, q0
615
add r2, r10, r2
616
vadd.u32 q6, q11, q8
617
add r3, r11, r3
618
vshl.u32 q5, q4, #9
619
eor r6, r6, r2, ror #23
620
vshl.u32 q7, q6, #9
621
add r2, r12, r0
622
vshr.u32 q4, q4, #32-9
623
eor r7, r7, r3, ror #23
624
vshr.u32 q6, q6, #32-9
625
add r3, lr, r1
626
veor.u32 q2, q2, q5
627
strd r6, [sp, #10*4]
628
veor.u32 q10, q10, q7
629
eor r8, r8, r2, ror #23
630
veor.u32 q2, q2, q4
631
eor r9, r9, r3, ror #23
632
veor.u32 q10, q10, q6
633
634
ldrd r2, [sp, #6*4]
635
vadd.u32 q4, q2, q3
636
add r10, r6, r10
637
vadd.u32 q6, q10, q11
638
add r11, r7, r11
639
vext.u32 q3, q3, q3, #3
640
eor r2, r2, r10, ror #19
641
vshl.u32 q5, q4, #13
642
add r10, r8, r12
643
vext.u32 q11, q11, q11, #3
644
eor r3, r3, r11, ror #19
645
vshl.u32 q7, q6, #13
646
add r11, r9, lr
647
vshr.u32 q4, q4, #32-13
648
eor r4, r4, r10, ror #19
649
vshr.u32 q6, q6, #32-13
650
eor r5, r5, r11, ror #19
651
veor.u32 q1, q1, q5
652
veor.u32 q9, q9, q7
653
veor.u32 q1, q1, q4
654
veor.u32 q9, q9, q6
655
656
ldrd r10, [sp, #2*4]
657
vadd.u32 q4, q1, q2
658
add r6, r2, r6
659
vadd.u32 q6, q9, q10
660
add r7, r3, r7
661
vswp.u32 d4, d5
662
eor r10, r10, r6, ror #14
663
vshl.u32 q5, q4, #18
664
add r6, r4, r8
665
vswp.u32 d20, d21
666
eor r11, r11, r7, ror #14
667
vshl.u32 q7, q6, #18
668
add r7, r5, r9
669
vshr.u32 q4, q4, #32-18
670
eor r0, r0, r6, ror #14
671
vshr.u32 q6, q6, #32-18
672
eor r1, r1, r7, ror #14
673
veor.u32 q0, q0, q5
674
ldrd r6, [sp, #14*4]
675
veor.u32 q8, q8, q7
676
veor.u32 q0, q0, q4
677
veor.u32 q8, q8, q6
678
679
680
strd r2, [sp, #6*4]
681
vadd.u32 q4, q0, q3
682
strd r10, [sp, #2*4]
683
vadd.u32 q6, q8, q11
684
add r6, r11, r6
685
vext.u32 q1, q1, q1, #1
686
add r7, r0, r7
687
vshl.u32 q5, q4, #7
688
eor r4, r4, r6, ror #25
689
vext.u32 q9, q9, q9, #1
690
add r6, r1, r12
691
vshl.u32 q7, q6, #7
692
eor r5, r5, r7, ror #25
693
vshr.u32 q4, q4, #32-7
694
add r7, r10, lr
695
vshr.u32 q6, q6, #32-7
696
eor r2, r2, r6, ror #25
697
veor.u32 q1, q1, q5
698
eor r3, r3, r7, ror #25
699
veor.u32 q9, q9, q7
700
strd r2, [sp, #6*4]
701
veor.u32 q1, q1, q4
702
veor.u32 q9, q9, q6
703
704
add r10, r3, r10
705
vadd.u32 q4, q1, q0
706
ldrd r6, [sp, #10*4]
707
vadd.u32 q6, q9, q8
708
add r11, r4, r11
709
vshl.u32 q5, q4, #9
710
eor r8, r8, r10, ror #23
711
vshl.u32 q7, q6, #9
712
add r10, r5, r0
713
vshr.u32 q4, q4, #32-9
714
eor r9, r9, r11, ror #23
715
vshr.u32 q6, q6, #32-9
716
add r11, r2, r1
717
veor.u32 q2, q2, q5
718
eor r6, r6, r10, ror #23
719
veor.u32 q10, q10, q7
720
eor r7, r7, r11, ror #23
721
veor.u32 q2, q2, q4
722
strd r6, [sp, #10*4]
723
veor.u32 q10, q10, q6
724
725
add r2, r7, r2
726
vadd.u32 q4, q2, q1
727
ldrd r10, [sp, #14*4]
728
vadd.u32 q6, q10, q9
729
add r3, r8, r3
730
vext.u32 q1, q1, q1, #3
731
eor r12, r12, r2, ror #19
732
vshl.u32 q5, q4, #13
733
add r2, r9, r4
734
vext.u32 q9, q9, q9, #3
735
eor lr, lr, r3, ror #19
736
vshl.u32 q7, q6, #13
737
add r3, r6, r5
738
vshr.u32 q4, q4, #32-13
739
eor r10, r10, r2, ror #19
740
vshr.u32 q6, q6, #32-13
741
eor r11, r11, r3, ror #19
742
veor.u32 q3, q3, q5
743
veor.u32 q11, q11, q7
744
veor.u32 q3, q3, q4
745
veor.u32 q11, q11, q6
746
747
ldrd r2, [sp, #2*4]
748
vadd.u32 q4, q3, q2
749
add r6, r11, r6
750
vadd.u32 q6, q11, q10
751
add r7, r12, r7
752
vswp.u32 d4, d5
753
eor r0, r0, r6, ror #14
754
vshl.u32 q5, q4, #18
755
add r6, lr, r8
756
vswp.u32 d20, d21
757
eor r1, r1, r7, ror #14
758
vshl.u32 q7, q6, #18
759
add r7, r10, r9
760
vext.u32 q3, q3, q3, #1
761
eor r2, r2, r6, ror #14
762
vshr.u32 q4, q4, #32-18
763
eor r3, r3, r7, ror #14
764
vshr.u32 q6, q6, #32-18
765
strd r2, [sp, #2*4]
766
vext.u32 q11, q11, q11, #1
767
strd r10, [sp, #14*4]
768
veor.u32 q0, q0, q5
769
veor.u32 q8, q8, q7
770
veor.u32 q0, q0, q4
771
veor.u32 q8, q8, q6
772
.endm
773
774
.macro salsa8_core_3way
775
ldmia sp, {r0-r12, lr}
776
ldrd r10, [sp, #14*4]
777
salsa8_core_3way_doubleround
778
salsa8_core_3way_doubleround
779
salsa8_core_3way_doubleround
780
salsa8_core_3way_doubleround
781
stmia sp, {r0-r5}
782
strd r8, [sp, #8*4]
783
str r12, [sp, #12*4]
784
str lr, [sp, #13*4]
785
.endm
786
787
.text
788
.code 32
789
.align 2
790
.globl scrypt_core_3way
791
.globl _scrypt_core_3way
792
#ifdef __ELF__
793
.type scrypt_core_3way, %function
794
#endif
795
scrypt_core_3way:
796
_scrypt_core_3way:
797
stmfd sp!, {r4-r11, lr}
798
vpush {q4-q7}
799
mov r12, sp
800
sub sp, sp, #24*16
801
bic sp, sp, #63
802
str r2, [sp, #4*16+3*4]
803
str r12, [sp, #4*16+4*4]
804
805
mov r3, r0
806
vldmia r3!, {q8-q15}
807
vmov.u64 q0, #0xffffffff
808
vmov.u32 q1, q8
809
vmov.u32 q2, q12
810
vbif.u32 q8, q9, q0
811
vbif.u32 q12, q13, q0
812
vbif.u32 q9, q10, q0
813
vbif.u32 q13, q14, q0
814
vbif.u32 q10, q11, q0
815
vbif.u32 q14, q15, q0
816
vbif.u32 q11, q1, q0
817
vbif.u32 q15, q2, q0
818
vldmia r3!, {q0-q7}
819
vswp.u32 d17, d21
820
vswp.u32 d25, d29
821
vswp.u32 d18, d22
822
vswp.u32 d26, d30
823
vstmia r0, {q8-q15}
824
vmov.u64 q8, #0xffffffff
825
vmov.u32 q9, q0
826
vmov.u32 q10, q4
827
vbif.u32 q0, q1, q8
828
vbif.u32 q4, q5, q8
829
vbif.u32 q1, q2, q8
830
vbif.u32 q5, q6, q8
831
vbif.u32 q2, q3, q8
832
vbif.u32 q6, q7, q8
833
vbif.u32 q3, q9, q8
834
vbif.u32 q7, q10, q8
835
vldmia r3, {q8-q15}
836
vswp.u32 d1, d5
837
vswp.u32 d9, d13
838
vswp.u32 d2, d6
839
vswp.u32 d10, d14
840
add r12, sp, #8*16
841
vstmia r12!, {q0-q7}
842
vmov.u64 q0, #0xffffffff
843
vmov.u32 q1, q8
844
vmov.u32 q2, q12
845
vbif.u32 q8, q9, q0
846
vbif.u32 q12, q13, q0
847
vbif.u32 q9, q10, q0
848
vbif.u32 q13, q14, q0
849
vbif.u32 q10, q11, q0
850
vbif.u32 q14, q15, q0
851
vbif.u32 q11, q1, q0
852
vbif.u32 q15, q2, q0
853
vswp.u32 d17, d21
854
vswp.u32 d25, d29
855
vswp.u32 d18, d22
856
vswp.u32 d26, d30
857
vstmia r12, {q8-q15}
858
859
add lr, sp, #128
860
vldmia lr, {q0-q7}
861
add r2, r1, r2, lsl #7
862
str r0, [sp, #4*16+0*4]
863
str r2, [sp, #4*16+2*4]
864
scrypt_core_3way_loop1:
865
add lr, r0, #16*4
866
add r3, r1, #16*4
867
str r1, [sp, #4*16+1*4]
868
mov r12, sp
869
scrypt_core_macro1a_x4
870
scrypt_core_macro1a_x4
871
scrypt_core_macro1a_x4
872
ldr r2, [sp, #4*16+3*4]
873
scrypt_core_macro1a_x4
874
sub r1, r1, #4*16
875
876
add r1, r1, r2, lsl #7
877
vstmia r1, {q0-q7}
878
add r3, r1, r2, lsl #7
879
vstmia r3, {q8-q15}
880
881
add lr, sp, #128
882
veor.u32 q0, q0, q4
883
veor.u32 q1, q1, q5
884
veor.u32 q2, q2, q6
885
veor.u32 q3, q3, q7
886
vstmia lr, {q0-q3}
887
veor.u32 q8, q8, q12
888
veor.u32 q9, q9, q13
889
veor.u32 q10, q10, q14
890
veor.u32 q11, q11, q15
891
add r12, sp, #256
892
vstmia r12, {q8-q11}
893
894
salsa8_core_3way
895
896
ldr r0, [sp, #4*16+0*4]
897
mov r12, sp
898
add r2, r0, #16*4
899
scrypt_core_macro2_x4
900
scrypt_core_macro2_x4
901
scrypt_core_macro2_x4
902
scrypt_core_macro2_x4
903
904
add lr, sp, #128
905
vldmia lr, {q4-q7}
906
vadd.u32 q4, q4, q0
907
vadd.u32 q5, q5, q1
908
vadd.u32 q6, q6, q2
909
vadd.u32 q7, q7, q3
910
add r12, sp, #256
911
vldmia r12, {q0-q3}
912
vstmia lr, {q4-q7}
913
vadd.u32 q8, q8, q0
914
vadd.u32 q9, q9, q1
915
vadd.u32 q10, q10, q2
916
vadd.u32 q11, q11, q3
917
918
add r4, sp, #128+4*16
919
vldmia r4, {q0-q3}
920
vstmia r12, {q8-q11}
921
veor.u32 q0, q0, q4
922
veor.u32 q1, q1, q5
923
veor.u32 q2, q2, q6
924
veor.u32 q3, q3, q7
925
vstmia r4, {q0-q3}
926
veor.u32 q8, q8, q12
927
veor.u32 q9, q9, q13
928
veor.u32 q10, q10, q14
929
veor.u32 q11, q11, q15
930
vmov q12, q8
931
vmov q13, q9
932
vmov q14, q10
933
vmov q15, q11
934
935
salsa8_core_3way
936
937
ldr r0, [sp, #4*16+0*4]
938
mov r1, sp
939
add r0, r0, #16*4
940
scrypt_core_macro3_x6
941
scrypt_core_macro3_x6
942
scrypt_core_macro3_x4
943
sub r0, r0, #8*16
944
945
ldr r1, [sp, #4*16+1*4]
946
ldr r2, [sp, #4*16+2*4]
947
add lr, sp, #128
948
add r4, sp, #128+4*16
949
vldmia r4, {q4-q7}
950
vadd.u32 q4, q4, q0
951
vadd.u32 q5, q5, q1
952
vadd.u32 q6, q6, q2
953
vadd.u32 q7, q7, q3
954
vstmia r4, {q4-q7}
955
vldmia lr, {q0-q3}
956
vadd.u32 q12, q12, q8
957
vadd.u32 q13, q13, q9
958
vadd.u32 q14, q14, q10
959
vadd.u32 q15, q15, q11
960
add r12, sp, #256
961
vldmia r12, {q8-q11}
962
963
add r1, r1, #8*16
964
cmp r1, r2
965
bne scrypt_core_3way_loop1
966
967
ldr r2, [sp, #4*16+3*4]
968
add r5, sp, #256+4*16
969
vstmia r5, {q12-q15}
970
971
sub r1, r1, r2, lsl #7
972
str r1, [sp, #4*16+1*4]
973
scrypt_core_3way_loop2:
974
str r2, [sp, #4*16+2*4]
975
976
ldr r0, [sp, #4*16+0*4]
977
ldr r1, [sp, #4*16+1*4]
978
ldr r2, [sp, #4*16+3*4]
979
ldr r4, [r0, #16*4]
980
sub r2, r2, #1
981
and r4, r4, r2
982
add r1, r1, r4, lsl #7
983
add r2, r0, #16*4
984
add r3, r1, #16*4
985
mov r12, sp
986
scrypt_core_macro1b_x4
987
scrypt_core_macro1b_x4
988
scrypt_core_macro1b_x4
989
scrypt_core_macro1b_x4
990
991
ldr r1, [sp, #4*16+1*4]
992
ldr r2, [sp, #4*16+3*4]
993
add r1, r1, r2, lsl #7
994
add r3, r1, r2, lsl #7
995
sub r2, r2, #1
996
vmov r6, r7, d8
997
and r6, r6, r2
998
add r6, r1, r6, lsl #7
999
vmov r7, r8, d24
1000
add lr, sp, #128
1001
vldmia lr, {q0-q3}
1002
pld [r6]
1003
pld [r6, #8*4]
1004
pld [r6, #16*4]
1005
pld [r6, #24*4]
1006
vldmia r6, {q8-q15}
1007
and r7, r7, r2
1008
add r7, r3, r7, lsl #7
1009
veor.u32 q8, q8, q0
1010
veor.u32 q9, q9, q1
1011
veor.u32 q10, q10, q2
1012
veor.u32 q11, q11, q3
1013
pld [r7]
1014
pld [r7, #8*4]
1015
pld [r7, #16*4]
1016
pld [r7, #24*4]
1017
veor.u32 q12, q12, q4
1018
veor.u32 q13, q13, q5
1019
veor.u32 q14, q14, q6
1020
veor.u32 q15, q15, q7
1021
vldmia r7, {q0-q7}
1022
vstmia lr, {q8-q15}
1023
add r12, sp, #256
1024
vldmia r12, {q8-q15}
1025
veor.u32 q8, q8, q0
1026
veor.u32 q9, q9, q1
1027
veor.u32 q10, q10, q2
1028
veor.u32 q11, q11, q3
1029
veor.u32 q12, q12, q4
1030
veor.u32 q13, q13, q5
1031
veor.u32 q14, q14, q6
1032
veor.u32 q15, q15, q7
1033
1034
vldmia lr, {q0-q7}
1035
veor.u32 q0, q0, q4
1036
veor.u32 q1, q1, q5
1037
veor.u32 q2, q2, q6
1038
veor.u32 q3, q3, q7
1039
vstmia lr, {q0-q3}
1040
veor.u32 q8, q8, q12
1041
veor.u32 q9, q9, q13
1042
veor.u32 q10, q10, q14
1043
veor.u32 q11, q11, q15
1044
vstmia r12, {q8-q15}
1045
1046
salsa8_core_3way
1047
1048
ldr r0, [sp, #4*16+0*4]
1049
mov r12, sp
1050
add r2, r0, #16*4
1051
scrypt_core_macro2_x4
1052
scrypt_core_macro2_x4
1053
scrypt_core_macro2_x4
1054
scrypt_core_macro2_x4
1055
1056
add lr, sp, #128
1057
vldmia lr, {q4-q7}
1058
vadd.u32 q4, q4, q0
1059
vadd.u32 q5, q5, q1
1060
vadd.u32 q6, q6, q2
1061
vadd.u32 q7, q7, q3
1062
add r12, sp, #256
1063
vldmia r12, {q12-q15}
1064
vstmia lr, {q4-q7}
1065
vadd.u32 q12, q12, q8
1066
vadd.u32 q13, q13, q9
1067
vadd.u32 q14, q14, q10
1068
vadd.u32 q15, q15, q11
1069
1070
add r4, sp, #128+4*16
1071
vldmia r4, {q0-q3}
1072
vstmia r12, {q12-q15}
1073
veor.u32 q0, q0, q4
1074
veor.u32 q1, q1, q5
1075
veor.u32 q2, q2, q6
1076
veor.u32 q3, q3, q7
1077
add r5, sp, #256+4*16
1078
vldmia r5, {q8-q11}
1079
vstmia r4, {q0-q3}
1080
veor.u32 q8, q8, q12
1081
veor.u32 q9, q9, q13
1082
veor.u32 q10, q10, q14
1083
veor.u32 q11, q11, q15
1084
vmov q12, q8
1085
vmov q13, q9
1086
vmov q14, q10
1087
vmov q15, q11
1088
1089
salsa8_core_3way
1090
1091
ldr r0, [sp, #4*16+0*4]
1092
ldr r3, [sp, #4*16+1*4]
1093
ldr r2, [sp, #4*16+3*4]
1094
mov r1, sp
1095
add r0, r0, #16*4
1096
sub r2, r2, #1
1097
scrypt_core_macro3_x4
1098
and r4, r4, r2
1099
add r3, r3, r4, lsl #7
1100
pld [r3, #16*4]
1101
pld [r3]
1102
pld [r3, #24*4]
1103
pld [r3, #8*4]
1104
scrypt_core_macro3_x6
1105
scrypt_core_macro3_x6
1106
1107
add lr, sp, #128
1108
add r4, sp, #128+4*16
1109
vldmia r4, {q4-q7}
1110
vadd.u32 q4, q4, q0
1111
vadd.u32 q5, q5, q1
1112
vadd.u32 q6, q6, q2
1113
vadd.u32 q7, q7, q3
1114
vstmia r4, {q4-q7}
1115
vadd.u32 q12, q12, q8
1116
vadd.u32 q13, q13, q9
1117
vadd.u32 q14, q14, q10
1118
vadd.u32 q15, q15, q11
1119
add r5, sp, #256+4*16
1120
vstmia r5, {q12-q15}
1121
1122
ldr r2, [sp, #4*16+2*4]
1123
subs r2, r2, #1
1124
bne scrypt_core_3way_loop2
1125
1126
ldr r0, [sp, #4*16+0*4]
1127
vldmia r0, {q8-q15}
1128
vmov.u64 q0, #0xffffffff
1129
vmov.u32 q1, q8
1130
vmov.u32 q2, q12
1131
vbif.u32 q8, q9, q0
1132
vbif.u32 q12, q13, q0
1133
vbif.u32 q9, q10, q0
1134
vbif.u32 q13, q14, q0
1135
vbif.u32 q10, q11, q0
1136
vbif.u32 q14, q15, q0
1137
vbif.u32 q11, q1, q0
1138
vbif.u32 q15, q2, q0
1139
add r12, sp, #8*16
1140
vldmia r12!, {q0-q7}
1141
vswp.u32 d17, d21
1142
vswp.u32 d25, d29
1143
vswp.u32 d18, d22
1144
vswp.u32 d26, d30
1145
vstmia r0!, {q8-q15}
1146
vmov.u64 q8, #0xffffffff
1147
vmov.u32 q9, q0
1148
vmov.u32 q10, q4
1149
vbif.u32 q0, q1, q8
1150
vbif.u32 q4, q5, q8
1151
vbif.u32 q1, q2, q8
1152
vbif.u32 q5, q6, q8
1153
vbif.u32 q2, q3, q8
1154
vbif.u32 q6, q7, q8
1155
vbif.u32 q3, q9, q8
1156
vbif.u32 q7, q10, q8
1157
vldmia r12, {q8-q15}
1158
vswp.u32 d1, d5
1159
vswp.u32 d9, d13
1160
vswp.u32 d2, d6
1161
vswp.u32 d10, d14
1162
vstmia r0!, {q0-q7}
1163
vmov.u64 q0, #0xffffffff
1164
vmov.u32 q1, q8
1165
vmov.u32 q2, q12
1166
vbif.u32 q8, q9, q0
1167
vbif.u32 q12, q13, q0
1168
vbif.u32 q9, q10, q0
1169
vbif.u32 q13, q14, q0
1170
vbif.u32 q10, q11, q0
1171
vbif.u32 q14, q15, q0
1172
vbif.u32 q11, q1, q0
1173
vbif.u32 q15, q2, q0
1174
vswp.u32 d17, d21
1175
vswp.u32 d25, d29
1176
vswp.u32 d18, d22
1177
vswp.u32 d26, d30
1178
vstmia r0, {q8-q15}
1179
1180
ldr sp, [sp, #4*16+4*4]
1181
vpop {q4-q7}
1182
ldmfd sp!, {r4-r11, pc}
1183
1184
#endif /* __ARM_NEON__ */
1185
1186
#endif
1187
1188