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