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