Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tpruvot
GitHub Repository: tpruvot/cpuminer-multi
Path: blob/linux/asm/scrypt-x64.S
1201 views
1
/*
2
* Copyright 2011-2014 [email protected]
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <cpuminer-config.h>
28
29
#if defined(__linux__) && defined(__ELF__)
30
.section .note.GNU-stack,"",%progbits
31
#endif
32
33
#if defined(USE_ASM) && defined(__x86_64__)
34
35
.text
36
.p2align 6
37
.globl scrypt_best_throughput
38
.globl _scrypt_best_throughput
39
scrypt_best_throughput:
40
_scrypt_best_throughput:
41
pushq %rbx
42
#if defined(USE_AVX2)
43
/* Check for AVX and OSXSAVE support */
44
movl $1, %eax
45
cpuid
46
andl $0x18000000, %ecx
47
cmpl $0x18000000, %ecx
48
jne scrypt_best_throughput_no_avx2
49
/* Check for AVX2 support */
50
movl $7, %eax
51
xorl %ecx, %ecx
52
cpuid
53
andl $0x00000020, %ebx
54
cmpl $0x00000020, %ebx
55
jne scrypt_best_throughput_no_avx2
56
/* Check for XMM and YMM state support */
57
xorl %ecx, %ecx
58
xgetbv
59
andl $0x00000006, %eax
60
cmpl $0x00000006, %eax
61
jne scrypt_best_throughput_no_avx2
62
movl $6, %eax
63
jmp scrypt_best_throughput_exit
64
scrypt_best_throughput_no_avx2:
65
#endif
66
/* Check for AuthenticAMD */
67
xorq %rax, %rax
68
cpuid
69
movl $3, %eax
70
cmpl $0x444d4163, %ecx
71
jne scrypt_best_throughput_not_amd
72
cmpl $0x69746e65, %edx
73
jne scrypt_best_throughput_not_amd
74
cmpl $0x68747541, %ebx
75
jne scrypt_best_throughput_not_amd
76
/* Check for AMD K8 or Bobcat */
77
movl $1, %eax
78
cpuid
79
andl $0x0ff00000, %eax
80
jz scrypt_best_throughput_one
81
cmpl $0x00500000, %eax
82
je scrypt_best_throughput_one
83
movl $3, %eax
84
jmp scrypt_best_throughput_exit
85
scrypt_best_throughput_not_amd:
86
/* Check for GenuineIntel */
87
cmpl $0x6c65746e, %ecx
88
jne scrypt_best_throughput_exit
89
cmpl $0x49656e69, %edx
90
jne scrypt_best_throughput_exit
91
cmpl $0x756e6547, %ebx
92
jne scrypt_best_throughput_exit
93
/* Check for Intel Atom */
94
movl $1, %eax
95
cpuid
96
movl %eax, %edx
97
andl $0x0ff00f00, %eax
98
cmpl $0x00000600, %eax
99
movl $3, %eax
100
jnz scrypt_best_throughput_exit
101
andl $0x000f00f0, %edx
102
cmpl $0x000100c0, %edx
103
je scrypt_best_throughput_one
104
cmpl $0x00020060, %edx
105
je scrypt_best_throughput_one
106
cmpl $0x00030060, %edx
107
jne scrypt_best_throughput_exit
108
scrypt_best_throughput_one:
109
movl $1, %eax
110
scrypt_best_throughput_exit:
111
popq %rbx
112
ret
113
114
115
.macro scrypt_shuffle src, so, dest, do
116
movl \so+60(\src), %eax
117
movl \so+44(\src), %ebx
118
movl \so+28(\src), %ecx
119
movl \so+12(\src), %edx
120
movl %eax, \do+12(\dest)
121
movl %ebx, \do+28(\dest)
122
movl %ecx, \do+44(\dest)
123
movl %edx, \do+60(\dest)
124
movl \so+40(\src), %eax
125
movl \so+8(\src), %ebx
126
movl \so+48(\src), %ecx
127
movl \so+16(\src), %edx
128
movl %eax, \do+8(\dest)
129
movl %ebx, \do+40(\dest)
130
movl %ecx, \do+16(\dest)
131
movl %edx, \do+48(\dest)
132
movl \so+20(\src), %eax
133
movl \so+4(\src), %ebx
134
movl \so+52(\src), %ecx
135
movl \so+36(\src), %edx
136
movl %eax, \do+4(\dest)
137
movl %ebx, \do+20(\dest)
138
movl %ecx, \do+36(\dest)
139
movl %edx, \do+52(\dest)
140
movl \so+0(\src), %eax
141
movl \so+24(\src), %ebx
142
movl \so+32(\src), %ecx
143
movl \so+56(\src), %edx
144
movl %eax, \do+0(\dest)
145
movl %ebx, \do+24(\dest)
146
movl %ecx, \do+32(\dest)
147
movl %edx, \do+56(\dest)
148
.endm
149
150
151
.macro salsa8_core_gen_doubleround
152
movq 72(%rsp), %r15
153
154
leaq (%r14, %rdx), %rbp
155
roll $7, %ebp
156
xorl %ebp, %r9d
157
leaq (%rdi, %r15), %rbp
158
roll $7, %ebp
159
xorl %ebp, %r10d
160
leaq (%rdx, %r9), %rbp
161
roll $9, %ebp
162
xorl %ebp, %r11d
163
leaq (%r15, %r10), %rbp
164
roll $9, %ebp
165
xorl %ebp, %r13d
166
167
leaq (%r9, %r11), %rbp
168
roll $13, %ebp
169
xorl %ebp, %r14d
170
leaq (%r10, %r13), %rbp
171
roll $13, %ebp
172
xorl %ebp, %edi
173
leaq (%r11, %r14), %rbp
174
roll $18, %ebp
175
xorl %ebp, %edx
176
leaq (%r13, %rdi), %rbp
177
roll $18, %ebp
178
xorl %ebp, %r15d
179
180
movq 48(%rsp), %rbp
181
movq %r15, 72(%rsp)
182
183
leaq (%rax, %rbp), %r15
184
roll $7, %r15d
185
xorl %r15d, %ebx
186
leaq (%rbp, %rbx), %r15
187
roll $9, %r15d
188
xorl %r15d, %ecx
189
leaq (%rbx, %rcx), %r15
190
roll $13, %r15d
191
xorl %r15d, %eax
192
leaq (%rcx, %rax), %r15
193
roll $18, %r15d
194
xorl %r15d, %ebp
195
196
movq 88(%rsp), %r15
197
movq %rbp, 48(%rsp)
198
199
leaq (%r12, %r15), %rbp
200
roll $7, %ebp
201
xorl %ebp, %esi
202
leaq (%r15, %rsi), %rbp
203
roll $9, %ebp
204
xorl %ebp, %r8d
205
leaq (%rsi, %r8), %rbp
206
roll $13, %ebp
207
xorl %ebp, %r12d
208
leaq (%r8, %r12), %rbp
209
roll $18, %ebp
210
xorl %ebp, %r15d
211
212
movq %r15, 88(%rsp)
213
movq 72(%rsp), %r15
214
215
leaq (%rsi, %rdx), %rbp
216
roll $7, %ebp
217
xorl %ebp, %edi
218
leaq (%r9, %r15), %rbp
219
roll $7, %ebp
220
xorl %ebp, %eax
221
leaq (%rdx, %rdi), %rbp
222
roll $9, %ebp
223
xorl %ebp, %ecx
224
leaq (%r15, %rax), %rbp
225
roll $9, %ebp
226
xorl %ebp, %r8d
227
228
leaq (%rdi, %rcx), %rbp
229
roll $13, %ebp
230
xorl %ebp, %esi
231
leaq (%rax, %r8), %rbp
232
roll $13, %ebp
233
xorl %ebp, %r9d
234
leaq (%rcx, %rsi), %rbp
235
roll $18, %ebp
236
xorl %ebp, %edx
237
leaq (%r8, %r9), %rbp
238
roll $18, %ebp
239
xorl %ebp, %r15d
240
241
movq 48(%rsp), %rbp
242
movq %r15, 72(%rsp)
243
244
leaq (%r10, %rbp), %r15
245
roll $7, %r15d
246
xorl %r15d, %r12d
247
leaq (%rbp, %r12), %r15
248
roll $9, %r15d
249
xorl %r15d, %r11d
250
leaq (%r12, %r11), %r15
251
roll $13, %r15d
252
xorl %r15d, %r10d
253
leaq (%r11, %r10), %r15
254
roll $18, %r15d
255
xorl %r15d, %ebp
256
257
movq 88(%rsp), %r15
258
movq %rbp, 48(%rsp)
259
260
leaq (%rbx, %r15), %rbp
261
roll $7, %ebp
262
xorl %ebp, %r14d
263
leaq (%r15, %r14), %rbp
264
roll $9, %ebp
265
xorl %ebp, %r13d
266
leaq (%r14, %r13), %rbp
267
roll $13, %ebp
268
xorl %ebp, %ebx
269
leaq (%r13, %rbx), %rbp
270
roll $18, %ebp
271
xorl %ebp, %r15d
272
273
movq %r15, 88(%rsp)
274
.endm
275
276
.text
277
.p2align 6
278
salsa8_core_gen:
279
/* 0: %rdx, %rdi, %rcx, %rsi */
280
movq 8(%rsp), %rdi
281
movq %rdi, %rdx
282
shrq $32, %rdi
283
movq 16(%rsp), %rsi
284
movq %rsi, %rcx
285
shrq $32, %rsi
286
/* 1: %r9, 72(%rsp), %rax, %r8 */
287
movq 24(%rsp), %r8
288
movq %r8, %r9
289
shrq $32, %r8
290
movq %r8, 72(%rsp)
291
movq 32(%rsp), %r8
292
movq %r8, %rax
293
shrq $32, %r8
294
/* 2: %r11, %r10, 48(%rsp), %r12 */
295
movq 40(%rsp), %r10
296
movq %r10, %r11
297
shrq $32, %r10
298
movq 48(%rsp), %r12
299
/* movq %r12, %r13 */
300
/* movq %r13, 48(%rsp) */
301
shrq $32, %r12
302
/* 3: %r14, %r13, %rbx, 88(%rsp) */
303
movq 56(%rsp), %r13
304
movq %r13, %r14
305
shrq $32, %r13
306
movq 64(%rsp), %r15
307
movq %r15, %rbx
308
shrq $32, %r15
309
movq %r15, 88(%rsp)
310
311
salsa8_core_gen_doubleround
312
salsa8_core_gen_doubleround
313
salsa8_core_gen_doubleround
314
salsa8_core_gen_doubleround
315
316
shlq $32, %rdi
317
xorq %rdi, %rdx
318
movq %rdx, 24(%rsp)
319
320
shlq $32, %rsi
321
xorq %rsi, %rcx
322
movq %rcx, 32(%rsp)
323
324
movl 72(%rsp), %edi
325
shlq $32, %rdi
326
xorq %rdi, %r9
327
movq %r9, 40(%rsp)
328
329
movl 48(%rsp), %ebp
330
shlq $32, %r8
331
xorq %r8, %rax
332
movq %rax, 48(%rsp)
333
334
shlq $32, %r10
335
xorq %r10, %r11
336
movq %r11, 56(%rsp)
337
338
shlq $32, %r12
339
xorq %r12, %rbp
340
movq %rbp, 64(%rsp)
341
342
shlq $32, %r13
343
xorq %r13, %r14
344
movq %r14, 72(%rsp)
345
346
movdqa 24(%rsp), %xmm0
347
348
shlq $32, %r15
349
xorq %r15, %rbx
350
movq %rbx, 80(%rsp)
351
352
movdqa 40(%rsp), %xmm1
353
movdqa 56(%rsp), %xmm2
354
movdqa 72(%rsp), %xmm3
355
356
ret
357
358
359
.text
360
.p2align 6
361
.globl scrypt_core
362
.globl _scrypt_core
363
scrypt_core:
364
_scrypt_core:
365
pushq %rbx
366
pushq %rbp
367
pushq %r12
368
pushq %r13
369
pushq %r14
370
pushq %r15
371
#if defined(_WIN64) || defined(__CYGWIN__)
372
subq $176, %rsp
373
movdqa %xmm6, 8(%rsp)
374
movdqa %xmm7, 24(%rsp)
375
movdqa %xmm8, 40(%rsp)
376
movdqa %xmm9, 56(%rsp)
377
movdqa %xmm10, 72(%rsp)
378
movdqa %xmm11, 88(%rsp)
379
movdqa %xmm12, 104(%rsp)
380
movdqa %xmm13, 120(%rsp)
381
movdqa %xmm14, 136(%rsp)
382
movdqa %xmm15, 152(%rsp)
383
pushq %rdi
384
pushq %rsi
385
movq %rcx, %rdi
386
movq %rdx, %rsi
387
#else
388
movq %rdx, %r8
389
#endif
390
391
.macro scrypt_core_cleanup
392
#if defined(_WIN64) || defined(__CYGWIN__)
393
popq %rsi
394
popq %rdi
395
movdqa 8(%rsp), %xmm6
396
movdqa 24(%rsp), %xmm7
397
movdqa 40(%rsp), %xmm8
398
movdqa 56(%rsp), %xmm9
399
movdqa 72(%rsp), %xmm10
400
movdqa 88(%rsp), %xmm11
401
movdqa 104(%rsp), %xmm12
402
movdqa 120(%rsp), %xmm13
403
movdqa 136(%rsp), %xmm14
404
movdqa 152(%rsp), %xmm15
405
addq $176, %rsp
406
#endif
407
popq %r15
408
popq %r14
409
popq %r13
410
popq %r12
411
popq %rbp
412
popq %rbx
413
.endm
414
415
/* GenuineIntel processors have fast SIMD */
416
xorl %eax, %eax
417
cpuid
418
cmpl $0x6c65746e, %ecx
419
jne scrypt_core_gen
420
cmpl $0x49656e69, %edx
421
jne scrypt_core_gen
422
cmpl $0x756e6547, %ebx
423
je scrypt_core_xmm
424
425
.p2align 6
426
scrypt_core_gen:
427
subq $136, %rsp
428
movdqa 0(%rdi), %xmm8
429
movdqa 16(%rdi), %xmm9
430
movdqa 32(%rdi), %xmm10
431
movdqa 48(%rdi), %xmm11
432
movdqa 64(%rdi), %xmm12
433
movdqa 80(%rdi), %xmm13
434
movdqa 96(%rdi), %xmm14
435
movdqa 112(%rdi), %xmm15
436
437
movq %r8, %rcx
438
shlq $7, %rcx
439
addq %rsi, %rcx
440
movq %r8, 96(%rsp)
441
movq %rdi, 104(%rsp)
442
movq %rsi, 112(%rsp)
443
movq %rcx, 120(%rsp)
444
scrypt_core_gen_loop1:
445
movdqa %xmm8, 0(%rsi)
446
movdqa %xmm9, 16(%rsi)
447
movdqa %xmm10, 32(%rsi)
448
movdqa %xmm11, 48(%rsi)
449
movdqa %xmm12, 64(%rsi)
450
movdqa %xmm13, 80(%rsi)
451
movdqa %xmm14, 96(%rsi)
452
movdqa %xmm15, 112(%rsi)
453
454
pxor %xmm12, %xmm8
455
pxor %xmm13, %xmm9
456
pxor %xmm14, %xmm10
457
pxor %xmm15, %xmm11
458
movdqa %xmm8, 0(%rsp)
459
movdqa %xmm9, 16(%rsp)
460
movdqa %xmm10, 32(%rsp)
461
movdqa %xmm11, 48(%rsp)
462
movq %rsi, 128(%rsp)
463
call salsa8_core_gen
464
paddd %xmm0, %xmm8
465
paddd %xmm1, %xmm9
466
paddd %xmm2, %xmm10
467
paddd %xmm3, %xmm11
468
469
pxor %xmm8, %xmm12
470
pxor %xmm9, %xmm13
471
pxor %xmm10, %xmm14
472
pxor %xmm11, %xmm15
473
movdqa %xmm12, 0(%rsp)
474
movdqa %xmm13, 16(%rsp)
475
movdqa %xmm14, 32(%rsp)
476
movdqa %xmm15, 48(%rsp)
477
call salsa8_core_gen
478
movq 128(%rsp), %rsi
479
paddd %xmm0, %xmm12
480
paddd %xmm1, %xmm13
481
paddd %xmm2, %xmm14
482
paddd %xmm3, %xmm15
483
484
addq $128, %rsi
485
movq 120(%rsp), %rcx
486
cmpq %rcx, %rsi
487
jne scrypt_core_gen_loop1
488
489
movq 96(%rsp), %r8
490
movq %r8, %rcx
491
subl $1, %r8d
492
movq %r8, 96(%rsp)
493
movd %xmm12, %edx
494
scrypt_core_gen_loop2:
495
movq 112(%rsp), %rsi
496
andl %r8d, %edx
497
shll $7, %edx
498
addq %rsi, %rdx
499
movdqa 0(%rdx), %xmm0
500
movdqa 16(%rdx), %xmm1
501
movdqa 32(%rdx), %xmm2
502
movdqa 48(%rdx), %xmm3
503
movdqa 64(%rdx), %xmm4
504
movdqa 80(%rdx), %xmm5
505
movdqa 96(%rdx), %xmm6
506
movdqa 112(%rdx), %xmm7
507
pxor %xmm0, %xmm8
508
pxor %xmm1, %xmm9
509
pxor %xmm2, %xmm10
510
pxor %xmm3, %xmm11
511
pxor %xmm4, %xmm12
512
pxor %xmm5, %xmm13
513
pxor %xmm6, %xmm14
514
pxor %xmm7, %xmm15
515
516
pxor %xmm12, %xmm8
517
pxor %xmm13, %xmm9
518
pxor %xmm14, %xmm10
519
pxor %xmm15, %xmm11
520
movdqa %xmm8, 0(%rsp)
521
movdqa %xmm9, 16(%rsp)
522
movdqa %xmm10, 32(%rsp)
523
movdqa %xmm11, 48(%rsp)
524
movq %rcx, 128(%rsp)
525
call salsa8_core_gen
526
paddd %xmm0, %xmm8
527
paddd %xmm1, %xmm9
528
paddd %xmm2, %xmm10
529
paddd %xmm3, %xmm11
530
531
pxor %xmm8, %xmm12
532
pxor %xmm9, %xmm13
533
pxor %xmm10, %xmm14
534
pxor %xmm11, %xmm15
535
movdqa %xmm12, 0(%rsp)
536
movdqa %xmm13, 16(%rsp)
537
movdqa %xmm14, 32(%rsp)
538
movdqa %xmm15, 48(%rsp)
539
call salsa8_core_gen
540
movq 96(%rsp), %r8
541
movq 128(%rsp), %rcx
542
addl 0(%rsp), %edx
543
paddd %xmm0, %xmm12
544
paddd %xmm1, %xmm13
545
paddd %xmm2, %xmm14
546
paddd %xmm3, %xmm15
547
548
subq $1, %rcx
549
ja scrypt_core_gen_loop2
550
551
movq 104(%rsp), %rdi
552
movdqa %xmm8, 0(%rdi)
553
movdqa %xmm9, 16(%rdi)
554
movdqa %xmm10, 32(%rdi)
555
movdqa %xmm11, 48(%rdi)
556
movdqa %xmm12, 64(%rdi)
557
movdqa %xmm13, 80(%rdi)
558
movdqa %xmm14, 96(%rdi)
559
movdqa %xmm15, 112(%rdi)
560
561
addq $136, %rsp
562
scrypt_core_cleanup
563
ret
564
565
566
.macro salsa8_core_xmm_doubleround
567
movdqa %xmm1, %xmm4
568
paddd %xmm0, %xmm4
569
movdqa %xmm4, %xmm5
570
pslld $7, %xmm4
571
psrld $25, %xmm5
572
pxor %xmm4, %xmm3
573
movdqa %xmm0, %xmm4
574
pxor %xmm5, %xmm3
575
576
paddd %xmm3, %xmm4
577
movdqa %xmm4, %xmm5
578
pslld $9, %xmm4
579
psrld $23, %xmm5
580
pxor %xmm4, %xmm2
581
movdqa %xmm3, %xmm4
582
pxor %xmm5, %xmm2
583
pshufd $0x93, %xmm3, %xmm3
584
585
paddd %xmm2, %xmm4
586
movdqa %xmm4, %xmm5
587
pslld $13, %xmm4
588
psrld $19, %xmm5
589
pxor %xmm4, %xmm1
590
movdqa %xmm2, %xmm4
591
pxor %xmm5, %xmm1
592
pshufd $0x4e, %xmm2, %xmm2
593
594
paddd %xmm1, %xmm4
595
movdqa %xmm4, %xmm5
596
pslld $18, %xmm4
597
psrld $14, %xmm5
598
pxor %xmm4, %xmm0
599
movdqa %xmm3, %xmm4
600
pxor %xmm5, %xmm0
601
pshufd $0x39, %xmm1, %xmm1
602
603
paddd %xmm0, %xmm4
604
movdqa %xmm4, %xmm5
605
pslld $7, %xmm4
606
psrld $25, %xmm5
607
pxor %xmm4, %xmm1
608
movdqa %xmm0, %xmm4
609
pxor %xmm5, %xmm1
610
611
paddd %xmm1, %xmm4
612
movdqa %xmm4, %xmm5
613
pslld $9, %xmm4
614
psrld $23, %xmm5
615
pxor %xmm4, %xmm2
616
movdqa %xmm1, %xmm4
617
pxor %xmm5, %xmm2
618
pshufd $0x93, %xmm1, %xmm1
619
620
paddd %xmm2, %xmm4
621
movdqa %xmm4, %xmm5
622
pslld $13, %xmm4
623
psrld $19, %xmm5
624
pxor %xmm4, %xmm3
625
movdqa %xmm2, %xmm4
626
pxor %xmm5, %xmm3
627
pshufd $0x4e, %xmm2, %xmm2
628
629
paddd %xmm3, %xmm4
630
movdqa %xmm4, %xmm5
631
pslld $18, %xmm4
632
psrld $14, %xmm5
633
pxor %xmm4, %xmm0
634
pshufd $0x39, %xmm3, %xmm3
635
pxor %xmm5, %xmm0
636
.endm
637
638
.macro salsa8_core_xmm
639
salsa8_core_xmm_doubleround
640
salsa8_core_xmm_doubleround
641
salsa8_core_xmm_doubleround
642
salsa8_core_xmm_doubleround
643
.endm
644
645
.p2align 6
646
scrypt_core_xmm:
647
pcmpeqw %xmm1, %xmm1
648
psrlq $32, %xmm1
649
650
movdqa 0(%rdi), %xmm8
651
movdqa 16(%rdi), %xmm11
652
movdqa 32(%rdi), %xmm10
653
movdqa 48(%rdi), %xmm9
654
movdqa %xmm8, %xmm0
655
pxor %xmm11, %xmm8
656
pand %xmm1, %xmm8
657
pxor %xmm11, %xmm8
658
pxor %xmm10, %xmm11
659
pand %xmm1, %xmm11
660
pxor %xmm10, %xmm11
661
pxor %xmm9, %xmm10
662
pand %xmm1, %xmm10
663
pxor %xmm9, %xmm10
664
pxor %xmm0, %xmm9
665
pand %xmm1, %xmm9
666
pxor %xmm0, %xmm9
667
movdqa %xmm8, %xmm0
668
pshufd $0x4e, %xmm10, %xmm10
669
punpcklqdq %xmm10, %xmm8
670
punpckhqdq %xmm0, %xmm10
671
movdqa %xmm11, %xmm0
672
pshufd $0x4e, %xmm9, %xmm9
673
punpcklqdq %xmm9, %xmm11
674
punpckhqdq %xmm0, %xmm9
675
676
movdqa 64(%rdi), %xmm12
677
movdqa 80(%rdi), %xmm15
678
movdqa 96(%rdi), %xmm14
679
movdqa 112(%rdi), %xmm13
680
movdqa %xmm12, %xmm0
681
pxor %xmm15, %xmm12
682
pand %xmm1, %xmm12
683
pxor %xmm15, %xmm12
684
pxor %xmm14, %xmm15
685
pand %xmm1, %xmm15
686
pxor %xmm14, %xmm15
687
pxor %xmm13, %xmm14
688
pand %xmm1, %xmm14
689
pxor %xmm13, %xmm14
690
pxor %xmm0, %xmm13
691
pand %xmm1, %xmm13
692
pxor %xmm0, %xmm13
693
movdqa %xmm12, %xmm0
694
pshufd $0x4e, %xmm14, %xmm14
695
punpcklqdq %xmm14, %xmm12
696
punpckhqdq %xmm0, %xmm14
697
movdqa %xmm15, %xmm0
698
pshufd $0x4e, %xmm13, %xmm13
699
punpcklqdq %xmm13, %xmm15
700
punpckhqdq %xmm0, %xmm13
701
702
movq %rsi, %rdx
703
movq %r8, %rcx
704
shlq $7, %rcx
705
addq %rsi, %rcx
706
scrypt_core_xmm_loop1:
707
pxor %xmm12, %xmm8
708
pxor %xmm13, %xmm9
709
pxor %xmm14, %xmm10
710
pxor %xmm15, %xmm11
711
movdqa %xmm8, 0(%rdx)
712
movdqa %xmm9, 16(%rdx)
713
movdqa %xmm10, 32(%rdx)
714
movdqa %xmm11, 48(%rdx)
715
movdqa %xmm12, 64(%rdx)
716
movdqa %xmm13, 80(%rdx)
717
movdqa %xmm14, 96(%rdx)
718
movdqa %xmm15, 112(%rdx)
719
720
movdqa %xmm8, %xmm0
721
movdqa %xmm9, %xmm1
722
movdqa %xmm10, %xmm2
723
movdqa %xmm11, %xmm3
724
salsa8_core_xmm
725
paddd %xmm0, %xmm8
726
paddd %xmm1, %xmm9
727
paddd %xmm2, %xmm10
728
paddd %xmm3, %xmm11
729
730
pxor %xmm8, %xmm12
731
pxor %xmm9, %xmm13
732
pxor %xmm10, %xmm14
733
pxor %xmm11, %xmm15
734
movdqa %xmm12, %xmm0
735
movdqa %xmm13, %xmm1
736
movdqa %xmm14, %xmm2
737
movdqa %xmm15, %xmm3
738
salsa8_core_xmm
739
paddd %xmm0, %xmm12
740
paddd %xmm1, %xmm13
741
paddd %xmm2, %xmm14
742
paddd %xmm3, %xmm15
743
744
addq $128, %rdx
745
cmpq %rcx, %rdx
746
jne scrypt_core_xmm_loop1
747
748
movq %r8, %rcx
749
subl $1, %r8d
750
scrypt_core_xmm_loop2:
751
movd %xmm12, %edx
752
andl %r8d, %edx
753
shll $7, %edx
754
pxor 0(%rsi, %rdx), %xmm8
755
pxor 16(%rsi, %rdx), %xmm9
756
pxor 32(%rsi, %rdx), %xmm10
757
pxor 48(%rsi, %rdx), %xmm11
758
759
pxor %xmm12, %xmm8
760
pxor %xmm13, %xmm9
761
pxor %xmm14, %xmm10
762
pxor %xmm15, %xmm11
763
movdqa %xmm8, %xmm0
764
movdqa %xmm9, %xmm1
765
movdqa %xmm10, %xmm2
766
movdqa %xmm11, %xmm3
767
salsa8_core_xmm
768
paddd %xmm0, %xmm8
769
paddd %xmm1, %xmm9
770
paddd %xmm2, %xmm10
771
paddd %xmm3, %xmm11
772
773
pxor 64(%rsi, %rdx), %xmm12
774
pxor 80(%rsi, %rdx), %xmm13
775
pxor 96(%rsi, %rdx), %xmm14
776
pxor 112(%rsi, %rdx), %xmm15
777
pxor %xmm8, %xmm12
778
pxor %xmm9, %xmm13
779
pxor %xmm10, %xmm14
780
pxor %xmm11, %xmm15
781
movdqa %xmm12, %xmm0
782
movdqa %xmm13, %xmm1
783
movdqa %xmm14, %xmm2
784
movdqa %xmm15, %xmm3
785
salsa8_core_xmm
786
paddd %xmm0, %xmm12
787
paddd %xmm1, %xmm13
788
paddd %xmm2, %xmm14
789
paddd %xmm3, %xmm15
790
791
subq $1, %rcx
792
ja scrypt_core_xmm_loop2
793
794
pcmpeqw %xmm1, %xmm1
795
psrlq $32, %xmm1
796
797
movdqa %xmm8, %xmm0
798
pxor %xmm9, %xmm8
799
pand %xmm1, %xmm8
800
pxor %xmm9, %xmm8
801
pxor %xmm10, %xmm9
802
pand %xmm1, %xmm9
803
pxor %xmm10, %xmm9
804
pxor %xmm11, %xmm10
805
pand %xmm1, %xmm10
806
pxor %xmm11, %xmm10
807
pxor %xmm0, %xmm11
808
pand %xmm1, %xmm11
809
pxor %xmm0, %xmm11
810
movdqa %xmm8, %xmm0
811
pshufd $0x4e, %xmm10, %xmm10
812
punpcklqdq %xmm10, %xmm8
813
punpckhqdq %xmm0, %xmm10
814
movdqa %xmm9, %xmm0
815
pshufd $0x4e, %xmm11, %xmm11
816
punpcklqdq %xmm11, %xmm9
817
punpckhqdq %xmm0, %xmm11
818
movdqa %xmm8, 0(%rdi)
819
movdqa %xmm11, 16(%rdi)
820
movdqa %xmm10, 32(%rdi)
821
movdqa %xmm9, 48(%rdi)
822
823
movdqa %xmm12, %xmm0
824
pxor %xmm13, %xmm12
825
pand %xmm1, %xmm12
826
pxor %xmm13, %xmm12
827
pxor %xmm14, %xmm13
828
pand %xmm1, %xmm13
829
pxor %xmm14, %xmm13
830
pxor %xmm15, %xmm14
831
pand %xmm1, %xmm14
832
pxor %xmm15, %xmm14
833
pxor %xmm0, %xmm15
834
pand %xmm1, %xmm15
835
pxor %xmm0, %xmm15
836
movdqa %xmm12, %xmm0
837
pshufd $0x4e, %xmm14, %xmm14
838
punpcklqdq %xmm14, %xmm12
839
punpckhqdq %xmm0, %xmm14
840
movdqa %xmm13, %xmm0
841
pshufd $0x4e, %xmm15, %xmm15
842
punpcklqdq %xmm15, %xmm13
843
punpckhqdq %xmm0, %xmm15
844
movdqa %xmm12, 64(%rdi)
845
movdqa %xmm15, 80(%rdi)
846
movdqa %xmm14, 96(%rdi)
847
movdqa %xmm13, 112(%rdi)
848
849
scrypt_core_cleanup
850
ret
851
852
853
#if defined(USE_AVX)
854
.macro salsa8_core_3way_avx_doubleround
855
vpaddd %xmm0, %xmm1, %xmm4
856
vpaddd %xmm8, %xmm9, %xmm6
857
vpaddd %xmm12, %xmm13, %xmm7
858
vpslld $7, %xmm4, %xmm5
859
vpsrld $25, %xmm4, %xmm4
860
vpxor %xmm5, %xmm3, %xmm3
861
vpxor %xmm4, %xmm3, %xmm3
862
vpslld $7, %xmm6, %xmm5
863
vpsrld $25, %xmm6, %xmm6
864
vpxor %xmm5, %xmm11, %xmm11
865
vpxor %xmm6, %xmm11, %xmm11
866
vpslld $7, %xmm7, %xmm5
867
vpsrld $25, %xmm7, %xmm7
868
vpxor %xmm5, %xmm15, %xmm15
869
vpxor %xmm7, %xmm15, %xmm15
870
871
vpaddd %xmm3, %xmm0, %xmm4
872
vpaddd %xmm11, %xmm8, %xmm6
873
vpaddd %xmm15, %xmm12, %xmm7
874
vpslld $9, %xmm4, %xmm5
875
vpsrld $23, %xmm4, %xmm4
876
vpxor %xmm5, %xmm2, %xmm2
877
vpxor %xmm4, %xmm2, %xmm2
878
vpslld $9, %xmm6, %xmm5
879
vpsrld $23, %xmm6, %xmm6
880
vpxor %xmm5, %xmm10, %xmm10
881
vpxor %xmm6, %xmm10, %xmm10
882
vpslld $9, %xmm7, %xmm5
883
vpsrld $23, %xmm7, %xmm7
884
vpxor %xmm5, %xmm14, %xmm14
885
vpxor %xmm7, %xmm14, %xmm14
886
887
vpaddd %xmm2, %xmm3, %xmm4
888
vpaddd %xmm10, %xmm11, %xmm6
889
vpaddd %xmm14, %xmm15, %xmm7
890
vpslld $13, %xmm4, %xmm5
891
vpsrld $19, %xmm4, %xmm4
892
vpshufd $0x93, %xmm3, %xmm3
893
vpshufd $0x93, %xmm11, %xmm11
894
vpshufd $0x93, %xmm15, %xmm15
895
vpxor %xmm5, %xmm1, %xmm1
896
vpxor %xmm4, %xmm1, %xmm1
897
vpslld $13, %xmm6, %xmm5
898
vpsrld $19, %xmm6, %xmm6
899
vpxor %xmm5, %xmm9, %xmm9
900
vpxor %xmm6, %xmm9, %xmm9
901
vpslld $13, %xmm7, %xmm5
902
vpsrld $19, %xmm7, %xmm7
903
vpxor %xmm5, %xmm13, %xmm13
904
vpxor %xmm7, %xmm13, %xmm13
905
906
vpaddd %xmm1, %xmm2, %xmm4
907
vpaddd %xmm9, %xmm10, %xmm6
908
vpaddd %xmm13, %xmm14, %xmm7
909
vpslld $18, %xmm4, %xmm5
910
vpsrld $14, %xmm4, %xmm4
911
vpshufd $0x4e, %xmm2, %xmm2
912
vpshufd $0x4e, %xmm10, %xmm10
913
vpshufd $0x4e, %xmm14, %xmm14
914
vpxor %xmm5, %xmm0, %xmm0
915
vpxor %xmm4, %xmm0, %xmm0
916
vpslld $18, %xmm6, %xmm5
917
vpsrld $14, %xmm6, %xmm6
918
vpxor %xmm5, %xmm8, %xmm8
919
vpxor %xmm6, %xmm8, %xmm8
920
vpslld $18, %xmm7, %xmm5
921
vpsrld $14, %xmm7, %xmm7
922
vpxor %xmm5, %xmm12, %xmm12
923
vpxor %xmm7, %xmm12, %xmm12
924
925
vpaddd %xmm0, %xmm3, %xmm4
926
vpaddd %xmm8, %xmm11, %xmm6
927
vpaddd %xmm12, %xmm15, %xmm7
928
vpslld $7, %xmm4, %xmm5
929
vpsrld $25, %xmm4, %xmm4
930
vpshufd $0x39, %xmm1, %xmm1
931
vpxor %xmm5, %xmm1, %xmm1
932
vpxor %xmm4, %xmm1, %xmm1
933
vpslld $7, %xmm6, %xmm5
934
vpsrld $25, %xmm6, %xmm6
935
vpshufd $0x39, %xmm9, %xmm9
936
vpxor %xmm5, %xmm9, %xmm9
937
vpxor %xmm6, %xmm9, %xmm9
938
vpslld $7, %xmm7, %xmm5
939
vpsrld $25, %xmm7, %xmm7
940
vpshufd $0x39, %xmm13, %xmm13
941
vpxor %xmm5, %xmm13, %xmm13
942
vpxor %xmm7, %xmm13, %xmm13
943
944
vpaddd %xmm1, %xmm0, %xmm4
945
vpaddd %xmm9, %xmm8, %xmm6
946
vpaddd %xmm13, %xmm12, %xmm7
947
vpslld $9, %xmm4, %xmm5
948
vpsrld $23, %xmm4, %xmm4
949
vpxor %xmm5, %xmm2, %xmm2
950
vpxor %xmm4, %xmm2, %xmm2
951
vpslld $9, %xmm6, %xmm5
952
vpsrld $23, %xmm6, %xmm6
953
vpxor %xmm5, %xmm10, %xmm10
954
vpxor %xmm6, %xmm10, %xmm10
955
vpslld $9, %xmm7, %xmm5
956
vpsrld $23, %xmm7, %xmm7
957
vpxor %xmm5, %xmm14, %xmm14
958
vpxor %xmm7, %xmm14, %xmm14
959
960
vpaddd %xmm2, %xmm1, %xmm4
961
vpaddd %xmm10, %xmm9, %xmm6
962
vpaddd %xmm14, %xmm13, %xmm7
963
vpslld $13, %xmm4, %xmm5
964
vpsrld $19, %xmm4, %xmm4
965
vpshufd $0x93, %xmm1, %xmm1
966
vpshufd $0x93, %xmm9, %xmm9
967
vpshufd $0x93, %xmm13, %xmm13
968
vpxor %xmm5, %xmm3, %xmm3
969
vpxor %xmm4, %xmm3, %xmm3
970
vpslld $13, %xmm6, %xmm5
971
vpsrld $19, %xmm6, %xmm6
972
vpxor %xmm5, %xmm11, %xmm11
973
vpxor %xmm6, %xmm11, %xmm11
974
vpslld $13, %xmm7, %xmm5
975
vpsrld $19, %xmm7, %xmm7
976
vpxor %xmm5, %xmm15, %xmm15
977
vpxor %xmm7, %xmm15, %xmm15
978
979
vpaddd %xmm3, %xmm2, %xmm4
980
vpaddd %xmm11, %xmm10, %xmm6
981
vpaddd %xmm15, %xmm14, %xmm7
982
vpslld $18, %xmm4, %xmm5
983
vpsrld $14, %xmm4, %xmm4
984
vpshufd $0x4e, %xmm2, %xmm2
985
vpshufd $0x4e, %xmm10, %xmm10
986
vpxor %xmm5, %xmm0, %xmm0
987
vpxor %xmm4, %xmm0, %xmm0
988
vpslld $18, %xmm6, %xmm5
989
vpsrld $14, %xmm6, %xmm6
990
vpshufd $0x4e, %xmm14, %xmm14
991
vpshufd $0x39, %xmm11, %xmm11
992
vpxor %xmm5, %xmm8, %xmm8
993
vpxor %xmm6, %xmm8, %xmm8
994
vpslld $18, %xmm7, %xmm5
995
vpsrld $14, %xmm7, %xmm7
996
vpshufd $0x39, %xmm3, %xmm3
997
vpshufd $0x39, %xmm15, %xmm15
998
vpxor %xmm5, %xmm12, %xmm12
999
vpxor %xmm7, %xmm12, %xmm12
1000
.endm
1001
1002
.macro salsa8_core_3way_avx
1003
salsa8_core_3way_avx_doubleround
1004
salsa8_core_3way_avx_doubleround
1005
salsa8_core_3way_avx_doubleround
1006
salsa8_core_3way_avx_doubleround
1007
.endm
1008
#endif /* USE_AVX */
1009
1010
.text
1011
.p2align 6
1012
.globl scrypt_core_3way
1013
.globl _scrypt_core_3way
1014
scrypt_core_3way:
1015
_scrypt_core_3way:
1016
pushq %rbx
1017
pushq %rbp
1018
#if defined(_WIN64) || defined(__CYGWIN__)
1019
subq $176, %rsp
1020
movdqa %xmm6, 8(%rsp)
1021
movdqa %xmm7, 24(%rsp)
1022
movdqa %xmm8, 40(%rsp)
1023
movdqa %xmm9, 56(%rsp)
1024
movdqa %xmm10, 72(%rsp)
1025
movdqa %xmm11, 88(%rsp)
1026
movdqa %xmm12, 104(%rsp)
1027
movdqa %xmm13, 120(%rsp)
1028
movdqa %xmm14, 136(%rsp)
1029
movdqa %xmm15, 152(%rsp)
1030
pushq %rdi
1031
pushq %rsi
1032
movq %rcx, %rdi
1033
movq %rdx, %rsi
1034
#else
1035
movq %rdx, %r8
1036
#endif
1037
subq $392, %rsp
1038
1039
.macro scrypt_core_3way_cleanup
1040
addq $392, %rsp
1041
#if defined(_WIN64) || defined(__CYGWIN__)
1042
popq %rsi
1043
popq %rdi
1044
movdqa 8(%rsp), %xmm6
1045
movdqa 24(%rsp), %xmm7
1046
movdqa 40(%rsp), %xmm8
1047
movdqa 56(%rsp), %xmm9
1048
movdqa 72(%rsp), %xmm10
1049
movdqa 88(%rsp), %xmm11
1050
movdqa 104(%rsp), %xmm12
1051
movdqa 120(%rsp), %xmm13
1052
movdqa 136(%rsp), %xmm14
1053
movdqa 152(%rsp), %xmm15
1054
addq $176, %rsp
1055
#endif
1056
popq %rbp
1057
popq %rbx
1058
.endm
1059
1060
#if !defined(USE_AVX)
1061
jmp scrypt_core_3way_xmm
1062
#else
1063
/* Check for AVX and OSXSAVE support */
1064
movl $1, %eax
1065
cpuid
1066
andl $0x18000000, %ecx
1067
cmpl $0x18000000, %ecx
1068
jne scrypt_core_3way_xmm
1069
/* Check for XMM and YMM state support */
1070
xorl %ecx, %ecx
1071
xgetbv
1072
andl $0x00000006, %eax
1073
cmpl $0x00000006, %eax
1074
jne scrypt_core_3way_xmm
1075
#if defined(USE_XOP)
1076
/* Check for XOP support */
1077
movl $0x80000001, %eax
1078
cpuid
1079
andl $0x00000800, %ecx
1080
jnz scrypt_core_3way_xop
1081
#endif
1082
1083
scrypt_core_3way_avx:
1084
scrypt_shuffle %rdi, 0, %rsp, 0
1085
scrypt_shuffle %rdi, 64, %rsp, 64
1086
scrypt_shuffle %rdi, 128, %rsp, 128
1087
scrypt_shuffle %rdi, 192, %rsp, 192
1088
scrypt_shuffle %rdi, 256, %rsp, 256
1089
scrypt_shuffle %rdi, 320, %rsp, 320
1090
1091
movdqa 64(%rsp), %xmm0
1092
movdqa 80(%rsp), %xmm1
1093
movdqa 96(%rsp), %xmm2
1094
movdqa 112(%rsp), %xmm3
1095
movdqa 128+64(%rsp), %xmm8
1096
movdqa 128+80(%rsp), %xmm9
1097
movdqa 128+96(%rsp), %xmm10
1098
movdqa 128+112(%rsp), %xmm11
1099
movdqa 256+64(%rsp), %xmm12
1100
movdqa 256+80(%rsp), %xmm13
1101
movdqa 256+96(%rsp), %xmm14
1102
movdqa 256+112(%rsp), %xmm15
1103
1104
movq %rsi, %rbx
1105
leaq (%r8, %r8, 2), %rax
1106
shlq $7, %rax
1107
addq %rsi, %rax
1108
scrypt_core_3way_avx_loop1:
1109
movdqa %xmm0, 64(%rbx)
1110
movdqa %xmm1, 80(%rbx)
1111
movdqa %xmm2, 96(%rbx)
1112
movdqa %xmm3, 112(%rbx)
1113
pxor 0(%rsp), %xmm0
1114
pxor 16(%rsp), %xmm1
1115
pxor 32(%rsp), %xmm2
1116
pxor 48(%rsp), %xmm3
1117
movdqa %xmm8, 128+64(%rbx)
1118
movdqa %xmm9, 128+80(%rbx)
1119
movdqa %xmm10, 128+96(%rbx)
1120
movdqa %xmm11, 128+112(%rbx)
1121
pxor 128+0(%rsp), %xmm8
1122
pxor 128+16(%rsp), %xmm9
1123
pxor 128+32(%rsp), %xmm10
1124
pxor 128+48(%rsp), %xmm11
1125
movdqa %xmm12, 256+64(%rbx)
1126
movdqa %xmm13, 256+80(%rbx)
1127
movdqa %xmm14, 256+96(%rbx)
1128
movdqa %xmm15, 256+112(%rbx)
1129
pxor 256+0(%rsp), %xmm12
1130
pxor 256+16(%rsp), %xmm13
1131
pxor 256+32(%rsp), %xmm14
1132
pxor 256+48(%rsp), %xmm15
1133
movdqa %xmm0, 0(%rbx)
1134
movdqa %xmm1, 16(%rbx)
1135
movdqa %xmm2, 32(%rbx)
1136
movdqa %xmm3, 48(%rbx)
1137
movdqa %xmm8, 128+0(%rbx)
1138
movdqa %xmm9, 128+16(%rbx)
1139
movdqa %xmm10, 128+32(%rbx)
1140
movdqa %xmm11, 128+48(%rbx)
1141
movdqa %xmm12, 256+0(%rbx)
1142
movdqa %xmm13, 256+16(%rbx)
1143
movdqa %xmm14, 256+32(%rbx)
1144
movdqa %xmm15, 256+48(%rbx)
1145
1146
salsa8_core_3way_avx
1147
paddd 0(%rbx), %xmm0
1148
paddd 16(%rbx), %xmm1
1149
paddd 32(%rbx), %xmm2
1150
paddd 48(%rbx), %xmm3
1151
paddd 128+0(%rbx), %xmm8
1152
paddd 128+16(%rbx), %xmm9
1153
paddd 128+32(%rbx), %xmm10
1154
paddd 128+48(%rbx), %xmm11
1155
paddd 256+0(%rbx), %xmm12
1156
paddd 256+16(%rbx), %xmm13
1157
paddd 256+32(%rbx), %xmm14
1158
paddd 256+48(%rbx), %xmm15
1159
movdqa %xmm0, 0(%rsp)
1160
movdqa %xmm1, 16(%rsp)
1161
movdqa %xmm2, 32(%rsp)
1162
movdqa %xmm3, 48(%rsp)
1163
movdqa %xmm8, 128+0(%rsp)
1164
movdqa %xmm9, 128+16(%rsp)
1165
movdqa %xmm10, 128+32(%rsp)
1166
movdqa %xmm11, 128+48(%rsp)
1167
movdqa %xmm12, 256+0(%rsp)
1168
movdqa %xmm13, 256+16(%rsp)
1169
movdqa %xmm14, 256+32(%rsp)
1170
movdqa %xmm15, 256+48(%rsp)
1171
1172
pxor 64(%rbx), %xmm0
1173
pxor 80(%rbx), %xmm1
1174
pxor 96(%rbx), %xmm2
1175
pxor 112(%rbx), %xmm3
1176
pxor 128+64(%rbx), %xmm8
1177
pxor 128+80(%rbx), %xmm9
1178
pxor 128+96(%rbx), %xmm10
1179
pxor 128+112(%rbx), %xmm11
1180
pxor 256+64(%rbx), %xmm12
1181
pxor 256+80(%rbx), %xmm13
1182
pxor 256+96(%rbx), %xmm14
1183
pxor 256+112(%rbx), %xmm15
1184
movdqa %xmm0, 64(%rsp)
1185
movdqa %xmm1, 80(%rsp)
1186
movdqa %xmm2, 96(%rsp)
1187
movdqa %xmm3, 112(%rsp)
1188
movdqa %xmm8, 128+64(%rsp)
1189
movdqa %xmm9, 128+80(%rsp)
1190
movdqa %xmm10, 128+96(%rsp)
1191
movdqa %xmm11, 128+112(%rsp)
1192
movdqa %xmm12, 256+64(%rsp)
1193
movdqa %xmm13, 256+80(%rsp)
1194
movdqa %xmm14, 256+96(%rsp)
1195
movdqa %xmm15, 256+112(%rsp)
1196
salsa8_core_3way_avx
1197
paddd 64(%rsp), %xmm0
1198
paddd 80(%rsp), %xmm1
1199
paddd 96(%rsp), %xmm2
1200
paddd 112(%rsp), %xmm3
1201
paddd 128+64(%rsp), %xmm8
1202
paddd 128+80(%rsp), %xmm9
1203
paddd 128+96(%rsp), %xmm10
1204
paddd 128+112(%rsp), %xmm11
1205
paddd 256+64(%rsp), %xmm12
1206
paddd 256+80(%rsp), %xmm13
1207
paddd 256+96(%rsp), %xmm14
1208
paddd 256+112(%rsp), %xmm15
1209
1210
addq $3*128, %rbx
1211
cmpq %rax, %rbx
1212
jne scrypt_core_3way_avx_loop1
1213
1214
movdqa %xmm0, 64(%rsp)
1215
movdqa %xmm1, 80(%rsp)
1216
movdqa %xmm2, 96(%rsp)
1217
movdqa %xmm3, 112(%rsp)
1218
movdqa %xmm8, 128+64(%rsp)
1219
movdqa %xmm9, 128+80(%rsp)
1220
movdqa %xmm10, 128+96(%rsp)
1221
movdqa %xmm11, 128+112(%rsp)
1222
movdqa %xmm12, 256+64(%rsp)
1223
movdqa %xmm13, 256+80(%rsp)
1224
movdqa %xmm14, 256+96(%rsp)
1225
movdqa %xmm15, 256+112(%rsp)
1226
1227
movq %r8, %rcx
1228
subq $1, %r8
1229
scrypt_core_3way_avx_loop2:
1230
movd %xmm0, %ebp
1231
movd %xmm8, %ebx
1232
movd %xmm12, %eax
1233
pxor 0(%rsp), %xmm0
1234
pxor 16(%rsp), %xmm1
1235
pxor 32(%rsp), %xmm2
1236
pxor 48(%rsp), %xmm3
1237
pxor 128+0(%rsp), %xmm8
1238
pxor 128+16(%rsp), %xmm9
1239
pxor 128+32(%rsp), %xmm10
1240
pxor 128+48(%rsp), %xmm11
1241
pxor 256+0(%rsp), %xmm12
1242
pxor 256+16(%rsp), %xmm13
1243
pxor 256+32(%rsp), %xmm14
1244
pxor 256+48(%rsp), %xmm15
1245
andl %r8d, %ebp
1246
leaq (%rbp, %rbp, 2), %rbp
1247
shll $7, %ebp
1248
andl %r8d, %ebx
1249
leaq 1(%rbx, %rbx, 2), %rbx
1250
shll $7, %ebx
1251
andl %r8d, %eax
1252
leaq 2(%rax, %rax, 2), %rax
1253
shll $7, %eax
1254
pxor 0(%rsi, %rbp), %xmm0
1255
pxor 16(%rsi, %rbp), %xmm1
1256
pxor 32(%rsi, %rbp), %xmm2
1257
pxor 48(%rsi, %rbp), %xmm3
1258
pxor 0(%rsi, %rbx), %xmm8
1259
pxor 16(%rsi, %rbx), %xmm9
1260
pxor 32(%rsi, %rbx), %xmm10
1261
pxor 48(%rsi, %rbx), %xmm11
1262
pxor 0(%rsi, %rax), %xmm12
1263
pxor 16(%rsi, %rax), %xmm13
1264
pxor 32(%rsi, %rax), %xmm14
1265
pxor 48(%rsi, %rax), %xmm15
1266
1267
movdqa %xmm0, 0(%rsp)
1268
movdqa %xmm1, 16(%rsp)
1269
movdqa %xmm2, 32(%rsp)
1270
movdqa %xmm3, 48(%rsp)
1271
movdqa %xmm8, 128+0(%rsp)
1272
movdqa %xmm9, 128+16(%rsp)
1273
movdqa %xmm10, 128+32(%rsp)
1274
movdqa %xmm11, 128+48(%rsp)
1275
movdqa %xmm12, 256+0(%rsp)
1276
movdqa %xmm13, 256+16(%rsp)
1277
movdqa %xmm14, 256+32(%rsp)
1278
movdqa %xmm15, 256+48(%rsp)
1279
salsa8_core_3way_avx
1280
paddd 0(%rsp), %xmm0
1281
paddd 16(%rsp), %xmm1
1282
paddd 32(%rsp), %xmm2
1283
paddd 48(%rsp), %xmm3
1284
paddd 128+0(%rsp), %xmm8
1285
paddd 128+16(%rsp), %xmm9
1286
paddd 128+32(%rsp), %xmm10
1287
paddd 128+48(%rsp), %xmm11
1288
paddd 256+0(%rsp), %xmm12
1289
paddd 256+16(%rsp), %xmm13
1290
paddd 256+32(%rsp), %xmm14
1291
paddd 256+48(%rsp), %xmm15
1292
movdqa %xmm0, 0(%rsp)
1293
movdqa %xmm1, 16(%rsp)
1294
movdqa %xmm2, 32(%rsp)
1295
movdqa %xmm3, 48(%rsp)
1296
movdqa %xmm8, 128+0(%rsp)
1297
movdqa %xmm9, 128+16(%rsp)
1298
movdqa %xmm10, 128+32(%rsp)
1299
movdqa %xmm11, 128+48(%rsp)
1300
movdqa %xmm12, 256+0(%rsp)
1301
movdqa %xmm13, 256+16(%rsp)
1302
movdqa %xmm14, 256+32(%rsp)
1303
movdqa %xmm15, 256+48(%rsp)
1304
1305
pxor 64(%rsi, %rbp), %xmm0
1306
pxor 80(%rsi, %rbp), %xmm1
1307
pxor 96(%rsi, %rbp), %xmm2
1308
pxor 112(%rsi, %rbp), %xmm3
1309
pxor 64(%rsi, %rbx), %xmm8
1310
pxor 80(%rsi, %rbx), %xmm9
1311
pxor 96(%rsi, %rbx), %xmm10
1312
pxor 112(%rsi, %rbx), %xmm11
1313
pxor 64(%rsi, %rax), %xmm12
1314
pxor 80(%rsi, %rax), %xmm13
1315
pxor 96(%rsi, %rax), %xmm14
1316
pxor 112(%rsi, %rax), %xmm15
1317
pxor 64(%rsp), %xmm0
1318
pxor 80(%rsp), %xmm1
1319
pxor 96(%rsp), %xmm2
1320
pxor 112(%rsp), %xmm3
1321
pxor 128+64(%rsp), %xmm8
1322
pxor 128+80(%rsp), %xmm9
1323
pxor 128+96(%rsp), %xmm10
1324
pxor 128+112(%rsp), %xmm11
1325
pxor 256+64(%rsp), %xmm12
1326
pxor 256+80(%rsp), %xmm13
1327
pxor 256+96(%rsp), %xmm14
1328
pxor 256+112(%rsp), %xmm15
1329
movdqa %xmm0, 64(%rsp)
1330
movdqa %xmm1, 80(%rsp)
1331
movdqa %xmm2, 96(%rsp)
1332
movdqa %xmm3, 112(%rsp)
1333
movdqa %xmm8, 128+64(%rsp)
1334
movdqa %xmm9, 128+80(%rsp)
1335
movdqa %xmm10, 128+96(%rsp)
1336
movdqa %xmm11, 128+112(%rsp)
1337
movdqa %xmm12, 256+64(%rsp)
1338
movdqa %xmm13, 256+80(%rsp)
1339
movdqa %xmm14, 256+96(%rsp)
1340
movdqa %xmm15, 256+112(%rsp)
1341
salsa8_core_3way_avx
1342
paddd 64(%rsp), %xmm0
1343
paddd 80(%rsp), %xmm1
1344
paddd 96(%rsp), %xmm2
1345
paddd 112(%rsp), %xmm3
1346
paddd 128+64(%rsp), %xmm8
1347
paddd 128+80(%rsp), %xmm9
1348
paddd 128+96(%rsp), %xmm10
1349
paddd 128+112(%rsp), %xmm11
1350
paddd 256+64(%rsp), %xmm12
1351
paddd 256+80(%rsp), %xmm13
1352
paddd 256+96(%rsp), %xmm14
1353
paddd 256+112(%rsp), %xmm15
1354
movdqa %xmm0, 64(%rsp)
1355
movdqa %xmm1, 80(%rsp)
1356
movdqa %xmm2, 96(%rsp)
1357
movdqa %xmm3, 112(%rsp)
1358
movdqa %xmm8, 128+64(%rsp)
1359
movdqa %xmm9, 128+80(%rsp)
1360
movdqa %xmm10, 128+96(%rsp)
1361
movdqa %xmm11, 128+112(%rsp)
1362
movdqa %xmm12, 256+64(%rsp)
1363
movdqa %xmm13, 256+80(%rsp)
1364
movdqa %xmm14, 256+96(%rsp)
1365
movdqa %xmm15, 256+112(%rsp)
1366
1367
subq $1, %rcx
1368
ja scrypt_core_3way_avx_loop2
1369
1370
scrypt_shuffle %rsp, 0, %rdi, 0
1371
scrypt_shuffle %rsp, 64, %rdi, 64
1372
scrypt_shuffle %rsp, 128, %rdi, 128
1373
scrypt_shuffle %rsp, 192, %rdi, 192
1374
scrypt_shuffle %rsp, 256, %rdi, 256
1375
scrypt_shuffle %rsp, 320, %rdi, 320
1376
1377
scrypt_core_3way_cleanup
1378
ret
1379
1380
#if defined(USE_XOP)
1381
.macro salsa8_core_3way_xop_doubleround
1382
vpaddd %xmm0, %xmm1, %xmm4
1383
vpaddd %xmm8, %xmm9, %xmm6
1384
vpaddd %xmm12, %xmm13, %xmm7
1385
vprotd $7, %xmm4, %xmm4
1386
vprotd $7, %xmm6, %xmm6
1387
vprotd $7, %xmm7, %xmm7
1388
vpxor %xmm4, %xmm3, %xmm3
1389
vpxor %xmm6, %xmm11, %xmm11
1390
vpxor %xmm7, %xmm15, %xmm15
1391
1392
vpaddd %xmm3, %xmm0, %xmm4
1393
vpaddd %xmm11, %xmm8, %xmm6
1394
vpaddd %xmm15, %xmm12, %xmm7
1395
vprotd $9, %xmm4, %xmm4
1396
vprotd $9, %xmm6, %xmm6
1397
vprotd $9, %xmm7, %xmm7
1398
vpxor %xmm4, %xmm2, %xmm2
1399
vpxor %xmm6, %xmm10, %xmm10
1400
vpxor %xmm7, %xmm14, %xmm14
1401
1402
vpaddd %xmm2, %xmm3, %xmm4
1403
vpaddd %xmm10, %xmm11, %xmm6
1404
vpaddd %xmm14, %xmm15, %xmm7
1405
vprotd $13, %xmm4, %xmm4
1406
vprotd $13, %xmm6, %xmm6
1407
vprotd $13, %xmm7, %xmm7
1408
vpshufd $0x93, %xmm3, %xmm3
1409
vpshufd $0x93, %xmm11, %xmm11
1410
vpshufd $0x93, %xmm15, %xmm15
1411
vpxor %xmm4, %xmm1, %xmm1
1412
vpxor %xmm6, %xmm9, %xmm9
1413
vpxor %xmm7, %xmm13, %xmm13
1414
1415
vpaddd %xmm1, %xmm2, %xmm4
1416
vpaddd %xmm9, %xmm10, %xmm6
1417
vpaddd %xmm13, %xmm14, %xmm7
1418
vprotd $18, %xmm4, %xmm4
1419
vprotd $18, %xmm6, %xmm6
1420
vprotd $18, %xmm7, %xmm7
1421
vpshufd $0x4e, %xmm2, %xmm2
1422
vpshufd $0x4e, %xmm10, %xmm10
1423
vpshufd $0x4e, %xmm14, %xmm14
1424
vpxor %xmm6, %xmm8, %xmm8
1425
vpxor %xmm4, %xmm0, %xmm0
1426
vpxor %xmm7, %xmm12, %xmm12
1427
1428
vpaddd %xmm0, %xmm3, %xmm4
1429
vpaddd %xmm8, %xmm11, %xmm6
1430
vpaddd %xmm12, %xmm15, %xmm7
1431
vprotd $7, %xmm4, %xmm4
1432
vprotd $7, %xmm6, %xmm6
1433
vprotd $7, %xmm7, %xmm7
1434
vpshufd $0x39, %xmm1, %xmm1
1435
vpshufd $0x39, %xmm9, %xmm9
1436
vpshufd $0x39, %xmm13, %xmm13
1437
vpxor %xmm4, %xmm1, %xmm1
1438
vpxor %xmm6, %xmm9, %xmm9
1439
vpxor %xmm7, %xmm13, %xmm13
1440
1441
vpaddd %xmm1, %xmm0, %xmm4
1442
vpaddd %xmm9, %xmm8, %xmm6
1443
vpaddd %xmm13, %xmm12, %xmm7
1444
vprotd $9, %xmm4, %xmm4
1445
vprotd $9, %xmm6, %xmm6
1446
vprotd $9, %xmm7, %xmm7
1447
vpxor %xmm4, %xmm2, %xmm2
1448
vpxor %xmm6, %xmm10, %xmm10
1449
vpxor %xmm7, %xmm14, %xmm14
1450
1451
vpaddd %xmm2, %xmm1, %xmm4
1452
vpaddd %xmm10, %xmm9, %xmm6
1453
vpaddd %xmm14, %xmm13, %xmm7
1454
vprotd $13, %xmm4, %xmm4
1455
vprotd $13, %xmm6, %xmm6
1456
vprotd $13, %xmm7, %xmm7
1457
vpshufd $0x93, %xmm1, %xmm1
1458
vpshufd $0x93, %xmm9, %xmm9
1459
vpshufd $0x93, %xmm13, %xmm13
1460
vpxor %xmm4, %xmm3, %xmm3
1461
vpxor %xmm6, %xmm11, %xmm11
1462
vpxor %xmm7, %xmm15, %xmm15
1463
1464
vpaddd %xmm3, %xmm2, %xmm4
1465
vpaddd %xmm11, %xmm10, %xmm6
1466
vpaddd %xmm15, %xmm14, %xmm7
1467
vprotd $18, %xmm4, %xmm4
1468
vprotd $18, %xmm6, %xmm6
1469
vprotd $18, %xmm7, %xmm7
1470
vpshufd $0x4e, %xmm2, %xmm2
1471
vpshufd $0x4e, %xmm10, %xmm10
1472
vpshufd $0x4e, %xmm14, %xmm14
1473
vpxor %xmm4, %xmm0, %xmm0
1474
vpxor %xmm6, %xmm8, %xmm8
1475
vpxor %xmm7, %xmm12, %xmm12
1476
vpshufd $0x39, %xmm3, %xmm3
1477
vpshufd $0x39, %xmm11, %xmm11
1478
vpshufd $0x39, %xmm15, %xmm15
1479
.endm
1480
1481
.macro salsa8_core_3way_xop
1482
salsa8_core_3way_xop_doubleround
1483
salsa8_core_3way_xop_doubleround
1484
salsa8_core_3way_xop_doubleround
1485
salsa8_core_3way_xop_doubleround
1486
.endm
1487
1488
.p2align 6
1489
scrypt_core_3way_xop:
1490
scrypt_shuffle %rdi, 0, %rsp, 0
1491
scrypt_shuffle %rdi, 64, %rsp, 64
1492
scrypt_shuffle %rdi, 128, %rsp, 128
1493
scrypt_shuffle %rdi, 192, %rsp, 192
1494
scrypt_shuffle %rdi, 256, %rsp, 256
1495
scrypt_shuffle %rdi, 320, %rsp, 320
1496
1497
movdqa 64(%rsp), %xmm0
1498
movdqa 80(%rsp), %xmm1
1499
movdqa 96(%rsp), %xmm2
1500
movdqa 112(%rsp), %xmm3
1501
movdqa 128+64(%rsp), %xmm8
1502
movdqa 128+80(%rsp), %xmm9
1503
movdqa 128+96(%rsp), %xmm10
1504
movdqa 128+112(%rsp), %xmm11
1505
movdqa 256+64(%rsp), %xmm12
1506
movdqa 256+80(%rsp), %xmm13
1507
movdqa 256+96(%rsp), %xmm14
1508
movdqa 256+112(%rsp), %xmm15
1509
1510
movq %rsi, %rbx
1511
leaq (%r8, %r8, 2), %rax
1512
shlq $7, %rax
1513
addq %rsi, %rax
1514
scrypt_core_3way_xop_loop1:
1515
movdqa %xmm0, 64(%rbx)
1516
movdqa %xmm1, 80(%rbx)
1517
movdqa %xmm2, 96(%rbx)
1518
movdqa %xmm3, 112(%rbx)
1519
pxor 0(%rsp), %xmm0
1520
pxor 16(%rsp), %xmm1
1521
pxor 32(%rsp), %xmm2
1522
pxor 48(%rsp), %xmm3
1523
movdqa %xmm8, 128+64(%rbx)
1524
movdqa %xmm9, 128+80(%rbx)
1525
movdqa %xmm10, 128+96(%rbx)
1526
movdqa %xmm11, 128+112(%rbx)
1527
pxor 128+0(%rsp), %xmm8
1528
pxor 128+16(%rsp), %xmm9
1529
pxor 128+32(%rsp), %xmm10
1530
pxor 128+48(%rsp), %xmm11
1531
movdqa %xmm12, 256+64(%rbx)
1532
movdqa %xmm13, 256+80(%rbx)
1533
movdqa %xmm14, 256+96(%rbx)
1534
movdqa %xmm15, 256+112(%rbx)
1535
pxor 256+0(%rsp), %xmm12
1536
pxor 256+16(%rsp), %xmm13
1537
pxor 256+32(%rsp), %xmm14
1538
pxor 256+48(%rsp), %xmm15
1539
movdqa %xmm0, 0(%rbx)
1540
movdqa %xmm1, 16(%rbx)
1541
movdqa %xmm2, 32(%rbx)
1542
movdqa %xmm3, 48(%rbx)
1543
movdqa %xmm8, 128+0(%rbx)
1544
movdqa %xmm9, 128+16(%rbx)
1545
movdqa %xmm10, 128+32(%rbx)
1546
movdqa %xmm11, 128+48(%rbx)
1547
movdqa %xmm12, 256+0(%rbx)
1548
movdqa %xmm13, 256+16(%rbx)
1549
movdqa %xmm14, 256+32(%rbx)
1550
movdqa %xmm15, 256+48(%rbx)
1551
1552
salsa8_core_3way_xop
1553
paddd 0(%rbx), %xmm0
1554
paddd 16(%rbx), %xmm1
1555
paddd 32(%rbx), %xmm2
1556
paddd 48(%rbx), %xmm3
1557
paddd 128+0(%rbx), %xmm8
1558
paddd 128+16(%rbx), %xmm9
1559
paddd 128+32(%rbx), %xmm10
1560
paddd 128+48(%rbx), %xmm11
1561
paddd 256+0(%rbx), %xmm12
1562
paddd 256+16(%rbx), %xmm13
1563
paddd 256+32(%rbx), %xmm14
1564
paddd 256+48(%rbx), %xmm15
1565
movdqa %xmm0, 0(%rsp)
1566
movdqa %xmm1, 16(%rsp)
1567
movdqa %xmm2, 32(%rsp)
1568
movdqa %xmm3, 48(%rsp)
1569
movdqa %xmm8, 128+0(%rsp)
1570
movdqa %xmm9, 128+16(%rsp)
1571
movdqa %xmm10, 128+32(%rsp)
1572
movdqa %xmm11, 128+48(%rsp)
1573
movdqa %xmm12, 256+0(%rsp)
1574
movdqa %xmm13, 256+16(%rsp)
1575
movdqa %xmm14, 256+32(%rsp)
1576
movdqa %xmm15, 256+48(%rsp)
1577
1578
pxor 64(%rbx), %xmm0
1579
pxor 80(%rbx), %xmm1
1580
pxor 96(%rbx), %xmm2
1581
pxor 112(%rbx), %xmm3
1582
pxor 128+64(%rbx), %xmm8
1583
pxor 128+80(%rbx), %xmm9
1584
pxor 128+96(%rbx), %xmm10
1585
pxor 128+112(%rbx), %xmm11
1586
pxor 256+64(%rbx), %xmm12
1587
pxor 256+80(%rbx), %xmm13
1588
pxor 256+96(%rbx), %xmm14
1589
pxor 256+112(%rbx), %xmm15
1590
movdqa %xmm0, 64(%rsp)
1591
movdqa %xmm1, 80(%rsp)
1592
movdqa %xmm2, 96(%rsp)
1593
movdqa %xmm3, 112(%rsp)
1594
movdqa %xmm8, 128+64(%rsp)
1595
movdqa %xmm9, 128+80(%rsp)
1596
movdqa %xmm10, 128+96(%rsp)
1597
movdqa %xmm11, 128+112(%rsp)
1598
movdqa %xmm12, 256+64(%rsp)
1599
movdqa %xmm13, 256+80(%rsp)
1600
movdqa %xmm14, 256+96(%rsp)
1601
movdqa %xmm15, 256+112(%rsp)
1602
salsa8_core_3way_xop
1603
paddd 64(%rsp), %xmm0
1604
paddd 80(%rsp), %xmm1
1605
paddd 96(%rsp), %xmm2
1606
paddd 112(%rsp), %xmm3
1607
paddd 128+64(%rsp), %xmm8
1608
paddd 128+80(%rsp), %xmm9
1609
paddd 128+96(%rsp), %xmm10
1610
paddd 128+112(%rsp), %xmm11
1611
paddd 256+64(%rsp), %xmm12
1612
paddd 256+80(%rsp), %xmm13
1613
paddd 256+96(%rsp), %xmm14
1614
paddd 256+112(%rsp), %xmm15
1615
1616
addq $3*128, %rbx
1617
cmpq %rax, %rbx
1618
jne scrypt_core_3way_xop_loop1
1619
1620
movdqa %xmm0, 64(%rsp)
1621
movdqa %xmm1, 80(%rsp)
1622
movdqa %xmm2, 96(%rsp)
1623
movdqa %xmm3, 112(%rsp)
1624
movdqa %xmm8, 128+64(%rsp)
1625
movdqa %xmm9, 128+80(%rsp)
1626
movdqa %xmm10, 128+96(%rsp)
1627
movdqa %xmm11, 128+112(%rsp)
1628
movdqa %xmm12, 256+64(%rsp)
1629
movdqa %xmm13, 256+80(%rsp)
1630
movdqa %xmm14, 256+96(%rsp)
1631
movdqa %xmm15, 256+112(%rsp)
1632
1633
movq %r8, %rcx
1634
subq $1, %r8
1635
scrypt_core_3way_xop_loop2:
1636
movd %xmm0, %ebp
1637
movd %xmm8, %ebx
1638
movd %xmm12, %eax
1639
pxor 0(%rsp), %xmm0
1640
pxor 16(%rsp), %xmm1
1641
pxor 32(%rsp), %xmm2
1642
pxor 48(%rsp), %xmm3
1643
pxor 128+0(%rsp), %xmm8
1644
pxor 128+16(%rsp), %xmm9
1645
pxor 128+32(%rsp), %xmm10
1646
pxor 128+48(%rsp), %xmm11
1647
pxor 256+0(%rsp), %xmm12
1648
pxor 256+16(%rsp), %xmm13
1649
pxor 256+32(%rsp), %xmm14
1650
pxor 256+48(%rsp), %xmm15
1651
andl %r8d, %ebp
1652
leaq (%rbp, %rbp, 2), %rbp
1653
shll $7, %ebp
1654
andl %r8d, %ebx
1655
leaq 1(%rbx, %rbx, 2), %rbx
1656
shll $7, %ebx
1657
andl %r8d, %eax
1658
leaq 2(%rax, %rax, 2), %rax
1659
shll $7, %eax
1660
pxor 0(%rsi, %rbp), %xmm0
1661
pxor 16(%rsi, %rbp), %xmm1
1662
pxor 32(%rsi, %rbp), %xmm2
1663
pxor 48(%rsi, %rbp), %xmm3
1664
pxor 0(%rsi, %rbx), %xmm8
1665
pxor 16(%rsi, %rbx), %xmm9
1666
pxor 32(%rsi, %rbx), %xmm10
1667
pxor 48(%rsi, %rbx), %xmm11
1668
pxor 0(%rsi, %rax), %xmm12
1669
pxor 16(%rsi, %rax), %xmm13
1670
pxor 32(%rsi, %rax), %xmm14
1671
pxor 48(%rsi, %rax), %xmm15
1672
1673
movdqa %xmm0, 0(%rsp)
1674
movdqa %xmm1, 16(%rsp)
1675
movdqa %xmm2, 32(%rsp)
1676
movdqa %xmm3, 48(%rsp)
1677
movdqa %xmm8, 128+0(%rsp)
1678
movdqa %xmm9, 128+16(%rsp)
1679
movdqa %xmm10, 128+32(%rsp)
1680
movdqa %xmm11, 128+48(%rsp)
1681
movdqa %xmm12, 256+0(%rsp)
1682
movdqa %xmm13, 256+16(%rsp)
1683
movdqa %xmm14, 256+32(%rsp)
1684
movdqa %xmm15, 256+48(%rsp)
1685
salsa8_core_3way_xop
1686
paddd 0(%rsp), %xmm0
1687
paddd 16(%rsp), %xmm1
1688
paddd 32(%rsp), %xmm2
1689
paddd 48(%rsp), %xmm3
1690
paddd 128+0(%rsp), %xmm8
1691
paddd 128+16(%rsp), %xmm9
1692
paddd 128+32(%rsp), %xmm10
1693
paddd 128+48(%rsp), %xmm11
1694
paddd 256+0(%rsp), %xmm12
1695
paddd 256+16(%rsp), %xmm13
1696
paddd 256+32(%rsp), %xmm14
1697
paddd 256+48(%rsp), %xmm15
1698
movdqa %xmm0, 0(%rsp)
1699
movdqa %xmm1, 16(%rsp)
1700
movdqa %xmm2, 32(%rsp)
1701
movdqa %xmm3, 48(%rsp)
1702
movdqa %xmm8, 128+0(%rsp)
1703
movdqa %xmm9, 128+16(%rsp)
1704
movdqa %xmm10, 128+32(%rsp)
1705
movdqa %xmm11, 128+48(%rsp)
1706
movdqa %xmm12, 256+0(%rsp)
1707
movdqa %xmm13, 256+16(%rsp)
1708
movdqa %xmm14, 256+32(%rsp)
1709
movdqa %xmm15, 256+48(%rsp)
1710
1711
pxor 64(%rsi, %rbp), %xmm0
1712
pxor 80(%rsi, %rbp), %xmm1
1713
pxor 96(%rsi, %rbp), %xmm2
1714
pxor 112(%rsi, %rbp), %xmm3
1715
pxor 64(%rsi, %rbx), %xmm8
1716
pxor 80(%rsi, %rbx), %xmm9
1717
pxor 96(%rsi, %rbx), %xmm10
1718
pxor 112(%rsi, %rbx), %xmm11
1719
pxor 64(%rsi, %rax), %xmm12
1720
pxor 80(%rsi, %rax), %xmm13
1721
pxor 96(%rsi, %rax), %xmm14
1722
pxor 112(%rsi, %rax), %xmm15
1723
pxor 64(%rsp), %xmm0
1724
pxor 80(%rsp), %xmm1
1725
pxor 96(%rsp), %xmm2
1726
pxor 112(%rsp), %xmm3
1727
pxor 128+64(%rsp), %xmm8
1728
pxor 128+80(%rsp), %xmm9
1729
pxor 128+96(%rsp), %xmm10
1730
pxor 128+112(%rsp), %xmm11
1731
pxor 256+64(%rsp), %xmm12
1732
pxor 256+80(%rsp), %xmm13
1733
pxor 256+96(%rsp), %xmm14
1734
pxor 256+112(%rsp), %xmm15
1735
movdqa %xmm0, 64(%rsp)
1736
movdqa %xmm1, 80(%rsp)
1737
movdqa %xmm2, 96(%rsp)
1738
movdqa %xmm3, 112(%rsp)
1739
movdqa %xmm8, 128+64(%rsp)
1740
movdqa %xmm9, 128+80(%rsp)
1741
movdqa %xmm10, 128+96(%rsp)
1742
movdqa %xmm11, 128+112(%rsp)
1743
movdqa %xmm12, 256+64(%rsp)
1744
movdqa %xmm13, 256+80(%rsp)
1745
movdqa %xmm14, 256+96(%rsp)
1746
movdqa %xmm15, 256+112(%rsp)
1747
salsa8_core_3way_xop
1748
paddd 64(%rsp), %xmm0
1749
paddd 80(%rsp), %xmm1
1750
paddd 96(%rsp), %xmm2
1751
paddd 112(%rsp), %xmm3
1752
paddd 128+64(%rsp), %xmm8
1753
paddd 128+80(%rsp), %xmm9
1754
paddd 128+96(%rsp), %xmm10
1755
paddd 128+112(%rsp), %xmm11
1756
paddd 256+64(%rsp), %xmm12
1757
paddd 256+80(%rsp), %xmm13
1758
paddd 256+96(%rsp), %xmm14
1759
paddd 256+112(%rsp), %xmm15
1760
movdqa %xmm0, 64(%rsp)
1761
movdqa %xmm1, 80(%rsp)
1762
movdqa %xmm2, 96(%rsp)
1763
movdqa %xmm3, 112(%rsp)
1764
movdqa %xmm8, 128+64(%rsp)
1765
movdqa %xmm9, 128+80(%rsp)
1766
movdqa %xmm10, 128+96(%rsp)
1767
movdqa %xmm11, 128+112(%rsp)
1768
movdqa %xmm12, 256+64(%rsp)
1769
movdqa %xmm13, 256+80(%rsp)
1770
movdqa %xmm14, 256+96(%rsp)
1771
movdqa %xmm15, 256+112(%rsp)
1772
1773
subq $1, %rcx
1774
ja scrypt_core_3way_xop_loop2
1775
1776
scrypt_shuffle %rsp, 0, %rdi, 0
1777
scrypt_shuffle %rsp, 64, %rdi, 64
1778
scrypt_shuffle %rsp, 128, %rdi, 128
1779
scrypt_shuffle %rsp, 192, %rdi, 192
1780
scrypt_shuffle %rsp, 256, %rdi, 256
1781
scrypt_shuffle %rsp, 320, %rdi, 320
1782
1783
scrypt_core_3way_cleanup
1784
ret
1785
#endif /* USE_XOP */
1786
#endif /* USE_AVX */
1787
1788
.macro salsa8_core_3way_xmm_doubleround
1789
movdqa %xmm1, %xmm4
1790
movdqa %xmm9, %xmm6
1791
movdqa %xmm13, %xmm7
1792
paddd %xmm0, %xmm4
1793
paddd %xmm8, %xmm6
1794
paddd %xmm12, %xmm7
1795
movdqa %xmm4, %xmm5
1796
pslld $7, %xmm4
1797
psrld $25, %xmm5
1798
pxor %xmm4, %xmm3
1799
pxor %xmm5, %xmm3
1800
movdqa %xmm0, %xmm4
1801
movdqa %xmm6, %xmm5
1802
pslld $7, %xmm6
1803
psrld $25, %xmm5
1804
pxor %xmm6, %xmm11
1805
pxor %xmm5, %xmm11
1806
movdqa %xmm8, %xmm6
1807
movdqa %xmm7, %xmm5
1808
pslld $7, %xmm7
1809
psrld $25, %xmm5
1810
pxor %xmm7, %xmm15
1811
pxor %xmm5, %xmm15
1812
movdqa %xmm12, %xmm7
1813
1814
paddd %xmm3, %xmm4
1815
paddd %xmm11, %xmm6
1816
paddd %xmm15, %xmm7
1817
movdqa %xmm4, %xmm5
1818
pslld $9, %xmm4
1819
psrld $23, %xmm5
1820
pxor %xmm4, %xmm2
1821
movdqa %xmm3, %xmm4
1822
pshufd $0x93, %xmm3, %xmm3
1823
pxor %xmm5, %xmm2
1824
movdqa %xmm6, %xmm5
1825
pslld $9, %xmm6
1826
psrld $23, %xmm5
1827
pxor %xmm6, %xmm10
1828
movdqa %xmm11, %xmm6
1829
pshufd $0x93, %xmm11, %xmm11
1830
pxor %xmm5, %xmm10
1831
movdqa %xmm7, %xmm5
1832
pslld $9, %xmm7
1833
psrld $23, %xmm5
1834
pxor %xmm7, %xmm14
1835
movdqa %xmm15, %xmm7
1836
pxor %xmm5, %xmm14
1837
pshufd $0x93, %xmm15, %xmm15
1838
1839
paddd %xmm2, %xmm4
1840
paddd %xmm10, %xmm6
1841
paddd %xmm14, %xmm7
1842
movdqa %xmm4, %xmm5
1843
pslld $13, %xmm4
1844
psrld $19, %xmm5
1845
pxor %xmm4, %xmm1
1846
movdqa %xmm2, %xmm4
1847
pshufd $0x4e, %xmm2, %xmm2
1848
pxor %xmm5, %xmm1
1849
movdqa %xmm6, %xmm5
1850
pslld $13, %xmm6
1851
psrld $19, %xmm5
1852
pxor %xmm6, %xmm9
1853
movdqa %xmm10, %xmm6
1854
pshufd $0x4e, %xmm10, %xmm10
1855
pxor %xmm5, %xmm9
1856
movdqa %xmm7, %xmm5
1857
pslld $13, %xmm7
1858
psrld $19, %xmm5
1859
pxor %xmm7, %xmm13
1860
movdqa %xmm14, %xmm7
1861
pshufd $0x4e, %xmm14, %xmm14
1862
pxor %xmm5, %xmm13
1863
1864
paddd %xmm1, %xmm4
1865
paddd %xmm9, %xmm6
1866
paddd %xmm13, %xmm7
1867
movdqa %xmm4, %xmm5
1868
pslld $18, %xmm4
1869
psrld $14, %xmm5
1870
pxor %xmm4, %xmm0
1871
pshufd $0x39, %xmm1, %xmm1
1872
pxor %xmm5, %xmm0
1873
movdqa %xmm3, %xmm4
1874
movdqa %xmm6, %xmm5
1875
pslld $18, %xmm6
1876
psrld $14, %xmm5
1877
pxor %xmm6, %xmm8
1878
pshufd $0x39, %xmm9, %xmm9
1879
pxor %xmm5, %xmm8
1880
movdqa %xmm11, %xmm6
1881
movdqa %xmm7, %xmm5
1882
pslld $18, %xmm7
1883
psrld $14, %xmm5
1884
pxor %xmm7, %xmm12
1885
movdqa %xmm15, %xmm7
1886
pxor %xmm5, %xmm12
1887
pshufd $0x39, %xmm13, %xmm13
1888
1889
paddd %xmm0, %xmm4
1890
paddd %xmm8, %xmm6
1891
paddd %xmm12, %xmm7
1892
movdqa %xmm4, %xmm5
1893
pslld $7, %xmm4
1894
psrld $25, %xmm5
1895
pxor %xmm4, %xmm1
1896
pxor %xmm5, %xmm1
1897
movdqa %xmm0, %xmm4
1898
movdqa %xmm6, %xmm5
1899
pslld $7, %xmm6
1900
psrld $25, %xmm5
1901
pxor %xmm6, %xmm9
1902
pxor %xmm5, %xmm9
1903
movdqa %xmm8, %xmm6
1904
movdqa %xmm7, %xmm5
1905
pslld $7, %xmm7
1906
psrld $25, %xmm5
1907
pxor %xmm7, %xmm13
1908
pxor %xmm5, %xmm13
1909
movdqa %xmm12, %xmm7
1910
1911
paddd %xmm1, %xmm4
1912
paddd %xmm9, %xmm6
1913
paddd %xmm13, %xmm7
1914
movdqa %xmm4, %xmm5
1915
pslld $9, %xmm4
1916
psrld $23, %xmm5
1917
pxor %xmm4, %xmm2
1918
movdqa %xmm1, %xmm4
1919
pshufd $0x93, %xmm1, %xmm1
1920
pxor %xmm5, %xmm2
1921
movdqa %xmm6, %xmm5
1922
pslld $9, %xmm6
1923
psrld $23, %xmm5
1924
pxor %xmm6, %xmm10
1925
movdqa %xmm9, %xmm6
1926
pshufd $0x93, %xmm9, %xmm9
1927
pxor %xmm5, %xmm10
1928
movdqa %xmm7, %xmm5
1929
pslld $9, %xmm7
1930
psrld $23, %xmm5
1931
pxor %xmm7, %xmm14
1932
movdqa %xmm13, %xmm7
1933
pshufd $0x93, %xmm13, %xmm13
1934
pxor %xmm5, %xmm14
1935
1936
paddd %xmm2, %xmm4
1937
paddd %xmm10, %xmm6
1938
paddd %xmm14, %xmm7
1939
movdqa %xmm4, %xmm5
1940
pslld $13, %xmm4
1941
psrld $19, %xmm5
1942
pxor %xmm4, %xmm3
1943
movdqa %xmm2, %xmm4
1944
pshufd $0x4e, %xmm2, %xmm2
1945
pxor %xmm5, %xmm3
1946
movdqa %xmm6, %xmm5
1947
pslld $13, %xmm6
1948
psrld $19, %xmm5
1949
pxor %xmm6, %xmm11
1950
movdqa %xmm10, %xmm6
1951
pshufd $0x4e, %xmm10, %xmm10
1952
pxor %xmm5, %xmm11
1953
movdqa %xmm7, %xmm5
1954
pslld $13, %xmm7
1955
psrld $19, %xmm5
1956
pxor %xmm7, %xmm15
1957
movdqa %xmm14, %xmm7
1958
pshufd $0x4e, %xmm14, %xmm14
1959
pxor %xmm5, %xmm15
1960
1961
paddd %xmm3, %xmm4
1962
paddd %xmm11, %xmm6
1963
paddd %xmm15, %xmm7
1964
movdqa %xmm4, %xmm5
1965
pslld $18, %xmm4
1966
psrld $14, %xmm5
1967
pxor %xmm4, %xmm0
1968
pshufd $0x39, %xmm3, %xmm3
1969
pxor %xmm5, %xmm0
1970
movdqa %xmm6, %xmm5
1971
pslld $18, %xmm6
1972
psrld $14, %xmm5
1973
pxor %xmm6, %xmm8
1974
pshufd $0x39, %xmm11, %xmm11
1975
pxor %xmm5, %xmm8
1976
movdqa %xmm7, %xmm5
1977
pslld $18, %xmm7
1978
psrld $14, %xmm5
1979
pxor %xmm7, %xmm12
1980
pshufd $0x39, %xmm15, %xmm15
1981
pxor %xmm5, %xmm12
1982
.endm
1983
1984
.macro salsa8_core_3way_xmm
1985
salsa8_core_3way_xmm_doubleround
1986
salsa8_core_3way_xmm_doubleround
1987
salsa8_core_3way_xmm_doubleround
1988
salsa8_core_3way_xmm_doubleround
1989
.endm
1990
1991
.p2align 6
1992
scrypt_core_3way_xmm:
1993
scrypt_shuffle %rdi, 0, %rsp, 0
1994
scrypt_shuffle %rdi, 64, %rsp, 64
1995
scrypt_shuffle %rdi, 128, %rsp, 128
1996
scrypt_shuffle %rdi, 192, %rsp, 192
1997
scrypt_shuffle %rdi, 256, %rsp, 256
1998
scrypt_shuffle %rdi, 320, %rsp, 320
1999
2000
movdqa 64(%rsp), %xmm0
2001
movdqa 80(%rsp), %xmm1
2002
movdqa 96(%rsp), %xmm2
2003
movdqa 112(%rsp), %xmm3
2004
movdqa 128+64(%rsp), %xmm8
2005
movdqa 128+80(%rsp), %xmm9
2006
movdqa 128+96(%rsp), %xmm10
2007
movdqa 128+112(%rsp), %xmm11
2008
movdqa 256+64(%rsp), %xmm12
2009
movdqa 256+80(%rsp), %xmm13
2010
movdqa 256+96(%rsp), %xmm14
2011
movdqa 256+112(%rsp), %xmm15
2012
2013
movq %rsi, %rbx
2014
leaq (%r8, %r8, 2), %rax
2015
shlq $7, %rax
2016
addq %rsi, %rax
2017
scrypt_core_3way_xmm_loop1:
2018
movdqa %xmm0, 64(%rbx)
2019
movdqa %xmm1, 80(%rbx)
2020
movdqa %xmm2, 96(%rbx)
2021
movdqa %xmm3, 112(%rbx)
2022
pxor 0(%rsp), %xmm0
2023
pxor 16(%rsp), %xmm1
2024
pxor 32(%rsp), %xmm2
2025
pxor 48(%rsp), %xmm3
2026
movdqa %xmm8, 128+64(%rbx)
2027
movdqa %xmm9, 128+80(%rbx)
2028
movdqa %xmm10, 128+96(%rbx)
2029
movdqa %xmm11, 128+112(%rbx)
2030
pxor 128+0(%rsp), %xmm8
2031
pxor 128+16(%rsp), %xmm9
2032
pxor 128+32(%rsp), %xmm10
2033
pxor 128+48(%rsp), %xmm11
2034
movdqa %xmm12, 256+64(%rbx)
2035
movdqa %xmm13, 256+80(%rbx)
2036
movdqa %xmm14, 256+96(%rbx)
2037
movdqa %xmm15, 256+112(%rbx)
2038
pxor 256+0(%rsp), %xmm12
2039
pxor 256+16(%rsp), %xmm13
2040
pxor 256+32(%rsp), %xmm14
2041
pxor 256+48(%rsp), %xmm15
2042
movdqa %xmm0, 0(%rbx)
2043
movdqa %xmm1, 16(%rbx)
2044
movdqa %xmm2, 32(%rbx)
2045
movdqa %xmm3, 48(%rbx)
2046
movdqa %xmm8, 128+0(%rbx)
2047
movdqa %xmm9, 128+16(%rbx)
2048
movdqa %xmm10, 128+32(%rbx)
2049
movdqa %xmm11, 128+48(%rbx)
2050
movdqa %xmm12, 256+0(%rbx)
2051
movdqa %xmm13, 256+16(%rbx)
2052
movdqa %xmm14, 256+32(%rbx)
2053
movdqa %xmm15, 256+48(%rbx)
2054
2055
salsa8_core_3way_xmm
2056
paddd 0(%rbx), %xmm0
2057
paddd 16(%rbx), %xmm1
2058
paddd 32(%rbx), %xmm2
2059
paddd 48(%rbx), %xmm3
2060
paddd 128+0(%rbx), %xmm8
2061
paddd 128+16(%rbx), %xmm9
2062
paddd 128+32(%rbx), %xmm10
2063
paddd 128+48(%rbx), %xmm11
2064
paddd 256+0(%rbx), %xmm12
2065
paddd 256+16(%rbx), %xmm13
2066
paddd 256+32(%rbx), %xmm14
2067
paddd 256+48(%rbx), %xmm15
2068
movdqa %xmm0, 0(%rsp)
2069
movdqa %xmm1, 16(%rsp)
2070
movdqa %xmm2, 32(%rsp)
2071
movdqa %xmm3, 48(%rsp)
2072
movdqa %xmm8, 128+0(%rsp)
2073
movdqa %xmm9, 128+16(%rsp)
2074
movdqa %xmm10, 128+32(%rsp)
2075
movdqa %xmm11, 128+48(%rsp)
2076
movdqa %xmm12, 256+0(%rsp)
2077
movdqa %xmm13, 256+16(%rsp)
2078
movdqa %xmm14, 256+32(%rsp)
2079
movdqa %xmm15, 256+48(%rsp)
2080
2081
pxor 64(%rbx), %xmm0
2082
pxor 80(%rbx), %xmm1
2083
pxor 96(%rbx), %xmm2
2084
pxor 112(%rbx), %xmm3
2085
pxor 128+64(%rbx), %xmm8
2086
pxor 128+80(%rbx), %xmm9
2087
pxor 128+96(%rbx), %xmm10
2088
pxor 128+112(%rbx), %xmm11
2089
pxor 256+64(%rbx), %xmm12
2090
pxor 256+80(%rbx), %xmm13
2091
pxor 256+96(%rbx), %xmm14
2092
pxor 256+112(%rbx), %xmm15
2093
movdqa %xmm0, 64(%rsp)
2094
movdqa %xmm1, 80(%rsp)
2095
movdqa %xmm2, 96(%rsp)
2096
movdqa %xmm3, 112(%rsp)
2097
movdqa %xmm8, 128+64(%rsp)
2098
movdqa %xmm9, 128+80(%rsp)
2099
movdqa %xmm10, 128+96(%rsp)
2100
movdqa %xmm11, 128+112(%rsp)
2101
movdqa %xmm12, 256+64(%rsp)
2102
movdqa %xmm13, 256+80(%rsp)
2103
movdqa %xmm14, 256+96(%rsp)
2104
movdqa %xmm15, 256+112(%rsp)
2105
salsa8_core_3way_xmm
2106
paddd 64(%rsp), %xmm0
2107
paddd 80(%rsp), %xmm1
2108
paddd 96(%rsp), %xmm2
2109
paddd 112(%rsp), %xmm3
2110
paddd 128+64(%rsp), %xmm8
2111
paddd 128+80(%rsp), %xmm9
2112
paddd 128+96(%rsp), %xmm10
2113
paddd 128+112(%rsp), %xmm11
2114
paddd 256+64(%rsp), %xmm12
2115
paddd 256+80(%rsp), %xmm13
2116
paddd 256+96(%rsp), %xmm14
2117
paddd 256+112(%rsp), %xmm15
2118
2119
addq $3*128, %rbx
2120
cmpq %rax, %rbx
2121
jne scrypt_core_3way_xmm_loop1
2122
2123
movdqa %xmm0, 64(%rsp)
2124
movdqa %xmm1, 80(%rsp)
2125
movdqa %xmm2, 96(%rsp)
2126
movdqa %xmm3, 112(%rsp)
2127
movdqa %xmm8, 128+64(%rsp)
2128
movdqa %xmm9, 128+80(%rsp)
2129
movdqa %xmm10, 128+96(%rsp)
2130
movdqa %xmm11, 128+112(%rsp)
2131
movdqa %xmm12, 256+64(%rsp)
2132
movdqa %xmm13, 256+80(%rsp)
2133
movdqa %xmm14, 256+96(%rsp)
2134
movdqa %xmm15, 256+112(%rsp)
2135
2136
movq %r8, %rcx
2137
subq $1, %r8
2138
scrypt_core_3way_xmm_loop2:
2139
movd %xmm0, %ebp
2140
movd %xmm8, %ebx
2141
movd %xmm12, %eax
2142
pxor 0(%rsp), %xmm0
2143
pxor 16(%rsp), %xmm1
2144
pxor 32(%rsp), %xmm2
2145
pxor 48(%rsp), %xmm3
2146
pxor 128+0(%rsp), %xmm8
2147
pxor 128+16(%rsp), %xmm9
2148
pxor 128+32(%rsp), %xmm10
2149
pxor 128+48(%rsp), %xmm11
2150
pxor 256+0(%rsp), %xmm12
2151
pxor 256+16(%rsp), %xmm13
2152
pxor 256+32(%rsp), %xmm14
2153
pxor 256+48(%rsp), %xmm15
2154
andl %r8d, %ebp
2155
leaq (%rbp, %rbp, 2), %rbp
2156
shll $7, %ebp
2157
andl %r8d, %ebx
2158
leaq 1(%rbx, %rbx, 2), %rbx
2159
shll $7, %ebx
2160
andl %r8d, %eax
2161
leaq 2(%rax, %rax, 2), %rax
2162
shll $7, %eax
2163
pxor 0(%rsi, %rbp), %xmm0
2164
pxor 16(%rsi, %rbp), %xmm1
2165
pxor 32(%rsi, %rbp), %xmm2
2166
pxor 48(%rsi, %rbp), %xmm3
2167
pxor 0(%rsi, %rbx), %xmm8
2168
pxor 16(%rsi, %rbx), %xmm9
2169
pxor 32(%rsi, %rbx), %xmm10
2170
pxor 48(%rsi, %rbx), %xmm11
2171
pxor 0(%rsi, %rax), %xmm12
2172
pxor 16(%rsi, %rax), %xmm13
2173
pxor 32(%rsi, %rax), %xmm14
2174
pxor 48(%rsi, %rax), %xmm15
2175
2176
movdqa %xmm0, 0(%rsp)
2177
movdqa %xmm1, 16(%rsp)
2178
movdqa %xmm2, 32(%rsp)
2179
movdqa %xmm3, 48(%rsp)
2180
movdqa %xmm8, 128+0(%rsp)
2181
movdqa %xmm9, 128+16(%rsp)
2182
movdqa %xmm10, 128+32(%rsp)
2183
movdqa %xmm11, 128+48(%rsp)
2184
movdqa %xmm12, 256+0(%rsp)
2185
movdqa %xmm13, 256+16(%rsp)
2186
movdqa %xmm14, 256+32(%rsp)
2187
movdqa %xmm15, 256+48(%rsp)
2188
salsa8_core_3way_xmm
2189
paddd 0(%rsp), %xmm0
2190
paddd 16(%rsp), %xmm1
2191
paddd 32(%rsp), %xmm2
2192
paddd 48(%rsp), %xmm3
2193
paddd 128+0(%rsp), %xmm8
2194
paddd 128+16(%rsp), %xmm9
2195
paddd 128+32(%rsp), %xmm10
2196
paddd 128+48(%rsp), %xmm11
2197
paddd 256+0(%rsp), %xmm12
2198
paddd 256+16(%rsp), %xmm13
2199
paddd 256+32(%rsp), %xmm14
2200
paddd 256+48(%rsp), %xmm15
2201
movdqa %xmm0, 0(%rsp)
2202
movdqa %xmm1, 16(%rsp)
2203
movdqa %xmm2, 32(%rsp)
2204
movdqa %xmm3, 48(%rsp)
2205
movdqa %xmm8, 128+0(%rsp)
2206
movdqa %xmm9, 128+16(%rsp)
2207
movdqa %xmm10, 128+32(%rsp)
2208
movdqa %xmm11, 128+48(%rsp)
2209
movdqa %xmm12, 256+0(%rsp)
2210
movdqa %xmm13, 256+16(%rsp)
2211
movdqa %xmm14, 256+32(%rsp)
2212
movdqa %xmm15, 256+48(%rsp)
2213
2214
pxor 64(%rsi, %rbp), %xmm0
2215
pxor 80(%rsi, %rbp), %xmm1
2216
pxor 96(%rsi, %rbp), %xmm2
2217
pxor 112(%rsi, %rbp), %xmm3
2218
pxor 64(%rsi, %rbx), %xmm8
2219
pxor 80(%rsi, %rbx), %xmm9
2220
pxor 96(%rsi, %rbx), %xmm10
2221
pxor 112(%rsi, %rbx), %xmm11
2222
pxor 64(%rsi, %rax), %xmm12
2223
pxor 80(%rsi, %rax), %xmm13
2224
pxor 96(%rsi, %rax), %xmm14
2225
pxor 112(%rsi, %rax), %xmm15
2226
pxor 64(%rsp), %xmm0
2227
pxor 80(%rsp), %xmm1
2228
pxor 96(%rsp), %xmm2
2229
pxor 112(%rsp), %xmm3
2230
pxor 128+64(%rsp), %xmm8
2231
pxor 128+80(%rsp), %xmm9
2232
pxor 128+96(%rsp), %xmm10
2233
pxor 128+112(%rsp), %xmm11
2234
pxor 256+64(%rsp), %xmm12
2235
pxor 256+80(%rsp), %xmm13
2236
pxor 256+96(%rsp), %xmm14
2237
pxor 256+112(%rsp), %xmm15
2238
movdqa %xmm0, 64(%rsp)
2239
movdqa %xmm1, 80(%rsp)
2240
movdqa %xmm2, 96(%rsp)
2241
movdqa %xmm3, 112(%rsp)
2242
movdqa %xmm8, 128+64(%rsp)
2243
movdqa %xmm9, 128+80(%rsp)
2244
movdqa %xmm10, 128+96(%rsp)
2245
movdqa %xmm11, 128+112(%rsp)
2246
movdqa %xmm12, 256+64(%rsp)
2247
movdqa %xmm13, 256+80(%rsp)
2248
movdqa %xmm14, 256+96(%rsp)
2249
movdqa %xmm15, 256+112(%rsp)
2250
salsa8_core_3way_xmm
2251
paddd 64(%rsp), %xmm0
2252
paddd 80(%rsp), %xmm1
2253
paddd 96(%rsp), %xmm2
2254
paddd 112(%rsp), %xmm3
2255
paddd 128+64(%rsp), %xmm8
2256
paddd 128+80(%rsp), %xmm9
2257
paddd 128+96(%rsp), %xmm10
2258
paddd 128+112(%rsp), %xmm11
2259
paddd 256+64(%rsp), %xmm12
2260
paddd 256+80(%rsp), %xmm13
2261
paddd 256+96(%rsp), %xmm14
2262
paddd 256+112(%rsp), %xmm15
2263
movdqa %xmm0, 64(%rsp)
2264
movdqa %xmm1, 80(%rsp)
2265
movdqa %xmm2, 96(%rsp)
2266
movdqa %xmm3, 112(%rsp)
2267
movdqa %xmm8, 128+64(%rsp)
2268
movdqa %xmm9, 128+80(%rsp)
2269
movdqa %xmm10, 128+96(%rsp)
2270
movdqa %xmm11, 128+112(%rsp)
2271
movdqa %xmm12, 256+64(%rsp)
2272
movdqa %xmm13, 256+80(%rsp)
2273
movdqa %xmm14, 256+96(%rsp)
2274
movdqa %xmm15, 256+112(%rsp)
2275
2276
subq $1, %rcx
2277
ja scrypt_core_3way_xmm_loop2
2278
2279
scrypt_shuffle %rsp, 0, %rdi, 0
2280
scrypt_shuffle %rsp, 64, %rdi, 64
2281
scrypt_shuffle %rsp, 128, %rdi, 128
2282
scrypt_shuffle %rsp, 192, %rdi, 192
2283
scrypt_shuffle %rsp, 256, %rdi, 256
2284
scrypt_shuffle %rsp, 320, %rdi, 320
2285
2286
scrypt_core_3way_cleanup
2287
ret
2288
2289
2290
#if defined(USE_AVX2)
2291
2292
.macro salsa8_core_6way_avx2_doubleround
2293
vpaddd %ymm0, %ymm1, %ymm4
2294
vpaddd %ymm8, %ymm9, %ymm6
2295
vpaddd %ymm12, %ymm13, %ymm7
2296
vpslld $7, %ymm4, %ymm5
2297
vpsrld $25, %ymm4, %ymm4
2298
vpxor %ymm5, %ymm3, %ymm3
2299
vpxor %ymm4, %ymm3, %ymm3
2300
vpslld $7, %ymm6, %ymm5
2301
vpsrld $25, %ymm6, %ymm6
2302
vpxor %ymm5, %ymm11, %ymm11
2303
vpxor %ymm6, %ymm11, %ymm11
2304
vpslld $7, %ymm7, %ymm5
2305
vpsrld $25, %ymm7, %ymm7
2306
vpxor %ymm5, %ymm15, %ymm15
2307
vpxor %ymm7, %ymm15, %ymm15
2308
2309
vpaddd %ymm3, %ymm0, %ymm4
2310
vpaddd %ymm11, %ymm8, %ymm6
2311
vpaddd %ymm15, %ymm12, %ymm7
2312
vpslld $9, %ymm4, %ymm5
2313
vpsrld $23, %ymm4, %ymm4
2314
vpxor %ymm5, %ymm2, %ymm2
2315
vpxor %ymm4, %ymm2, %ymm2
2316
vpslld $9, %ymm6, %ymm5
2317
vpsrld $23, %ymm6, %ymm6
2318
vpxor %ymm5, %ymm10, %ymm10
2319
vpxor %ymm6, %ymm10, %ymm10
2320
vpslld $9, %ymm7, %ymm5
2321
vpsrld $23, %ymm7, %ymm7
2322
vpxor %ymm5, %ymm14, %ymm14
2323
vpxor %ymm7, %ymm14, %ymm14
2324
2325
vpaddd %ymm2, %ymm3, %ymm4
2326
vpaddd %ymm10, %ymm11, %ymm6
2327
vpaddd %ymm14, %ymm15, %ymm7
2328
vpslld $13, %ymm4, %ymm5
2329
vpsrld $19, %ymm4, %ymm4
2330
vpshufd $0x93, %ymm3, %ymm3
2331
vpshufd $0x93, %ymm11, %ymm11
2332
vpshufd $0x93, %ymm15, %ymm15
2333
vpxor %ymm5, %ymm1, %ymm1
2334
vpxor %ymm4, %ymm1, %ymm1
2335
vpslld $13, %ymm6, %ymm5
2336
vpsrld $19, %ymm6, %ymm6
2337
vpxor %ymm5, %ymm9, %ymm9
2338
vpxor %ymm6, %ymm9, %ymm9
2339
vpslld $13, %ymm7, %ymm5
2340
vpsrld $19, %ymm7, %ymm7
2341
vpxor %ymm5, %ymm13, %ymm13
2342
vpxor %ymm7, %ymm13, %ymm13
2343
2344
vpaddd %ymm1, %ymm2, %ymm4
2345
vpaddd %ymm9, %ymm10, %ymm6
2346
vpaddd %ymm13, %ymm14, %ymm7
2347
vpslld $18, %ymm4, %ymm5
2348
vpsrld $14, %ymm4, %ymm4
2349
vpshufd $0x4e, %ymm2, %ymm2
2350
vpshufd $0x4e, %ymm10, %ymm10
2351
vpshufd $0x4e, %ymm14, %ymm14
2352
vpxor %ymm5, %ymm0, %ymm0
2353
vpxor %ymm4, %ymm0, %ymm0
2354
vpslld $18, %ymm6, %ymm5
2355
vpsrld $14, %ymm6, %ymm6
2356
vpxor %ymm5, %ymm8, %ymm8
2357
vpxor %ymm6, %ymm8, %ymm8
2358
vpslld $18, %ymm7, %ymm5
2359
vpsrld $14, %ymm7, %ymm7
2360
vpxor %ymm5, %ymm12, %ymm12
2361
vpxor %ymm7, %ymm12, %ymm12
2362
2363
vpaddd %ymm0, %ymm3, %ymm4
2364
vpaddd %ymm8, %ymm11, %ymm6
2365
vpaddd %ymm12, %ymm15, %ymm7
2366
vpslld $7, %ymm4, %ymm5
2367
vpsrld $25, %ymm4, %ymm4
2368
vpshufd $0x39, %ymm1, %ymm1
2369
vpxor %ymm5, %ymm1, %ymm1
2370
vpxor %ymm4, %ymm1, %ymm1
2371
vpslld $7, %ymm6, %ymm5
2372
vpsrld $25, %ymm6, %ymm6
2373
vpshufd $0x39, %ymm9, %ymm9
2374
vpxor %ymm5, %ymm9, %ymm9
2375
vpxor %ymm6, %ymm9, %ymm9
2376
vpslld $7, %ymm7, %ymm5
2377
vpsrld $25, %ymm7, %ymm7
2378
vpshufd $0x39, %ymm13, %ymm13
2379
vpxor %ymm5, %ymm13, %ymm13
2380
vpxor %ymm7, %ymm13, %ymm13
2381
2382
vpaddd %ymm1, %ymm0, %ymm4
2383
vpaddd %ymm9, %ymm8, %ymm6
2384
vpaddd %ymm13, %ymm12, %ymm7
2385
vpslld $9, %ymm4, %ymm5
2386
vpsrld $23, %ymm4, %ymm4
2387
vpxor %ymm5, %ymm2, %ymm2
2388
vpxor %ymm4, %ymm2, %ymm2
2389
vpslld $9, %ymm6, %ymm5
2390
vpsrld $23, %ymm6, %ymm6
2391
vpxor %ymm5, %ymm10, %ymm10
2392
vpxor %ymm6, %ymm10, %ymm10
2393
vpslld $9, %ymm7, %ymm5
2394
vpsrld $23, %ymm7, %ymm7
2395
vpxor %ymm5, %ymm14, %ymm14
2396
vpxor %ymm7, %ymm14, %ymm14
2397
2398
vpaddd %ymm2, %ymm1, %ymm4
2399
vpaddd %ymm10, %ymm9, %ymm6
2400
vpaddd %ymm14, %ymm13, %ymm7
2401
vpslld $13, %ymm4, %ymm5
2402
vpsrld $19, %ymm4, %ymm4
2403
vpshufd $0x93, %ymm1, %ymm1
2404
vpshufd $0x93, %ymm9, %ymm9
2405
vpshufd $0x93, %ymm13, %ymm13
2406
vpxor %ymm5, %ymm3, %ymm3
2407
vpxor %ymm4, %ymm3, %ymm3
2408
vpslld $13, %ymm6, %ymm5
2409
vpsrld $19, %ymm6, %ymm6
2410
vpxor %ymm5, %ymm11, %ymm11
2411
vpxor %ymm6, %ymm11, %ymm11
2412
vpslld $13, %ymm7, %ymm5
2413
vpsrld $19, %ymm7, %ymm7
2414
vpxor %ymm5, %ymm15, %ymm15
2415
vpxor %ymm7, %ymm15, %ymm15
2416
2417
vpaddd %ymm3, %ymm2, %ymm4
2418
vpaddd %ymm11, %ymm10, %ymm6
2419
vpaddd %ymm15, %ymm14, %ymm7
2420
vpslld $18, %ymm4, %ymm5
2421
vpsrld $14, %ymm4, %ymm4
2422
vpshufd $0x4e, %ymm2, %ymm2
2423
vpshufd $0x4e, %ymm10, %ymm10
2424
vpxor %ymm5, %ymm0, %ymm0
2425
vpxor %ymm4, %ymm0, %ymm0
2426
vpslld $18, %ymm6, %ymm5
2427
vpsrld $14, %ymm6, %ymm6
2428
vpshufd $0x4e, %ymm14, %ymm14
2429
vpshufd $0x39, %ymm11, %ymm11
2430
vpxor %ymm5, %ymm8, %ymm8
2431
vpxor %ymm6, %ymm8, %ymm8
2432
vpslld $18, %ymm7, %ymm5
2433
vpsrld $14, %ymm7, %ymm7
2434
vpshufd $0x39, %ymm3, %ymm3
2435
vpshufd $0x39, %ymm15, %ymm15
2436
vpxor %ymm5, %ymm12, %ymm12
2437
vpxor %ymm7, %ymm12, %ymm12
2438
.endm
2439
2440
.macro salsa8_core_6way_avx2
2441
salsa8_core_6way_avx2_doubleround
2442
salsa8_core_6way_avx2_doubleround
2443
salsa8_core_6way_avx2_doubleround
2444
salsa8_core_6way_avx2_doubleround
2445
.endm
2446
2447
.text
2448
.p2align 6
2449
.globl scrypt_core_6way
2450
.globl _scrypt_core_6way
2451
scrypt_core_6way:
2452
_scrypt_core_6way:
2453
pushq %rbx
2454
pushq %rbp
2455
#if defined(_WIN64) || defined(__CYGWIN__)
2456
subq $176, %rsp
2457
vmovdqa %xmm6, 8(%rsp)
2458
vmovdqa %xmm7, 24(%rsp)
2459
vmovdqa %xmm8, 40(%rsp)
2460
vmovdqa %xmm9, 56(%rsp)
2461
vmovdqa %xmm10, 72(%rsp)
2462
vmovdqa %xmm11, 88(%rsp)
2463
vmovdqa %xmm12, 104(%rsp)
2464
vmovdqa %xmm13, 120(%rsp)
2465
vmovdqa %xmm14, 136(%rsp)
2466
vmovdqa %xmm15, 152(%rsp)
2467
pushq %rdi
2468
pushq %rsi
2469
movq %rcx, %rdi
2470
movq %rdx, %rsi
2471
#else
2472
movq %rdx, %r8
2473
#endif
2474
movq %rsp, %rdx
2475
subq $768, %rsp
2476
andq $-128, %rsp
2477
2478
.macro scrypt_core_6way_cleanup
2479
movq %rdx, %rsp
2480
#if defined(_WIN64) || defined(__CYGWIN__)
2481
popq %rsi
2482
popq %rdi
2483
vmovdqa 8(%rsp), %xmm6
2484
vmovdqa 24(%rsp), %xmm7
2485
vmovdqa 40(%rsp), %xmm8
2486
vmovdqa 56(%rsp), %xmm9
2487
vmovdqa 72(%rsp), %xmm10
2488
vmovdqa 88(%rsp), %xmm11
2489
vmovdqa 104(%rsp), %xmm12
2490
vmovdqa 120(%rsp), %xmm13
2491
vmovdqa 136(%rsp), %xmm14
2492
vmovdqa 152(%rsp), %xmm15
2493
addq $176, %rsp
2494
#endif
2495
popq %rbp
2496
popq %rbx
2497
.endm
2498
2499
.macro scrypt_shuffle_pack2 src, so, dest, do
2500
vmovdqa \so+0*16(\src), %xmm0
2501
vmovdqa \so+1*16(\src), %xmm1
2502
vmovdqa \so+2*16(\src), %xmm2
2503
vmovdqa \so+3*16(\src), %xmm3
2504
vinserti128 $1, \so+128+0*16(\src), %ymm0, %ymm0
2505
vinserti128 $1, \so+128+1*16(\src), %ymm1, %ymm1
2506
vinserti128 $1, \so+128+2*16(\src), %ymm2, %ymm2
2507
vinserti128 $1, \so+128+3*16(\src), %ymm3, %ymm3
2508
vpblendd $0x33, %ymm0, %ymm2, %ymm4
2509
vpblendd $0xcc, %ymm1, %ymm3, %ymm5
2510
vpblendd $0x33, %ymm2, %ymm0, %ymm6
2511
vpblendd $0xcc, %ymm3, %ymm1, %ymm7
2512
vpblendd $0x55, %ymm7, %ymm6, %ymm3
2513
vpblendd $0x55, %ymm6, %ymm5, %ymm2
2514
vpblendd $0x55, %ymm5, %ymm4, %ymm1
2515
vpblendd $0x55, %ymm4, %ymm7, %ymm0
2516
vmovdqa %ymm0, \do+0*32(\dest)
2517
vmovdqa %ymm1, \do+1*32(\dest)
2518
vmovdqa %ymm2, \do+2*32(\dest)
2519
vmovdqa %ymm3, \do+3*32(\dest)
2520
.endm
2521
2522
.macro scrypt_shuffle_unpack2 src, so, dest, do
2523
vmovdqa \so+0*32(\src), %ymm0
2524
vmovdqa \so+1*32(\src), %ymm1
2525
vmovdqa \so+2*32(\src), %ymm2
2526
vmovdqa \so+3*32(\src), %ymm3
2527
vpblendd $0x33, %ymm0, %ymm2, %ymm4
2528
vpblendd $0xcc, %ymm1, %ymm3, %ymm5
2529
vpblendd $0x33, %ymm2, %ymm0, %ymm6
2530
vpblendd $0xcc, %ymm3, %ymm1, %ymm7
2531
vpblendd $0x55, %ymm7, %ymm6, %ymm3
2532
vpblendd $0x55, %ymm6, %ymm5, %ymm2
2533
vpblendd $0x55, %ymm5, %ymm4, %ymm1
2534
vpblendd $0x55, %ymm4, %ymm7, %ymm0
2535
vmovdqa %xmm0, \do+0*16(\dest)
2536
vmovdqa %xmm1, \do+1*16(\dest)
2537
vmovdqa %xmm2, \do+2*16(\dest)
2538
vmovdqa %xmm3, \do+3*16(\dest)
2539
vextracti128 $1, %ymm0, \do+128+0*16(\dest)
2540
vextracti128 $1, %ymm1, \do+128+1*16(\dest)
2541
vextracti128 $1, %ymm2, \do+128+2*16(\dest)
2542
vextracti128 $1, %ymm3, \do+128+3*16(\dest)
2543
.endm
2544
2545
scrypt_core_6way_avx2:
2546
scrypt_shuffle_pack2 %rdi, 0*256+0, %rsp, 0*128
2547
scrypt_shuffle_pack2 %rdi, 0*256+64, %rsp, 1*128
2548
scrypt_shuffle_pack2 %rdi, 1*256+0, %rsp, 2*128
2549
scrypt_shuffle_pack2 %rdi, 1*256+64, %rsp, 3*128
2550
scrypt_shuffle_pack2 %rdi, 2*256+0, %rsp, 4*128
2551
scrypt_shuffle_pack2 %rdi, 2*256+64, %rsp, 5*128
2552
2553
vmovdqa 0*256+4*32(%rsp), %ymm0
2554
vmovdqa 0*256+5*32(%rsp), %ymm1
2555
vmovdqa 0*256+6*32(%rsp), %ymm2
2556
vmovdqa 0*256+7*32(%rsp), %ymm3
2557
vmovdqa 1*256+4*32(%rsp), %ymm8
2558
vmovdqa 1*256+5*32(%rsp), %ymm9
2559
vmovdqa 1*256+6*32(%rsp), %ymm10
2560
vmovdqa 1*256+7*32(%rsp), %ymm11
2561
vmovdqa 2*256+4*32(%rsp), %ymm12
2562
vmovdqa 2*256+5*32(%rsp), %ymm13
2563
vmovdqa 2*256+6*32(%rsp), %ymm14
2564
vmovdqa 2*256+7*32(%rsp), %ymm15
2565
2566
movq %rsi, %rbx
2567
leaq (%r8, %r8, 2), %rax
2568
shlq $8, %rax
2569
addq %rsi, %rax
2570
scrypt_core_6way_avx2_loop1:
2571
vmovdqa %ymm0, 0*256+4*32(%rbx)
2572
vmovdqa %ymm1, 0*256+5*32(%rbx)
2573
vmovdqa %ymm2, 0*256+6*32(%rbx)
2574
vmovdqa %ymm3, 0*256+7*32(%rbx)
2575
vpxor 0*256+0*32(%rsp), %ymm0, %ymm0
2576
vpxor 0*256+1*32(%rsp), %ymm1, %ymm1
2577
vpxor 0*256+2*32(%rsp), %ymm2, %ymm2
2578
vpxor 0*256+3*32(%rsp), %ymm3, %ymm3
2579
vmovdqa %ymm8, 1*256+4*32(%rbx)
2580
vmovdqa %ymm9, 1*256+5*32(%rbx)
2581
vmovdqa %ymm10, 1*256+6*32(%rbx)
2582
vmovdqa %ymm11, 1*256+7*32(%rbx)
2583
vpxor 1*256+0*32(%rsp), %ymm8, %ymm8
2584
vpxor 1*256+1*32(%rsp), %ymm9, %ymm9
2585
vpxor 1*256+2*32(%rsp), %ymm10, %ymm10
2586
vpxor 1*256+3*32(%rsp), %ymm11, %ymm11
2587
vmovdqa %ymm12, 2*256+4*32(%rbx)
2588
vmovdqa %ymm13, 2*256+5*32(%rbx)
2589
vmovdqa %ymm14, 2*256+6*32(%rbx)
2590
vmovdqa %ymm15, 2*256+7*32(%rbx)
2591
vpxor 2*256+0*32(%rsp), %ymm12, %ymm12
2592
vpxor 2*256+1*32(%rsp), %ymm13, %ymm13
2593
vpxor 2*256+2*32(%rsp), %ymm14, %ymm14
2594
vpxor 2*256+3*32(%rsp), %ymm15, %ymm15
2595
vmovdqa %ymm0, 0*256+0*32(%rbx)
2596
vmovdqa %ymm1, 0*256+1*32(%rbx)
2597
vmovdqa %ymm2, 0*256+2*32(%rbx)
2598
vmovdqa %ymm3, 0*256+3*32(%rbx)
2599
vmovdqa %ymm8, 1*256+0*32(%rbx)
2600
vmovdqa %ymm9, 1*256+1*32(%rbx)
2601
vmovdqa %ymm10, 1*256+2*32(%rbx)
2602
vmovdqa %ymm11, 1*256+3*32(%rbx)
2603
vmovdqa %ymm12, 2*256+0*32(%rbx)
2604
vmovdqa %ymm13, 2*256+1*32(%rbx)
2605
vmovdqa %ymm14, 2*256+2*32(%rbx)
2606
vmovdqa %ymm15, 2*256+3*32(%rbx)
2607
2608
salsa8_core_6way_avx2
2609
vpaddd 0*256+0*32(%rbx), %ymm0, %ymm0
2610
vpaddd 0*256+1*32(%rbx), %ymm1, %ymm1
2611
vpaddd 0*256+2*32(%rbx), %ymm2, %ymm2
2612
vpaddd 0*256+3*32(%rbx), %ymm3, %ymm3
2613
vpaddd 1*256+0*32(%rbx), %ymm8, %ymm8
2614
vpaddd 1*256+1*32(%rbx), %ymm9, %ymm9
2615
vpaddd 1*256+2*32(%rbx), %ymm10, %ymm10
2616
vpaddd 1*256+3*32(%rbx), %ymm11, %ymm11
2617
vpaddd 2*256+0*32(%rbx), %ymm12, %ymm12
2618
vpaddd 2*256+1*32(%rbx), %ymm13, %ymm13
2619
vpaddd 2*256+2*32(%rbx), %ymm14, %ymm14
2620
vpaddd 2*256+3*32(%rbx), %ymm15, %ymm15
2621
vmovdqa %ymm0, 0*256+0*32(%rsp)
2622
vmovdqa %ymm1, 0*256+1*32(%rsp)
2623
vmovdqa %ymm2, 0*256+2*32(%rsp)
2624
vmovdqa %ymm3, 0*256+3*32(%rsp)
2625
vmovdqa %ymm8, 1*256+0*32(%rsp)
2626
vmovdqa %ymm9, 1*256+1*32(%rsp)
2627
vmovdqa %ymm10, 1*256+2*32(%rsp)
2628
vmovdqa %ymm11, 1*256+3*32(%rsp)
2629
vmovdqa %ymm12, 2*256+0*32(%rsp)
2630
vmovdqa %ymm13, 2*256+1*32(%rsp)
2631
vmovdqa %ymm14, 2*256+2*32(%rsp)
2632
vmovdqa %ymm15, 2*256+3*32(%rsp)
2633
2634
vpxor 0*256+4*32(%rbx), %ymm0, %ymm0
2635
vpxor 0*256+5*32(%rbx), %ymm1, %ymm1
2636
vpxor 0*256+6*32(%rbx), %ymm2, %ymm2
2637
vpxor 0*256+7*32(%rbx), %ymm3, %ymm3
2638
vpxor 1*256+4*32(%rbx), %ymm8, %ymm8
2639
vpxor 1*256+5*32(%rbx), %ymm9, %ymm9
2640
vpxor 1*256+6*32(%rbx), %ymm10, %ymm10
2641
vpxor 1*256+7*32(%rbx), %ymm11, %ymm11
2642
vpxor 2*256+4*32(%rbx), %ymm12, %ymm12
2643
vpxor 2*256+5*32(%rbx), %ymm13, %ymm13
2644
vpxor 2*256+6*32(%rbx), %ymm14, %ymm14
2645
vpxor 2*256+7*32(%rbx), %ymm15, %ymm15
2646
vmovdqa %ymm0, 0*256+4*32(%rsp)
2647
vmovdqa %ymm1, 0*256+5*32(%rsp)
2648
vmovdqa %ymm2, 0*256+6*32(%rsp)
2649
vmovdqa %ymm3, 0*256+7*32(%rsp)
2650
vmovdqa %ymm8, 1*256+4*32(%rsp)
2651
vmovdqa %ymm9, 1*256+5*32(%rsp)
2652
vmovdqa %ymm10, 1*256+6*32(%rsp)
2653
vmovdqa %ymm11, 1*256+7*32(%rsp)
2654
vmovdqa %ymm12, 2*256+4*32(%rsp)
2655
vmovdqa %ymm13, 2*256+5*32(%rsp)
2656
vmovdqa %ymm14, 2*256+6*32(%rsp)
2657
vmovdqa %ymm15, 2*256+7*32(%rsp)
2658
salsa8_core_6way_avx2
2659
vpaddd 0*256+4*32(%rsp), %ymm0, %ymm0
2660
vpaddd 0*256+5*32(%rsp), %ymm1, %ymm1
2661
vpaddd 0*256+6*32(%rsp), %ymm2, %ymm2
2662
vpaddd 0*256+7*32(%rsp), %ymm3, %ymm3
2663
vpaddd 1*256+4*32(%rsp), %ymm8, %ymm8
2664
vpaddd 1*256+5*32(%rsp), %ymm9, %ymm9
2665
vpaddd 1*256+6*32(%rsp), %ymm10, %ymm10
2666
vpaddd 1*256+7*32(%rsp), %ymm11, %ymm11
2667
vpaddd 2*256+4*32(%rsp), %ymm12, %ymm12
2668
vpaddd 2*256+5*32(%rsp), %ymm13, %ymm13
2669
vpaddd 2*256+6*32(%rsp), %ymm14, %ymm14
2670
vpaddd 2*256+7*32(%rsp), %ymm15, %ymm15
2671
2672
addq $6*128, %rbx
2673
cmpq %rax, %rbx
2674
jne scrypt_core_6way_avx2_loop1
2675
2676
vmovdqa %ymm0, 0*256+4*32(%rsp)
2677
vmovdqa %ymm1, 0*256+5*32(%rsp)
2678
vmovdqa %ymm2, 0*256+6*32(%rsp)
2679
vmovdqa %ymm3, 0*256+7*32(%rsp)
2680
vmovdqa %ymm8, 1*256+4*32(%rsp)
2681
vmovdqa %ymm9, 1*256+5*32(%rsp)
2682
vmovdqa %ymm10, 1*256+6*32(%rsp)
2683
vmovdqa %ymm11, 1*256+7*32(%rsp)
2684
vmovdqa %ymm12, 2*256+4*32(%rsp)
2685
vmovdqa %ymm13, 2*256+5*32(%rsp)
2686
vmovdqa %ymm14, 2*256+6*32(%rsp)
2687
vmovdqa %ymm15, 2*256+7*32(%rsp)
2688
2689
movq %r8, %rcx
2690
leaq -1(%r8), %r11
2691
scrypt_core_6way_avx2_loop2:
2692
vmovd %xmm0, %ebp
2693
vmovd %xmm8, %ebx
2694
vmovd %xmm12, %eax
2695
vextracti128 $1, %ymm0, %xmm4
2696
vextracti128 $1, %ymm8, %xmm5
2697
vextracti128 $1, %ymm12, %xmm6
2698
vmovd %xmm4, %r8d
2699
vmovd %xmm5, %r9d
2700
vmovd %xmm6, %r10d
2701
vpxor 0*256+0*32(%rsp), %ymm0, %ymm0
2702
vpxor 0*256+1*32(%rsp), %ymm1, %ymm1
2703
vpxor 0*256+2*32(%rsp), %ymm2, %ymm2
2704
vpxor 0*256+3*32(%rsp), %ymm3, %ymm3
2705
vpxor 1*256+0*32(%rsp), %ymm8, %ymm8
2706
vpxor 1*256+1*32(%rsp), %ymm9, %ymm9
2707
vpxor 1*256+2*32(%rsp), %ymm10, %ymm10
2708
vpxor 1*256+3*32(%rsp), %ymm11, %ymm11
2709
vpxor 2*256+0*32(%rsp), %ymm12, %ymm12
2710
vpxor 2*256+1*32(%rsp), %ymm13, %ymm13
2711
vpxor 2*256+2*32(%rsp), %ymm14, %ymm14
2712
vpxor 2*256+3*32(%rsp), %ymm15, %ymm15
2713
andl %r11d, %ebp
2714
leaq 0(%rbp, %rbp, 2), %rbp
2715
shll $8, %ebp
2716
andl %r11d, %ebx
2717
leaq 1(%rbx, %rbx, 2), %rbx
2718
shll $8, %ebx
2719
andl %r11d, %eax
2720
leaq 2(%rax, %rax, 2), %rax
2721
shll $8, %eax
2722
andl %r11d, %r8d
2723
leaq 0(%r8, %r8, 2), %r8
2724
shll $8, %r8d
2725
andl %r11d, %r9d
2726
leaq 1(%r9, %r9, 2), %r9
2727
shll $8, %r9d
2728
andl %r11d, %r10d
2729
leaq 2(%r10, %r10, 2), %r10
2730
shll $8, %r10d
2731
vmovdqa 0*32(%rsi, %rbp), %xmm4
2732
vinserti128 $1, 0*32+16(%rsi, %r8), %ymm4, %ymm4
2733
vmovdqa 1*32(%rsi, %rbp), %xmm5
2734
vinserti128 $1, 1*32+16(%rsi, %r8), %ymm5, %ymm5
2735
vmovdqa 2*32(%rsi, %rbp), %xmm6
2736
vinserti128 $1, 2*32+16(%rsi, %r8), %ymm6, %ymm6
2737
vmovdqa 3*32(%rsi, %rbp), %xmm7
2738
vinserti128 $1, 3*32+16(%rsi, %r8), %ymm7, %ymm7
2739
vpxor %ymm4, %ymm0, %ymm0
2740
vpxor %ymm5, %ymm1, %ymm1
2741
vpxor %ymm6, %ymm2, %ymm2
2742
vpxor %ymm7, %ymm3, %ymm3
2743
vmovdqa 0*32(%rsi, %rbx), %xmm4
2744
vinserti128 $1, 0*32+16(%rsi, %r9), %ymm4, %ymm4
2745
vmovdqa 1*32(%rsi, %rbx), %xmm5
2746
vinserti128 $1, 1*32+16(%rsi, %r9), %ymm5, %ymm5
2747
vmovdqa 2*32(%rsi, %rbx), %xmm6
2748
vinserti128 $1, 2*32+16(%rsi, %r9), %ymm6, %ymm6
2749
vmovdqa 3*32(%rsi, %rbx), %xmm7
2750
vinserti128 $1, 3*32+16(%rsi, %r9), %ymm7, %ymm7
2751
vpxor %ymm4, %ymm8, %ymm8
2752
vpxor %ymm5, %ymm9, %ymm9
2753
vpxor %ymm6, %ymm10, %ymm10
2754
vpxor %ymm7, %ymm11, %ymm11
2755
vmovdqa 0*32(%rsi, %rax), %xmm4
2756
vinserti128 $1, 0*32+16(%rsi, %r10), %ymm4, %ymm4
2757
vmovdqa 1*32(%rsi, %rax), %xmm5
2758
vinserti128 $1, 1*32+16(%rsi, %r10), %ymm5, %ymm5
2759
vmovdqa 2*32(%rsi, %rax), %xmm6
2760
vinserti128 $1, 2*32+16(%rsi, %r10), %ymm6, %ymm6
2761
vmovdqa 3*32(%rsi, %rax), %xmm7
2762
vinserti128 $1, 3*32+16(%rsi, %r10), %ymm7, %ymm7
2763
vpxor %ymm4, %ymm12, %ymm12
2764
vpxor %ymm5, %ymm13, %ymm13
2765
vpxor %ymm6, %ymm14, %ymm14
2766
vpxor %ymm7, %ymm15, %ymm15
2767
2768
vmovdqa %ymm0, 0*256+0*32(%rsp)
2769
vmovdqa %ymm1, 0*256+1*32(%rsp)
2770
vmovdqa %ymm2, 0*256+2*32(%rsp)
2771
vmovdqa %ymm3, 0*256+3*32(%rsp)
2772
vmovdqa %ymm8, 1*256+0*32(%rsp)
2773
vmovdqa %ymm9, 1*256+1*32(%rsp)
2774
vmovdqa %ymm10, 1*256+2*32(%rsp)
2775
vmovdqa %ymm11, 1*256+3*32(%rsp)
2776
vmovdqa %ymm12, 2*256+0*32(%rsp)
2777
vmovdqa %ymm13, 2*256+1*32(%rsp)
2778
vmovdqa %ymm14, 2*256+2*32(%rsp)
2779
vmovdqa %ymm15, 2*256+3*32(%rsp)
2780
salsa8_core_6way_avx2
2781
vpaddd 0*256+0*32(%rsp), %ymm0, %ymm0
2782
vpaddd 0*256+1*32(%rsp), %ymm1, %ymm1
2783
vpaddd 0*256+2*32(%rsp), %ymm2, %ymm2
2784
vpaddd 0*256+3*32(%rsp), %ymm3, %ymm3
2785
vpaddd 1*256+0*32(%rsp), %ymm8, %ymm8
2786
vpaddd 1*256+1*32(%rsp), %ymm9, %ymm9
2787
vpaddd 1*256+2*32(%rsp), %ymm10, %ymm10
2788
vpaddd 1*256+3*32(%rsp), %ymm11, %ymm11
2789
vpaddd 2*256+0*32(%rsp), %ymm12, %ymm12
2790
vpaddd 2*256+1*32(%rsp), %ymm13, %ymm13
2791
vpaddd 2*256+2*32(%rsp), %ymm14, %ymm14
2792
vpaddd 2*256+3*32(%rsp), %ymm15, %ymm15
2793
vmovdqa %ymm0, 0*256+0*32(%rsp)
2794
vmovdqa %ymm1, 0*256+1*32(%rsp)
2795
vmovdqa %ymm2, 0*256+2*32(%rsp)
2796
vmovdqa %ymm3, 0*256+3*32(%rsp)
2797
vmovdqa %ymm8, 1*256+0*32(%rsp)
2798
vmovdqa %ymm9, 1*256+1*32(%rsp)
2799
vmovdqa %ymm10, 1*256+2*32(%rsp)
2800
vmovdqa %ymm11, 1*256+3*32(%rsp)
2801
vmovdqa %ymm12, 2*256+0*32(%rsp)
2802
vmovdqa %ymm13, 2*256+1*32(%rsp)
2803
vmovdqa %ymm14, 2*256+2*32(%rsp)
2804
vmovdqa %ymm15, 2*256+3*32(%rsp)
2805
2806
vmovdqa 4*32(%rsi, %rbp), %xmm4
2807
vinserti128 $1, 4*32+16(%rsi, %r8), %ymm4, %ymm4
2808
vmovdqa 5*32(%rsi, %rbp), %xmm5
2809
vinserti128 $1, 5*32+16(%rsi, %r8), %ymm5, %ymm5
2810
vmovdqa 6*32(%rsi, %rbp), %xmm6
2811
vinserti128 $1, 6*32+16(%rsi, %r8), %ymm6, %ymm6
2812
vmovdqa 7*32(%rsi, %rbp), %xmm7
2813
vinserti128 $1, 7*32+16(%rsi, %r8), %ymm7, %ymm7
2814
vpxor %ymm4, %ymm0, %ymm0
2815
vpxor %ymm5, %ymm1, %ymm1
2816
vpxor %ymm6, %ymm2, %ymm2
2817
vpxor %ymm7, %ymm3, %ymm3
2818
vmovdqa 4*32(%rsi, %rbx), %xmm4
2819
vinserti128 $1, 4*32+16(%rsi, %r9), %ymm4, %ymm4
2820
vmovdqa 5*32(%rsi, %rbx), %xmm5
2821
vinserti128 $1, 5*32+16(%rsi, %r9), %ymm5, %ymm5
2822
vmovdqa 6*32(%rsi, %rbx), %xmm6
2823
vinserti128 $1, 6*32+16(%rsi, %r9), %ymm6, %ymm6
2824
vmovdqa 7*32(%rsi, %rbx), %xmm7
2825
vinserti128 $1, 7*32+16(%rsi, %r9), %ymm7, %ymm7
2826
vpxor %ymm4, %ymm8, %ymm8
2827
vpxor %ymm5, %ymm9, %ymm9
2828
vpxor %ymm6, %ymm10, %ymm10
2829
vpxor %ymm7, %ymm11, %ymm11
2830
vmovdqa 4*32(%rsi, %rax), %xmm4
2831
vinserti128 $1, 4*32+16(%rsi, %r10), %ymm4, %ymm4
2832
vmovdqa 5*32(%rsi, %rax), %xmm5
2833
vinserti128 $1, 5*32+16(%rsi, %r10), %ymm5, %ymm5
2834
vmovdqa 6*32(%rsi, %rax), %xmm6
2835
vinserti128 $1, 6*32+16(%rsi, %r10), %ymm6, %ymm6
2836
vmovdqa 7*32(%rsi, %rax), %xmm7
2837
vinserti128 $1, 7*32+16(%rsi, %r10), %ymm7, %ymm7
2838
vpxor %ymm4, %ymm12, %ymm12
2839
vpxor %ymm5, %ymm13, %ymm13
2840
vpxor %ymm6, %ymm14, %ymm14
2841
vpxor %ymm7, %ymm15, %ymm15
2842
vpxor 0*256+4*32(%rsp), %ymm0, %ymm0
2843
vpxor 0*256+5*32(%rsp), %ymm1, %ymm1
2844
vpxor 0*256+6*32(%rsp), %ymm2, %ymm2
2845
vpxor 0*256+7*32(%rsp), %ymm3, %ymm3
2846
vpxor 1*256+4*32(%rsp), %ymm8, %ymm8
2847
vpxor 1*256+5*32(%rsp), %ymm9, %ymm9
2848
vpxor 1*256+6*32(%rsp), %ymm10, %ymm10
2849
vpxor 1*256+7*32(%rsp), %ymm11, %ymm11
2850
vpxor 2*256+4*32(%rsp), %ymm12, %ymm12
2851
vpxor 2*256+5*32(%rsp), %ymm13, %ymm13
2852
vpxor 2*256+6*32(%rsp), %ymm14, %ymm14
2853
vpxor 2*256+7*32(%rsp), %ymm15, %ymm15
2854
vmovdqa %ymm0, 0*256+4*32(%rsp)
2855
vmovdqa %ymm1, 0*256+5*32(%rsp)
2856
vmovdqa %ymm2, 0*256+6*32(%rsp)
2857
vmovdqa %ymm3, 0*256+7*32(%rsp)
2858
vmovdqa %ymm8, 1*256+4*32(%rsp)
2859
vmovdqa %ymm9, 1*256+5*32(%rsp)
2860
vmovdqa %ymm10, 1*256+6*32(%rsp)
2861
vmovdqa %ymm11, 1*256+7*32(%rsp)
2862
vmovdqa %ymm12, 2*256+4*32(%rsp)
2863
vmovdqa %ymm13, 2*256+5*32(%rsp)
2864
vmovdqa %ymm14, 2*256+6*32(%rsp)
2865
vmovdqa %ymm15, 2*256+7*32(%rsp)
2866
salsa8_core_6way_avx2
2867
vpaddd 0*256+4*32(%rsp), %ymm0, %ymm0
2868
vpaddd 0*256+5*32(%rsp), %ymm1, %ymm1
2869
vpaddd 0*256+6*32(%rsp), %ymm2, %ymm2
2870
vpaddd 0*256+7*32(%rsp), %ymm3, %ymm3
2871
vpaddd 1*256+4*32(%rsp), %ymm8, %ymm8
2872
vpaddd 1*256+5*32(%rsp), %ymm9, %ymm9
2873
vpaddd 1*256+6*32(%rsp), %ymm10, %ymm10
2874
vpaddd 1*256+7*32(%rsp), %ymm11, %ymm11
2875
vpaddd 2*256+4*32(%rsp), %ymm12, %ymm12
2876
vpaddd 2*256+5*32(%rsp), %ymm13, %ymm13
2877
vpaddd 2*256+6*32(%rsp), %ymm14, %ymm14
2878
vpaddd 2*256+7*32(%rsp), %ymm15, %ymm15
2879
vmovdqa %ymm0, 0*256+4*32(%rsp)
2880
vmovdqa %ymm1, 0*256+5*32(%rsp)
2881
vmovdqa %ymm2, 0*256+6*32(%rsp)
2882
vmovdqa %ymm3, 0*256+7*32(%rsp)
2883
vmovdqa %ymm8, 1*256+4*32(%rsp)
2884
vmovdqa %ymm9, 1*256+5*32(%rsp)
2885
vmovdqa %ymm10, 1*256+6*32(%rsp)
2886
vmovdqa %ymm11, 1*256+7*32(%rsp)
2887
vmovdqa %ymm12, 2*256+4*32(%rsp)
2888
vmovdqa %ymm13, 2*256+5*32(%rsp)
2889
vmovdqa %ymm14, 2*256+6*32(%rsp)
2890
vmovdqa %ymm15, 2*256+7*32(%rsp)
2891
2892
subq $1, %rcx
2893
ja scrypt_core_6way_avx2_loop2
2894
2895
scrypt_shuffle_unpack2 %rsp, 0*128, %rdi, 0*256+0
2896
scrypt_shuffle_unpack2 %rsp, 1*128, %rdi, 0*256+64
2897
scrypt_shuffle_unpack2 %rsp, 2*128, %rdi, 1*256+0
2898
scrypt_shuffle_unpack2 %rsp, 3*128, %rdi, 1*256+64
2899
scrypt_shuffle_unpack2 %rsp, 4*128, %rdi, 2*256+0
2900
scrypt_shuffle_unpack2 %rsp, 5*128, %rdi, 2*256+64
2901
2902
scrypt_core_6way_cleanup
2903
ret
2904
2905
#endif /* USE_AVX2 */
2906
2907
#endif
2908
2909