chacha20: add AVX2/AMD64 assembly implementation
[libgcrypt.git] / cipher / chacha20-avx2-amd64.S
1 /* chacha20-avx2-amd64.S  -  AMD64/AVX2 implementation of ChaCha20
2  *
3  * Copyright (C) 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
4  *
5  * This file is part of Libgcrypt.
6  *
7  * Libgcrypt is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * Libgcrypt is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 /*
22  * Based on public domain implementation by Andrew Moon at
23  *  https://github.com/floodyberry/chacha-opt
24  */
25
26 #ifdef __x86_64__
27 #include <config.h>
28
29 #if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && \
30     defined(HAVE_GCC_INLINE_ASM_AVX2) && USE_CHACHA20
31
32 #ifdef __PIC__
33 #  define RIP (%rip)
34 #else
35 #  define RIP
36 #endif
37
38 .text
39
40 .align 8
41 .globl _gcry_chacha20_amd64_avx2_blocks
42 .type  _gcry_chacha20_amd64_avx2_blocks,@function;
43 _gcry_chacha20_amd64_avx2_blocks:
44 .Lchacha_blocks_avx2_local:
45         pushq %rbx
46         pushq %rbp
47         pushq %r12
48         pushq %r13
49         pushq %r14
50         movq %rsp, %rbp
51         andq $~63, %rsp
52         subq $512, %rsp
53         leaq .LC RIP, %rax
54         vmovdqu 0(%rax), %xmm6
55         vmovdqu 16(%rax), %xmm7
56         vmovdqu 0(%rdi), %xmm8
57         vmovdqu 16(%rdi), %xmm9
58         vmovdqu 32(%rdi), %xmm10
59         vmovdqu 48(%rdi), %xmm11
60         movl $20, %eax
61         movq $1, %r9
62         vmovdqa %xmm8, 0(%rsp)
63         vmovdqa %xmm9, 16(%rsp)
64         vmovdqa %xmm10, 32(%rsp)
65         vmovdqa %xmm11, 48(%rsp)
66         movq %rax, 64(%rsp)
67         vmovdqa %xmm6, 448(%rsp)
68         vmovdqa %xmm6, 464(%rsp)
69         vmovdqa %xmm7, 480(%rsp)
70         vmovdqa %xmm7, 496(%rsp)
71         cmpq $512, %rcx
72         jae .Lchacha_blocks_avx2_atleast512
73         cmp $256, %rcx
74         jae .Lchacha_blocks_avx2_atleast256
75         jmp .Lchacha_blocks_avx2_below256
76         .p2align 6,,63
77 .Lchacha_blocks_avx2_atleast512:
78         movq 48(%rsp), %rax
79         leaq 1(%rax), %r8
80         leaq 2(%rax), %r9
81         leaq 3(%rax), %r10
82         leaq 4(%rax), %rbx
83         leaq 5(%rax), %r11
84         leaq 6(%rax), %r12
85         leaq 7(%rax), %r13
86         leaq 8(%rax), %r14
87         movl %eax, 128(%rsp)
88         movl %r8d, 4+128(%rsp)
89         movl %r9d, 8+128(%rsp)
90         movl %r10d, 12+128(%rsp)
91         movl %ebx, 16+128(%rsp)
92         movl %r11d, 20+128(%rsp)
93         movl %r12d, 24+128(%rsp)
94         movl %r13d, 28+128(%rsp)
95         shrq $32, %rax
96         shrq $32, %r8
97         shrq $32, %r9
98         shrq $32, %r10
99         shrq $32, %rbx
100         shrq $32, %r11
101         shrq $32, %r12
102         shrq $32, %r13
103         movl %eax, 160(%rsp)
104         movl %r8d, 4+160(%rsp)
105         movl %r9d, 8+160(%rsp)
106         movl %r10d, 12+160(%rsp)
107         movl %ebx, 16+160(%rsp)
108         movl %r11d, 20+160(%rsp)
109         movl %r12d, 24+160(%rsp)
110         movl %r13d, 28+160(%rsp)
111         movq %r14, 48(%rsp)
112         movq 64(%rsp), %rax
113         vpbroadcastd 0(%rsp), %ymm0
114         vpbroadcastd 4+0(%rsp), %ymm1
115         vpbroadcastd 8+0(%rsp), %ymm2
116         vpbroadcastd 12+0(%rsp), %ymm3
117         vpbroadcastd 16(%rsp), %ymm4
118         vpbroadcastd 4+16(%rsp), %ymm5
119         vpbroadcastd 8+16(%rsp), %ymm6
120         vpbroadcastd 12+16(%rsp), %ymm7
121         vpbroadcastd 32(%rsp), %ymm8
122         vpbroadcastd 4+32(%rsp), %ymm9
123         vpbroadcastd 8+32(%rsp), %ymm10
124         vpbroadcastd 12+32(%rsp), %ymm11
125         vpbroadcastd 8+48(%rsp), %ymm14
126         vpbroadcastd 12+48(%rsp), %ymm15
127         vmovdqa 128(%rsp), %ymm12
128         vmovdqa 160(%rsp), %ymm13
129 .Lchacha_blocks_avx2_mainloop1:
130         vpaddd %ymm0, %ymm4, %ymm0
131         vpaddd %ymm1, %ymm5, %ymm1
132         vpxor %ymm12, %ymm0, %ymm12
133         vpxor %ymm13, %ymm1, %ymm13
134         vpaddd %ymm2, %ymm6, %ymm2
135         vpaddd %ymm3, %ymm7, %ymm3
136         vpxor %ymm14, %ymm2, %ymm14
137         vpxor %ymm15, %ymm3, %ymm15
138         vpshufb 448(%rsp), %ymm12, %ymm12
139         vpshufb 448(%rsp), %ymm13, %ymm13
140         vpaddd %ymm8, %ymm12, %ymm8
141         vpaddd %ymm9, %ymm13, %ymm9
142         vpshufb 448(%rsp), %ymm14, %ymm14
143         vpshufb 448(%rsp), %ymm15, %ymm15
144         vpaddd %ymm10, %ymm14, %ymm10
145         vpaddd %ymm11, %ymm15, %ymm11
146         vmovdqa %ymm12, 96(%rsp)
147         vpxor %ymm4, %ymm8, %ymm4
148         vpxor %ymm5, %ymm9, %ymm5
149         vpslld $ 12, %ymm4, %ymm12
150         vpsrld $20, %ymm4, %ymm4
151         vpxor %ymm4, %ymm12, %ymm4
152         vpslld $ 12, %ymm5, %ymm12
153         vpsrld $20, %ymm5, %ymm5
154         vpxor %ymm5, %ymm12, %ymm5
155         vpxor %ymm6, %ymm10, %ymm6
156         vpxor %ymm7, %ymm11, %ymm7
157         vpslld $ 12, %ymm6, %ymm12
158         vpsrld $20, %ymm6, %ymm6
159         vpxor %ymm6, %ymm12, %ymm6
160         vpslld $ 12, %ymm7, %ymm12
161         vpsrld $20, %ymm7, %ymm7
162         vpxor %ymm7, %ymm12, %ymm7
163         vpaddd %ymm0, %ymm4, %ymm0
164         vpaddd %ymm1, %ymm5, %ymm1
165         vpxor 96(%rsp), %ymm0, %ymm12
166         vpxor %ymm13, %ymm1, %ymm13
167         vpaddd %ymm2, %ymm6, %ymm2
168         vpaddd %ymm3, %ymm7, %ymm3
169         vpxor %ymm14, %ymm2, %ymm14
170         vpxor %ymm15, %ymm3, %ymm15
171         vpshufb 480(%rsp), %ymm12, %ymm12
172         vpshufb 480(%rsp), %ymm13, %ymm13
173         vpaddd %ymm8, %ymm12, %ymm8
174         vpaddd %ymm9, %ymm13, %ymm9
175         vpshufb 480(%rsp), %ymm14, %ymm14
176         vpshufb 480(%rsp), %ymm15, %ymm15
177         vpaddd %ymm10, %ymm14, %ymm10
178         vpaddd %ymm11, %ymm15, %ymm11
179         vmovdqa %ymm12, 96(%rsp)
180         vpxor %ymm4, %ymm8, %ymm4
181         vpxor %ymm5, %ymm9, %ymm5
182         vpslld $ 7, %ymm4, %ymm12
183         vpsrld $25, %ymm4, %ymm4
184         vpxor %ymm4, %ymm12, %ymm4
185         vpslld $ 7, %ymm5, %ymm12
186         vpsrld $25, %ymm5, %ymm5
187         vpxor %ymm5, %ymm12, %ymm5
188         vpxor %ymm6, %ymm10, %ymm6
189         vpxor %ymm7, %ymm11, %ymm7
190         vpslld $ 7, %ymm6, %ymm12
191         vpsrld $25, %ymm6, %ymm6
192         vpxor %ymm6, %ymm12, %ymm6
193         vpslld $ 7, %ymm7, %ymm12
194         vpsrld $25, %ymm7, %ymm7
195         vpxor %ymm7, %ymm12, %ymm7
196         vpaddd %ymm0, %ymm5, %ymm0
197         vpaddd %ymm1, %ymm6, %ymm1
198         vpxor %ymm15, %ymm0, %ymm15
199         vpxor 96(%rsp), %ymm1, %ymm12
200         vpaddd %ymm2, %ymm7, %ymm2
201         vpaddd %ymm3, %ymm4, %ymm3
202         vpxor %ymm13, %ymm2, %ymm13
203         vpxor %ymm14, %ymm3, %ymm14
204         vpshufb 448(%rsp), %ymm15, %ymm15
205         vpshufb 448(%rsp), %ymm12, %ymm12
206         vpaddd %ymm10, %ymm15, %ymm10
207         vpaddd %ymm11, %ymm12, %ymm11
208         vpshufb 448(%rsp), %ymm13, %ymm13
209         vpshufb 448(%rsp), %ymm14, %ymm14
210         vpaddd %ymm8, %ymm13, %ymm8
211         vpaddd %ymm9, %ymm14, %ymm9
212         vmovdqa %ymm15, 96(%rsp)
213         vpxor %ymm5, %ymm10, %ymm5
214         vpxor %ymm6, %ymm11, %ymm6
215         vpslld $ 12, %ymm5, %ymm15
216         vpsrld $20, %ymm5, %ymm5
217         vpxor %ymm5, %ymm15, %ymm5
218         vpslld $ 12, %ymm6, %ymm15
219         vpsrld $20, %ymm6, %ymm6
220         vpxor %ymm6, %ymm15, %ymm6
221         vpxor %ymm7, %ymm8, %ymm7
222         vpxor %ymm4, %ymm9, %ymm4
223         vpslld $ 12, %ymm7, %ymm15
224         vpsrld $20, %ymm7, %ymm7
225         vpxor %ymm7, %ymm15, %ymm7
226         vpslld $ 12, %ymm4, %ymm15
227         vpsrld $20, %ymm4, %ymm4
228         vpxor %ymm4, %ymm15, %ymm4
229         vpaddd %ymm0, %ymm5, %ymm0
230         vpaddd %ymm1, %ymm6, %ymm1
231         vpxor 96(%rsp), %ymm0, %ymm15
232         vpxor %ymm12, %ymm1, %ymm12
233         vpaddd %ymm2, %ymm7, %ymm2
234         vpaddd %ymm3, %ymm4, %ymm3
235         vpxor %ymm13, %ymm2, %ymm13
236         vpxor %ymm14, %ymm3, %ymm14
237         vpshufb 480(%rsp), %ymm15, %ymm15
238         vpshufb 480(%rsp), %ymm12, %ymm12
239         vpaddd %ymm10, %ymm15, %ymm10
240         vpaddd %ymm11, %ymm12, %ymm11
241         vpshufb 480(%rsp), %ymm13, %ymm13
242         vpshufb 480(%rsp), %ymm14, %ymm14
243         vpaddd %ymm8, %ymm13, %ymm8
244         vpaddd %ymm9, %ymm14, %ymm9
245         vmovdqa %ymm15, 96(%rsp)
246         vpxor %ymm5, %ymm10, %ymm5
247         vpxor %ymm6, %ymm11, %ymm6
248         vpslld $ 7, %ymm5, %ymm15
249         vpsrld $25, %ymm5, %ymm5
250         vpxor %ymm5, %ymm15, %ymm5
251         vpslld $ 7, %ymm6, %ymm15
252         vpsrld $25, %ymm6, %ymm6
253         vpxor %ymm6, %ymm15, %ymm6
254         vpxor %ymm7, %ymm8, %ymm7
255         vpxor %ymm4, %ymm9, %ymm4
256         vpslld $ 7, %ymm7, %ymm15
257         vpsrld $25, %ymm7, %ymm7
258         vpxor %ymm7, %ymm15, %ymm7
259         vpslld $ 7, %ymm4, %ymm15
260         vpsrld $25, %ymm4, %ymm4
261         vpxor %ymm4, %ymm15, %ymm4
262         vmovdqa 96(%rsp), %ymm15
263         subq $2, %rax
264         jnz .Lchacha_blocks_avx2_mainloop1
265         vmovdqa %ymm8, 192(%rsp)
266         vmovdqa %ymm9, 224(%rsp)
267         vmovdqa %ymm10, 256(%rsp)
268         vmovdqa %ymm11, 288(%rsp)
269         vmovdqa %ymm12, 320(%rsp)
270         vmovdqa %ymm13, 352(%rsp)
271         vmovdqa %ymm14, 384(%rsp)
272         vmovdqa %ymm15, 416(%rsp)
273         vpbroadcastd 0(%rsp), %ymm8
274         vpbroadcastd 4+0(%rsp), %ymm9
275         vpbroadcastd 8+0(%rsp), %ymm10
276         vpbroadcastd 12+0(%rsp), %ymm11
277         vpbroadcastd 16(%rsp), %ymm12
278         vpbroadcastd 4+16(%rsp), %ymm13
279         vpbroadcastd 8+16(%rsp), %ymm14
280         vpbroadcastd 12+16(%rsp), %ymm15
281         vpaddd %ymm8, %ymm0, %ymm0
282         vpaddd %ymm9, %ymm1, %ymm1
283         vpaddd %ymm10, %ymm2, %ymm2
284         vpaddd %ymm11, %ymm3, %ymm3
285         vpaddd %ymm12, %ymm4, %ymm4
286         vpaddd %ymm13, %ymm5, %ymm5
287         vpaddd %ymm14, %ymm6, %ymm6
288         vpaddd %ymm15, %ymm7, %ymm7
289         vpunpckldq %ymm1, %ymm0, %ymm8
290         vpunpckldq %ymm3, %ymm2, %ymm9
291         vpunpckhdq %ymm1, %ymm0, %ymm12
292         vpunpckhdq %ymm3, %ymm2, %ymm13
293         vpunpckldq %ymm5, %ymm4, %ymm10
294         vpunpckldq %ymm7, %ymm6, %ymm11
295         vpunpckhdq %ymm5, %ymm4, %ymm14
296         vpunpckhdq %ymm7, %ymm6, %ymm15
297         vpunpcklqdq %ymm9, %ymm8, %ymm0
298         vpunpcklqdq %ymm11, %ymm10, %ymm1
299         vpunpckhqdq %ymm9, %ymm8, %ymm2
300         vpunpckhqdq %ymm11, %ymm10, %ymm3
301         vpunpcklqdq %ymm13, %ymm12, %ymm4
302         vpunpcklqdq %ymm15, %ymm14, %ymm5
303         vpunpckhqdq %ymm13, %ymm12, %ymm6
304         vpunpckhqdq %ymm15, %ymm14, %ymm7
305         vperm2i128 $0x20, %ymm1, %ymm0, %ymm8
306         vperm2i128 $0x20, %ymm3, %ymm2, %ymm9
307         vperm2i128 $0x31, %ymm1, %ymm0, %ymm12
308         vperm2i128 $0x31, %ymm3, %ymm2, %ymm13
309         vperm2i128 $0x20, %ymm5, %ymm4, %ymm10
310         vperm2i128 $0x20, %ymm7, %ymm6, %ymm11
311         vperm2i128 $0x31, %ymm5, %ymm4, %ymm14
312         vperm2i128 $0x31, %ymm7, %ymm6, %ymm15
313         andq %rsi, %rsi
314         jz .Lchacha_blocks_avx2_noinput1
315         vpxor 0(%rsi), %ymm8, %ymm8
316         vpxor 64(%rsi), %ymm9, %ymm9
317         vpxor 128(%rsi), %ymm10, %ymm10
318         vpxor 192(%rsi), %ymm11, %ymm11
319         vpxor 256(%rsi), %ymm12, %ymm12
320         vpxor 320(%rsi), %ymm13, %ymm13
321         vpxor 384(%rsi), %ymm14, %ymm14
322         vpxor 448(%rsi), %ymm15, %ymm15
323         vmovdqu %ymm8, 0(%rdx)
324         vmovdqu %ymm9, 64(%rdx)
325         vmovdqu %ymm10, 128(%rdx)
326         vmovdqu %ymm11, 192(%rdx)
327         vmovdqu %ymm12, 256(%rdx)
328         vmovdqu %ymm13, 320(%rdx)
329         vmovdqu %ymm14, 384(%rdx)
330         vmovdqu %ymm15, 448(%rdx)
331         vmovdqa 192(%rsp), %ymm0
332         vmovdqa 224(%rsp), %ymm1
333         vmovdqa 256(%rsp), %ymm2
334         vmovdqa 288(%rsp), %ymm3
335         vmovdqa 320(%rsp), %ymm4
336         vmovdqa 352(%rsp), %ymm5
337         vmovdqa 384(%rsp), %ymm6
338         vmovdqa 416(%rsp), %ymm7
339         vpbroadcastd 32(%rsp), %ymm8
340         vpbroadcastd 4+32(%rsp), %ymm9
341         vpbroadcastd 8+32(%rsp), %ymm10
342         vpbroadcastd 12+32(%rsp), %ymm11
343         vmovdqa 128(%rsp), %ymm12
344         vmovdqa 160(%rsp), %ymm13
345         vpbroadcastd 8+48(%rsp), %ymm14
346         vpbroadcastd 12+48(%rsp), %ymm15
347         vpaddd %ymm8, %ymm0, %ymm0
348         vpaddd %ymm9, %ymm1, %ymm1
349         vpaddd %ymm10, %ymm2, %ymm2
350         vpaddd %ymm11, %ymm3, %ymm3
351         vpaddd %ymm12, %ymm4, %ymm4
352         vpaddd %ymm13, %ymm5, %ymm5
353         vpaddd %ymm14, %ymm6, %ymm6
354         vpaddd %ymm15, %ymm7, %ymm7
355         vpunpckldq %ymm1, %ymm0, %ymm8
356         vpunpckldq %ymm3, %ymm2, %ymm9
357         vpunpckhdq %ymm1, %ymm0, %ymm12
358         vpunpckhdq %ymm3, %ymm2, %ymm13
359         vpunpckldq %ymm5, %ymm4, %ymm10
360         vpunpckldq %ymm7, %ymm6, %ymm11
361         vpunpckhdq %ymm5, %ymm4, %ymm14
362         vpunpckhdq %ymm7, %ymm6, %ymm15
363         vpunpcklqdq %ymm9, %ymm8, %ymm0
364         vpunpcklqdq %ymm11, %ymm10, %ymm1
365         vpunpckhqdq %ymm9, %ymm8, %ymm2
366         vpunpckhqdq %ymm11, %ymm10, %ymm3
367         vpunpcklqdq %ymm13, %ymm12, %ymm4
368         vpunpcklqdq %ymm15, %ymm14, %ymm5
369         vpunpckhqdq %ymm13, %ymm12, %ymm6
370         vpunpckhqdq %ymm15, %ymm14, %ymm7
371         vperm2i128 $0x20, %ymm1, %ymm0, %ymm8
372         vperm2i128 $0x20, %ymm3, %ymm2, %ymm9
373         vperm2i128 $0x31, %ymm1, %ymm0, %ymm12
374         vperm2i128 $0x31, %ymm3, %ymm2, %ymm13
375         vperm2i128 $0x20, %ymm5, %ymm4, %ymm10
376         vperm2i128 $0x20, %ymm7, %ymm6, %ymm11
377         vperm2i128 $0x31, %ymm5, %ymm4, %ymm14
378         vperm2i128 $0x31, %ymm7, %ymm6, %ymm15
379         vpxor 32(%rsi), %ymm8, %ymm8
380         vpxor 96(%rsi), %ymm9, %ymm9
381         vpxor 160(%rsi), %ymm10, %ymm10
382         vpxor 224(%rsi), %ymm11, %ymm11
383         vpxor 288(%rsi), %ymm12, %ymm12
384         vpxor 352(%rsi), %ymm13, %ymm13
385         vpxor 416(%rsi), %ymm14, %ymm14
386         vpxor 480(%rsi), %ymm15, %ymm15
387         vmovdqu %ymm8, 32(%rdx)
388         vmovdqu %ymm9, 96(%rdx)
389         vmovdqu %ymm10, 160(%rdx)
390         vmovdqu %ymm11, 224(%rdx)
391         vmovdqu %ymm12, 288(%rdx)
392         vmovdqu %ymm13, 352(%rdx)
393         vmovdqu %ymm14, 416(%rdx)
394         vmovdqu %ymm15, 480(%rdx)
395         addq $512, %rsi
396         jmp .Lchacha_blocks_avx2_mainloop1_cont
397 .Lchacha_blocks_avx2_noinput1:
398         vmovdqu %ymm8, 0(%rdx)
399         vmovdqu %ymm9, 64(%rdx)
400         vmovdqu %ymm10, 128(%rdx)
401         vmovdqu %ymm11, 192(%rdx)
402         vmovdqu %ymm12, 256(%rdx)
403         vmovdqu %ymm13, 320(%rdx)
404         vmovdqu %ymm14, 384(%rdx)
405         vmovdqu %ymm15, 448(%rdx)
406         vmovdqa 192(%rsp), %ymm0
407         vmovdqa 224(%rsp), %ymm1
408         vmovdqa 256(%rsp), %ymm2
409         vmovdqa 288(%rsp), %ymm3
410         vmovdqa 320(%rsp), %ymm4
411         vmovdqa 352(%rsp), %ymm5
412         vmovdqa 384(%rsp), %ymm6
413         vmovdqa 416(%rsp), %ymm7
414         vpbroadcastd 32(%rsp), %ymm8
415         vpbroadcastd 4+32(%rsp), %ymm9
416         vpbroadcastd 8+32(%rsp), %ymm10
417         vpbroadcastd 12+32(%rsp), %ymm11
418         vmovdqa 128(%rsp), %ymm12
419         vmovdqa 160(%rsp), %ymm13
420         vpbroadcastd 8+48(%rsp), %ymm14
421         vpbroadcastd 12+48(%rsp), %ymm15
422         vpaddd %ymm8, %ymm0, %ymm0
423         vpaddd %ymm9, %ymm1, %ymm1
424         vpaddd %ymm10, %ymm2, %ymm2
425         vpaddd %ymm11, %ymm3, %ymm3
426         vpaddd %ymm12, %ymm4, %ymm4
427         vpaddd %ymm13, %ymm5, %ymm5
428         vpaddd %ymm14, %ymm6, %ymm6
429         vpaddd %ymm15, %ymm7, %ymm7
430         vpunpckldq %ymm1, %ymm0, %ymm8
431         vpunpckldq %ymm3, %ymm2, %ymm9
432         vpunpckhdq %ymm1, %ymm0, %ymm12
433         vpunpckhdq %ymm3, %ymm2, %ymm13
434         vpunpckldq %ymm5, %ymm4, %ymm10
435         vpunpckldq %ymm7, %ymm6, %ymm11
436         vpunpckhdq %ymm5, %ymm4, %ymm14
437         vpunpckhdq %ymm7, %ymm6, %ymm15
438         vpunpcklqdq %ymm9, %ymm8, %ymm0
439         vpunpcklqdq %ymm11, %ymm10, %ymm1
440         vpunpckhqdq %ymm9, %ymm8, %ymm2
441         vpunpckhqdq %ymm11, %ymm10, %ymm3
442         vpunpcklqdq %ymm13, %ymm12, %ymm4
443         vpunpcklqdq %ymm15, %ymm14, %ymm5
444         vpunpckhqdq %ymm13, %ymm12, %ymm6
445         vpunpckhqdq %ymm15, %ymm14, %ymm7
446         vperm2i128 $0x20, %ymm1, %ymm0, %ymm8
447         vperm2i128 $0x20, %ymm3, %ymm2, %ymm9
448         vperm2i128 $0x31, %ymm1, %ymm0, %ymm12
449         vperm2i128 $0x31, %ymm3, %ymm2, %ymm13
450         vperm2i128 $0x20, %ymm5, %ymm4, %ymm10
451         vperm2i128 $0x20, %ymm7, %ymm6, %ymm11
452         vperm2i128 $0x31, %ymm5, %ymm4, %ymm14
453         vperm2i128 $0x31, %ymm7, %ymm6, %ymm15
454         vmovdqu %ymm8, 32(%rdx)
455         vmovdqu %ymm9, 96(%rdx)
456         vmovdqu %ymm10, 160(%rdx)
457         vmovdqu %ymm11, 224(%rdx)
458         vmovdqu %ymm12, 288(%rdx)
459         vmovdqu %ymm13, 352(%rdx)
460         vmovdqu %ymm14, 416(%rdx)
461         vmovdqu %ymm15, 480(%rdx)
462 .Lchacha_blocks_avx2_mainloop1_cont:
463         addq $512, %rdx
464         subq $512, %rcx
465         cmp $512, %rcx
466         jae .Lchacha_blocks_avx2_atleast512
467         cmp $256, %rcx
468         jb .Lchacha_blocks_avx2_below256_fixup
469 .Lchacha_blocks_avx2_atleast256:
470         movq 48(%rsp), %rax
471         leaq 1(%rax), %r8
472         leaq 2(%rax), %r9
473         leaq 3(%rax), %r10
474         leaq 4(%rax), %rbx
475         movl %eax, 128(%rsp)
476         movl %r8d, 4+128(%rsp)
477         movl %r9d, 8+128(%rsp)
478         movl %r10d, 12+128(%rsp)
479         shrq $32, %rax
480         shrq $32, %r8
481         shrq $32, %r9
482         shrq $32, %r10
483         movl %eax, 160(%rsp)
484         movl %r8d, 4+160(%rsp)
485         movl %r9d, 8+160(%rsp)
486         movl %r10d, 12+160(%rsp)
487         movq %rbx, 48(%rsp)
488         movq 64(%rsp), %rax
489         vpbroadcastd 0(%rsp), %xmm0
490         vpbroadcastd 4+0(%rsp), %xmm1
491         vpbroadcastd 8+0(%rsp), %xmm2
492         vpbroadcastd 12+0(%rsp), %xmm3
493         vpbroadcastd 16(%rsp), %xmm4
494         vpbroadcastd 4+16(%rsp), %xmm5
495         vpbroadcastd 8+16(%rsp), %xmm6
496         vpbroadcastd 12+16(%rsp), %xmm7
497         vpbroadcastd 32(%rsp), %xmm8
498         vpbroadcastd 4+32(%rsp), %xmm9
499         vpbroadcastd 8+32(%rsp), %xmm10
500         vpbroadcastd 12+32(%rsp), %xmm11
501         vmovdqa 128(%rsp), %xmm12
502         vmovdqa 160(%rsp), %xmm13
503         vpbroadcastd 8+48(%rsp), %xmm14
504         vpbroadcastd 12+48(%rsp), %xmm15
505 .Lchacha_blocks_avx2_mainloop2:
506         vpaddd %xmm0, %xmm4, %xmm0
507         vpaddd %xmm1, %xmm5, %xmm1
508         vpxor %xmm12, %xmm0, %xmm12
509         vpxor %xmm13, %xmm1, %xmm13
510         vpaddd %xmm2, %xmm6, %xmm2
511         vpaddd %xmm3, %xmm7, %xmm3
512         vpxor %xmm14, %xmm2, %xmm14
513         vpxor %xmm15, %xmm3, %xmm15
514         vpshufb 448(%rsp), %xmm12, %xmm12
515         vpshufb 448(%rsp), %xmm13, %xmm13
516         vpaddd %xmm8, %xmm12, %xmm8
517         vpaddd %xmm9, %xmm13, %xmm9
518         vpshufb 448(%rsp), %xmm14, %xmm14
519         vpshufb 448(%rsp), %xmm15, %xmm15
520         vpaddd %xmm10, %xmm14, %xmm10
521         vpaddd %xmm11, %xmm15, %xmm11
522         vmovdqa %xmm12, 96(%rsp)
523         vpxor %xmm4, %xmm8, %xmm4
524         vpxor %xmm5, %xmm9, %xmm5
525         vpslld $ 12, %xmm4, %xmm12
526         vpsrld $20, %xmm4, %xmm4
527         vpxor %xmm4, %xmm12, %xmm4
528         vpslld $ 12, %xmm5, %xmm12
529         vpsrld $20, %xmm5, %xmm5
530         vpxor %xmm5, %xmm12, %xmm5
531         vpxor %xmm6, %xmm10, %xmm6
532         vpxor %xmm7, %xmm11, %xmm7
533         vpslld $ 12, %xmm6, %xmm12
534         vpsrld $20, %xmm6, %xmm6
535         vpxor %xmm6, %xmm12, %xmm6
536         vpslld $ 12, %xmm7, %xmm12
537         vpsrld $20, %xmm7, %xmm7
538         vpxor %xmm7, %xmm12, %xmm7
539         vpaddd %xmm0, %xmm4, %xmm0
540         vpaddd %xmm1, %xmm5, %xmm1
541         vpxor 96(%rsp), %xmm0, %xmm12
542         vpxor %xmm13, %xmm1, %xmm13
543         vpaddd %xmm2, %xmm6, %xmm2
544         vpaddd %xmm3, %xmm7, %xmm3
545         vpxor %xmm14, %xmm2, %xmm14
546         vpxor %xmm15, %xmm3, %xmm15
547         vpshufb 480(%rsp), %xmm12, %xmm12
548         vpshufb 480(%rsp), %xmm13, %xmm13
549         vpaddd %xmm8, %xmm12, %xmm8
550         vpaddd %xmm9, %xmm13, %xmm9
551         vpshufb 480(%rsp), %xmm14, %xmm14
552         vpshufb 480(%rsp), %xmm15, %xmm15
553         vpaddd %xmm10, %xmm14, %xmm10
554         vpaddd %xmm11, %xmm15, %xmm11
555         vmovdqa %xmm12, 96(%rsp)
556         vpxor %xmm4, %xmm8, %xmm4
557         vpxor %xmm5, %xmm9, %xmm5
558         vpslld $ 7, %xmm4, %xmm12
559         vpsrld $25, %xmm4, %xmm4
560         vpxor %xmm4, %xmm12, %xmm4
561         vpslld $ 7, %xmm5, %xmm12
562         vpsrld $25, %xmm5, %xmm5
563         vpxor %xmm5, %xmm12, %xmm5
564         vpxor %xmm6, %xmm10, %xmm6
565         vpxor %xmm7, %xmm11, %xmm7
566         vpslld $ 7, %xmm6, %xmm12
567         vpsrld $25, %xmm6, %xmm6
568         vpxor %xmm6, %xmm12, %xmm6
569         vpslld $ 7, %xmm7, %xmm12
570         vpsrld $25, %xmm7, %xmm7
571         vpxor %xmm7, %xmm12, %xmm7
572         vpaddd %xmm0, %xmm5, %xmm0
573         vpaddd %xmm1, %xmm6, %xmm1
574         vpxor %xmm15, %xmm0, %xmm15
575         vpxor 96(%rsp), %xmm1, %xmm12
576         vpaddd %xmm2, %xmm7, %xmm2
577         vpaddd %xmm3, %xmm4, %xmm3
578         vpxor %xmm13, %xmm2, %xmm13
579         vpxor %xmm14, %xmm3, %xmm14
580         vpshufb 448(%rsp), %xmm15, %xmm15
581         vpshufb 448(%rsp), %xmm12, %xmm12
582         vpaddd %xmm10, %xmm15, %xmm10
583         vpaddd %xmm11, %xmm12, %xmm11
584         vpshufb 448(%rsp), %xmm13, %xmm13
585         vpshufb 448(%rsp), %xmm14, %xmm14
586         vpaddd %xmm8, %xmm13, %xmm8
587         vpaddd %xmm9, %xmm14, %xmm9
588         vmovdqa %xmm15, 96(%rsp)
589         vpxor %xmm5, %xmm10, %xmm5
590         vpxor %xmm6, %xmm11, %xmm6
591         vpslld $ 12, %xmm5, %xmm15
592         vpsrld $20, %xmm5, %xmm5
593         vpxor %xmm5, %xmm15, %xmm5
594         vpslld $ 12, %xmm6, %xmm15
595         vpsrld $20, %xmm6, %xmm6
596         vpxor %xmm6, %xmm15, %xmm6
597         vpxor %xmm7, %xmm8, %xmm7
598         vpxor %xmm4, %xmm9, %xmm4
599         vpslld $ 12, %xmm7, %xmm15
600         vpsrld $20, %xmm7, %xmm7
601         vpxor %xmm7, %xmm15, %xmm7
602         vpslld $ 12, %xmm4, %xmm15
603         vpsrld $20, %xmm4, %xmm4
604         vpxor %xmm4, %xmm15, %xmm4
605         vpaddd %xmm0, %xmm5, %xmm0
606         vpaddd %xmm1, %xmm6, %xmm1
607         vpxor 96(%rsp), %xmm0, %xmm15
608         vpxor %xmm12, %xmm1, %xmm12
609         vpaddd %xmm2, %xmm7, %xmm2
610         vpaddd %xmm3, %xmm4, %xmm3
611         vpxor %xmm13, %xmm2, %xmm13
612         vpxor %xmm14, %xmm3, %xmm14
613         vpshufb 480(%rsp), %xmm15, %xmm15
614         vpshufb 480(%rsp), %xmm12, %xmm12
615         vpaddd %xmm10, %xmm15, %xmm10
616         vpaddd %xmm11, %xmm12, %xmm11
617         vpshufb 480(%rsp), %xmm13, %xmm13
618         vpshufb 480(%rsp), %xmm14, %xmm14
619         vpaddd %xmm8, %xmm13, %xmm8
620         vpaddd %xmm9, %xmm14, %xmm9
621         vmovdqa %xmm15, 96(%rsp)
622         vpxor %xmm5, %xmm10, %xmm5
623         vpxor %xmm6, %xmm11, %xmm6
624         vpslld $ 7, %xmm5, %xmm15
625         vpsrld $25, %xmm5, %xmm5
626         vpxor %xmm5, %xmm15, %xmm5
627         vpslld $ 7, %xmm6, %xmm15
628         vpsrld $25, %xmm6, %xmm6
629         vpxor %xmm6, %xmm15, %xmm6
630         vpxor %xmm7, %xmm8, %xmm7
631         vpxor %xmm4, %xmm9, %xmm4
632         vpslld $ 7, %xmm7, %xmm15
633         vpsrld $25, %xmm7, %xmm7
634         vpxor %xmm7, %xmm15, %xmm7
635         vpslld $ 7, %xmm4, %xmm15
636         vpsrld $25, %xmm4, %xmm4
637         vpxor %xmm4, %xmm15, %xmm4
638         vmovdqa 96(%rsp), %xmm15
639         subq $2, %rax
640         jnz .Lchacha_blocks_avx2_mainloop2
641         vmovdqa %xmm8, 192(%rsp)
642         vmovdqa %xmm9, 208(%rsp)
643         vmovdqa %xmm10, 224(%rsp)
644         vmovdqa %xmm11, 240(%rsp)
645         vmovdqa %xmm12, 256(%rsp)
646         vmovdqa %xmm13, 272(%rsp)
647         vmovdqa %xmm14, 288(%rsp)
648         vmovdqa %xmm15, 304(%rsp)
649         vpbroadcastd 0(%rsp), %xmm8
650         vpbroadcastd 4+0(%rsp), %xmm9
651         vpbroadcastd 8+0(%rsp), %xmm10
652         vpbroadcastd 12+0(%rsp), %xmm11
653         vpbroadcastd 16(%rsp), %xmm12
654         vpbroadcastd 4+16(%rsp), %xmm13
655         vpbroadcastd 8+16(%rsp), %xmm14
656         vpbroadcastd 12+16(%rsp), %xmm15
657         vpaddd %xmm8, %xmm0, %xmm0
658         vpaddd %xmm9, %xmm1, %xmm1
659         vpaddd %xmm10, %xmm2, %xmm2
660         vpaddd %xmm11, %xmm3, %xmm3
661         vpaddd %xmm12, %xmm4, %xmm4
662         vpaddd %xmm13, %xmm5, %xmm5
663         vpaddd %xmm14, %xmm6, %xmm6
664         vpaddd %xmm15, %xmm7, %xmm7
665         vpunpckldq %xmm1, %xmm0, %xmm8
666         vpunpckldq %xmm3, %xmm2, %xmm9
667         vpunpckhdq %xmm1, %xmm0, %xmm12
668         vpunpckhdq %xmm3, %xmm2, %xmm13
669         vpunpckldq %xmm5, %xmm4, %xmm10
670         vpunpckldq %xmm7, %xmm6, %xmm11
671         vpunpckhdq %xmm5, %xmm4, %xmm14
672         vpunpckhdq %xmm7, %xmm6, %xmm15
673         vpunpcklqdq %xmm9, %xmm8, %xmm0
674         vpunpcklqdq %xmm11, %xmm10, %xmm1
675         vpunpckhqdq %xmm9, %xmm8, %xmm2
676         vpunpckhqdq %xmm11, %xmm10, %xmm3
677         vpunpcklqdq %xmm13, %xmm12, %xmm4
678         vpunpcklqdq %xmm15, %xmm14, %xmm5
679         vpunpckhqdq %xmm13, %xmm12, %xmm6
680         vpunpckhqdq %xmm15, %xmm14, %xmm7
681         andq %rsi, %rsi
682         jz .Lchacha_blocks_avx2_noinput2
683         vpxor 0(%rsi), %xmm0, %xmm0
684         vpxor 16(%rsi), %xmm1, %xmm1
685         vpxor 64(%rsi), %xmm2, %xmm2
686         vpxor 80(%rsi), %xmm3, %xmm3
687         vpxor 128(%rsi), %xmm4, %xmm4
688         vpxor 144(%rsi), %xmm5, %xmm5
689         vpxor 192(%rsi), %xmm6, %xmm6
690         vpxor 208(%rsi), %xmm7, %xmm7
691         vmovdqu %xmm0, 0(%rdx)
692         vmovdqu %xmm1, 16(%rdx)
693         vmovdqu %xmm2, 64(%rdx)
694         vmovdqu %xmm3, 80(%rdx)
695         vmovdqu %xmm4, 128(%rdx)
696         vmovdqu %xmm5, 144(%rdx)
697         vmovdqu %xmm6, 192(%rdx)
698         vmovdqu %xmm7, 208(%rdx)
699         vmovdqa 192(%rsp), %xmm0
700         vmovdqa 208(%rsp), %xmm1
701         vmovdqa 224(%rsp), %xmm2
702         vmovdqa 240(%rsp), %xmm3
703         vmovdqa 256(%rsp), %xmm4
704         vmovdqa 272(%rsp), %xmm5
705         vmovdqa 288(%rsp), %xmm6
706         vmovdqa 304(%rsp), %xmm7
707         vpbroadcastd 32(%rsp), %xmm8
708         vpbroadcastd 4+32(%rsp), %xmm9
709         vpbroadcastd 8+32(%rsp), %xmm10
710         vpbroadcastd 12+32(%rsp), %xmm11
711         vmovdqa 128(%rsp), %xmm12
712         vmovdqa 160(%rsp), %xmm13
713         vpbroadcastd 8+48(%rsp), %xmm14
714         vpbroadcastd 12+48(%rsp), %xmm15
715         vpaddd %xmm8, %xmm0, %xmm0
716         vpaddd %xmm9, %xmm1, %xmm1
717         vpaddd %xmm10, %xmm2, %xmm2
718         vpaddd %xmm11, %xmm3, %xmm3
719         vpaddd %xmm12, %xmm4, %xmm4
720         vpaddd %xmm13, %xmm5, %xmm5
721         vpaddd %xmm14, %xmm6, %xmm6
722         vpaddd %xmm15, %xmm7, %xmm7
723         vpunpckldq %xmm1, %xmm0, %xmm8
724         vpunpckldq %xmm3, %xmm2, %xmm9
725         vpunpckhdq %xmm1, %xmm0, %xmm12
726         vpunpckhdq %xmm3, %xmm2, %xmm13
727         vpunpckldq %xmm5, %xmm4, %xmm10
728         vpunpckldq %xmm7, %xmm6, %xmm11
729         vpunpckhdq %xmm5, %xmm4, %xmm14
730         vpunpckhdq %xmm7, %xmm6, %xmm15
731         vpunpcklqdq %xmm9, %xmm8, %xmm0
732         vpunpcklqdq %xmm11, %xmm10, %xmm1
733         vpunpckhqdq %xmm9, %xmm8, %xmm2
734         vpunpckhqdq %xmm11, %xmm10, %xmm3
735         vpunpcklqdq %xmm13, %xmm12, %xmm4
736         vpunpcklqdq %xmm15, %xmm14, %xmm5
737         vpunpckhqdq %xmm13, %xmm12, %xmm6
738         vpunpckhqdq %xmm15, %xmm14, %xmm7
739         vpxor 32(%rsi), %xmm0, %xmm0
740         vpxor 48(%rsi), %xmm1, %xmm1
741         vpxor 96(%rsi), %xmm2, %xmm2
742         vpxor 112(%rsi), %xmm3, %xmm3
743         vpxor 160(%rsi), %xmm4, %xmm4
744         vpxor 176(%rsi), %xmm5, %xmm5
745         vpxor 224(%rsi), %xmm6, %xmm6
746         vpxor 240(%rsi), %xmm7, %xmm7
747         vmovdqu %xmm0, 32(%rdx)
748         vmovdqu %xmm1, 48(%rdx)
749         vmovdqu %xmm2, 96(%rdx)
750         vmovdqu %xmm3, 112(%rdx)
751         vmovdqu %xmm4, 160(%rdx)
752         vmovdqu %xmm5, 176(%rdx)
753         vmovdqu %xmm6, 224(%rdx)
754         vmovdqu %xmm7, 240(%rdx)
755         addq $256, %rsi
756         jmp .Lchacha_blocks_avx2_mainloop2_cont
757 .Lchacha_blocks_avx2_noinput2:
758         vmovdqu %xmm0, 0(%rdx)
759         vmovdqu %xmm1, 16(%rdx)
760         vmovdqu %xmm2, 64(%rdx)
761         vmovdqu %xmm3, 80(%rdx)
762         vmovdqu %xmm4, 128(%rdx)
763         vmovdqu %xmm5, 144(%rdx)
764         vmovdqu %xmm6, 192(%rdx)
765         vmovdqu %xmm7, 208(%rdx)
766         vmovdqa 192(%rsp), %xmm0
767         vmovdqa 208(%rsp), %xmm1
768         vmovdqa 224(%rsp), %xmm2
769         vmovdqa 240(%rsp), %xmm3
770         vmovdqa 256(%rsp), %xmm4
771         vmovdqa 272(%rsp), %xmm5
772         vmovdqa 288(%rsp), %xmm6
773         vmovdqa 304(%rsp), %xmm7
774         vpbroadcastd 32(%rsp), %xmm8
775         vpbroadcastd 4+32(%rsp), %xmm9
776         vpbroadcastd 8+32(%rsp), %xmm10
777         vpbroadcastd 12+32(%rsp), %xmm11
778         vmovdqa 128(%rsp), %xmm12
779         vmovdqa 160(%rsp), %xmm13
780         vpbroadcastd 8+48(%rsp), %xmm14
781         vpbroadcastd 12+48(%rsp), %xmm15
782         vpaddd %xmm8, %xmm0, %xmm0
783         vpaddd %xmm9, %xmm1, %xmm1
784         vpaddd %xmm10, %xmm2, %xmm2
785         vpaddd %xmm11, %xmm3, %xmm3
786         vpaddd %xmm12, %xmm4, %xmm4
787         vpaddd %xmm13, %xmm5, %xmm5
788         vpaddd %xmm14, %xmm6, %xmm6
789         vpaddd %xmm15, %xmm7, %xmm7
790         vpunpckldq %xmm1, %xmm0, %xmm8
791         vpunpckldq %xmm3, %xmm2, %xmm9
792         vpunpckhdq %xmm1, %xmm0, %xmm12
793         vpunpckhdq %xmm3, %xmm2, %xmm13
794         vpunpckldq %xmm5, %xmm4, %xmm10
795         vpunpckldq %xmm7, %xmm6, %xmm11
796         vpunpckhdq %xmm5, %xmm4, %xmm14
797         vpunpckhdq %xmm7, %xmm6, %xmm15
798         vpunpcklqdq %xmm9, %xmm8, %xmm0
799         vpunpcklqdq %xmm11, %xmm10, %xmm1
800         vpunpckhqdq %xmm9, %xmm8, %xmm2
801         vpunpckhqdq %xmm11, %xmm10, %xmm3
802         vpunpcklqdq %xmm13, %xmm12, %xmm4
803         vpunpcklqdq %xmm15, %xmm14, %xmm5
804         vpunpckhqdq %xmm13, %xmm12, %xmm6
805         vpunpckhqdq %xmm15, %xmm14, %xmm7
806         vmovdqu %xmm0, 32(%rdx)
807         vmovdqu %xmm1, 48(%rdx)
808         vmovdqu %xmm2, 96(%rdx)
809         vmovdqu %xmm3, 112(%rdx)
810         vmovdqu %xmm4, 160(%rdx)
811         vmovdqu %xmm5, 176(%rdx)
812         vmovdqu %xmm6, 224(%rdx)
813         vmovdqu %xmm7, 240(%rdx)
814 .Lchacha_blocks_avx2_mainloop2_cont:
815         addq $256, %rdx
816         subq $256, %rcx
817         cmp $256, %rcx
818         jae .Lchacha_blocks_avx2_atleast256
819 .Lchacha_blocks_avx2_below256_fixup:
820         vmovdqa 448(%rsp), %xmm6
821         vmovdqa 480(%rsp), %xmm7
822         vmovdqa 0(%rsp), %xmm8
823         vmovdqa 16(%rsp), %xmm9
824         vmovdqa 32(%rsp), %xmm10
825         vmovdqa 48(%rsp), %xmm11
826         movq $1, %r9
827 .Lchacha_blocks_avx2_below256:
828         vmovq %r9, %xmm5
829         andq %rcx, %rcx
830         jz .Lchacha_blocks_avx2_done
831         cmpq $64, %rcx
832         jae .Lchacha_blocks_avx2_above63
833         movq %rdx, %r9
834         andq %rsi, %rsi
835         jz .Lchacha_blocks_avx2_noinput3
836         movq %rcx, %r10
837         movq %rsp, %rdx
838         addq %r10, %rsi
839         addq %r10, %rdx
840         negq %r10
841 .Lchacha_blocks_avx2_copyinput:
842         movb (%rsi, %r10), %al
843         movb %al, (%rdx, %r10)
844         incq %r10
845         jnz .Lchacha_blocks_avx2_copyinput
846         movq %rsp, %rsi
847 .Lchacha_blocks_avx2_noinput3:
848         movq %rsp, %rdx
849 .Lchacha_blocks_avx2_above63:
850         vmovdqa %xmm8, %xmm0
851         vmovdqa %xmm9, %xmm1
852         vmovdqa %xmm10, %xmm2
853         vmovdqa %xmm11, %xmm3
854         movq 64(%rsp), %rax
855 .Lchacha_blocks_avx2_mainloop3:
856         vpaddd %xmm0, %xmm1, %xmm0
857         vpxor %xmm3, %xmm0, %xmm3
858         vpshufb %xmm6, %xmm3, %xmm3
859         vpaddd %xmm2, %xmm3, %xmm2
860         vpxor %xmm1, %xmm2, %xmm1
861         vpslld $12, %xmm1, %xmm4
862         vpsrld $20, %xmm1, %xmm1
863         vpxor %xmm1, %xmm4, %xmm1
864         vpaddd %xmm0, %xmm1, %xmm0
865         vpxor %xmm3, %xmm0, %xmm3
866         vpshufb %xmm7, %xmm3, %xmm3
867         vpshufd $0x93, %xmm0, %xmm0
868         vpaddd %xmm2, %xmm3, %xmm2
869         vpshufd $0x4e, %xmm3, %xmm3
870         vpxor %xmm1, %xmm2, %xmm1
871         vpshufd $0x39, %xmm2, %xmm2
872         vpslld $7, %xmm1, %xmm4
873         vpsrld $25, %xmm1, %xmm1
874         vpxor %xmm1, %xmm4, %xmm1
875         vpaddd %xmm0, %xmm1, %xmm0
876         vpxor %xmm3, %xmm0, %xmm3
877         vpshufb %xmm6, %xmm3, %xmm3
878         vpaddd %xmm2, %xmm3, %xmm2
879         vpxor %xmm1, %xmm2, %xmm1
880         vpslld $12, %xmm1, %xmm4
881         vpsrld $20, %xmm1, %xmm1
882         vpxor %xmm1, %xmm4, %xmm1
883         vpaddd %xmm0, %xmm1, %xmm0
884         vpxor %xmm3, %xmm0, %xmm3
885         vpshufb %xmm7, %xmm3, %xmm3
886         vpshufd $0x39, %xmm0, %xmm0
887         vpaddd %xmm2, %xmm3, %xmm2
888         vpshufd $0x4e, %xmm3, %xmm3
889         vpxor %xmm1, %xmm2, %xmm1
890         vpshufd $0x93, %xmm2, %xmm2
891         vpslld $7, %xmm1, %xmm4
892         vpsrld $25, %xmm1, %xmm1
893         vpxor %xmm1, %xmm4, %xmm1
894         subq $2, %rax
895         jnz .Lchacha_blocks_avx2_mainloop3
896         vpaddd %xmm0, %xmm8, %xmm0
897         vpaddd %xmm1, %xmm9, %xmm1
898         vpaddd %xmm2, %xmm10, %xmm2
899         vpaddd %xmm3, %xmm11, %xmm3
900         andq %rsi, %rsi
901         jz .Lchacha_blocks_avx2_noinput4
902         vpxor 0(%rsi), %xmm0, %xmm0
903         vpxor 16(%rsi), %xmm1, %xmm1
904         vpxor 32(%rsi), %xmm2, %xmm2
905         vpxor 48(%rsi), %xmm3, %xmm3
906         addq $64, %rsi
907 .Lchacha_blocks_avx2_noinput4:
908         vmovdqu %xmm0, 0(%rdx)
909         vmovdqu %xmm1, 16(%rdx)
910         vmovdqu %xmm2, 32(%rdx)
911         vmovdqu %xmm3, 48(%rdx)
912         vpaddq %xmm11, %xmm5, %xmm11
913         cmpq $64, %rcx
914         jbe .Lchacha_blocks_avx2_mainloop3_finishup
915         addq $64, %rdx
916         subq $64, %rcx
917         jmp .Lchacha_blocks_avx2_below256
918 .Lchacha_blocks_avx2_mainloop3_finishup:
919         cmpq $64, %rcx
920         je .Lchacha_blocks_avx2_done
921         addq %rcx, %r9
922         addq %rcx, %rdx
923         negq %rcx
924 .Lchacha_blocks_avx2_copyoutput:
925         movb (%rdx, %rcx), %al
926         movb %al, (%r9, %rcx)
927         incq %rcx
928         jnz .Lchacha_blocks_avx2_copyoutput
929 .Lchacha_blocks_avx2_done:
930         vmovdqu %xmm11, 48(%rdi)
931         movq %rbp, %rsp
932         popq %r14
933         popq %r13
934         popq %r12
935         popq %rbp
936         popq %rbx
937         vzeroall
938         movl $(63 + 512), %eax
939         ret
940 .size _gcry_chacha20_amd64_avx2_blocks,.-_gcry_chacha20_amd64_avx2_blocks;
941
942 .data
943 .align 16
944 .LC:
945 .byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13       /* pshufb rotate by 16 */
946 .byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14       /* pshufb rotate by 8 */
947
948 #endif /*defined(USE_CHACHA20)*/
949 #endif /*__x86_64*/