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