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