1 /* $FreeBSD$ */
2 /* Do not modify. This file is auto-generated from chacha-x86_64.pl. */
3 .text
4
5
6
7 .align 64
8 .Lzero:
9 .long 0,0,0,0
10 .Lone:
11 .long 1,0,0,0
12 .Linc:
13 .long 0,1,2,3
14 .Lfour:
15 .long 4,4,4,4
16 .Lincy:
17 .long 0,2,4,6,1,3,5,7
18 .Leight:
19 .long 8,8,8,8,8,8,8,8
20 .Lrot16:
21 .byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd
22 .Lrot24:
23 .byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe
24 .Ltwoy:
25 .long 2,0,0,0, 2,0,0,0
26 .align 64
27 .Lzeroz:
28 .long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0
29 .Lfourz:
30 .long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0
31 .Lincz:
32 .long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
33 .Lsixteen:
34 .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
35 .Lsigma:
36 .byte 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0
37 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
38 .globl ChaCha20_ctr32
39 .type ChaCha20_ctr32,@function
40 .align 64
41 ChaCha20_ctr32:
42 .cfi_startproc
43 cmpq $0,%rdx
44 je .Lno_data
45 movq OPENSSL_ia32cap_P+4(%rip),%r10
46 testl $512,%r10d
47 jnz .LChaCha20_ssse3
48
49 pushq %rbx
50 .cfi_adjust_cfa_offset 8
51 .cfi_offset %rbx,-16
52 pushq %rbp
53 .cfi_adjust_cfa_offset 8
54 .cfi_offset %rbp,-24
55 pushq %r12
56 .cfi_adjust_cfa_offset 8
57 .cfi_offset %r12,-32
58 pushq %r13
59 .cfi_adjust_cfa_offset 8
60 .cfi_offset %r13,-40
61 pushq %r14
62 .cfi_adjust_cfa_offset 8
63 .cfi_offset %r14,-48
64 pushq %r15
65 .cfi_adjust_cfa_offset 8
66 .cfi_offset %r15,-56
67 subq $64+24,%rsp
68 .cfi_adjust_cfa_offset 64+24
69 .Lctr32_body:
70
71
72 movdqu (%rcx),%xmm1
73 movdqu 16(%rcx),%xmm2
74 movdqu (%r8),%xmm3
75 movdqa .Lone(%rip),%xmm4
76
77
78 movdqa %xmm1,16(%rsp)
79 movdqa %xmm2,32(%rsp)
80 movdqa %xmm3,48(%rsp)
81 movq %rdx,%rbp
82 jmp .Loop_outer
83
84 .align 32
85 .Loop_outer:
86 movl $0x61707865,%eax
87 movl $0x3320646e,%ebx
88 movl $0x79622d32,%ecx
89 movl $0x6b206574,%edx
90 movl 16(%rsp),%r8d
91 movl 20(%rsp),%r9d
92 movl 24(%rsp),%r10d
93 movl 28(%rsp),%r11d
94 movd %xmm3,%r12d
95 movl 52(%rsp),%r13d
96 movl 56(%rsp),%r14d
97 movl 60(%rsp),%r15d
98
99 movq %rbp,64+0(%rsp)
100 movl $10,%ebp
101 movq %rsi,64+8(%rsp)
102 .byte 102,72,15,126,214
103 movq %rdi,64+16(%rsp)
104 movq %rsi,%rdi
105 shrq $32,%rdi
106 jmp .Loop
107
108 .align 32
109 .Loop:
110 addl %r8d,%eax
111 xorl %eax,%r12d
112 roll $16,%r12d
113 addl %r9d,%ebx
114 xorl %ebx,%r13d
115 roll $16,%r13d
116 addl %r12d,%esi
117 xorl %esi,%r8d
118 roll $12,%r8d
119 addl %r13d,%edi
120 xorl %edi,%r9d
121 roll $12,%r9d
122 addl %r8d,%eax
123 xorl %eax,%r12d
124 roll $8,%r12d
125 addl %r9d,%ebx
126 xorl %ebx,%r13d
127 roll $8,%r13d
128 addl %r12d,%esi
129 xorl %esi,%r8d
130 roll $7,%r8d
131 addl %r13d,%edi
132 xorl %edi,%r9d
133 roll $7,%r9d
134 movl %esi,32(%rsp)
135 movl %edi,36(%rsp)
136 movl 40(%rsp),%esi
137 movl 44(%rsp),%edi
138 addl %r10d,%ecx
139 xorl %ecx,%r14d
140 roll $16,%r14d
141 addl %r11d,%edx
142 xorl %edx,%r15d
143 roll $16,%r15d
144 addl %r14d,%esi
145 xorl %esi,%r10d
146 roll $12,%r10d
147 addl %r15d,%edi
148 xorl %edi,%r11d
149 roll $12,%r11d
150 addl %r10d,%ecx
151 xorl %ecx,%r14d
152 roll $8,%r14d
153 addl %r11d,%edx
154 xorl %edx,%r15d
155 roll $8,%r15d
156 addl %r14d,%esi
157 xorl %esi,%r10d
158 roll $7,%r10d
159 addl %r15d,%edi
160 xorl %edi,%r11d
161 roll $7,%r11d
162 addl %r9d,%eax
163 xorl %eax,%r15d
164 roll $16,%r15d
165 addl %r10d,%ebx
166 xorl %ebx,%r12d
167 roll $16,%r12d
168 addl %r15d,%esi
169 xorl %esi,%r9d
170 roll $12,%r9d
171 addl %r12d,%edi
172 xorl %edi,%r10d
173 roll $12,%r10d
174 addl %r9d,%eax
175 xorl %eax,%r15d
176 roll $8,%r15d
177 addl %r10d,%ebx
178 xorl %ebx,%r12d
179 roll $8,%r12d
180 addl %r15d,%esi
181 xorl %esi,%r9d
182 roll $7,%r9d
183 addl %r12d,%edi
184 xorl %edi,%r10d
185 roll $7,%r10d
186 movl %esi,40(%rsp)
187 movl %edi,44(%rsp)
188 movl 32(%rsp),%esi
189 movl 36(%rsp),%edi
190 addl %r11d,%ecx
191 xorl %ecx,%r13d
192 roll $16,%r13d
193 addl %r8d,%edx
194 xorl %edx,%r14d
195 roll $16,%r14d
196 addl %r13d,%esi
197 xorl %esi,%r11d
198 roll $12,%r11d
199 addl %r14d,%edi
200 xorl %edi,%r8d
201 roll $12,%r8d
202 addl %r11d,%ecx
203 xorl %ecx,%r13d
204 roll $8,%r13d
205 addl %r8d,%edx
206 xorl %edx,%r14d
207 roll $8,%r14d
208 addl %r13d,%esi
209 xorl %esi,%r11d
210 roll $7,%r11d
211 addl %r14d,%edi
212 xorl %edi,%r8d
213 roll $7,%r8d
214 decl %ebp
215 jnz .Loop
216 movl %edi,36(%rsp)
217 movl %esi,32(%rsp)
218 movq 64(%rsp),%rbp
219 movdqa %xmm2,%xmm1
220 movq 64+8(%rsp),%rsi
221 paddd %xmm4,%xmm3
222 movq 64+16(%rsp),%rdi
223
224 addl $0x61707865,%eax
225 addl $0x3320646e,%ebx
226 addl $0x79622d32,%ecx
227 addl $0x6b206574,%edx
228 addl 16(%rsp),%r8d
229 addl 20(%rsp),%r9d
230 addl 24(%rsp),%r10d
231 addl 28(%rsp),%r11d
232 addl 48(%rsp),%r12d
233 addl 52(%rsp),%r13d
234 addl 56(%rsp),%r14d
235 addl 60(%rsp),%r15d
236 paddd 32(%rsp),%xmm1
237
238 cmpq $64,%rbp
239 jb .Ltail
240
241 xorl 0(%rsi),%eax
242 xorl 4(%rsi),%ebx
243 xorl 8(%rsi),%ecx
244 xorl 12(%rsi),%edx
245 xorl 16(%rsi),%r8d
246 xorl 20(%rsi),%r9d
247 xorl 24(%rsi),%r10d
248 xorl 28(%rsi),%r11d
249 movdqu 32(%rsi),%xmm0
250 xorl 48(%rsi),%r12d
251 xorl 52(%rsi),%r13d
252 xorl 56(%rsi),%r14d
253 xorl 60(%rsi),%r15d
254 leaq 64(%rsi),%rsi
255 pxor %xmm1,%xmm0
256
257 movdqa %xmm2,32(%rsp)
258 movd %xmm3,48(%rsp)
259
260 movl %eax,0(%rdi)
261 movl %ebx,4(%rdi)
262 movl %ecx,8(%rdi)
263 movl %edx,12(%rdi)
264 movl %r8d,16(%rdi)
265 movl %r9d,20(%rdi)
266 movl %r10d,24(%rdi)
267 movl %r11d,28(%rdi)
268 movdqu %xmm0,32(%rdi)
269 movl %r12d,48(%rdi)
270 movl %r13d,52(%rdi)
271 movl %r14d,56(%rdi)
272 movl %r15d,60(%rdi)
273 leaq 64(%rdi),%rdi
274
275 subq $64,%rbp
276 jnz .Loop_outer
277
278 jmp .Ldone
279
280 .align 16
281 .Ltail:
282 movl %eax,0(%rsp)
283 movl %ebx,4(%rsp)
284 xorq %rbx,%rbx
285 movl %ecx,8(%rsp)
286 movl %edx,12(%rsp)
287 movl %r8d,16(%rsp)
288 movl %r9d,20(%rsp)
289 movl %r10d,24(%rsp)
290 movl %r11d,28(%rsp)
291 movdqa %xmm1,32(%rsp)
292 movl %r12d,48(%rsp)
293 movl %r13d,52(%rsp)
294 movl %r14d,56(%rsp)
295 movl %r15d,60(%rsp)
296
297 .Loop_tail:
298 movzbl (%rsi,%rbx,1),%eax
299 movzbl (%rsp,%rbx,1),%edx
300 leaq 1(%rbx),%rbx
301 xorl %edx,%eax
302 movb %al,-1(%rdi,%rbx,1)
303 decq %rbp
304 jnz .Loop_tail
305
306 .Ldone:
307 leaq 64+24+48(%rsp),%rsi
308 .cfi_def_cfa %rsi,8
309 movq -48(%rsi),%r15
310 .cfi_restore %r15
311 movq -40(%rsi),%r14
312 .cfi_restore %r14
313 movq -32(%rsi),%r13
314 .cfi_restore %r13
315 movq -24(%rsi),%r12
316 .cfi_restore %r12
317 movq -16(%rsi),%rbp
318 .cfi_restore %rbp
319 movq -8(%rsi),%rbx
320 .cfi_restore %rbx
321 leaq (%rsi),%rsp
322 .cfi_def_cfa_register %rsp
323 .Lno_data:
324 .byte 0xf3,0xc3
325 .cfi_endproc
326 .size ChaCha20_ctr32,.-ChaCha20_ctr32
327 .type ChaCha20_ssse3,@function
328 .align 32
329 ChaCha20_ssse3:
330 .cfi_startproc
331 .LChaCha20_ssse3:
332 movq %rsp,%r9
333 .cfi_def_cfa_register %r9
334 testl $2048,%r10d
335 jnz .LChaCha20_4xop
336 cmpq $128,%rdx
337 je .LChaCha20_128
338 ja .LChaCha20_4x
339
340 .Ldo_sse3_after_all:
341 subq $64+8,%rsp
342 movdqa .Lsigma(%rip),%xmm0
343 movdqu (%rcx),%xmm1
344 movdqu 16(%rcx),%xmm2
345 movdqu (%r8),%xmm3
346 movdqa .Lrot16(%rip),%xmm6
347 movdqa .Lrot24(%rip),%xmm7
348
349 movdqa %xmm0,0(%rsp)
350 movdqa %xmm1,16(%rsp)
351 movdqa %xmm2,32(%rsp)
352 movdqa %xmm3,48(%rsp)
353 movq $10,%r8
354 jmp .Loop_ssse3
355
356 .align 32
357 .Loop_outer_ssse3:
358 movdqa .Lone(%rip),%xmm3
359 movdqa 0(%rsp),%xmm0
360 movdqa 16(%rsp),%xmm1
361 movdqa 32(%rsp),%xmm2
362 paddd 48(%rsp),%xmm3
363 movq $10,%r8
364 movdqa %xmm3,48(%rsp)
365 jmp .Loop_ssse3
366
367 .align 32
368 .Loop_ssse3:
369 paddd %xmm1,%xmm0
370 pxor %xmm0,%xmm3
371 .byte 102,15,56,0,222
372 paddd %xmm3,%xmm2
373 pxor %xmm2,%xmm1
374 movdqa %xmm1,%xmm4
375 psrld $20,%xmm1
376 pslld $12,%xmm4
377 por %xmm4,%xmm1
378 paddd %xmm1,%xmm0
379 pxor %xmm0,%xmm3
380 .byte 102,15,56,0,223
381 paddd %xmm3,%xmm2
382 pxor %xmm2,%xmm1
383 movdqa %xmm1,%xmm4
384 psrld $25,%xmm1
385 pslld $7,%xmm4
386 por %xmm4,%xmm1
387 pshufd $78,%xmm2,%xmm2
388 pshufd $57,%xmm1,%xmm1
389 pshufd $147,%xmm3,%xmm3
390 nop
391 paddd %xmm1,%xmm0
392 pxor %xmm0,%xmm3
393 .byte 102,15,56,0,222
394 paddd %xmm3,%xmm2
395 pxor %xmm2,%xmm1
396 movdqa %xmm1,%xmm4
397 psrld $20,%xmm1
398 pslld $12,%xmm4
399 por %xmm4,%xmm1
400 paddd %xmm1,%xmm0
401 pxor %xmm0,%xmm3
402 .byte 102,15,56,0,223
403 paddd %xmm3,%xmm2
404 pxor %xmm2,%xmm1
405 movdqa %xmm1,%xmm4
406 psrld $25,%xmm1
407 pslld $7,%xmm4
408 por %xmm4,%xmm1
409 pshufd $78,%xmm2,%xmm2
410 pshufd $147,%xmm1,%xmm1
411 pshufd $57,%xmm3,%xmm3
412 decq %r8
413 jnz .Loop_ssse3
414 paddd 0(%rsp),%xmm0
415 paddd 16(%rsp),%xmm1
416 paddd 32(%rsp),%xmm2
417 paddd 48(%rsp),%xmm3
418
419 cmpq $64,%rdx
420 jb .Ltail_ssse3
421
422 movdqu 0(%rsi),%xmm4
423 movdqu 16(%rsi),%xmm5
424 pxor %xmm4,%xmm0
425 movdqu 32(%rsi),%xmm4
426 pxor %xmm5,%xmm1
427 movdqu 48(%rsi),%xmm5
428 leaq 64(%rsi),%rsi
429 pxor %xmm4,%xmm2
430 pxor %xmm5,%xmm3
431
432 movdqu %xmm0,0(%rdi)
433 movdqu %xmm1,16(%rdi)
434 movdqu %xmm2,32(%rdi)
435 movdqu %xmm3,48(%rdi)
436 leaq 64(%rdi),%rdi
437
438 subq $64,%rdx
439 jnz .Loop_outer_ssse3
440
441 jmp .Ldone_ssse3
442
443 .align 16
444 .Ltail_ssse3:
445 movdqa %xmm0,0(%rsp)
446 movdqa %xmm1,16(%rsp)
447 movdqa %xmm2,32(%rsp)
448 movdqa %xmm3,48(%rsp)
449 xorq %r8,%r8
450
451 .Loop_tail_ssse3:
452 movzbl (%rsi,%r8,1),%eax
453 movzbl (%rsp,%r8,1),%ecx
454 leaq 1(%r8),%r8
455 xorl %ecx,%eax
456 movb %al,-1(%rdi,%r8,1)
457 decq %rdx
458 jnz .Loop_tail_ssse3
459
460 .Ldone_ssse3:
461 leaq (%r9),%rsp
462 .cfi_def_cfa_register %rsp
463 .Lssse3_epilogue:
464 .byte 0xf3,0xc3
465 .cfi_endproc
466 .size ChaCha20_ssse3,.-ChaCha20_ssse3
467 .type ChaCha20_128,@function
468 .align 32
469 ChaCha20_128:
470 .cfi_startproc
471 .LChaCha20_128:
472 movq %rsp,%r9
473 .cfi_def_cfa_register %r9
474 subq $64+8,%rsp
475 movdqa .Lsigma(%rip),%xmm8
476 movdqu (%rcx),%xmm9
477 movdqu 16(%rcx),%xmm2
478 movdqu (%r8),%xmm3
479 movdqa .Lone(%rip),%xmm1
480 movdqa .Lrot16(%rip),%xmm6
481 movdqa .Lrot24(%rip),%xmm7
482
483 movdqa %xmm8,%xmm10
484 movdqa %xmm8,0(%rsp)
485 movdqa %xmm9,%xmm11
486 movdqa %xmm9,16(%rsp)
487 movdqa %xmm2,%xmm0
488 movdqa %xmm2,32(%rsp)
489 paddd %xmm3,%xmm1
490 movdqa %xmm3,48(%rsp)
491 movq $10,%r8
492 jmp .Loop_128
493
494 .align 32
495 .Loop_128:
496 paddd %xmm9,%xmm8
497 pxor %xmm8,%xmm3
498 paddd %xmm11,%xmm10
499 pxor %xmm10,%xmm1
500 .byte 102,15,56,0,222
501 .byte 102,15,56,0,206
502 paddd %xmm3,%xmm2
503 paddd %xmm1,%xmm0
504 pxor %xmm2,%xmm9
505 pxor %xmm0,%xmm11
506 movdqa %xmm9,%xmm4
507 psrld $20,%xmm9
508 movdqa %xmm11,%xmm5
509 pslld $12,%xmm4
510 psrld $20,%xmm11
511 por %xmm4,%xmm9
512 pslld $12,%xmm5
513 por %xmm5,%xmm11
514 paddd %xmm9,%xmm8
515 pxor %xmm8,%xmm3
516 paddd %xmm11,%xmm10
517 pxor %xmm10,%xmm1
518 .byte 102,15,56,0,223
519 .byte 102,15,56,0,207
520 paddd %xmm3,%xmm2
521 paddd %xmm1,%xmm0
522 pxor %xmm2,%xmm9
523 pxor %xmm0,%xmm11
524 movdqa %xmm9,%xmm4
525 psrld $25,%xmm9
526 movdqa %xmm11,%xmm5
527 pslld $7,%xmm4
528 psrld $25,%xmm11
529 por %xmm4,%xmm9
530 pslld $7,%xmm5
531 por %xmm5,%xmm11
532 pshufd $78,%xmm2,%xmm2
533 pshufd $57,%xmm9,%xmm9
534 pshufd $147,%xmm3,%xmm3
535 pshufd $78,%xmm0,%xmm0
536 pshufd $57,%xmm11,%xmm11
537 pshufd $147,%xmm1,%xmm1
538 paddd %xmm9,%xmm8
539 pxor %xmm8,%xmm3
540 paddd %xmm11,%xmm10
541 pxor %xmm10,%xmm1
542 .byte 102,15,56,0,222
543 .byte 102,15,56,0,206
544 paddd %xmm3,%xmm2
545 paddd %xmm1,%xmm0
546 pxor %xmm2,%xmm9
547 pxor %xmm0,%xmm11
548 movdqa %xmm9,%xmm4
549 psrld $20,%xmm9
550 movdqa %xmm11,%xmm5
551 pslld $12,%xmm4
552 psrld $20,%xmm11
553 por %xmm4,%xmm9
554 pslld $12,%xmm5
555 por %xmm5,%xmm11
556 paddd %xmm9,%xmm8
557 pxor %xmm8,%xmm3
558 paddd %xmm11,%xmm10
559 pxor %xmm10,%xmm1
560 .byte 102,15,56,0,223
561 .byte 102,15,56,0,207
562 paddd %xmm3,%xmm2
563 paddd %xmm1,%xmm0
564 pxor %xmm2,%xmm9
565 pxor %xmm0,%xmm11
566 movdqa %xmm9,%xmm4
567 psrld $25,%xmm9
568 movdqa %xmm11,%xmm5
569 pslld $7,%xmm4
570 psrld $25,%xmm11
571 por %xmm4,%xmm9
572 pslld $7,%xmm5
573 por %xmm5,%xmm11
574 pshufd $78,%xmm2,%xmm2
575 pshufd $147,%xmm9,%xmm9
576 pshufd $57,%xmm3,%xmm3
577 pshufd $78,%xmm0,%xmm0
578 pshufd $147,%xmm11,%xmm11
579 pshufd $57,%xmm1,%xmm1
580 decq %r8
581 jnz .Loop_128
582 paddd 0(%rsp),%xmm8
583 paddd 16(%rsp),%xmm9
584 paddd 32(%rsp),%xmm2
585 paddd 48(%rsp),%xmm3
586 paddd .Lone(%rip),%xmm1
587 paddd 0(%rsp),%xmm10
588 paddd 16(%rsp),%xmm11
589 paddd 32(%rsp),%xmm0
590 paddd 48(%rsp),%xmm1
591
592 movdqu 0(%rsi),%xmm4
593 movdqu 16(%rsi),%xmm5
594 pxor %xmm4,%xmm8
595 movdqu 32(%rsi),%xmm4
596 pxor %xmm5,%xmm9
597 movdqu 48(%rsi),%xmm5
598 pxor %xmm4,%xmm2
599 movdqu 64(%rsi),%xmm4
600 pxor %xmm5,%xmm3
601 movdqu 80(%rsi),%xmm5
602 pxor %xmm4,%xmm10
603 movdqu 96(%rsi),%xmm4
604 pxor %xmm5,%xmm11
605 movdqu 112(%rsi),%xmm5
606 pxor %xmm4,%xmm0
607 pxor %xmm5,%xmm1
608
609 movdqu %xmm8,0(%rdi)
610 movdqu %xmm9,16(%rdi)
611 movdqu %xmm2,32(%rdi)
612 movdqu %xmm3,48(%rdi)
613 movdqu %xmm10,64(%rdi)
614 movdqu %xmm11,80(%rdi)
615 movdqu %xmm0,96(%rdi)
616 movdqu %xmm1,112(%rdi)
617 leaq (%r9),%rsp
618 .cfi_def_cfa_register %rsp
619 .L128_epilogue:
620 .byte 0xf3,0xc3
621 .cfi_endproc
622 .size ChaCha20_128,.-ChaCha20_128
623 .type ChaCha20_4x,@function
624 .align 32
625 ChaCha20_4x:
626 .cfi_startproc
627 .LChaCha20_4x:
628 movq %rsp,%r9
629 .cfi_def_cfa_register %r9
630 movq %r10,%r11
631 shrq $32,%r10
632 testq $32,%r10
633 jnz .LChaCha20_8x
634 cmpq $192,%rdx
635 ja .Lproceed4x
636
637 andq $71303168,%r11
638 cmpq $4194304,%r11
639 je .Ldo_sse3_after_all
640
641 .Lproceed4x:
642 subq $0x140+8,%rsp
643 movdqa .Lsigma(%rip),%xmm11
644 movdqu (%rcx),%xmm15
645 movdqu 16(%rcx),%xmm7
646 movdqu (%r8),%xmm3
647 leaq 256(%rsp),%rcx
648 leaq .Lrot16(%rip),%r10
649 leaq .Lrot24(%rip),%r11
650
651 pshufd $0x00,%xmm11,%xmm8
652 pshufd $0x55,%xmm11,%xmm9
653 movdqa %xmm8,64(%rsp)
654 pshufd $0xaa,%xmm11,%xmm10
655 movdqa %xmm9,80(%rsp)
656 pshufd $0xff,%xmm11,%xmm11
657 movdqa %xmm10,96(%rsp)
658 movdqa %xmm11,112(%rsp)
659
660 pshufd $0x00,%xmm15,%xmm12
661 pshufd $0x55,%xmm15,%xmm13
662 movdqa %xmm12,128-256(%rcx)
663 pshufd $0xaa,%xmm15,%xmm14
664 movdqa %xmm13,144-256(%rcx)
665 pshufd $0xff,%xmm15,%xmm15
666 movdqa %xmm14,160-256(%rcx)
667 movdqa %xmm15,176-256(%rcx)
668
669 pshufd $0x00,%xmm7,%xmm4
670 pshufd $0x55,%xmm7,%xmm5
671 movdqa %xmm4,192-256(%rcx)
672 pshufd $0xaa,%xmm7,%xmm6
673 movdqa %xmm5,208-256(%rcx)
674 pshufd $0xff,%xmm7,%xmm7
675 movdqa %xmm6,224-256(%rcx)
676 movdqa %xmm7,240-256(%rcx)
677
678 pshufd $0x00,%xmm3,%xmm0
679 pshufd $0x55,%xmm3,%xmm1
680 paddd .Linc(%rip),%xmm0
681 pshufd $0xaa,%xmm3,%xmm2
682 movdqa %xmm1,272-256(%rcx)
683 pshufd $0xff,%xmm3,%xmm3
684 movdqa %xmm2,288-256(%rcx)
685 movdqa %xmm3,304-256(%rcx)
686
687 jmp .Loop_enter4x
688
689 .align 32
690 .Loop_outer4x:
691 movdqa 64(%rsp),%xmm8
692 movdqa 80(%rsp),%xmm9
693 movdqa 96(%rsp),%xmm10
694 movdqa 112(%rsp),%xmm11
695 movdqa 128-256(%rcx),%xmm12
696 movdqa 144-256(%rcx),%xmm13
697 movdqa 160-256(%rcx),%xmm14
698 movdqa 176-256(%rcx),%xmm15
699 movdqa 192-256(%rcx),%xmm4
700 movdqa 208-256(%rcx),%xmm5
701 movdqa 224-256(%rcx),%xmm6
702 movdqa 240-256(%rcx),%xmm7
703 movdqa 256-256(%rcx),%xmm0
704 movdqa 272-256(%rcx),%xmm1
705 movdqa 288-256(%rcx),%xmm2
706 movdqa 304-256(%rcx),%xmm3
707 paddd .Lfour(%rip),%xmm0
708
709 .Loop_enter4x:
710 movdqa %xmm6,32(%rsp)
711 movdqa %xmm7,48(%rsp)
712 movdqa (%r10),%xmm7
713 movl $10,%eax
714 movdqa %xmm0,256-256(%rcx)
715 jmp .Loop4x
716
717 .align 32
718 .Loop4x:
719 paddd %xmm12,%xmm8
720 paddd %xmm13,%xmm9
721 pxor %xmm8,%xmm0
722 pxor %xmm9,%xmm1
723 .byte 102,15,56,0,199
724 .byte 102,15,56,0,207
725 paddd %xmm0,%xmm4
726 paddd %xmm1,%xmm5
727 pxor %xmm4,%xmm12
728 pxor %xmm5,%xmm13
729 movdqa %xmm12,%xmm6
730 pslld $12,%xmm12
731 psrld $20,%xmm6
732 movdqa %xmm13,%xmm7
733 pslld $12,%xmm13
734 por %xmm6,%xmm12
735 psrld $20,%xmm7
736 movdqa (%r11),%xmm6
737 por %xmm7,%xmm13
738 paddd %xmm12,%xmm8
739 paddd %xmm13,%xmm9
740 pxor %xmm8,%xmm0
741 pxor %xmm9,%xmm1
742 .byte 102,15,56,0,198
743 .byte 102,15,56,0,206
744 paddd %xmm0,%xmm4
745 paddd %xmm1,%xmm5
746 pxor %xmm4,%xmm12
747 pxor %xmm5,%xmm13
748 movdqa %xmm12,%xmm7
749 pslld $7,%xmm12
750 psrld $25,%xmm7
751 movdqa %xmm13,%xmm6
752 pslld $7,%xmm13
753 por %xmm7,%xmm12
754 psrld $25,%xmm6
755 movdqa (%r10),%xmm7
756 por %xmm6,%xmm13
757 movdqa %xmm4,0(%rsp)
758 movdqa %xmm5,16(%rsp)
759 movdqa 32(%rsp),%xmm4
760 movdqa 48(%rsp),%xmm5
761 paddd %xmm14,%xmm10
762 paddd %xmm15,%xmm11
763 pxor %xmm10,%xmm2
764 pxor %xmm11,%xmm3
765 .byte 102,15,56,0,215
766 .byte 102,15,56,0,223
767 paddd %xmm2,%xmm4
768 paddd %xmm3,%xmm5
769 pxor %xmm4,%xmm14
770 pxor %xmm5,%xmm15
771 movdqa %xmm14,%xmm6
772 pslld $12,%xmm14
773 psrld $20,%xmm6
774 movdqa %xmm15,%xmm7
775 pslld $12,%xmm15
776 por %xmm6,%xmm14
777 psrld $20,%xmm7
778 movdqa (%r11),%xmm6
779 por %xmm7,%xmm15
780 paddd %xmm14,%xmm10
781 paddd %xmm15,%xmm11
782 pxor %xmm10,%xmm2
783 pxor %xmm11,%xmm3
784 .byte 102,15,56,0,214
785 .byte 102,15,56,0,222
786 paddd %xmm2,%xmm4
787 paddd %xmm3,%xmm5
788 pxor %xmm4,%xmm14
789 pxor %xmm5,%xmm15
790 movdqa %xmm14,%xmm7
791 pslld $7,%xmm14
792 psrld $25,%xmm7
793 movdqa %xmm15,%xmm6
794 pslld $7,%xmm15
795 por %xmm7,%xmm14
796 psrld $25,%xmm6
797 movdqa (%r10),%xmm7
798 por %xmm6,%xmm15
799 paddd %xmm13,%xmm8
800 paddd %xmm14,%xmm9
801 pxor %xmm8,%xmm3
802 pxor %xmm9,%xmm0
803 .byte 102,15,56,0,223
804 .byte 102,15,56,0,199
805 paddd %xmm3,%xmm4
806 paddd %xmm0,%xmm5
807 pxor %xmm4,%xmm13
808 pxor %xmm5,%xmm14
809 movdqa %xmm13,%xmm6
810 pslld $12,%xmm13
811 psrld $20,%xmm6
812 movdqa %xmm14,%xmm7
813 pslld $12,%xmm14
814 por %xmm6,%xmm13
815 psrld $20,%xmm7
816 movdqa (%r11),%xmm6
817 por %xmm7,%xmm14
818 paddd %xmm13,%xmm8
819 paddd %xmm14,%xmm9
820 pxor %xmm8,%xmm3
821 pxor %xmm9,%xmm0
822 .byte 102,15,56,0,222
823 .byte 102,15,56,0,198
824 paddd %xmm3,%xmm4
825 paddd %xmm0,%xmm5
826 pxor %xmm4,%xmm13
827 pxor %xmm5,%xmm14
828 movdqa %xmm13,%xmm7
829 pslld $7,%xmm13
830 psrld $25,%xmm7
831 movdqa %xmm14,%xmm6
832 pslld $7,%xmm14
833 por %xmm7,%xmm13
834 psrld $25,%xmm6
835 movdqa (%r10),%xmm7
836 por %xmm6,%xmm14
837 movdqa %xmm4,32(%rsp)
838 movdqa %xmm5,48(%rsp)
839 movdqa 0(%rsp),%xmm4
840 movdqa 16(%rsp),%xmm5
841 paddd %xmm15,%xmm10
842 paddd %xmm12,%xmm11
843 pxor %xmm10,%xmm1
844 pxor %xmm11,%xmm2
845 .byte 102,15,56,0,207
846 .byte 102,15,56,0,215
847 paddd %xmm1,%xmm4
848 paddd %xmm2,%xmm5
849 pxor %xmm4,%xmm15
850 pxor %xmm5,%xmm12
851 movdqa %xmm15,%xmm6
852 pslld $12,%xmm15
853 psrld $20,%xmm6
854 movdqa %xmm12,%xmm7
855 pslld $12,%xmm12
856 por %xmm6,%xmm15
857 psrld $20,%xmm7
858 movdqa (%r11),%xmm6
859 por %xmm7,%xmm12
860 paddd %xmm15,%xmm10
861 paddd %xmm12,%xmm11
862 pxor %xmm10,%xmm1
863 pxor %xmm11,%xmm2
864 .byte 102,15,56,0,206
865 .byte 102,15,56,0,214
866 paddd %xmm1,%xmm4
867 paddd %xmm2,%xmm5
868 pxor %xmm4,%xmm15
869 pxor %xmm5,%xmm12
870 movdqa %xmm15,%xmm7
871 pslld $7,%xmm15
872 psrld $25,%xmm7
873 movdqa %xmm12,%xmm6
874 pslld $7,%xmm12
875 por %xmm7,%xmm15
876 psrld $25,%xmm6
877 movdqa (%r10),%xmm7
878 por %xmm6,%xmm12
879 decl %eax
880 jnz .Loop4x
881
882 paddd 64(%rsp),%xmm8
883 paddd 80(%rsp),%xmm9
884 paddd 96(%rsp),%xmm10
885 paddd 112(%rsp),%xmm11
886
887 movdqa %xmm8,%xmm6
888 punpckldq %xmm9,%xmm8
889 movdqa %xmm10,%xmm7
890 punpckldq %xmm11,%xmm10
891 punpckhdq %xmm9,%xmm6
892 punpckhdq %xmm11,%xmm7
893 movdqa %xmm8,%xmm9
894 punpcklqdq %xmm10,%xmm8
895 movdqa %xmm6,%xmm11
896 punpcklqdq %xmm7,%xmm6
897 punpckhqdq %xmm10,%xmm9
898 punpckhqdq %xmm7,%xmm11
899 paddd 128-256(%rcx),%xmm12
900 paddd 144-256(%rcx),%xmm13
901 paddd 160-256(%rcx),%xmm14
902 paddd 176-256(%rcx),%xmm15
903
904 movdqa %xmm8,0(%rsp)
905 movdqa %xmm9,16(%rsp)
906 movdqa 32(%rsp),%xmm8
907 movdqa 48(%rsp),%xmm9
908
909 movdqa %xmm12,%xmm10
910 punpckldq %xmm13,%xmm12
911 movdqa %xmm14,%xmm7
912 punpckldq %xmm15,%xmm14
913 punpckhdq %xmm13,%xmm10
914 punpckhdq %xmm15,%xmm7
915 movdqa %xmm12,%xmm13
916 punpcklqdq %xmm14,%xmm12
917 movdqa %xmm10,%xmm15
918 punpcklqdq %xmm7,%xmm10
919 punpckhqdq %xmm14,%xmm13
920 punpckhqdq %xmm7,%xmm15
921 paddd 192-256(%rcx),%xmm4
922 paddd 208-256(%rcx),%xmm5
923 paddd 224-256(%rcx),%xmm8
924 paddd 240-256(%rcx),%xmm9
925
926 movdqa %xmm6,32(%rsp)
927 movdqa %xmm11,48(%rsp)
928
929 movdqa %xmm4,%xmm14
930 punpckldq %xmm5,%xmm4
931 movdqa %xmm8,%xmm7
932 punpckldq %xmm9,%xmm8
933 punpckhdq %xmm5,%xmm14
934 punpckhdq %xmm9,%xmm7
935 movdqa %xmm4,%xmm5
936 punpcklqdq %xmm8,%xmm4
937 movdqa %xmm14,%xmm9
938 punpcklqdq %xmm7,%xmm14
939 punpckhqdq %xmm8,%xmm5
940 punpckhqdq %xmm7,%xmm9
941 paddd 256-256(%rcx),%xmm0
942 paddd 272-256(%rcx),%xmm1
943 paddd 288-256(%rcx),%xmm2
944 paddd 304-256(%rcx),%xmm3
945
946 movdqa %xmm0,%xmm8
947 punpckldq %xmm1,%xmm0
948 movdqa %xmm2,%xmm7
949 punpckldq %xmm3,%xmm2
950 punpckhdq %xmm1,%xmm8
951 punpckhdq %xmm3,%xmm7
952 movdqa %xmm0,%xmm1
953 punpcklqdq %xmm2,%xmm0
954 movdqa %xmm8,%xmm3
955 punpcklqdq %xmm7,%xmm8
956 punpckhqdq %xmm2,%xmm1
957 punpckhqdq %xmm7,%xmm3
958 cmpq $256,%rdx
959 jb .Ltail4x
960
961 movdqu 0(%rsi),%xmm6
962 movdqu 16(%rsi),%xmm11
963 movdqu 32(%rsi),%xmm2
964 movdqu 48(%rsi),%xmm7
965 pxor 0(%rsp),%xmm6
966 pxor %xmm12,%xmm11
967 pxor %xmm4,%xmm2
968 pxor %xmm0,%xmm7
969
970 movdqu %xmm6,0(%rdi)
971 movdqu 64(%rsi),%xmm6
972 movdqu %xmm11,16(%rdi)
973 movdqu 80(%rsi),%xmm11
974 movdqu %xmm2,32(%rdi)
975 movdqu 96(%rsi),%xmm2
976 movdqu %xmm7,48(%rdi)
977 movdqu 112(%rsi),%xmm7
978 leaq 128(%rsi),%rsi
979 pxor 16(%rsp),%xmm6
980 pxor %xmm13,%xmm11
981 pxor %xmm5,%xmm2
982 pxor %xmm1,%xmm7
983
984 movdqu %xmm6,64(%rdi)
985 movdqu 0(%rsi),%xmm6
986 movdqu %xmm11,80(%rdi)
987 movdqu 16(%rsi),%xmm11
988 movdqu %xmm2,96(%rdi)
989 movdqu 32(%rsi),%xmm2
990 movdqu %xmm7,112(%rdi)
991 leaq 128(%rdi),%rdi
992 movdqu 48(%rsi),%xmm7
993 pxor 32(%rsp),%xmm6
994 pxor %xmm10,%xmm11
995 pxor %xmm14,%xmm2
996 pxor %xmm8,%xmm7
997
998 movdqu %xmm6,0(%rdi)
999 movdqu 64(%rsi),%xmm6
1000 movdqu %xmm11,16(%rdi)
1001 movdqu 80(%rsi),%xmm11
1002 movdqu %xmm2,32(%rdi)
1003 movdqu 96(%rsi),%xmm2
1004 movdqu %xmm7,48(%rdi)
1005 movdqu 112(%rsi),%xmm7
1006 leaq 128(%rsi),%rsi
1007 pxor 48(%rsp),%xmm6
1008 pxor %xmm15,%xmm11
1009 pxor %xmm9,%xmm2
1010 pxor %xmm3,%xmm7
1011 movdqu %xmm6,64(%rdi)
1012 movdqu %xmm11,80(%rdi)
1013 movdqu %xmm2,96(%rdi)
1014 movdqu %xmm7,112(%rdi)
1015 leaq 128(%rdi),%rdi
1016
1017 subq $256,%rdx
1018 jnz .Loop_outer4x
1019
1020 jmp .Ldone4x
1021
1022 .Ltail4x:
1023 cmpq $192,%rdx
1024 jae .L192_or_more4x
1025 cmpq $128,%rdx
1026 jae .L128_or_more4x
1027 cmpq $64,%rdx
1028 jae .L64_or_more4x
1029
1030
1031 xorq %r10,%r10
1032
1033 movdqa %xmm12,16(%rsp)
1034 movdqa %xmm4,32(%rsp)
1035 movdqa %xmm0,48(%rsp)
1036 jmp .Loop_tail4x
1037
1038 .align 32
1039 .L64_or_more4x:
1040 movdqu 0(%rsi),%xmm6
1041 movdqu 16(%rsi),%xmm11
1042 movdqu 32(%rsi),%xmm2
1043 movdqu 48(%rsi),%xmm7
1044 pxor 0(%rsp),%xmm6
1045 pxor %xmm12,%xmm11
1046 pxor %xmm4,%xmm2
1047 pxor %xmm0,%xmm7
1048 movdqu %xmm6,0(%rdi)
1049 movdqu %xmm11,16(%rdi)
1050 movdqu %xmm2,32(%rdi)
1051 movdqu %xmm7,48(%rdi)
1052 je .Ldone4x
1053
1054 movdqa 16(%rsp),%xmm6
1055 leaq 64(%rsi),%rsi
1056 xorq %r10,%r10
1057 movdqa %xmm6,0(%rsp)
1058 movdqa %xmm13,16(%rsp)
1059 leaq 64(%rdi),%rdi
1060 movdqa %xmm5,32(%rsp)
1061 subq $64,%rdx
1062 movdqa %xmm1,48(%rsp)
1063 jmp .Loop_tail4x
1064
1065 .align 32
1066 .L128_or_more4x:
1067 movdqu 0(%rsi),%xmm6
1068 movdqu 16(%rsi),%xmm11
1069 movdqu 32(%rsi),%xmm2
1070 movdqu 48(%rsi),%xmm7
1071 pxor 0(%rsp),%xmm6
1072 pxor %xmm12,%xmm11
1073 pxor %xmm4,%xmm2
1074 pxor %xmm0,%xmm7
1075
1076 movdqu %xmm6,0(%rdi)
1077 movdqu 64(%rsi),%xmm6
1078 movdqu %xmm11,16(%rdi)
1079 movdqu 80(%rsi),%xmm11
1080 movdqu %xmm2,32(%rdi)
1081 movdqu 96(%rsi),%xmm2
1082 movdqu %xmm7,48(%rdi)
1083 movdqu 112(%rsi),%xmm7
1084 pxor 16(%rsp),%xmm6
1085 pxor %xmm13,%xmm11
1086 pxor %xmm5,%xmm2
1087 pxor %xmm1,%xmm7
1088 movdqu %xmm6,64(%rdi)
1089 movdqu %xmm11,80(%rdi)
1090 movdqu %xmm2,96(%rdi)
1091 movdqu %xmm7,112(%rdi)
1092 je .Ldone4x
1093
1094 movdqa 32(%rsp),%xmm6
1095 leaq 128(%rsi),%rsi
1096 xorq %r10,%r10
1097 movdqa %xmm6,0(%rsp)
1098 movdqa %xmm10,16(%rsp)
1099 leaq 128(%rdi),%rdi
1100 movdqa %xmm14,32(%rsp)
1101 subq $128,%rdx
1102 movdqa %xmm8,48(%rsp)
1103 jmp .Loop_tail4x
1104
1105 .align 32
1106 .L192_or_more4x:
1107 movdqu 0(%rsi),%xmm6
1108 movdqu 16(%rsi),%xmm11
1109 movdqu 32(%rsi),%xmm2
1110 movdqu 48(%rsi),%xmm7
1111 pxor 0(%rsp),%xmm6
1112 pxor %xmm12,%xmm11
1113 pxor %xmm4,%xmm2
1114 pxor %xmm0,%xmm7
1115
1116 movdqu %xmm6,0(%rdi)
1117 movdqu 64(%rsi),%xmm6
1118 movdqu %xmm11,16(%rdi)
1119 movdqu 80(%rsi),%xmm11
1120 movdqu %xmm2,32(%rdi)
1121 movdqu 96(%rsi),%xmm2
1122 movdqu %xmm7,48(%rdi)
1123 movdqu 112(%rsi),%xmm7
1124 leaq 128(%rsi),%rsi
1125 pxor 16(%rsp),%xmm6
1126 pxor %xmm13,%xmm11
1127 pxor %xmm5,%xmm2
1128 pxor %xmm1,%xmm7
1129
1130 movdqu %xmm6,64(%rdi)
1131 movdqu 0(%rsi),%xmm6
1132 movdqu %xmm11,80(%rdi)
1133 movdqu 16(%rsi),%xmm11
1134 movdqu %xmm2,96(%rdi)
1135 movdqu 32(%rsi),%xmm2
1136 movdqu %xmm7,112(%rdi)
1137 leaq 128(%rdi),%rdi
1138 movdqu 48(%rsi),%xmm7
1139 pxor 32(%rsp),%xmm6
1140 pxor %xmm10,%xmm11
1141 pxor %xmm14,%xmm2
1142 pxor %xmm8,%xmm7
1143 movdqu %xmm6,0(%rdi)
1144 movdqu %xmm11,16(%rdi)
1145 movdqu %xmm2,32(%rdi)
1146 movdqu %xmm7,48(%rdi)
1147 je .Ldone4x
1148
1149 movdqa 48(%rsp),%xmm6
1150 leaq 64(%rsi),%rsi
1151 xorq %r10,%r10
1152 movdqa %xmm6,0(%rsp)
1153 movdqa %xmm15,16(%rsp)
1154 leaq 64(%rdi),%rdi
1155 movdqa %xmm9,32(%rsp)
1156 subq $192,%rdx
1157 movdqa %xmm3,48(%rsp)
1158
1159 .Loop_tail4x:
1160 movzbl (%rsi,%r10,1),%eax
1161 movzbl (%rsp,%r10,1),%ecx
1162 leaq 1(%r10),%r10
1163 xorl %ecx,%eax
1164 movb %al,-1(%rdi,%r10,1)
1165 decq %rdx
1166 jnz .Loop_tail4x
1167
1168 .Ldone4x:
1169 leaq (%r9),%rsp
1170 .cfi_def_cfa_register %rsp
1171 .L4x_epilogue:
1172 .byte 0xf3,0xc3
1173 .cfi_endproc
1174 .size ChaCha20_4x,.-ChaCha20_4x
1175 .type ChaCha20_4xop,@function
1176 .align 32
1177 ChaCha20_4xop:
1178 .cfi_startproc
1179 .LChaCha20_4xop:
1180 movq %rsp,%r9
1181 .cfi_def_cfa_register %r9
1182 subq $0x140+8,%rsp
1183 vzeroupper
1184
1185 vmovdqa .Lsigma(%rip),%xmm11
1186 vmovdqu (%rcx),%xmm3
1187 vmovdqu 16(%rcx),%xmm15
1188 vmovdqu (%r8),%xmm7
1189 leaq 256(%rsp),%rcx
1190
1191 vpshufd $0x00,%xmm11,%xmm8
1192 vpshufd $0x55,%xmm11,%xmm9
1193 vmovdqa %xmm8,64(%rsp)
1194 vpshufd $0xaa,%xmm11,%xmm10
1195 vmovdqa %xmm9,80(%rsp)
1196 vpshufd $0xff,%xmm11,%xmm11
1197 vmovdqa %xmm10,96(%rsp)
1198 vmovdqa %xmm11,112(%rsp)
1199
1200 vpshufd $0x00,%xmm3,%xmm0
1201 vpshufd $0x55,%xmm3,%xmm1
1202 vmovdqa %xmm0,128-256(%rcx)
1203 vpshufd $0xaa,%xmm3,%xmm2
1204 vmovdqa %xmm1,144-256(%rcx)
1205 vpshufd $0xff,%xmm3,%xmm3
1206 vmovdqa %xmm2,160-256(%rcx)
1207 vmovdqa %xmm3,176-256(%rcx)
1208
1209 vpshufd $0x00,%xmm15,%xmm12
1210 vpshufd $0x55,%xmm15,%xmm13
1211 vmovdqa %xmm12,192-256(%rcx)
1212 vpshufd $0xaa,%xmm15,%xmm14
1213 vmovdqa %xmm13,208-256(%rcx)
1214 vpshufd $0xff,%xmm15,%xmm15
1215 vmovdqa %xmm14,224-256(%rcx)
1216 vmovdqa %xmm15,240-256(%rcx)
1217
1218 vpshufd $0x00,%xmm7,%xmm4
1219 vpshufd $0x55,%xmm7,%xmm5
1220 vpaddd .Linc(%rip),%xmm4,%xmm4
1221 vpshufd $0xaa,%xmm7,%xmm6
1222 vmovdqa %xmm5,272-256(%rcx)
1223 vpshufd $0xff,%xmm7,%xmm7
1224 vmovdqa %xmm6,288-256(%rcx)
1225 vmovdqa %xmm7,304-256(%rcx)
1226
1227 jmp .Loop_enter4xop
1228
1229 .align 32
1230 .Loop_outer4xop:
1231 vmovdqa 64(%rsp),%xmm8
1232 vmovdqa 80(%rsp),%xmm9
1233 vmovdqa 96(%rsp),%xmm10
1234 vmovdqa 112(%rsp),%xmm11
1235 vmovdqa 128-256(%rcx),%xmm0
1236 vmovdqa 144-256(%rcx),%xmm1
1237 vmovdqa 160-256(%rcx),%xmm2
1238 vmovdqa 176-256(%rcx),%xmm3
1239 vmovdqa 192-256(%rcx),%xmm12
1240 vmovdqa 208-256(%rcx),%xmm13
1241 vmovdqa 224-256(%rcx),%xmm14
1242 vmovdqa 240-256(%rcx),%xmm15
1243 vmovdqa 256-256(%rcx),%xmm4
1244 vmovdqa 272-256(%rcx),%xmm5
1245 vmovdqa 288-256(%rcx),%xmm6
1246 vmovdqa 304-256(%rcx),%xmm7
1247 vpaddd .Lfour(%rip),%xmm4,%xmm4
1248
1249 .Loop_enter4xop:
1250 movl $10,%eax
1251 vmovdqa %xmm4,256-256(%rcx)
1252 jmp .Loop4xop
1253
1254 .align 32
1255 .Loop4xop:
1256 vpaddd %xmm0,%xmm8,%xmm8
1257 vpaddd %xmm1,%xmm9,%xmm9
1258 vpaddd %xmm2,%xmm10,%xmm10
1259 vpaddd %xmm3,%xmm11,%xmm11
1260 vpxor %xmm4,%xmm8,%xmm4
1261 vpxor %xmm5,%xmm9,%xmm5
1262 vpxor %xmm6,%xmm10,%xmm6
1263 vpxor %xmm7,%xmm11,%xmm7
1264 .byte 143,232,120,194,228,16
1265 .byte 143,232,120,194,237,16
1266 .byte 143,232,120,194,246,16
1267 .byte 143,232,120,194,255,16
1268 vpaddd %xmm4,%xmm12,%xmm12
1269 vpaddd %xmm5,%xmm13,%xmm13
1270 vpaddd %xmm6,%xmm14,%xmm14
1271 vpaddd %xmm7,%xmm15,%xmm15
1272 vpxor %xmm0,%xmm12,%xmm0
1273 vpxor %xmm1,%xmm13,%xmm1
1274 vpxor %xmm14,%xmm2,%xmm2
1275 vpxor %xmm15,%xmm3,%xmm3
1276 .byte 143,232,120,194,192,12
1277 .byte 143,232,120,194,201,12
1278 .byte 143,232,120,194,210,12
1279 .byte 143,232,120,194,219,12
1280 vpaddd %xmm8,%xmm0,%xmm8
1281 vpaddd %xmm9,%xmm1,%xmm9
1282 vpaddd %xmm2,%xmm10,%xmm10
1283 vpaddd %xmm3,%xmm11,%xmm11
1284 vpxor %xmm4,%xmm8,%xmm4
1285 vpxor %xmm5,%xmm9,%xmm5
1286 vpxor %xmm6,%xmm10,%xmm6
1287 vpxor %xmm7,%xmm11,%xmm7
1288 .byte 143,232,120,194,228,8
1289 .byte 143,232,120,194,237,8
1290 .byte 143,232,120,194,246,8
1291 .byte 143,232,120,194,255,8
1292 vpaddd %xmm4,%xmm12,%xmm12
1293 vpaddd %xmm5,%xmm13,%xmm13
1294 vpaddd %xmm6,%xmm14,%xmm14
1295 vpaddd %xmm7,%xmm15,%xmm15
1296 vpxor %xmm0,%xmm12,%xmm0
1297 vpxor %xmm1,%xmm13,%xmm1
1298 vpxor %xmm14,%xmm2,%xmm2
1299 vpxor %xmm15,%xmm3,%xmm3
1300 .byte 143,232,120,194,192,7
1301 .byte 143,232,120,194,201,7
1302 .byte 143,232,120,194,210,7
1303 .byte 143,232,120,194,219,7
1304 vpaddd %xmm1,%xmm8,%xmm8
1305 vpaddd %xmm2,%xmm9,%xmm9
1306 vpaddd %xmm3,%xmm10,%xmm10
1307 vpaddd %xmm0,%xmm11,%xmm11
1308 vpxor %xmm7,%xmm8,%xmm7
1309 vpxor %xmm4,%xmm9,%xmm4
1310 vpxor %xmm5,%xmm10,%xmm5
1311 vpxor %xmm6,%xmm11,%xmm6
1312 .byte 143,232,120,194,255,16
1313 .byte 143,232,120,194,228,16
1314 .byte 143,232,120,194,237,16
1315 .byte 143,232,120,194,246,16
1316 vpaddd %xmm7,%xmm14,%xmm14
1317 vpaddd %xmm4,%xmm15,%xmm15
1318 vpaddd %xmm5,%xmm12,%xmm12
1319 vpaddd %xmm6,%xmm13,%xmm13
1320 vpxor %xmm1,%xmm14,%xmm1
1321 vpxor %xmm2,%xmm15,%xmm2
1322 vpxor %xmm12,%xmm3,%xmm3
1323 vpxor %xmm13,%xmm0,%xmm0
1324 .byte 143,232,120,194,201,12
1325 .byte 143,232,120,194,210,12
1326 .byte 143,232,120,194,219,12
1327 .byte 143,232,120,194,192,12
1328 vpaddd %xmm8,%xmm1,%xmm8
1329 vpaddd %xmm9,%xmm2,%xmm9
1330 vpaddd %xmm3,%xmm10,%xmm10
1331 vpaddd %xmm0,%xmm11,%xmm11
1332 vpxor %xmm7,%xmm8,%xmm7
1333 vpxor %xmm4,%xmm9,%xmm4
1334 vpxor %xmm5,%xmm10,%xmm5
1335 vpxor %xmm6,%xmm11,%xmm6
1336 .byte 143,232,120,194,255,8
1337 .byte 143,232,120,194,228,8
1338 .byte 143,232,120,194,237,8
1339 .byte 143,232,120,194,246,8
1340 vpaddd %xmm7,%xmm14,%xmm14
1341 vpaddd %xmm4,%xmm15,%xmm15
1342 vpaddd %xmm5,%xmm12,%xmm12
1343 vpaddd %xmm6,%xmm13,%xmm13
1344 vpxor %xmm1,%xmm14,%xmm1
1345 vpxor %xmm2,%xmm15,%xmm2
1346 vpxor %xmm12,%xmm3,%xmm3
1347 vpxor %xmm13,%xmm0,%xmm0
1348 .byte 143,232,120,194,201,7
1349 .byte 143,232,120,194,210,7
1350 .byte 143,232,120,194,219,7
1351 .byte 143,232,120,194,192,7
1352 decl %eax
1353 jnz .Loop4xop
1354
1355 vpaddd 64(%rsp),%xmm8,%xmm8
1356 vpaddd 80(%rsp),%xmm9,%xmm9
1357 vpaddd 96(%rsp),%xmm10,%xmm10
1358 vpaddd 112(%rsp),%xmm11,%xmm11
1359
1360 vmovdqa %xmm14,32(%rsp)
1361 vmovdqa %xmm15,48(%rsp)
1362
1363 vpunpckldq %xmm9,%xmm8,%xmm14
1364 vpunpckldq %xmm11,%xmm10,%xmm15
1365 vpunpckhdq %xmm9,%xmm8,%xmm8
1366 vpunpckhdq %xmm11,%xmm10,%xmm10
1367 vpunpcklqdq %xmm15,%xmm14,%xmm9
1368 vpunpckhqdq %xmm15,%xmm14,%xmm14
1369 vpunpcklqdq %xmm10,%xmm8,%xmm11
1370 vpunpckhqdq %xmm10,%xmm8,%xmm8
1371 vpaddd 128-256(%rcx),%xmm0,%xmm0
1372 vpaddd 144-256(%rcx),%xmm1,%xmm1
1373 vpaddd 160-256(%rcx),%xmm2,%xmm2
1374 vpaddd 176-256(%rcx),%xmm3,%xmm3
1375
1376 vmovdqa %xmm9,0(%rsp)
1377 vmovdqa %xmm14,16(%rsp)
1378 vmovdqa 32(%rsp),%xmm9
1379 vmovdqa 48(%rsp),%xmm14
1380
1381 vpunpckldq %xmm1,%xmm0,%xmm10
1382 vpunpckldq %xmm3,%xmm2,%xmm15
1383 vpunpckhdq %xmm1,%xmm0,%xmm0
1384 vpunpckhdq %xmm3,%xmm2,%xmm2
1385 vpunpcklqdq %xmm15,%xmm10,%xmm1
1386 vpunpckhqdq %xmm15,%xmm10,%xmm10
1387 vpunpcklqdq %xmm2,%xmm0,%xmm3
1388 vpunpckhqdq %xmm2,%xmm0,%xmm0
1389 vpaddd 192-256(%rcx),%xmm12,%xmm12
1390 vpaddd 208-256(%rcx),%xmm13,%xmm13
1391 vpaddd 224-256(%rcx),%xmm9,%xmm9
1392 vpaddd 240-256(%rcx),%xmm14,%xmm14
1393
1394 vpunpckldq %xmm13,%xmm12,%xmm2
1395 vpunpckldq %xmm14,%xmm9,%xmm15
1396 vpunpckhdq %xmm13,%xmm12,%xmm12
1397 vpunpckhdq %xmm14,%xmm9,%xmm9
1398 vpunpcklqdq %xmm15,%xmm2,%xmm13
1399 vpunpckhqdq %xmm15,%xmm2,%xmm2
1400 vpunpcklqdq %xmm9,%xmm12,%xmm14
1401 vpunpckhqdq %xmm9,%xmm12,%xmm12
1402 vpaddd 256-256(%rcx),%xmm4,%xmm4
1403 vpaddd 272-256(%rcx),%xmm5,%xmm5
1404 vpaddd 288-256(%rcx),%xmm6,%xmm6
1405 vpaddd 304-256(%rcx),%xmm7,%xmm7
1406
1407 vpunpckldq %xmm5,%xmm4,%xmm9
1408 vpunpckldq %xmm7,%xmm6,%xmm15
1409 vpunpckhdq %xmm5,%xmm4,%xmm4
1410 vpunpckhdq %xmm7,%xmm6,%xmm6
1411 vpunpcklqdq %xmm15,%xmm9,%xmm5
1412 vpunpckhqdq %xmm15,%xmm9,%xmm9
1413 vpunpcklqdq %xmm6,%xmm4,%xmm7
1414 vpunpckhqdq %xmm6,%xmm4,%xmm4
1415 vmovdqa 0(%rsp),%xmm6
1416 vmovdqa 16(%rsp),%xmm15
1417
1418 cmpq $256,%rdx
1419 jb .Ltail4xop
1420
1421 vpxor 0(%rsi),%xmm6,%xmm6
1422 vpxor 16(%rsi),%xmm1,%xmm1
1423 vpxor 32(%rsi),%xmm13,%xmm13
1424 vpxor 48(%rsi),%xmm5,%xmm5
1425 vpxor 64(%rsi),%xmm15,%xmm15
1426 vpxor 80(%rsi),%xmm10,%xmm10
1427 vpxor 96(%rsi),%xmm2,%xmm2
1428 vpxor 112(%rsi),%xmm9,%xmm9
1429 leaq 128(%rsi),%rsi
1430 vpxor 0(%rsi),%xmm11,%xmm11
1431 vpxor 16(%rsi),%xmm3,%xmm3
1432 vpxor 32(%rsi),%xmm14,%xmm14
1433 vpxor 48(%rsi),%xmm7,%xmm7
1434 vpxor 64(%rsi),%xmm8,%xmm8
1435 vpxor 80(%rsi),%xmm0,%xmm0
1436 vpxor 96(%rsi),%xmm12,%xmm12
1437 vpxor 112(%rsi),%xmm4,%xmm4
1438 leaq 128(%rsi),%rsi
1439
1440 vmovdqu %xmm6,0(%rdi)
1441 vmovdqu %xmm1,16(%rdi)
1442 vmovdqu %xmm13,32(%rdi)
1443 vmovdqu %xmm5,48(%rdi)
1444 vmovdqu %xmm15,64(%rdi)
1445 vmovdqu %xmm10,80(%rdi)
1446 vmovdqu %xmm2,96(%rdi)
1447 vmovdqu %xmm9,112(%rdi)
1448 leaq 128(%rdi),%rdi
1449 vmovdqu %xmm11,0(%rdi)
1450 vmovdqu %xmm3,16(%rdi)
1451 vmovdqu %xmm14,32(%rdi)
1452 vmovdqu %xmm7,48(%rdi)
1453 vmovdqu %xmm8,64(%rdi)
1454 vmovdqu %xmm0,80(%rdi)
1455 vmovdqu %xmm12,96(%rdi)
1456 vmovdqu %xmm4,112(%rdi)
1457 leaq 128(%rdi),%rdi
1458
1459 subq $256,%rdx
1460 jnz .Loop_outer4xop
1461
1462 jmp .Ldone4xop
1463
1464 .align 32
1465 .Ltail4xop:
1466 cmpq $192,%rdx
1467 jae .L192_or_more4xop
1468 cmpq $128,%rdx
1469 jae .L128_or_more4xop
1470 cmpq $64,%rdx
1471 jae .L64_or_more4xop
1472
1473 xorq %r10,%r10
1474 vmovdqa %xmm6,0(%rsp)
1475 vmovdqa %xmm1,16(%rsp)
1476 vmovdqa %xmm13,32(%rsp)
1477 vmovdqa %xmm5,48(%rsp)
1478 jmp .Loop_tail4xop
1479
1480 .align 32
1481 .L64_or_more4xop:
1482 vpxor 0(%rsi),%xmm6,%xmm6
1483 vpxor 16(%rsi),%xmm1,%xmm1
1484 vpxor 32(%rsi),%xmm13,%xmm13
1485 vpxor 48(%rsi),%xmm5,%xmm5
1486 vmovdqu %xmm6,0(%rdi)
1487 vmovdqu %xmm1,16(%rdi)
1488 vmovdqu %xmm13,32(%rdi)
1489 vmovdqu %xmm5,48(%rdi)
1490 je .Ldone4xop
1491
1492 leaq 64(%rsi),%rsi
1493 vmovdqa %xmm15,0(%rsp)
1494 xorq %r10,%r10
1495 vmovdqa %xmm10,16(%rsp)
1496 leaq 64(%rdi),%rdi
1497 vmovdqa %xmm2,32(%rsp)
1498 subq $64,%rdx
1499 vmovdqa %xmm9,48(%rsp)
1500 jmp .Loop_tail4xop
1501
1502 .align 32
1503 .L128_or_more4xop:
1504 vpxor 0(%rsi),%xmm6,%xmm6
1505 vpxor 16(%rsi),%xmm1,%xmm1
1506 vpxor 32(%rsi),%xmm13,%xmm13
1507 vpxor 48(%rsi),%xmm5,%xmm5
1508 vpxor 64(%rsi),%xmm15,%xmm15
1509 vpxor 80(%rsi),%xmm10,%xmm10
1510 vpxor 96(%rsi),%xmm2,%xmm2
1511 vpxor 112(%rsi),%xmm9,%xmm9
1512
1513 vmovdqu %xmm6,0(%rdi)
1514 vmovdqu %xmm1,16(%rdi)
1515 vmovdqu %xmm13,32(%rdi)
1516 vmovdqu %xmm5,48(%rdi)
1517 vmovdqu %xmm15,64(%rdi)
1518 vmovdqu %xmm10,80(%rdi)
1519 vmovdqu %xmm2,96(%rdi)
1520 vmovdqu %xmm9,112(%rdi)
1521 je .Ldone4xop
1522
1523 leaq 128(%rsi),%rsi
1524 vmovdqa %xmm11,0(%rsp)
1525 xorq %r10,%r10
1526 vmovdqa %xmm3,16(%rsp)
1527 leaq 128(%rdi),%rdi
1528 vmovdqa %xmm14,32(%rsp)
1529 subq $128,%rdx
1530 vmovdqa %xmm7,48(%rsp)
1531 jmp .Loop_tail4xop
1532
1533 .align 32
1534 .L192_or_more4xop:
1535 vpxor 0(%rsi),%xmm6,%xmm6
1536 vpxor 16(%rsi),%xmm1,%xmm1
1537 vpxor 32(%rsi),%xmm13,%xmm13
1538 vpxor 48(%rsi),%xmm5,%xmm5
1539 vpxor 64(%rsi),%xmm15,%xmm15
1540 vpxor 80(%rsi),%xmm10,%xmm10
1541 vpxor 96(%rsi),%xmm2,%xmm2
1542 vpxor 112(%rsi),%xmm9,%xmm9
1543 leaq 128(%rsi),%rsi
1544 vpxor 0(%rsi),%xmm11,%xmm11
1545 vpxor 16(%rsi),%xmm3,%xmm3
1546 vpxor 32(%rsi),%xmm14,%xmm14
1547 vpxor 48(%rsi),%xmm7,%xmm7
1548
1549 vmovdqu %xmm6,0(%rdi)
1550 vmovdqu %xmm1,16(%rdi)
1551 vmovdqu %xmm13,32(%rdi)
1552 vmovdqu %xmm5,48(%rdi)
1553 vmovdqu %xmm15,64(%rdi)
1554 vmovdqu %xmm10,80(%rdi)
1555 vmovdqu %xmm2,96(%rdi)
1556 vmovdqu %xmm9,112(%rdi)
1557 leaq 128(%rdi),%rdi
1558 vmovdqu %xmm11,0(%rdi)
1559 vmovdqu %xmm3,16(%rdi)
1560 vmovdqu %xmm14,32(%rdi)
1561 vmovdqu %xmm7,48(%rdi)
1562 je .Ldone4xop
1563
1564 leaq 64(%rsi),%rsi
1565 vmovdqa %xmm8,0(%rsp)
1566 xorq %r10,%r10
1567 vmovdqa %xmm0,16(%rsp)
1568 leaq 64(%rdi),%rdi
1569 vmovdqa %xmm12,32(%rsp)
1570 subq $192,%rdx
1571 vmovdqa %xmm4,48(%rsp)
1572
1573 .Loop_tail4xop:
1574 movzbl (%rsi,%r10,1),%eax
1575 movzbl (%rsp,%r10,1),%ecx
1576 leaq 1(%r10),%r10
1577 xorl %ecx,%eax
1578 movb %al,-1(%rdi,%r10,1)
1579 decq %rdx
1580 jnz .Loop_tail4xop
1581
1582 .Ldone4xop:
1583 vzeroupper
1584 leaq (%r9),%rsp
1585 .cfi_def_cfa_register %rsp
1586 .L4xop_epilogue:
1587 .byte 0xf3,0xc3
1588 .cfi_endproc
1589 .size ChaCha20_4xop,.-ChaCha20_4xop
1590 .type ChaCha20_8x,@function
1591 .align 32
1592 ChaCha20_8x:
1593 .cfi_startproc
1594 .LChaCha20_8x:
1595 movq %rsp,%r9
1596 .cfi_def_cfa_register %r9
1597 subq $0x280+8,%rsp
1598 andq $-32,%rsp
1599 vzeroupper
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610 vbroadcasti128 .Lsigma(%rip),%ymm11
1611 vbroadcasti128 (%rcx),%ymm3
1612 vbroadcasti128 16(%rcx),%ymm15
1613 vbroadcasti128 (%r8),%ymm7
1614 leaq 256(%rsp),%rcx
1615 leaq 512(%rsp),%rax
1616 leaq .Lrot16(%rip),%r10
1617 leaq .Lrot24(%rip),%r11
1618
1619 vpshufd $0x00,%ymm11,%ymm8
1620 vpshufd $0x55,%ymm11,%ymm9
1621 vmovdqa %ymm8,128-256(%rcx)
1622 vpshufd $0xaa,%ymm11,%ymm10
1623 vmovdqa %ymm9,160-256(%rcx)
1624 vpshufd $0xff,%ymm11,%ymm11
1625 vmovdqa %ymm10,192-256(%rcx)
1626 vmovdqa %ymm11,224-256(%rcx)
1627
1628 vpshufd $0x00,%ymm3,%ymm0
1629 vpshufd $0x55,%ymm3,%ymm1
1630 vmovdqa %ymm0,256-256(%rcx)
1631 vpshufd $0xaa,%ymm3,%ymm2
1632 vmovdqa %ymm1,288-256(%rcx)
1633 vpshufd $0xff,%ymm3,%ymm3
1634 vmovdqa %ymm2,320-256(%rcx)
1635 vmovdqa %ymm3,352-256(%rcx)
1636
1637 vpshufd $0x00,%ymm15,%ymm12
1638 vpshufd $0x55,%ymm15,%ymm13
1639 vmovdqa %ymm12,384-512(%rax)
1640 vpshufd $0xaa,%ymm15,%ymm14
1641 vmovdqa %ymm13,416-512(%rax)
1642 vpshufd $0xff,%ymm15,%ymm15
1643 vmovdqa %ymm14,448-512(%rax)
1644 vmovdqa %ymm15,480-512(%rax)
1645
1646 vpshufd $0x00,%ymm7,%ymm4
1647 vpshufd $0x55,%ymm7,%ymm5
1648 vpaddd .Lincy(%rip),%ymm4,%ymm4
1649 vpshufd $0xaa,%ymm7,%ymm6
1650 vmovdqa %ymm5,544-512(%rax)
1651 vpshufd $0xff,%ymm7,%ymm7
1652 vmovdqa %ymm6,576-512(%rax)
1653 vmovdqa %ymm7,608-512(%rax)
1654
1655 jmp .Loop_enter8x
1656
1657 .align 32
1658 .Loop_outer8x:
1659 vmovdqa 128-256(%rcx),%ymm8
1660 vmovdqa 160-256(%rcx),%ymm9
1661 vmovdqa 192-256(%rcx),%ymm10
1662 vmovdqa 224-256(%rcx),%ymm11
1663 vmovdqa 256-256(%rcx),%ymm0
1664 vmovdqa 288-256(%rcx),%ymm1
1665 vmovdqa 320-256(%rcx),%ymm2
1666 vmovdqa 352-256(%rcx),%ymm3
1667 vmovdqa 384-512(%rax),%ymm12
1668 vmovdqa 416-512(%rax),%ymm13
1669 vmovdqa 448-512(%rax),%ymm14
1670 vmovdqa 480-512(%rax),%ymm15
1671 vmovdqa 512-512(%rax),%ymm4
1672 vmovdqa 544-512(%rax),%ymm5
1673 vmovdqa 576-512(%rax),%ymm6
1674 vmovdqa 608-512(%rax),%ymm7
1675 vpaddd .Leight(%rip),%ymm4,%ymm4
1676
1677 .Loop_enter8x:
1678 vmovdqa %ymm14,64(%rsp)
1679 vmovdqa %ymm15,96(%rsp)
1680 vbroadcasti128 (%r10),%ymm15
1681 vmovdqa %ymm4,512-512(%rax)
1682 movl $10,%eax
1683 jmp .Loop8x
1684
1685 .align 32
1686 .Loop8x:
1687 vpaddd %ymm0,%ymm8,%ymm8
1688 vpxor %ymm4,%ymm8,%ymm4
1689 vpshufb %ymm15,%ymm4,%ymm4
1690 vpaddd %ymm1,%ymm9,%ymm9
1691 vpxor %ymm5,%ymm9,%ymm5
1692 vpshufb %ymm15,%ymm5,%ymm5
1693 vpaddd %ymm4,%ymm12,%ymm12
1694 vpxor %ymm0,%ymm12,%ymm0
1695 vpslld $12,%ymm0,%ymm14
1696 vpsrld $20,%ymm0,%ymm0
1697 vpor %ymm0,%ymm14,%ymm0
1698 vbroadcasti128 (%r11),%ymm14
1699 vpaddd %ymm5,%ymm13,%ymm13
1700 vpxor %ymm1,%ymm13,%ymm1
1701 vpslld $12,%ymm1,%ymm15
1702 vpsrld $20,%ymm1,%ymm1
1703 vpor %ymm1,%ymm15,%ymm1
1704 vpaddd %ymm0,%ymm8,%ymm8
1705 vpxor %ymm4,%ymm8,%ymm4
1706 vpshufb %ymm14,%ymm4,%ymm4
1707 vpaddd %ymm1,%ymm9,%ymm9
1708 vpxor %ymm5,%ymm9,%ymm5
1709 vpshufb %ymm14,%ymm5,%ymm5
1710 vpaddd %ymm4,%ymm12,%ymm12
1711 vpxor %ymm0,%ymm12,%ymm0
1712 vpslld $7,%ymm0,%ymm15
1713 vpsrld $25,%ymm0,%ymm0
1714 vpor %ymm0,%ymm15,%ymm0
1715 vbroadcasti128 (%r10),%ymm15
1716 vpaddd %ymm5,%ymm13,%ymm13
1717 vpxor %ymm1,%ymm13,%ymm1
1718 vpslld $7,%ymm1,%ymm14
1719 vpsrld $25,%ymm1,%ymm1
1720 vpor %ymm1,%ymm14,%ymm1
1721 vmovdqa %ymm12,0(%rsp)
1722 vmovdqa %ymm13,32(%rsp)
1723 vmovdqa 64(%rsp),%ymm12
1724 vmovdqa 96(%rsp),%ymm13
1725 vpaddd %ymm2,%ymm10,%ymm10
1726 vpxor %ymm6,%ymm10,%ymm6
1727 vpshufb %ymm15,%ymm6,%ymm6
1728 vpaddd %ymm3,%ymm11,%ymm11
1729 vpxor %ymm7,%ymm11,%ymm7
1730 vpshufb %ymm15,%ymm7,%ymm7
1731 vpaddd %ymm6,%ymm12,%ymm12
1732 vpxor %ymm2,%ymm12,%ymm2
1733 vpslld $12,%ymm2,%ymm14
1734 vpsrld $20,%ymm2,%ymm2
1735 vpor %ymm2,%ymm14,%ymm2
1736 vbroadcasti128 (%r11),%ymm14
1737 vpaddd %ymm7,%ymm13,%ymm13
1738 vpxor %ymm3,%ymm13,%ymm3
1739 vpslld $12,%ymm3,%ymm15
1740 vpsrld $20,%ymm3,%ymm3
1741 vpor %ymm3,%ymm15,%ymm3
1742 vpaddd %ymm2,%ymm10,%ymm10
1743 vpxor %ymm6,%ymm10,%ymm6
1744 vpshufb %ymm14,%ymm6,%ymm6
1745 vpaddd %ymm3,%ymm11,%ymm11
1746 vpxor %ymm7,%ymm11,%ymm7
1747 vpshufb %ymm14,%ymm7,%ymm7
1748 vpaddd %ymm6,%ymm12,%ymm12
1749 vpxor %ymm2,%ymm12,%ymm2
1750 vpslld $7,%ymm2,%ymm15
1751 vpsrld $25,%ymm2,%ymm2
1752 vpor %ymm2,%ymm15,%ymm2
1753 vbroadcasti128 (%r10),%ymm15
1754 vpaddd %ymm7,%ymm13,%ymm13
1755 vpxor %ymm3,%ymm13,%ymm3
1756 vpslld $7,%ymm3,%ymm14
1757 vpsrld $25,%ymm3,%ymm3
1758 vpor %ymm3,%ymm14,%ymm3
1759 vpaddd %ymm1,%ymm8,%ymm8
1760 vpxor %ymm7,%ymm8,%ymm7
1761 vpshufb %ymm15,%ymm7,%ymm7
1762 vpaddd %ymm2,%ymm9,%ymm9
1763 vpxor %ymm4,%ymm9,%ymm4
1764 vpshufb %ymm15,%ymm4,%ymm4
1765 vpaddd %ymm7,%ymm12,%ymm12
1766 vpxor %ymm1,%ymm12,%ymm1
1767 vpslld $12,%ymm1,%ymm14
1768 vpsrld $20,%ymm1,%ymm1
1769 vpor %ymm1,%ymm14,%ymm1
1770 vbroadcasti128 (%r11),%ymm14
1771 vpaddd %ymm4,%ymm13,%ymm13
1772 vpxor %ymm2,%ymm13,%ymm2
1773 vpslld $12,%ymm2,%ymm15
1774 vpsrld $20,%ymm2,%ymm2
1775 vpor %ymm2,%ymm15,%ymm2
1776 vpaddd %ymm1,%ymm8,%ymm8
1777 vpxor %ymm7,%ymm8,%ymm7
1778 vpshufb %ymm14,%ymm7,%ymm7
1779 vpaddd %ymm2,%ymm9,%ymm9
1780 vpxor %ymm4,%ymm9,%ymm4
1781 vpshufb %ymm14,%ymm4,%ymm4
1782 vpaddd %ymm7,%ymm12,%ymm12
1783 vpxor %ymm1,%ymm12,%ymm1
1784 vpslld $7,%ymm1,%ymm15
1785 vpsrld $25,%ymm1,%ymm1
1786 vpor %ymm1,%ymm15,%ymm1
1787 vbroadcasti128 (%r10),%ymm15
1788 vpaddd %ymm4,%ymm13,%ymm13
1789 vpxor %ymm2,%ymm13,%ymm2
1790 vpslld $7,%ymm2,%ymm14
1791 vpsrld $25,%ymm2,%ymm2
1792 vpor %ymm2,%ymm14,%ymm2
1793 vmovdqa %ymm12,64(%rsp)
1794 vmovdqa %ymm13,96(%rsp)
1795 vmovdqa 0(%rsp),%ymm12
1796 vmovdqa 32(%rsp),%ymm13
1797 vpaddd %ymm3,%ymm10,%ymm10
1798 vpxor %ymm5,%ymm10,%ymm5
1799 vpshufb %ymm15,%ymm5,%ymm5
1800 vpaddd %ymm0,%ymm11,%ymm11
1801 vpxor %ymm6,%ymm11,%ymm6
1802 vpshufb %ymm15,%ymm6,%ymm6
1803 vpaddd %ymm5,%ymm12,%ymm12
1804 vpxor %ymm3,%ymm12,%ymm3
1805 vpslld $12,%ymm3,%ymm14
1806 vpsrld $20,%ymm3,%ymm3
1807 vpor %ymm3,%ymm14,%ymm3
1808 vbroadcasti128 (%r11),%ymm14
1809 vpaddd %ymm6,%ymm13,%ymm13
1810 vpxor %ymm0,%ymm13,%ymm0
1811 vpslld $12,%ymm0,%ymm15
1812 vpsrld $20,%ymm0,%ymm0
1813 vpor %ymm0,%ymm15,%ymm0
1814 vpaddd %ymm3,%ymm10,%ymm10
1815 vpxor %ymm5,%ymm10,%ymm5
1816 vpshufb %ymm14,%ymm5,%ymm5
1817 vpaddd %ymm0,%ymm11,%ymm11
1818 vpxor %ymm6,%ymm11,%ymm6
1819 vpshufb %ymm14,%ymm6,%ymm6
1820 vpaddd %ymm5,%ymm12,%ymm12
1821 vpxor %ymm3,%ymm12,%ymm3
1822 vpslld $7,%ymm3,%ymm15
1823 vpsrld $25,%ymm3,%ymm3
1824 vpor %ymm3,%ymm15,%ymm3
1825 vbroadcasti128 (%r10),%ymm15
1826 vpaddd %ymm6,%ymm13,%ymm13
1827 vpxor %ymm0,%ymm13,%ymm0
1828 vpslld $7,%ymm0,%ymm14
1829 vpsrld $25,%ymm0,%ymm0
1830 vpor %ymm0,%ymm14,%ymm0
1831 decl %eax
1832 jnz .Loop8x
1833
1834 leaq 512(%rsp),%rax
1835 vpaddd 128-256(%rcx),%ymm8,%ymm8
1836 vpaddd 160-256(%rcx),%ymm9,%ymm9
1837 vpaddd 192-256(%rcx),%ymm10,%ymm10
1838 vpaddd 224-256(%rcx),%ymm11,%ymm11
1839
1840 vpunpckldq %ymm9,%ymm8,%ymm14
1841 vpunpckldq %ymm11,%ymm10,%ymm15
1842 vpunpckhdq %ymm9,%ymm8,%ymm8
1843 vpunpckhdq %ymm11,%ymm10,%ymm10
1844 vpunpcklqdq %ymm15,%ymm14,%ymm9
1845 vpunpckhqdq %ymm15,%ymm14,%ymm14
1846 vpunpcklqdq %ymm10,%ymm8,%ymm11
1847 vpunpckhqdq %ymm10,%ymm8,%ymm8
1848 vpaddd 256-256(%rcx),%ymm0,%ymm0
1849 vpaddd 288-256(%rcx),%ymm1,%ymm1
1850 vpaddd 320-256(%rcx),%ymm2,%ymm2
1851 vpaddd 352-256(%rcx),%ymm3,%ymm3
1852
1853 vpunpckldq %ymm1,%ymm0,%ymm10
1854 vpunpckldq %ymm3,%ymm2,%ymm15
1855 vpunpckhdq %ymm1,%ymm0,%ymm0
1856 vpunpckhdq %ymm3,%ymm2,%ymm2
1857 vpunpcklqdq %ymm15,%ymm10,%ymm1
1858 vpunpckhqdq %ymm15,%ymm10,%ymm10
1859 vpunpcklqdq %ymm2,%ymm0,%ymm3
1860 vpunpckhqdq %ymm2,%ymm0,%ymm0
1861 vperm2i128 $0x20,%ymm1,%ymm9,%ymm15
1862 vperm2i128 $0x31,%ymm1,%ymm9,%ymm1
1863 vperm2i128 $0x20,%ymm10,%ymm14,%ymm9
1864 vperm2i128 $0x31,%ymm10,%ymm14,%ymm10
1865 vperm2i128 $0x20,%ymm3,%ymm11,%ymm14
1866 vperm2i128 $0x31,%ymm3,%ymm11,%ymm3
1867 vperm2i128 $0x20,%ymm0,%ymm8,%ymm11
1868 vperm2i128 $0x31,%ymm0,%ymm8,%ymm0
1869 vmovdqa %ymm15,0(%rsp)
1870 vmovdqa %ymm9,32(%rsp)
1871 vmovdqa 64(%rsp),%ymm15
1872 vmovdqa 96(%rsp),%ymm9
1873
1874 vpaddd 384-512(%rax),%ymm12,%ymm12
1875 vpaddd 416-512(%rax),%ymm13,%ymm13
1876 vpaddd 448-512(%rax),%ymm15,%ymm15
1877 vpaddd 480-512(%rax),%ymm9,%ymm9
1878
1879 vpunpckldq %ymm13,%ymm12,%ymm2
1880 vpunpckldq %ymm9,%ymm15,%ymm8
1881 vpunpckhdq %ymm13,%ymm12,%ymm12
1882 vpunpckhdq %ymm9,%ymm15,%ymm15
1883 vpunpcklqdq %ymm8,%ymm2,%ymm13
1884 vpunpckhqdq %ymm8,%ymm2,%ymm2
1885 vpunpcklqdq %ymm15,%ymm12,%ymm9
1886 vpunpckhqdq %ymm15,%ymm12,%ymm12
1887 vpaddd 512-512(%rax),%ymm4,%ymm4
1888 vpaddd 544-512(%rax),%ymm5,%ymm5
1889 vpaddd 576-512(%rax),%ymm6,%ymm6
1890 vpaddd 608-512(%rax),%ymm7,%ymm7
1891
1892 vpunpckldq %ymm5,%ymm4,%ymm15
1893 vpunpckldq %ymm7,%ymm6,%ymm8
1894 vpunpckhdq %ymm5,%ymm4,%ymm4
1895 vpunpckhdq %ymm7,%ymm6,%ymm6
1896 vpunpcklqdq %ymm8,%ymm15,%ymm5
1897 vpunpckhqdq %ymm8,%ymm15,%ymm15
1898 vpunpcklqdq %ymm6,%ymm4,%ymm7
1899 vpunpckhqdq %ymm6,%ymm4,%ymm4
1900 vperm2i128 $0x20,%ymm5,%ymm13,%ymm8
1901 vperm2i128 $0x31,%ymm5,%ymm13,%ymm5
1902 vperm2i128 $0x20,%ymm15,%ymm2,%ymm13
1903 vperm2i128 $0x31,%ymm15,%ymm2,%ymm15
1904 vperm2i128 $0x20,%ymm7,%ymm9,%ymm2
1905 vperm2i128 $0x31,%ymm7,%ymm9,%ymm7
1906 vperm2i128 $0x20,%ymm4,%ymm12,%ymm9
1907 vperm2i128 $0x31,%ymm4,%ymm12,%ymm4
1908 vmovdqa 0(%rsp),%ymm6
1909 vmovdqa 32(%rsp),%ymm12
1910
1911 cmpq $512,%rdx
1912 jb .Ltail8x
1913
1914 vpxor 0(%rsi),%ymm6,%ymm6
1915 vpxor 32(%rsi),%ymm8,%ymm8
1916 vpxor 64(%rsi),%ymm1,%ymm1
1917 vpxor 96(%rsi),%ymm5,%ymm5
1918 leaq 128(%rsi),%rsi
1919 vmovdqu %ymm6,0(%rdi)
1920 vmovdqu %ymm8,32(%rdi)
1921 vmovdqu %ymm1,64(%rdi)
1922 vmovdqu %ymm5,96(%rdi)
1923 leaq 128(%rdi),%rdi
1924
1925 vpxor 0(%rsi),%ymm12,%ymm12
1926 vpxor 32(%rsi),%ymm13,%ymm13
1927 vpxor 64(%rsi),%ymm10,%ymm10
1928 vpxor 96(%rsi),%ymm15,%ymm15
1929 leaq 128(%rsi),%rsi
1930 vmovdqu %ymm12,0(%rdi)
1931 vmovdqu %ymm13,32(%rdi)
1932 vmovdqu %ymm10,64(%rdi)
1933 vmovdqu %ymm15,96(%rdi)
1934 leaq 128(%rdi),%rdi
1935
1936 vpxor 0(%rsi),%ymm14,%ymm14
1937 vpxor 32(%rsi),%ymm2,%ymm2
1938 vpxor 64(%rsi),%ymm3,%ymm3
1939 vpxor 96(%rsi),%ymm7,%ymm7
1940 leaq 128(%rsi),%rsi
1941 vmovdqu %ymm14,0(%rdi)
1942 vmovdqu %ymm2,32(%rdi)
1943 vmovdqu %ymm3,64(%rdi)
1944 vmovdqu %ymm7,96(%rdi)
1945 leaq 128(%rdi),%rdi
1946
1947 vpxor 0(%rsi),%ymm11,%ymm11
1948 vpxor 32(%rsi),%ymm9,%ymm9
1949 vpxor 64(%rsi),%ymm0,%ymm0
1950 vpxor 96(%rsi),%ymm4,%ymm4
1951 leaq 128(%rsi),%rsi
1952 vmovdqu %ymm11,0(%rdi)
1953 vmovdqu %ymm9,32(%rdi)
1954 vmovdqu %ymm0,64(%rdi)
1955 vmovdqu %ymm4,96(%rdi)
1956 leaq 128(%rdi),%rdi
1957
1958 subq $512,%rdx
1959 jnz .Loop_outer8x
1960
1961 jmp .Ldone8x
1962
1963 .Ltail8x:
1964 cmpq $448,%rdx
1965 jae .L448_or_more8x
1966 cmpq $384,%rdx
1967 jae .L384_or_more8x
1968 cmpq $320,%rdx
1969 jae .L320_or_more8x
1970 cmpq $256,%rdx
1971 jae .L256_or_more8x
1972 cmpq $192,%rdx
1973 jae .L192_or_more8x
1974 cmpq $128,%rdx
1975 jae .L128_or_more8x
1976 cmpq $64,%rdx
1977 jae .L64_or_more8x
1978
1979 xorq %r10,%r10
1980 vmovdqa %ymm6,0(%rsp)
1981 vmovdqa %ymm8,32(%rsp)
1982 jmp .Loop_tail8x
1983
1984 .align 32
1985 .L64_or_more8x:
1986 vpxor 0(%rsi),%ymm6,%ymm6
1987 vpxor 32(%rsi),%ymm8,%ymm8
1988 vmovdqu %ymm6,0(%rdi)
1989 vmovdqu %ymm8,32(%rdi)
1990 je .Ldone8x
1991
1992 leaq 64(%rsi),%rsi
1993 xorq %r10,%r10
1994 vmovdqa %ymm1,0(%rsp)
1995 leaq 64(%rdi),%rdi
1996 subq $64,%rdx
1997 vmovdqa %ymm5,32(%rsp)
1998 jmp .Loop_tail8x
1999
2000 .align 32
2001 .L128_or_more8x:
2002 vpxor 0(%rsi),%ymm6,%ymm6
2003 vpxor 32(%rsi),%ymm8,%ymm8
2004 vpxor 64(%rsi),%ymm1,%ymm1
2005 vpxor 96(%rsi),%ymm5,%ymm5
2006 vmovdqu %ymm6,0(%rdi)
2007 vmovdqu %ymm8,32(%rdi)
2008 vmovdqu %ymm1,64(%rdi)
2009 vmovdqu %ymm5,96(%rdi)
2010 je .Ldone8x
2011
2012 leaq 128(%rsi),%rsi
2013 xorq %r10,%r10
2014 vmovdqa %ymm12,0(%rsp)
2015 leaq 128(%rdi),%rdi
2016 subq $128,%rdx
2017 vmovdqa %ymm13,32(%rsp)
2018 jmp .Loop_tail8x
2019
2020 .align 32
2021 .L192_or_more8x:
2022 vpxor 0(%rsi),%ymm6,%ymm6
2023 vpxor 32(%rsi),%ymm8,%ymm8
2024 vpxor 64(%rsi),%ymm1,%ymm1
2025 vpxor 96(%rsi),%ymm5,%ymm5
2026 vpxor 128(%rsi),%ymm12,%ymm12
2027 vpxor 160(%rsi),%ymm13,%ymm13
2028 vmovdqu %ymm6,0(%rdi)
2029 vmovdqu %ymm8,32(%rdi)
2030 vmovdqu %ymm1,64(%rdi)
2031 vmovdqu %ymm5,96(%rdi)
2032 vmovdqu %ymm12,128(%rdi)
2033 vmovdqu %ymm13,160(%rdi)
2034 je .Ldone8x
2035
2036 leaq 192(%rsi),%rsi
2037 xorq %r10,%r10
2038 vmovdqa %ymm10,0(%rsp)
2039 leaq 192(%rdi),%rdi
2040 subq $192,%rdx
2041 vmovdqa %ymm15,32(%rsp)
2042 jmp .Loop_tail8x
2043
2044 .align 32
2045 .L256_or_more8x:
2046 vpxor 0(%rsi),%ymm6,%ymm6
2047 vpxor 32(%rsi),%ymm8,%ymm8
2048 vpxor 64(%rsi),%ymm1,%ymm1
2049 vpxor 96(%rsi),%ymm5,%ymm5
2050 vpxor 128(%rsi),%ymm12,%ymm12
2051 vpxor 160(%rsi),%ymm13,%ymm13
2052 vpxor 192(%rsi),%ymm10,%ymm10
2053 vpxor 224(%rsi),%ymm15,%ymm15
2054 vmovdqu %ymm6,0(%rdi)
2055 vmovdqu %ymm8,32(%rdi)
2056 vmovdqu %ymm1,64(%rdi)
2057 vmovdqu %ymm5,96(%rdi)
2058 vmovdqu %ymm12,128(%rdi)
2059 vmovdqu %ymm13,160(%rdi)
2060 vmovdqu %ymm10,192(%rdi)
2061 vmovdqu %ymm15,224(%rdi)
2062 je .Ldone8x
2063
2064 leaq 256(%rsi),%rsi
2065 xorq %r10,%r10
2066 vmovdqa %ymm14,0(%rsp)
2067 leaq 256(%rdi),%rdi
2068 subq $256,%rdx
2069 vmovdqa %ymm2,32(%rsp)
2070 jmp .Loop_tail8x
2071
2072 .align 32
2073 .L320_or_more8x:
2074 vpxor 0(%rsi),%ymm6,%ymm6
2075 vpxor 32(%rsi),%ymm8,%ymm8
2076 vpxor 64(%rsi),%ymm1,%ymm1
2077 vpxor 96(%rsi),%ymm5,%ymm5
2078 vpxor 128(%rsi),%ymm12,%ymm12
2079 vpxor 160(%rsi),%ymm13,%ymm13
2080 vpxor 192(%rsi),%ymm10,%ymm10
2081 vpxor 224(%rsi),%ymm15,%ymm15
2082 vpxor 256(%rsi),%ymm14,%ymm14
2083 vpxor 288(%rsi),%ymm2,%ymm2
2084 vmovdqu %ymm6,0(%rdi)
2085 vmovdqu %ymm8,32(%rdi)
2086 vmovdqu %ymm1,64(%rdi)
2087 vmovdqu %ymm5,96(%rdi)
2088 vmovdqu %ymm12,128(%rdi)
2089 vmovdqu %ymm13,160(%rdi)
2090 vmovdqu %ymm10,192(%rdi)
2091 vmovdqu %ymm15,224(%rdi)
2092 vmovdqu %ymm14,256(%rdi)
2093 vmovdqu %ymm2,288(%rdi)
2094 je .Ldone8x
2095
2096 leaq 320(%rsi),%rsi
2097 xorq %r10,%r10
2098 vmovdqa %ymm3,0(%rsp)
2099 leaq 320(%rdi),%rdi
2100 subq $320,%rdx
2101 vmovdqa %ymm7,32(%rsp)
2102 jmp .Loop_tail8x
2103
2104 .align 32
2105 .L384_or_more8x:
2106 vpxor 0(%rsi),%ymm6,%ymm6
2107 vpxor 32(%rsi),%ymm8,%ymm8
2108 vpxor 64(%rsi),%ymm1,%ymm1
2109 vpxor 96(%rsi),%ymm5,%ymm5
2110 vpxor 128(%rsi),%ymm12,%ymm12
2111 vpxor 160(%rsi),%ymm13,%ymm13
2112 vpxor 192(%rsi),%ymm10,%ymm10
2113 vpxor 224(%rsi),%ymm15,%ymm15
2114 vpxor 256(%rsi),%ymm14,%ymm14
2115 vpxor 288(%rsi),%ymm2,%ymm2
2116 vpxor 320(%rsi),%ymm3,%ymm3
2117 vpxor 352(%rsi),%ymm7,%ymm7
2118 vmovdqu %ymm6,0(%rdi)
2119 vmovdqu %ymm8,32(%rdi)
2120 vmovdqu %ymm1,64(%rdi)
2121 vmovdqu %ymm5,96(%rdi)
2122 vmovdqu %ymm12,128(%rdi)
2123 vmovdqu %ymm13,160(%rdi)
2124 vmovdqu %ymm10,192(%rdi)
2125 vmovdqu %ymm15,224(%rdi)
2126 vmovdqu %ymm14,256(%rdi)
2127 vmovdqu %ymm2,288(%rdi)
2128 vmovdqu %ymm3,320(%rdi)
2129 vmovdqu %ymm7,352(%rdi)
2130 je .Ldone8x
2131
2132 leaq 384(%rsi),%rsi
2133 xorq %r10,%r10
2134 vmovdqa %ymm11,0(%rsp)
2135 leaq 384(%rdi),%rdi
2136 subq $384,%rdx
2137 vmovdqa %ymm9,32(%rsp)
2138 jmp .Loop_tail8x
2139
2140 .align 32
2141 .L448_or_more8x:
2142 vpxor 0(%rsi),%ymm6,%ymm6
2143 vpxor 32(%rsi),%ymm8,%ymm8
2144 vpxor 64(%rsi),%ymm1,%ymm1
2145 vpxor 96(%rsi),%ymm5,%ymm5
2146 vpxor 128(%rsi),%ymm12,%ymm12
2147 vpxor 160(%rsi),%ymm13,%ymm13
2148 vpxor 192(%rsi),%ymm10,%ymm10
2149 vpxor 224(%rsi),%ymm15,%ymm15
2150 vpxor 256(%rsi),%ymm14,%ymm14
2151 vpxor 288(%rsi),%ymm2,%ymm2
2152 vpxor 320(%rsi),%ymm3,%ymm3
2153 vpxor 352(%rsi),%ymm7,%ymm7
2154 vpxor 384(%rsi),%ymm11,%ymm11
2155 vpxor 416(%rsi),%ymm9,%ymm9
2156 vmovdqu %ymm6,0(%rdi)
2157 vmovdqu %ymm8,32(%rdi)
2158 vmovdqu %ymm1,64(%rdi)
2159 vmovdqu %ymm5,96(%rdi)
2160 vmovdqu %ymm12,128(%rdi)
2161 vmovdqu %ymm13,160(%rdi)
2162 vmovdqu %ymm10,192(%rdi)
2163 vmovdqu %ymm15,224(%rdi)
2164 vmovdqu %ymm14,256(%rdi)
2165 vmovdqu %ymm2,288(%rdi)
2166 vmovdqu %ymm3,320(%rdi)
2167 vmovdqu %ymm7,352(%rdi)
2168 vmovdqu %ymm11,384(%rdi)
2169 vmovdqu %ymm9,416(%rdi)
2170 je .Ldone8x
2171
2172 leaq 448(%rsi),%rsi
2173 xorq %r10,%r10
2174 vmovdqa %ymm0,0(%rsp)
2175 leaq 448(%rdi),%rdi
2176 subq $448,%rdx
2177 vmovdqa %ymm4,32(%rsp)
2178
2179 .Loop_tail8x:
2180 movzbl (%rsi,%r10,1),%eax
2181 movzbl (%rsp,%r10,1),%ecx
2182 leaq 1(%r10),%r10
2183 xorl %ecx,%eax
2184 movb %al,-1(%rdi,%r10,1)
2185 decq %rdx
2186 jnz .Loop_tail8x
2187
2188 .Ldone8x:
2189 vzeroall
2190 leaq (%r9),%rsp
2191 .cfi_def_cfa_register %rsp
2192 .L8x_epilogue:
2193 .byte 0xf3,0xc3
2194 .cfi_endproc
2195 .size ChaCha20_8x,.-ChaCha20_8x
Cache object: 1f14a43c4d6c14bf7a0f038fa415b4a0
|