]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - secure/lib/libcrypto/amd64/chacha-x86_64.S
Merge sendmail 8.16.1 to HEAD: See contrib/sendmail/RELEASE_NOTES for details
[FreeBSD/FreeBSD.git] / secure / lib / libcrypto / amd64 / chacha-x86_64.S
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         cmpq    $128,%rdx
335         je      .LChaCha20_128
336         ja      .LChaCha20_4x
337
338 .Ldo_sse3_after_all:
339         subq    $64+8,%rsp
340         movdqa  .Lsigma(%rip),%xmm0
341         movdqu  (%rcx),%xmm1
342         movdqu  16(%rcx),%xmm2
343         movdqu  (%r8),%xmm3
344         movdqa  .Lrot16(%rip),%xmm6
345         movdqa  .Lrot24(%rip),%xmm7
346
347         movdqa  %xmm0,0(%rsp)
348         movdqa  %xmm1,16(%rsp)
349         movdqa  %xmm2,32(%rsp)
350         movdqa  %xmm3,48(%rsp)
351         movq    $10,%r8
352         jmp     .Loop_ssse3
353
354 .align  32
355 .Loop_outer_ssse3:
356         movdqa  .Lone(%rip),%xmm3
357         movdqa  0(%rsp),%xmm0
358         movdqa  16(%rsp),%xmm1
359         movdqa  32(%rsp),%xmm2
360         paddd   48(%rsp),%xmm3
361         movq    $10,%r8
362         movdqa  %xmm3,48(%rsp)
363         jmp     .Loop_ssse3
364
365 .align  32
366 .Loop_ssse3:
367         paddd   %xmm1,%xmm0
368         pxor    %xmm0,%xmm3
369 .byte   102,15,56,0,222
370         paddd   %xmm3,%xmm2
371         pxor    %xmm2,%xmm1
372         movdqa  %xmm1,%xmm4
373         psrld   $20,%xmm1
374         pslld   $12,%xmm4
375         por     %xmm4,%xmm1
376         paddd   %xmm1,%xmm0
377         pxor    %xmm0,%xmm3
378 .byte   102,15,56,0,223
379         paddd   %xmm3,%xmm2
380         pxor    %xmm2,%xmm1
381         movdqa  %xmm1,%xmm4
382         psrld   $25,%xmm1
383         pslld   $7,%xmm4
384         por     %xmm4,%xmm1
385         pshufd  $78,%xmm2,%xmm2
386         pshufd  $57,%xmm1,%xmm1
387         pshufd  $147,%xmm3,%xmm3
388         nop
389         paddd   %xmm1,%xmm0
390         pxor    %xmm0,%xmm3
391 .byte   102,15,56,0,222
392         paddd   %xmm3,%xmm2
393         pxor    %xmm2,%xmm1
394         movdqa  %xmm1,%xmm4
395         psrld   $20,%xmm1
396         pslld   $12,%xmm4
397         por     %xmm4,%xmm1
398         paddd   %xmm1,%xmm0
399         pxor    %xmm0,%xmm3
400 .byte   102,15,56,0,223
401         paddd   %xmm3,%xmm2
402         pxor    %xmm2,%xmm1
403         movdqa  %xmm1,%xmm4
404         psrld   $25,%xmm1
405         pslld   $7,%xmm4
406         por     %xmm4,%xmm1
407         pshufd  $78,%xmm2,%xmm2
408         pshufd  $147,%xmm1,%xmm1
409         pshufd  $57,%xmm3,%xmm3
410         decq    %r8
411         jnz     .Loop_ssse3
412         paddd   0(%rsp),%xmm0
413         paddd   16(%rsp),%xmm1
414         paddd   32(%rsp),%xmm2
415         paddd   48(%rsp),%xmm3
416
417         cmpq    $64,%rdx
418         jb      .Ltail_ssse3
419
420         movdqu  0(%rsi),%xmm4
421         movdqu  16(%rsi),%xmm5
422         pxor    %xmm4,%xmm0
423         movdqu  32(%rsi),%xmm4
424         pxor    %xmm5,%xmm1
425         movdqu  48(%rsi),%xmm5
426         leaq    64(%rsi),%rsi
427         pxor    %xmm4,%xmm2
428         pxor    %xmm5,%xmm3
429
430         movdqu  %xmm0,0(%rdi)
431         movdqu  %xmm1,16(%rdi)
432         movdqu  %xmm2,32(%rdi)
433         movdqu  %xmm3,48(%rdi)
434         leaq    64(%rdi),%rdi
435
436         subq    $64,%rdx
437         jnz     .Loop_outer_ssse3
438
439         jmp     .Ldone_ssse3
440
441 .align  16
442 .Ltail_ssse3:
443         movdqa  %xmm0,0(%rsp)
444         movdqa  %xmm1,16(%rsp)
445         movdqa  %xmm2,32(%rsp)
446         movdqa  %xmm3,48(%rsp)
447         xorq    %r8,%r8
448
449 .Loop_tail_ssse3:
450         movzbl  (%rsi,%r8,1),%eax
451         movzbl  (%rsp,%r8,1),%ecx
452         leaq    1(%r8),%r8
453         xorl    %ecx,%eax
454         movb    %al,-1(%rdi,%r8,1)
455         decq    %rdx
456         jnz     .Loop_tail_ssse3
457
458 .Ldone_ssse3:
459         leaq    (%r9),%rsp
460 .cfi_def_cfa_register   %rsp
461 .Lssse3_epilogue:
462         .byte   0xf3,0xc3
463 .cfi_endproc    
464 .size   ChaCha20_ssse3,.-ChaCha20_ssse3
465 .type   ChaCha20_128,@function
466 .align  32
467 ChaCha20_128:
468 .cfi_startproc  
469 .LChaCha20_128:
470         movq    %rsp,%r9
471 .cfi_def_cfa_register   %r9
472         subq    $64+8,%rsp
473         movdqa  .Lsigma(%rip),%xmm8
474         movdqu  (%rcx),%xmm9
475         movdqu  16(%rcx),%xmm2
476         movdqu  (%r8),%xmm3
477         movdqa  .Lone(%rip),%xmm1
478         movdqa  .Lrot16(%rip),%xmm6
479         movdqa  .Lrot24(%rip),%xmm7
480
481         movdqa  %xmm8,%xmm10
482         movdqa  %xmm8,0(%rsp)
483         movdqa  %xmm9,%xmm11
484         movdqa  %xmm9,16(%rsp)
485         movdqa  %xmm2,%xmm0
486         movdqa  %xmm2,32(%rsp)
487         paddd   %xmm3,%xmm1
488         movdqa  %xmm3,48(%rsp)
489         movq    $10,%r8
490         jmp     .Loop_128
491
492 .align  32
493 .Loop_128:
494         paddd   %xmm9,%xmm8
495         pxor    %xmm8,%xmm3
496         paddd   %xmm11,%xmm10
497         pxor    %xmm10,%xmm1
498 .byte   102,15,56,0,222
499 .byte   102,15,56,0,206
500         paddd   %xmm3,%xmm2
501         paddd   %xmm1,%xmm0
502         pxor    %xmm2,%xmm9
503         pxor    %xmm0,%xmm11
504         movdqa  %xmm9,%xmm4
505         psrld   $20,%xmm9
506         movdqa  %xmm11,%xmm5
507         pslld   $12,%xmm4
508         psrld   $20,%xmm11
509         por     %xmm4,%xmm9
510         pslld   $12,%xmm5
511         por     %xmm5,%xmm11
512         paddd   %xmm9,%xmm8
513         pxor    %xmm8,%xmm3
514         paddd   %xmm11,%xmm10
515         pxor    %xmm10,%xmm1
516 .byte   102,15,56,0,223
517 .byte   102,15,56,0,207
518         paddd   %xmm3,%xmm2
519         paddd   %xmm1,%xmm0
520         pxor    %xmm2,%xmm9
521         pxor    %xmm0,%xmm11
522         movdqa  %xmm9,%xmm4
523         psrld   $25,%xmm9
524         movdqa  %xmm11,%xmm5
525         pslld   $7,%xmm4
526         psrld   $25,%xmm11
527         por     %xmm4,%xmm9
528         pslld   $7,%xmm5
529         por     %xmm5,%xmm11
530         pshufd  $78,%xmm2,%xmm2
531         pshufd  $57,%xmm9,%xmm9
532         pshufd  $147,%xmm3,%xmm3
533         pshufd  $78,%xmm0,%xmm0
534         pshufd  $57,%xmm11,%xmm11
535         pshufd  $147,%xmm1,%xmm1
536         paddd   %xmm9,%xmm8
537         pxor    %xmm8,%xmm3
538         paddd   %xmm11,%xmm10
539         pxor    %xmm10,%xmm1
540 .byte   102,15,56,0,222
541 .byte   102,15,56,0,206
542         paddd   %xmm3,%xmm2
543         paddd   %xmm1,%xmm0
544         pxor    %xmm2,%xmm9
545         pxor    %xmm0,%xmm11
546         movdqa  %xmm9,%xmm4
547         psrld   $20,%xmm9
548         movdqa  %xmm11,%xmm5
549         pslld   $12,%xmm4
550         psrld   $20,%xmm11
551         por     %xmm4,%xmm9
552         pslld   $12,%xmm5
553         por     %xmm5,%xmm11
554         paddd   %xmm9,%xmm8
555         pxor    %xmm8,%xmm3
556         paddd   %xmm11,%xmm10
557         pxor    %xmm10,%xmm1
558 .byte   102,15,56,0,223
559 .byte   102,15,56,0,207
560         paddd   %xmm3,%xmm2
561         paddd   %xmm1,%xmm0
562         pxor    %xmm2,%xmm9
563         pxor    %xmm0,%xmm11
564         movdqa  %xmm9,%xmm4
565         psrld   $25,%xmm9
566         movdqa  %xmm11,%xmm5
567         pslld   $7,%xmm4
568         psrld   $25,%xmm11
569         por     %xmm4,%xmm9
570         pslld   $7,%xmm5
571         por     %xmm5,%xmm11
572         pshufd  $78,%xmm2,%xmm2
573         pshufd  $147,%xmm9,%xmm9
574         pshufd  $57,%xmm3,%xmm3
575         pshufd  $78,%xmm0,%xmm0
576         pshufd  $147,%xmm11,%xmm11
577         pshufd  $57,%xmm1,%xmm1
578         decq    %r8
579         jnz     .Loop_128
580         paddd   0(%rsp),%xmm8
581         paddd   16(%rsp),%xmm9
582         paddd   32(%rsp),%xmm2
583         paddd   48(%rsp),%xmm3
584         paddd   .Lone(%rip),%xmm1
585         paddd   0(%rsp),%xmm10
586         paddd   16(%rsp),%xmm11
587         paddd   32(%rsp),%xmm0
588         paddd   48(%rsp),%xmm1
589
590         movdqu  0(%rsi),%xmm4
591         movdqu  16(%rsi),%xmm5
592         pxor    %xmm4,%xmm8
593         movdqu  32(%rsi),%xmm4
594         pxor    %xmm5,%xmm9
595         movdqu  48(%rsi),%xmm5
596         pxor    %xmm4,%xmm2
597         movdqu  64(%rsi),%xmm4
598         pxor    %xmm5,%xmm3
599         movdqu  80(%rsi),%xmm5
600         pxor    %xmm4,%xmm10
601         movdqu  96(%rsi),%xmm4
602         pxor    %xmm5,%xmm11
603         movdqu  112(%rsi),%xmm5
604         pxor    %xmm4,%xmm0
605         pxor    %xmm5,%xmm1
606
607         movdqu  %xmm8,0(%rdi)
608         movdqu  %xmm9,16(%rdi)
609         movdqu  %xmm2,32(%rdi)
610         movdqu  %xmm3,48(%rdi)
611         movdqu  %xmm10,64(%rdi)
612         movdqu  %xmm11,80(%rdi)
613         movdqu  %xmm0,96(%rdi)
614         movdqu  %xmm1,112(%rdi)
615         leaq    (%r9),%rsp
616 .cfi_def_cfa_register   %rsp
617 .L128_epilogue:
618         .byte   0xf3,0xc3
619 .cfi_endproc    
620 .size   ChaCha20_128,.-ChaCha20_128
621 .type   ChaCha20_4x,@function
622 .align  32
623 ChaCha20_4x:
624 .cfi_startproc  
625 .LChaCha20_4x:
626         movq    %rsp,%r9
627 .cfi_def_cfa_register   %r9
628         movq    %r10,%r11
629         cmpq    $192,%rdx
630         ja      .Lproceed4x
631
632         andq    $71303168,%r11
633         cmpq    $4194304,%r11
634         je      .Ldo_sse3_after_all
635
636 .Lproceed4x:
637         subq    $0x140+8,%rsp
638         movdqa  .Lsigma(%rip),%xmm11
639         movdqu  (%rcx),%xmm15
640         movdqu  16(%rcx),%xmm7
641         movdqu  (%r8),%xmm3
642         leaq    256(%rsp),%rcx
643         leaq    .Lrot16(%rip),%r10
644         leaq    .Lrot24(%rip),%r11
645
646         pshufd  $0x00,%xmm11,%xmm8
647         pshufd  $0x55,%xmm11,%xmm9
648         movdqa  %xmm8,64(%rsp)
649         pshufd  $0xaa,%xmm11,%xmm10
650         movdqa  %xmm9,80(%rsp)
651         pshufd  $0xff,%xmm11,%xmm11
652         movdqa  %xmm10,96(%rsp)
653         movdqa  %xmm11,112(%rsp)
654
655         pshufd  $0x00,%xmm15,%xmm12
656         pshufd  $0x55,%xmm15,%xmm13
657         movdqa  %xmm12,128-256(%rcx)
658         pshufd  $0xaa,%xmm15,%xmm14
659         movdqa  %xmm13,144-256(%rcx)
660         pshufd  $0xff,%xmm15,%xmm15
661         movdqa  %xmm14,160-256(%rcx)
662         movdqa  %xmm15,176-256(%rcx)
663
664         pshufd  $0x00,%xmm7,%xmm4
665         pshufd  $0x55,%xmm7,%xmm5
666         movdqa  %xmm4,192-256(%rcx)
667         pshufd  $0xaa,%xmm7,%xmm6
668         movdqa  %xmm5,208-256(%rcx)
669         pshufd  $0xff,%xmm7,%xmm7
670         movdqa  %xmm6,224-256(%rcx)
671         movdqa  %xmm7,240-256(%rcx)
672
673         pshufd  $0x00,%xmm3,%xmm0
674         pshufd  $0x55,%xmm3,%xmm1
675         paddd   .Linc(%rip),%xmm0
676         pshufd  $0xaa,%xmm3,%xmm2
677         movdqa  %xmm1,272-256(%rcx)
678         pshufd  $0xff,%xmm3,%xmm3
679         movdqa  %xmm2,288-256(%rcx)
680         movdqa  %xmm3,304-256(%rcx)
681
682         jmp     .Loop_enter4x
683
684 .align  32
685 .Loop_outer4x:
686         movdqa  64(%rsp),%xmm8
687         movdqa  80(%rsp),%xmm9
688         movdqa  96(%rsp),%xmm10
689         movdqa  112(%rsp),%xmm11
690         movdqa  128-256(%rcx),%xmm12
691         movdqa  144-256(%rcx),%xmm13
692         movdqa  160-256(%rcx),%xmm14
693         movdqa  176-256(%rcx),%xmm15
694         movdqa  192-256(%rcx),%xmm4
695         movdqa  208-256(%rcx),%xmm5
696         movdqa  224-256(%rcx),%xmm6
697         movdqa  240-256(%rcx),%xmm7
698         movdqa  256-256(%rcx),%xmm0
699         movdqa  272-256(%rcx),%xmm1
700         movdqa  288-256(%rcx),%xmm2
701         movdqa  304-256(%rcx),%xmm3
702         paddd   .Lfour(%rip),%xmm0
703
704 .Loop_enter4x:
705         movdqa  %xmm6,32(%rsp)
706         movdqa  %xmm7,48(%rsp)
707         movdqa  (%r10),%xmm7
708         movl    $10,%eax
709         movdqa  %xmm0,256-256(%rcx)
710         jmp     .Loop4x
711
712 .align  32
713 .Loop4x:
714         paddd   %xmm12,%xmm8
715         paddd   %xmm13,%xmm9
716         pxor    %xmm8,%xmm0
717         pxor    %xmm9,%xmm1
718 .byte   102,15,56,0,199
719 .byte   102,15,56,0,207
720         paddd   %xmm0,%xmm4
721         paddd   %xmm1,%xmm5
722         pxor    %xmm4,%xmm12
723         pxor    %xmm5,%xmm13
724         movdqa  %xmm12,%xmm6
725         pslld   $12,%xmm12
726         psrld   $20,%xmm6
727         movdqa  %xmm13,%xmm7
728         pslld   $12,%xmm13
729         por     %xmm6,%xmm12
730         psrld   $20,%xmm7
731         movdqa  (%r11),%xmm6
732         por     %xmm7,%xmm13
733         paddd   %xmm12,%xmm8
734         paddd   %xmm13,%xmm9
735         pxor    %xmm8,%xmm0
736         pxor    %xmm9,%xmm1
737 .byte   102,15,56,0,198
738 .byte   102,15,56,0,206
739         paddd   %xmm0,%xmm4
740         paddd   %xmm1,%xmm5
741         pxor    %xmm4,%xmm12
742         pxor    %xmm5,%xmm13
743         movdqa  %xmm12,%xmm7
744         pslld   $7,%xmm12
745         psrld   $25,%xmm7
746         movdqa  %xmm13,%xmm6
747         pslld   $7,%xmm13
748         por     %xmm7,%xmm12
749         psrld   $25,%xmm6
750         movdqa  (%r10),%xmm7
751         por     %xmm6,%xmm13
752         movdqa  %xmm4,0(%rsp)
753         movdqa  %xmm5,16(%rsp)
754         movdqa  32(%rsp),%xmm4
755         movdqa  48(%rsp),%xmm5
756         paddd   %xmm14,%xmm10
757         paddd   %xmm15,%xmm11
758         pxor    %xmm10,%xmm2
759         pxor    %xmm11,%xmm3
760 .byte   102,15,56,0,215
761 .byte   102,15,56,0,223
762         paddd   %xmm2,%xmm4
763         paddd   %xmm3,%xmm5
764         pxor    %xmm4,%xmm14
765         pxor    %xmm5,%xmm15
766         movdqa  %xmm14,%xmm6
767         pslld   $12,%xmm14
768         psrld   $20,%xmm6
769         movdqa  %xmm15,%xmm7
770         pslld   $12,%xmm15
771         por     %xmm6,%xmm14
772         psrld   $20,%xmm7
773         movdqa  (%r11),%xmm6
774         por     %xmm7,%xmm15
775         paddd   %xmm14,%xmm10
776         paddd   %xmm15,%xmm11
777         pxor    %xmm10,%xmm2
778         pxor    %xmm11,%xmm3
779 .byte   102,15,56,0,214
780 .byte   102,15,56,0,222
781         paddd   %xmm2,%xmm4
782         paddd   %xmm3,%xmm5
783         pxor    %xmm4,%xmm14
784         pxor    %xmm5,%xmm15
785         movdqa  %xmm14,%xmm7
786         pslld   $7,%xmm14
787         psrld   $25,%xmm7
788         movdqa  %xmm15,%xmm6
789         pslld   $7,%xmm15
790         por     %xmm7,%xmm14
791         psrld   $25,%xmm6
792         movdqa  (%r10),%xmm7
793         por     %xmm6,%xmm15
794         paddd   %xmm13,%xmm8
795         paddd   %xmm14,%xmm9
796         pxor    %xmm8,%xmm3
797         pxor    %xmm9,%xmm0
798 .byte   102,15,56,0,223
799 .byte   102,15,56,0,199
800         paddd   %xmm3,%xmm4
801         paddd   %xmm0,%xmm5
802         pxor    %xmm4,%xmm13
803         pxor    %xmm5,%xmm14
804         movdqa  %xmm13,%xmm6
805         pslld   $12,%xmm13
806         psrld   $20,%xmm6
807         movdqa  %xmm14,%xmm7
808         pslld   $12,%xmm14
809         por     %xmm6,%xmm13
810         psrld   $20,%xmm7
811         movdqa  (%r11),%xmm6
812         por     %xmm7,%xmm14
813         paddd   %xmm13,%xmm8
814         paddd   %xmm14,%xmm9
815         pxor    %xmm8,%xmm3
816         pxor    %xmm9,%xmm0
817 .byte   102,15,56,0,222
818 .byte   102,15,56,0,198
819         paddd   %xmm3,%xmm4
820         paddd   %xmm0,%xmm5
821         pxor    %xmm4,%xmm13
822         pxor    %xmm5,%xmm14
823         movdqa  %xmm13,%xmm7
824         pslld   $7,%xmm13
825         psrld   $25,%xmm7
826         movdqa  %xmm14,%xmm6
827         pslld   $7,%xmm14
828         por     %xmm7,%xmm13
829         psrld   $25,%xmm6
830         movdqa  (%r10),%xmm7
831         por     %xmm6,%xmm14
832         movdqa  %xmm4,32(%rsp)
833         movdqa  %xmm5,48(%rsp)
834         movdqa  0(%rsp),%xmm4
835         movdqa  16(%rsp),%xmm5
836         paddd   %xmm15,%xmm10
837         paddd   %xmm12,%xmm11
838         pxor    %xmm10,%xmm1
839         pxor    %xmm11,%xmm2
840 .byte   102,15,56,0,207
841 .byte   102,15,56,0,215
842         paddd   %xmm1,%xmm4
843         paddd   %xmm2,%xmm5
844         pxor    %xmm4,%xmm15
845         pxor    %xmm5,%xmm12
846         movdqa  %xmm15,%xmm6
847         pslld   $12,%xmm15
848         psrld   $20,%xmm6
849         movdqa  %xmm12,%xmm7
850         pslld   $12,%xmm12
851         por     %xmm6,%xmm15
852         psrld   $20,%xmm7
853         movdqa  (%r11),%xmm6
854         por     %xmm7,%xmm12
855         paddd   %xmm15,%xmm10
856         paddd   %xmm12,%xmm11
857         pxor    %xmm10,%xmm1
858         pxor    %xmm11,%xmm2
859 .byte   102,15,56,0,206
860 .byte   102,15,56,0,214
861         paddd   %xmm1,%xmm4
862         paddd   %xmm2,%xmm5
863         pxor    %xmm4,%xmm15
864         pxor    %xmm5,%xmm12
865         movdqa  %xmm15,%xmm7
866         pslld   $7,%xmm15
867         psrld   $25,%xmm7
868         movdqa  %xmm12,%xmm6
869         pslld   $7,%xmm12
870         por     %xmm7,%xmm15
871         psrld   $25,%xmm6
872         movdqa  (%r10),%xmm7
873         por     %xmm6,%xmm12
874         decl    %eax
875         jnz     .Loop4x
876
877         paddd   64(%rsp),%xmm8
878         paddd   80(%rsp),%xmm9
879         paddd   96(%rsp),%xmm10
880         paddd   112(%rsp),%xmm11
881
882         movdqa  %xmm8,%xmm6
883         punpckldq       %xmm9,%xmm8
884         movdqa  %xmm10,%xmm7
885         punpckldq       %xmm11,%xmm10
886         punpckhdq       %xmm9,%xmm6
887         punpckhdq       %xmm11,%xmm7
888         movdqa  %xmm8,%xmm9
889         punpcklqdq      %xmm10,%xmm8
890         movdqa  %xmm6,%xmm11
891         punpcklqdq      %xmm7,%xmm6
892         punpckhqdq      %xmm10,%xmm9
893         punpckhqdq      %xmm7,%xmm11
894         paddd   128-256(%rcx),%xmm12
895         paddd   144-256(%rcx),%xmm13
896         paddd   160-256(%rcx),%xmm14
897         paddd   176-256(%rcx),%xmm15
898
899         movdqa  %xmm8,0(%rsp)
900         movdqa  %xmm9,16(%rsp)
901         movdqa  32(%rsp),%xmm8
902         movdqa  48(%rsp),%xmm9
903
904         movdqa  %xmm12,%xmm10
905         punpckldq       %xmm13,%xmm12
906         movdqa  %xmm14,%xmm7
907         punpckldq       %xmm15,%xmm14
908         punpckhdq       %xmm13,%xmm10
909         punpckhdq       %xmm15,%xmm7
910         movdqa  %xmm12,%xmm13
911         punpcklqdq      %xmm14,%xmm12
912         movdqa  %xmm10,%xmm15
913         punpcklqdq      %xmm7,%xmm10
914         punpckhqdq      %xmm14,%xmm13
915         punpckhqdq      %xmm7,%xmm15
916         paddd   192-256(%rcx),%xmm4
917         paddd   208-256(%rcx),%xmm5
918         paddd   224-256(%rcx),%xmm8
919         paddd   240-256(%rcx),%xmm9
920
921         movdqa  %xmm6,32(%rsp)
922         movdqa  %xmm11,48(%rsp)
923
924         movdqa  %xmm4,%xmm14
925         punpckldq       %xmm5,%xmm4
926         movdqa  %xmm8,%xmm7
927         punpckldq       %xmm9,%xmm8
928         punpckhdq       %xmm5,%xmm14
929         punpckhdq       %xmm9,%xmm7
930         movdqa  %xmm4,%xmm5
931         punpcklqdq      %xmm8,%xmm4
932         movdqa  %xmm14,%xmm9
933         punpcklqdq      %xmm7,%xmm14
934         punpckhqdq      %xmm8,%xmm5
935         punpckhqdq      %xmm7,%xmm9
936         paddd   256-256(%rcx),%xmm0
937         paddd   272-256(%rcx),%xmm1
938         paddd   288-256(%rcx),%xmm2
939         paddd   304-256(%rcx),%xmm3
940
941         movdqa  %xmm0,%xmm8
942         punpckldq       %xmm1,%xmm0
943         movdqa  %xmm2,%xmm7
944         punpckldq       %xmm3,%xmm2
945         punpckhdq       %xmm1,%xmm8
946         punpckhdq       %xmm3,%xmm7
947         movdqa  %xmm0,%xmm1
948         punpcklqdq      %xmm2,%xmm0
949         movdqa  %xmm8,%xmm3
950         punpcklqdq      %xmm7,%xmm8
951         punpckhqdq      %xmm2,%xmm1
952         punpckhqdq      %xmm7,%xmm3
953         cmpq    $256,%rdx
954         jb      .Ltail4x
955
956         movdqu  0(%rsi),%xmm6
957         movdqu  16(%rsi),%xmm11
958         movdqu  32(%rsi),%xmm2
959         movdqu  48(%rsi),%xmm7
960         pxor    0(%rsp),%xmm6
961         pxor    %xmm12,%xmm11
962         pxor    %xmm4,%xmm2
963         pxor    %xmm0,%xmm7
964
965         movdqu  %xmm6,0(%rdi)
966         movdqu  64(%rsi),%xmm6
967         movdqu  %xmm11,16(%rdi)
968         movdqu  80(%rsi),%xmm11
969         movdqu  %xmm2,32(%rdi)
970         movdqu  96(%rsi),%xmm2
971         movdqu  %xmm7,48(%rdi)
972         movdqu  112(%rsi),%xmm7
973         leaq    128(%rsi),%rsi
974         pxor    16(%rsp),%xmm6
975         pxor    %xmm13,%xmm11
976         pxor    %xmm5,%xmm2
977         pxor    %xmm1,%xmm7
978
979         movdqu  %xmm6,64(%rdi)
980         movdqu  0(%rsi),%xmm6
981         movdqu  %xmm11,80(%rdi)
982         movdqu  16(%rsi),%xmm11
983         movdqu  %xmm2,96(%rdi)
984         movdqu  32(%rsi),%xmm2
985         movdqu  %xmm7,112(%rdi)
986         leaq    128(%rdi),%rdi
987         movdqu  48(%rsi),%xmm7
988         pxor    32(%rsp),%xmm6
989         pxor    %xmm10,%xmm11
990         pxor    %xmm14,%xmm2
991         pxor    %xmm8,%xmm7
992
993         movdqu  %xmm6,0(%rdi)
994         movdqu  64(%rsi),%xmm6
995         movdqu  %xmm11,16(%rdi)
996         movdqu  80(%rsi),%xmm11
997         movdqu  %xmm2,32(%rdi)
998         movdqu  96(%rsi),%xmm2
999         movdqu  %xmm7,48(%rdi)
1000         movdqu  112(%rsi),%xmm7
1001         leaq    128(%rsi),%rsi
1002         pxor    48(%rsp),%xmm6
1003         pxor    %xmm15,%xmm11
1004         pxor    %xmm9,%xmm2
1005         pxor    %xmm3,%xmm7
1006         movdqu  %xmm6,64(%rdi)
1007         movdqu  %xmm11,80(%rdi)
1008         movdqu  %xmm2,96(%rdi)
1009         movdqu  %xmm7,112(%rdi)
1010         leaq    128(%rdi),%rdi
1011
1012         subq    $256,%rdx
1013         jnz     .Loop_outer4x
1014
1015         jmp     .Ldone4x
1016
1017 .Ltail4x:
1018         cmpq    $192,%rdx
1019         jae     .L192_or_more4x
1020         cmpq    $128,%rdx
1021         jae     .L128_or_more4x
1022         cmpq    $64,%rdx
1023         jae     .L64_or_more4x
1024
1025
1026         xorq    %r10,%r10
1027
1028         movdqa  %xmm12,16(%rsp)
1029         movdqa  %xmm4,32(%rsp)
1030         movdqa  %xmm0,48(%rsp)
1031         jmp     .Loop_tail4x
1032
1033 .align  32
1034 .L64_or_more4x:
1035         movdqu  0(%rsi),%xmm6
1036         movdqu  16(%rsi),%xmm11
1037         movdqu  32(%rsi),%xmm2
1038         movdqu  48(%rsi),%xmm7
1039         pxor    0(%rsp),%xmm6
1040         pxor    %xmm12,%xmm11
1041         pxor    %xmm4,%xmm2
1042         pxor    %xmm0,%xmm7
1043         movdqu  %xmm6,0(%rdi)
1044         movdqu  %xmm11,16(%rdi)
1045         movdqu  %xmm2,32(%rdi)
1046         movdqu  %xmm7,48(%rdi)
1047         je      .Ldone4x
1048
1049         movdqa  16(%rsp),%xmm6
1050         leaq    64(%rsi),%rsi
1051         xorq    %r10,%r10
1052         movdqa  %xmm6,0(%rsp)
1053         movdqa  %xmm13,16(%rsp)
1054         leaq    64(%rdi),%rdi
1055         movdqa  %xmm5,32(%rsp)
1056         subq    $64,%rdx
1057         movdqa  %xmm1,48(%rsp)
1058         jmp     .Loop_tail4x
1059
1060 .align  32
1061 .L128_or_more4x:
1062         movdqu  0(%rsi),%xmm6
1063         movdqu  16(%rsi),%xmm11
1064         movdqu  32(%rsi),%xmm2
1065         movdqu  48(%rsi),%xmm7
1066         pxor    0(%rsp),%xmm6
1067         pxor    %xmm12,%xmm11
1068         pxor    %xmm4,%xmm2
1069         pxor    %xmm0,%xmm7
1070
1071         movdqu  %xmm6,0(%rdi)
1072         movdqu  64(%rsi),%xmm6
1073         movdqu  %xmm11,16(%rdi)
1074         movdqu  80(%rsi),%xmm11
1075         movdqu  %xmm2,32(%rdi)
1076         movdqu  96(%rsi),%xmm2
1077         movdqu  %xmm7,48(%rdi)
1078         movdqu  112(%rsi),%xmm7
1079         pxor    16(%rsp),%xmm6
1080         pxor    %xmm13,%xmm11
1081         pxor    %xmm5,%xmm2
1082         pxor    %xmm1,%xmm7
1083         movdqu  %xmm6,64(%rdi)
1084         movdqu  %xmm11,80(%rdi)
1085         movdqu  %xmm2,96(%rdi)
1086         movdqu  %xmm7,112(%rdi)
1087         je      .Ldone4x
1088
1089         movdqa  32(%rsp),%xmm6
1090         leaq    128(%rsi),%rsi
1091         xorq    %r10,%r10
1092         movdqa  %xmm6,0(%rsp)
1093         movdqa  %xmm10,16(%rsp)
1094         leaq    128(%rdi),%rdi
1095         movdqa  %xmm14,32(%rsp)
1096         subq    $128,%rdx
1097         movdqa  %xmm8,48(%rsp)
1098         jmp     .Loop_tail4x
1099
1100 .align  32
1101 .L192_or_more4x:
1102         movdqu  0(%rsi),%xmm6
1103         movdqu  16(%rsi),%xmm11
1104         movdqu  32(%rsi),%xmm2
1105         movdqu  48(%rsi),%xmm7
1106         pxor    0(%rsp),%xmm6
1107         pxor    %xmm12,%xmm11
1108         pxor    %xmm4,%xmm2
1109         pxor    %xmm0,%xmm7
1110
1111         movdqu  %xmm6,0(%rdi)
1112         movdqu  64(%rsi),%xmm6
1113         movdqu  %xmm11,16(%rdi)
1114         movdqu  80(%rsi),%xmm11
1115         movdqu  %xmm2,32(%rdi)
1116         movdqu  96(%rsi),%xmm2
1117         movdqu  %xmm7,48(%rdi)
1118         movdqu  112(%rsi),%xmm7
1119         leaq    128(%rsi),%rsi
1120         pxor    16(%rsp),%xmm6
1121         pxor    %xmm13,%xmm11
1122         pxor    %xmm5,%xmm2
1123         pxor    %xmm1,%xmm7
1124
1125         movdqu  %xmm6,64(%rdi)
1126         movdqu  0(%rsi),%xmm6
1127         movdqu  %xmm11,80(%rdi)
1128         movdqu  16(%rsi),%xmm11
1129         movdqu  %xmm2,96(%rdi)
1130         movdqu  32(%rsi),%xmm2
1131         movdqu  %xmm7,112(%rdi)
1132         leaq    128(%rdi),%rdi
1133         movdqu  48(%rsi),%xmm7
1134         pxor    32(%rsp),%xmm6
1135         pxor    %xmm10,%xmm11
1136         pxor    %xmm14,%xmm2
1137         pxor    %xmm8,%xmm7
1138         movdqu  %xmm6,0(%rdi)
1139         movdqu  %xmm11,16(%rdi)
1140         movdqu  %xmm2,32(%rdi)
1141         movdqu  %xmm7,48(%rdi)
1142         je      .Ldone4x
1143
1144         movdqa  48(%rsp),%xmm6
1145         leaq    64(%rsi),%rsi
1146         xorq    %r10,%r10
1147         movdqa  %xmm6,0(%rsp)
1148         movdqa  %xmm15,16(%rsp)
1149         leaq    64(%rdi),%rdi
1150         movdqa  %xmm9,32(%rsp)
1151         subq    $192,%rdx
1152         movdqa  %xmm3,48(%rsp)
1153
1154 .Loop_tail4x:
1155         movzbl  (%rsi,%r10,1),%eax
1156         movzbl  (%rsp,%r10,1),%ecx
1157         leaq    1(%r10),%r10
1158         xorl    %ecx,%eax
1159         movb    %al,-1(%rdi,%r10,1)
1160         decq    %rdx
1161         jnz     .Loop_tail4x
1162
1163 .Ldone4x:
1164         leaq    (%r9),%rsp
1165 .cfi_def_cfa_register   %rsp
1166 .L4x_epilogue:
1167         .byte   0xf3,0xc3
1168 .cfi_endproc    
1169 .size   ChaCha20_4x,.-ChaCha20_4x