More optimized CRC implementations
[libgcrypt.git] / cipher / poly1305-sse2-amd64.S
1 /* poly1305-sse2-amd64.S  -  AMD64/SSE2 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
30 .text
31
32
33 .align 8
34 .globl _gcry_poly1305_amd64_sse2_init_ext
35 .type  _gcry_poly1305_amd64_sse2_init_ext,@function;
36 _gcry_poly1305_amd64_sse2_init_ext:
37 .Lpoly1305_init_ext_x86_local:
38         xor %edx, %edx
39         pushq %r12
40         pushq %r13
41         pushq %r14
42         movq %rdx, %r10
43         movq $-1, %rcx
44         testq %r10, %r10
45         pxor %xmm0, %xmm0
46         movq $0xfffffc0ffff, %r9
47         movdqa %xmm0, (%rdi)
48         cmove %rcx, %r10
49         movdqa %xmm0, 16(%rdi)
50         movq $0xffc0fffffff, %rcx
51         movdqa %xmm0, 32(%rdi)
52         movdqa %xmm0, 48(%rdi)
53         movdqa %xmm0, 64(%rdi)
54         movq 8(%rsi), %r11
55         movq %r11, %r8
56         movq (%rsi), %r12
57         andq %r12, %rcx
58         shrq $44, %r12
59         shlq $20, %r8
60         shrq $24, %r11
61         orq %r8, %r12
62         movq $0xffffffc0f, %r8
63         andq %r9, %r12
64         andq %r8, %r11
65         movl %ecx, %r8d
66         andl $67108863, %r8d
67         movq %rcx, %r9
68         movl %r8d, 84(%rdi)
69         movq %r12, %r8
70         shrq $26, %r9
71         shlq $18, %r8
72         orq %r8, %r9
73         movq %r12, %r8
74         shrq $8, %r8
75         andl $67108863, %r9d
76         andl $67108863, %r8d
77         movl %r9d, 92(%rdi)
78         movq %r12, %r9
79         movl %r8d, 100(%rdi)
80         movq %r11, %r8
81         shrq $34, %r9
82         shlq $10, %r8
83         orq %r8, %r9
84         movq %r11, %r8
85         shrq $16, %r8
86         andl $67108863, %r9d
87         movl %r9d, 108(%rdi)
88         cmpq $16, %r10
89         movl %r8d, 116(%rdi)
90         movl 16(%rsi), %r8d
91         movl %r8d, 124(%rdi)
92         movl 20(%rsi), %r8d
93         movl %r8d, 132(%rdi)
94         movl 24(%rsi), %r8d
95         movl %r8d, 140(%rdi)
96         movl 28(%rsi), %esi
97         movl %esi, 148(%rdi)
98         jbe .Lpoly1305_init_ext_sse2_done
99         lea (%r11,%r11,4), %r14
100         shlq $2, %r14
101         lea (%r12,%r12), %rax
102         mulq %r14
103         movq %rax, %r13
104         movq %rcx, %rax
105         movq %rdx, %r8
106         mulq %rcx
107         addq %rax, %r13
108         lea (%rcx,%rcx), %rax
109         movq %r13, %r9
110         adcq %rdx, %r8
111         mulq %r12
112         shlq $20, %r8
113         movq %rax, %rsi
114         shrq $44, %r9
115         movq %r11, %rax
116         orq %r9, %r8
117         movq %rdx, %r9
118         mulq %r14
119         addq %rax, %rsi
120         movq %rcx, %rax
121         adcq %rdx, %r9
122         addq %r11, %r11
123         mulq %r11
124         addq %rsi, %r8
125         movq %rax, %r11
126         movq %r12, %rax
127         movq %rdx, %rcx
128         adcq $0, %r9
129         mulq %r12
130         addq %rax, %r11
131         movq %r8, %rsi
132         adcq %rdx, %rcx
133         shlq $20, %r9
134         shrq $44, %rsi
135         orq %rsi, %r9
136         movq $0xfffffffffff, %rsi
137         addq %r11, %r9
138         movq %r9, %r12
139         adcq $0, %rcx
140         andq %rsi, %r13
141         shlq $22, %rcx
142         andq %rsi, %r8
143         shrq $42, %r12
144         orq %r12, %rcx
145         movq %rsi, %r12
146         lea (%rcx,%rcx,4), %rcx
147         addq %rcx, %r13
148         movq %rsi, %rcx
149         andq %r13, %rcx
150         shrq $44, %r13
151         movq %rcx, %r14
152         addq %r13, %r8
153         movq $0x3ffffffffff, %r13
154         andq %r8, %r12
155         andq %r13, %r9
156         shrq $44, %r8
157         movq %r12, %r11
158         addq %r8, %r9
159         movq %r12, %rax
160         movq %r9, %r13
161         movl %ecx, %r8d
162         shrq $26, %r14
163         andl $67108863, %r8d
164         shlq $18, %r11
165         shrq $34, %rax
166         orq %r11, %r14
167         shlq $10, %r13
168         movq %r12, %r11
169         orq %r13, %rax
170         movq %r9, %r13
171         shrq $8, %r11
172         shrq $16, %r13
173         andl $67108863, %r14d
174         andl $67108863, %r11d
175         andl $67108863, %eax
176         movl %r8d, 88(%rdi)
177         cmpq $64, %r10
178         movl %r8d, 80(%rdi)
179         movl %r14d, 104(%rdi)
180         movl %r14d, 96(%rdi)
181         movl %r11d, 120(%rdi)
182         movl %r11d, 112(%rdi)
183         movl %eax, 136(%rdi)
184         movl %eax, 128(%rdi)
185         movl %r13d, 152(%rdi)
186         movl %r13d, 144(%rdi)
187         jbe .Lpoly1305_init_ext_sse2_done
188         lea (%r9,%r9,4), %r14
189         shlq $2, %r14
190         lea (%r12,%r12), %rax
191         mulq %r14
192         movq %rax, %r8
193         movq %rcx, %rax
194         movq %rdx, %r10
195         mulq %rcx
196         addq %rax, %r8
197         lea (%rcx,%rcx), %rax
198         movq %r8, %r11
199         adcq %rdx, %r10
200         andq %rsi, %r8
201         mulq %r12
202         shlq $20, %r10
203         movq %rax, %r13
204         shrq $44, %r11
205         movq %r9, %rax
206         orq %r11, %r10
207         movq %rdx, %r11
208         mulq %r14
209         addq %rax, %r13
210         movq %rcx, %rax
211         adcq %rdx, %r11
212         addq %r9, %r9
213         mulq %r9
214         addq %r13, %r10
215         movq %rax, %r9
216         movq %r12, %rax
217         movq %rdx, %rcx
218         adcq $0, %r11
219         mulq %r12
220         addq %rax, %r9
221         movq %r10, %r13
222         adcq %rdx, %rcx
223         andq %rsi, %r10
224         shlq $20, %r11
225         shrq $44, %r13
226         orq %r13, %r11
227         addq %r9, %r11
228         movq %rsi, %r9
229         movq %r11, %r12
230         adcq $0, %rcx
231         shlq $22, %rcx
232         shrq $42, %r12
233         orq %r12, %rcx
234         lea (%rcx,%rcx,4), %rcx
235         addq %rcx, %r8
236         andq %r8, %r9
237         shrq $44, %r8
238         movl %r9d, %eax
239         addq %r8, %r10
240         movq $0x3ffffffffff, %r8
241         andq %r10, %rsi
242         andq %r8, %r11
243         shrq $44, %r10
244         movq %rsi, %r8
245         addq %r10, %r11
246         andl $67108863, %eax
247         shrq $26, %r9
248         movq %r11, %r10
249         shlq $18, %r8
250         shlq $10, %r10
251         orq %r8, %r9
252         movq %rsi, %r8
253         shrq $34, %rsi
254         andl $67108863, %r9d
255         shrq $8, %r8
256         orq %r10, %rsi
257         shrq $16, %r11
258         andl $67108863, %r8d
259         andl $67108863, %esi
260         movl %eax, 168(%rdi)
261         movl %eax, 160(%rdi)
262         movl %r9d, 184(%rdi)
263         movl %r9d, 176(%rdi)
264         movl %r8d, 200(%rdi)
265         movl %r8d, 192(%rdi)
266         movl %esi, 216(%rdi)
267         movl %esi, 208(%rdi)
268         movl %r11d, 232(%rdi)
269         movl %r11d, 224(%rdi)
270 .Lpoly1305_init_ext_sse2_done:
271         movq $0, 240(%rdi)
272         popq %r14
273         popq %r13
274         popq %r12
275         ret
276 .size _gcry_poly1305_amd64_sse2_init_ext,.-_gcry_poly1305_amd64_sse2_init_ext;
277
278
279 .align 8
280 .globl _gcry_poly1305_amd64_sse2_finish_ext
281 .type  _gcry_poly1305_amd64_sse2_finish_ext,@function;
282 _gcry_poly1305_amd64_sse2_finish_ext:
283 .Lpoly1305_finish_ext_x86_local:
284         pushq %rbp
285         movq %rsp, %rbp
286         subq $64, %rsp
287         andq $~63, %rsp
288         movq %rdx, 32(%rsp)
289         movq %rcx, 40(%rsp)
290         andq %rdx, %rdx
291         jz .Lpoly1305_finish_x86_no_leftover
292         pxor %xmm0, %xmm0
293         movdqa %xmm0, 0+0(%rsp)
294         movdqa %xmm0, 16+0(%rsp)
295         leaq 0(%rsp), %r8
296         testq $16, %rdx
297         jz .Lpoly1305_finish_x86_skip16
298         movdqu 0(%rsi), %xmm0
299         movdqa %xmm0, 0(%r8)
300         addq $16, %rsi
301         addq $16, %r8
302 .Lpoly1305_finish_x86_skip16:
303         testq $8, %rdx
304         jz .Lpoly1305_finish_x86_skip8
305         movq 0(%rsi), %rax
306         movq %rax, 0(%r8)
307         addq $8, %rsi
308         addq $8, %r8
309 .Lpoly1305_finish_x86_skip8:
310         testq $4, %rdx
311         jz .Lpoly1305_finish_x86_skip4
312         movl 0(%rsi), %eax
313         movl %eax, 0(%r8)
314         addq $4, %rsi
315         addq $4, %r8
316 .Lpoly1305_finish_x86_skip4:
317         testq $2, %rdx
318         jz .Lpoly1305_finish_x86_skip2
319         movw 0(%rsi), %ax
320         movw %ax, 0(%r8)
321         addq $2, %rsi
322         addq $2, %r8
323 .Lpoly1305_finish_x86_skip2:
324         testq $1, %rdx
325         jz .Lpoly1305_finish_x86_skip1
326         movb 0(%rsi), %al
327         movb %al, 0(%r8)
328         addq $1, %r8
329 .Lpoly1305_finish_x86_skip1:
330         cmpq $16, %rdx
331         je .Lpoly1305_finish_x86_is16
332         movb $1, 0(%r8)
333 .Lpoly1305_finish_x86_is16:
334         movq $4, %rax
335         jae .Lpoly1305_finish_x86_16andover
336         movq $8, %rax
337 .Lpoly1305_finish_x86_16andover:
338         orq %rax, 240(%rdi)
339         leaq 0(%rsp), %rsi
340         movq $32, %rdx
341         callq .Lpoly1305_blocks_x86_local
342 .Lpoly1305_finish_x86_no_leftover:
343         testq $1, 240(%rdi)
344         jz .Lpoly1305_finish_x86_not_started
345         movq 32(%rsp), %rdx
346         andq %rdx, %rdx
347         jz .Lpoly1305_finish_x86_r2r
348         cmpq $16, %rdx
349         jg .Lpoly1305_finish_x86_r2r
350         xorl %r10d, %r10d
351         movl 84(%rdi), %eax
352         movl 92(%rdi), %ecx
353         movl 100(%rdi), %edx
354         movl 108(%rdi), %r8d
355         movl 116(%rdi), %r9d
356         movl %eax, 80(%rdi)
357         movl $1, 8+80(%rdi)
358         movl %ecx, 96(%rdi)
359         movl %r10d, 8+96(%rdi)
360         movl %edx, 112(%rdi)
361         movl %r10d, 8+112(%rdi)
362         movl %r8d, 128(%rdi)
363         movl %r10d, 8+128(%rdi)
364         movl %r9d, 144(%rdi)
365         movl %r10d, 8+144(%rdi)
366         jmp .Lpoly1305_finish_x86_combine
367 .Lpoly1305_finish_x86_r2r:
368         movl 84(%rdi), %eax
369         movl 92(%rdi), %ecx
370         movl 100(%rdi), %edx
371         movl 108(%rdi), %r8d
372         movl 116(%rdi), %r9d
373         movl %eax, 8+80(%rdi)
374         movl %ecx, 8+96(%rdi)
375         movl %edx, 8+112(%rdi)
376         movl %r8d, 8+128(%rdi)
377         movl %r9d, 8+144(%rdi)
378 .Lpoly1305_finish_x86_combine:
379         xorq %rsi, %rsi
380         movq $32, %rdx
381         callq .Lpoly1305_blocks_x86_local
382 .Lpoly1305_finish_x86_not_started:
383         movq 0(%rdi), %r8
384         movq 8(%rdi), %r9
385         movq %r9, %r10
386         movq 16(%rdi), %r11
387         shlq $44, %r9
388         shrq $20, %r10
389         shlq $24, %r11
390         orq %r9, %r8
391         orq %r11, %r10
392         pxor %xmm0, %xmm0
393         movl 124(%rdi), %eax
394         movl 132(%rdi), %ecx
395         movl 140(%rdi), %edx
396         movl 148(%rdi), %esi
397         movq 40(%rsp), %r11
398         shlq $32, %rcx
399         shlq $32, %rsi
400         orq %rcx, %rax
401         orq %rsi, %rdx
402         addq %r8, %rax
403         adcq %r10, %rdx
404         movq %rax, 0(%r11)
405         movq %rdx, 8(%r11)
406         movq %rbp, %rax
407         subq %rsp, %rax
408         movq %rbp, %rsp
409         movdqa %xmm0, 0(%rdi)
410         movdqa %xmm0, 16(%rdi)
411         movdqa %xmm0, 32(%rdi)
412         movdqa %xmm0, 48(%rdi)
413         movdqa %xmm0, 64(%rdi)
414         movdqa %xmm0, 80(%rdi)
415         movdqa %xmm0, 96(%rdi)
416         movdqa %xmm0, 112(%rdi)
417         movdqa %xmm0, 128(%rdi)
418         movdqa %xmm0, 144(%rdi)
419         movdqa %xmm0, 160(%rdi)
420         movdqa %xmm0, 176(%rdi)
421         movdqa %xmm0, 192(%rdi)
422         movdqa %xmm0, 208(%rdi)
423         movdqa %xmm0, 224(%rdi)
424         popq %rbp
425         addq $8, %rax
426         ret
427 .size _gcry_poly1305_amd64_sse2_finish_ext,.-_gcry_poly1305_amd64_sse2_finish_ext;
428
429
430 .align 8
431 .globl _gcry_poly1305_amd64_sse2_blocks
432 .type  _gcry_poly1305_amd64_sse2_blocks,@function;
433 _gcry_poly1305_amd64_sse2_blocks:
434 .Lpoly1305_blocks_x86_local:
435         pushq %rbp
436         movq %rsp, %rbp
437         pushq %rbx
438         andq $-64, %rsp
439         subq $328, %rsp
440         movq 240(%rdi), %rax
441         movl $(1<<24), %r8d
442         movl $((1<<26)-1), %r9d
443         movd %r8, %xmm0
444         movd %r9, %xmm5
445         pshufd $0x44, %xmm0, %xmm0
446         pshufd $0x44, %xmm5, %xmm5
447         testb $4, %al
448         je .Lpoly1305_blocks_x86_3
449         psrldq $8, %xmm0
450 .Lpoly1305_blocks_x86_3:
451         testb $8, %al
452         je .Lpoly1305_blocks_x86_4
453         pxor %xmm0, %xmm0
454 .Lpoly1305_blocks_x86_4:
455         movdqa %xmm0, 168(%rsp)
456         testb $1, %al
457         jne .Lpoly1305_blocks_x86_5
458         movq 16(%rsi), %xmm0
459         movdqa %xmm5, %xmm7
460         movdqa %xmm5, %xmm10
461         movq (%rsi), %xmm6
462         orq $1, %rax
463         subq $32, %rdx
464         movq 8(%rsi), %xmm1
465         punpcklqdq %xmm0, %xmm6
466         movq 24(%rsi), %xmm0
467         pand %xmm6, %xmm7
468         movdqa %xmm6, %xmm9
469         psrlq $52, %xmm6
470         addq $32, %rsi
471         punpcklqdq %xmm0, %xmm1
472         movdqa %xmm1, %xmm0
473         psrlq $26, %xmm9
474         psllq $12, %xmm0
475         movq %rax, 240(%rdi)
476         pand %xmm5, %xmm9
477         por %xmm0, %xmm6
478         psrlq $40, %xmm1
479         pand %xmm6, %xmm10
480         por 168(%rsp), %xmm1
481         psrlq $26, %xmm6
482         pand %xmm5, %xmm6
483 .Lpoly1305_blocks_x86_6:
484         movdqa 80(%rdi), %xmm13
485         cmpq $63, %rdx
486         movl $(5), %r8d
487         movd %r8, %xmm14
488         pshufd $0x44, %xmm14, %xmm14
489         movdqa 96(%rdi), %xmm15
490         movdqa %xmm13, -8(%rsp)
491         movdqa 112(%rdi), %xmm0
492         movdqa %xmm14, 136(%rsp)
493         movdqa 128(%rdi), %xmm3
494         movdqa %xmm15, 312(%rsp)
495         pmuludq %xmm14, %xmm15
496         movdqa 144(%rdi), %xmm13
497         movdqa %xmm0, 232(%rsp)
498         pmuludq %xmm14, %xmm0
499         movdqa %xmm3, 152(%rsp)
500         pmuludq %xmm14, %xmm3
501         movdqa %xmm13, 56(%rsp)
502         pmuludq %xmm14, %xmm13
503         movdqa %xmm15, 40(%rsp)
504         movdqa %xmm0, -24(%rsp)
505         movdqa %xmm3, -40(%rsp)
506         movdqa %xmm13, -56(%rsp)
507         jbe .Lpoly1305_blocks_x86_7
508         movdqa 192(%rdi), %xmm15
509         leaq 32(%rsi), %rax
510         movq %rdx, %rcx
511         movdqa 176(%rdi), %xmm14
512         movdqa %xmm15, %xmm2
513         movdqa 208(%rdi), %xmm0
514         movdqa %xmm15, 216(%rsp)
515         movdqa %xmm14, 296(%rsp)
516         movdqa 224(%rdi), %xmm3
517         pmuludq 136(%rsp), %xmm14
518         movdqa -24(%rsp), %xmm13
519         movdqa %xmm14, 8(%rsp)
520         pmuludq 136(%rsp), %xmm2
521         movdqa -40(%rsp), %xmm14
522         movdqa %xmm0, 120(%rsp)
523         pmuludq 136(%rsp), %xmm0
524         movdqa %xmm3, 24(%rsp)
525         movdqa 160(%rdi), %xmm12
526         movdqa %xmm0, %xmm8
527         movdqa -56(%rsp), %xmm15
528         movdqa %xmm13, 88(%rsp)
529         pmuludq 136(%rsp), %xmm3
530         movdqa %xmm2, 104(%rsp)
531         movdqa %xmm0, %xmm13
532         movdqa -8(%rsp), %xmm11
533         movdqa %xmm3, 280(%rsp)
534         movdqa %xmm2, %xmm3
535         movdqa %xmm0, 200(%rsp)
536         movdqa %xmm14, 184(%rsp)
537         movdqa %xmm15, 264(%rsp)
538         jmp .Lpoly1305_blocks_x86_8
539 .p2align 6,,63
540 .Lpoly1305_blocks_x86_13:
541         movdqa 200(%rsp), %xmm13
542         movdqa %xmm3, %xmm6
543         movdqa 200(%rsp), %xmm8
544         movdqa 104(%rsp), %xmm3
545 .Lpoly1305_blocks_x86_8:
546         movdqa 8(%rsp), %xmm4
547         pmuludq %xmm6, %xmm3
548         subq $64, %rcx
549         pmuludq %xmm10, %xmm8
550         movdqa 104(%rsp), %xmm2
551         movdqa 200(%rsp), %xmm0
552         pmuludq %xmm1, %xmm4
553         movdqa 280(%rsp), %xmm15
554         pmuludq %xmm6, %xmm13
555         movdqa 280(%rsp), %xmm14
556         pmuludq %xmm1, %xmm0
557         paddq %xmm3, %xmm4
558         pmuludq %xmm1, %xmm2
559         movdqa 280(%rsp), %xmm3
560         paddq %xmm8, %xmm4
561         pmuludq %xmm9, %xmm15
562         movdqa 280(%rsp), %xmm8
563         pmuludq %xmm10, %xmm14
564         pmuludq %xmm6, %xmm8
565         paddq %xmm13, %xmm2
566         movdqa %xmm6, %xmm13
567         pmuludq %xmm1, %xmm3
568         paddq %xmm15, %xmm4
569         movdqa 296(%rsp), %xmm15
570         pmuludq %xmm12, %xmm13
571         paddq %xmm14, %xmm2
572         movdqa %xmm7, %xmm14
573         paddq %xmm8, %xmm0
574         pmuludq %xmm12, %xmm14
575         movdqa %xmm9, %xmm8
576         pmuludq 296(%rsp), %xmm6
577         pmuludq %xmm12, %xmm8
578         movdqa %xmm6, 248(%rsp)
579         pmuludq %xmm10, %xmm15
580         movq -16(%rax), %xmm6
581         paddq %xmm13, %xmm3
582         movdqa %xmm10, %xmm13
583         paddq %xmm14, %xmm4
584         movq -8(%rax), %xmm14
585         paddq %xmm8, %xmm2
586         movq -32(%rax), %xmm8
587         pmuludq %xmm12, %xmm13
588         paddq %xmm15, %xmm3
589         pmuludq %xmm12, %xmm1
590         movdqa 216(%rsp), %xmm15
591         pmuludq 216(%rsp), %xmm10
592         punpcklqdq %xmm6, %xmm8
593         movq -24(%rax), %xmm6
594         pmuludq %xmm9, %xmm15
595         paddq %xmm13, %xmm0
596         movdqa 296(%rsp), %xmm13
597         paddq 248(%rsp), %xmm1
598         punpcklqdq %xmm14, %xmm6
599         movdqa 296(%rsp), %xmm14
600         pmuludq %xmm9, %xmm13
601         pmuludq 120(%rsp), %xmm9
602         movdqa %xmm15, 72(%rsp)
603         paddq %xmm10, %xmm1
604         movdqa 216(%rsp), %xmm15
605         pmuludq %xmm7, %xmm14
606         movdqa %xmm6, %xmm10
607         paddq %xmm9, %xmm1
608         pmuludq %xmm7, %xmm15
609         paddq %xmm13, %xmm0
610         paddq 72(%rsp), %xmm3
611         movdqa 120(%rsp), %xmm13
612         psllq $12, %xmm10
613         paddq %xmm14, %xmm2
614         movdqa %xmm5, %xmm14
615         pand %xmm8, %xmm14
616         pmuludq %xmm7, %xmm13
617         paddq %xmm15, %xmm0
618         movdqa %xmm14, 248(%rsp)
619         movdqa %xmm8, %xmm14
620         psrlq $52, %xmm8
621         movdqu (%rax), %xmm9
622         por %xmm10, %xmm8
623         pmuludq 24(%rsp), %xmm7
624         movdqu 16(%rax), %xmm10
625         paddq %xmm13, %xmm3
626         pxor %xmm13, %xmm13
627         movdqa %xmm9, %xmm15
628         paddq %xmm7, %xmm1
629         movdqa %xmm6, %xmm7
630         movdqa %xmm10, -72(%rsp)
631         punpckldq %xmm10, %xmm15
632         movdqa %xmm15, %xmm10
633         punpckldq %xmm13, %xmm10
634         punpckhdq -72(%rsp), %xmm9
635         psrlq $40, %xmm6
636         movdqa %xmm10, 72(%rsp)
637         movdqa %xmm9, %xmm10
638         punpckhdq %xmm13, %xmm9
639         psllq $18, %xmm9
640         paddq 72(%rsp), %xmm4
641         addq $64, %rax
642         paddq %xmm9, %xmm3
643         movdqa 40(%rsp), %xmm9
644         cmpq $63, %rcx
645         punpckhdq %xmm13, %xmm15
646         psllq $6, %xmm15
647         punpckldq %xmm13, %xmm10
648         paddq %xmm15, %xmm2
649         psllq $12, %xmm10
650         por 168(%rsp), %xmm6
651         pmuludq %xmm6, %xmm9
652         movdqa 88(%rsp), %xmm15
653         paddq %xmm10, %xmm0
654         movdqa 88(%rsp), %xmm13
655         psrlq $14, %xmm7
656         pand %xmm5, %xmm8
657         movdqa 184(%rsp), %xmm10
658         pand %xmm5, %xmm7
659         pmuludq %xmm7, %xmm15
660         paddq %xmm9, %xmm4
661         pmuludq %xmm6, %xmm13
662         movdqa 184(%rsp), %xmm9
663         paddq 168(%rsp), %xmm1
664         pmuludq %xmm7, %xmm10
665         pmuludq %xmm6, %xmm9
666         paddq %xmm15, %xmm4
667         movdqa 184(%rsp), %xmm15
668         paddq %xmm13, %xmm2
669         psrlq $26, %xmm14
670         movdqa 264(%rsp), %xmm13
671         paddq %xmm10, %xmm2
672         pmuludq %xmm8, %xmm15
673         pand %xmm5, %xmm14
674         paddq %xmm9, %xmm0
675         pmuludq %xmm6, %xmm13
676         movdqa 264(%rsp), %xmm9
677         movdqa 264(%rsp), %xmm10
678         pmuludq %xmm11, %xmm6
679         pmuludq %xmm8, %xmm9
680         paddq %xmm15, %xmm4
681         movdqa 264(%rsp), %xmm15
682         pmuludq %xmm14, %xmm10
683         paddq %xmm13, %xmm3
684         movdqa %xmm7, %xmm13
685         pmuludq %xmm7, %xmm15
686         paddq %xmm6, %xmm1
687         movdqa 312(%rsp), %xmm6
688         paddq %xmm9, %xmm2
689         pmuludq %xmm11, %xmm13
690         movdqa 248(%rsp), %xmm9
691         paddq %xmm10, %xmm4
692         pmuludq %xmm8, %xmm6
693         pmuludq 312(%rsp), %xmm7
694         paddq %xmm15, %xmm0
695         movdqa %xmm9, %xmm10
696         movdqa %xmm14, %xmm15
697         pmuludq %xmm11, %xmm10
698         paddq %xmm13, %xmm3
699         movdqa %xmm8, %xmm13
700         pmuludq %xmm11, %xmm13
701         paddq %xmm6, %xmm3
702         paddq %xmm7, %xmm1
703         movdqa 232(%rsp), %xmm6
704         pmuludq %xmm11, %xmm15
705         pmuludq 232(%rsp), %xmm8
706         paddq %xmm10, %xmm4
707         paddq %xmm8, %xmm1
708         movdqa 312(%rsp), %xmm10
709         paddq %xmm13, %xmm0
710         pmuludq %xmm14, %xmm6
711         movdqa 312(%rsp), %xmm13
712         pmuludq %xmm9, %xmm10
713         paddq %xmm15, %xmm2
714         movdqa 232(%rsp), %xmm7
715         pmuludq %xmm14, %xmm13
716         pmuludq 152(%rsp), %xmm14
717         paddq %xmm14, %xmm1
718         pmuludq %xmm9, %xmm7
719         paddq %xmm6, %xmm3
720         paddq %xmm10, %xmm2
721         movdqa 152(%rsp), %xmm10
722         paddq %xmm13, %xmm0
723         pmuludq %xmm9, %xmm10
724         paddq %xmm7, %xmm0
725         movdqa %xmm4, %xmm7
726         psrlq $26, %xmm7
727         pmuludq 56(%rsp), %xmm9
728         pand %xmm5, %xmm4
729         paddq %xmm7, %xmm2
730         paddq %xmm9, %xmm1
731         paddq %xmm10, %xmm3
732         movdqa %xmm2, %xmm7
733         movdqa %xmm2, %xmm9
734         movdqa %xmm3, %xmm6
735         psrlq $26, %xmm7
736         pand %xmm5, %xmm3
737         psrlq $26, %xmm6
738         paddq %xmm7, %xmm0
739         pand %xmm5, %xmm9
740         paddq %xmm6, %xmm1
741         movdqa %xmm0, %xmm10
742         movdqa %xmm1, %xmm6
743         pand %xmm5, %xmm10
744         pand %xmm5, %xmm1
745         psrlq $26, %xmm6
746         pmuludq 136(%rsp), %xmm6
747         paddq %xmm6, %xmm4
748         movdqa %xmm0, %xmm6
749         psrlq $26, %xmm6
750         movdqa %xmm4, %xmm2
751         movdqa %xmm4, %xmm7
752         paddq %xmm6, %xmm3
753         psrlq $26, %xmm2
754         pand %xmm5, %xmm7
755         movdqa %xmm3, %xmm0
756         paddq %xmm2, %xmm9
757         pand %xmm5, %xmm3
758         psrlq $26, %xmm0
759         paddq %xmm0, %xmm1
760         ja .Lpoly1305_blocks_x86_13
761         leaq -64(%rdx), %rax
762         movdqa %xmm3, %xmm6
763         andl $63, %edx
764         andq $-64, %rax
765         leaq 64(%rsi,%rax), %rsi
766 .Lpoly1305_blocks_x86_7:
767         cmpq $31, %rdx
768         jbe .Lpoly1305_blocks_x86_9
769         movdqa -24(%rsp), %xmm13
770         movdqa %xmm6, %xmm0
771         movdqa %xmm6, %xmm3
772         movdqa 40(%rsp), %xmm11
773         movdqa %xmm1, %xmm12
774         testq %rsi, %rsi
775         movdqa -40(%rsp), %xmm2
776         pmuludq %xmm13, %xmm0
777         movdqa %xmm1, %xmm8
778         pmuludq %xmm1, %xmm11
779         movdqa %xmm10, %xmm4
780         movdqa %xmm1, %xmm14
781         pmuludq %xmm2, %xmm3
782         movdqa %xmm6, %xmm15
783         pmuludq %xmm1, %xmm13
784         movdqa %xmm7, %xmm1
785         pmuludq %xmm2, %xmm12
786         paddq %xmm0, %xmm11
787         movdqa -56(%rsp), %xmm0
788         pmuludq %xmm10, %xmm2
789         paddq %xmm3, %xmm13
790         pmuludq %xmm0, %xmm4
791         movdqa %xmm9, %xmm3
792         pmuludq %xmm0, %xmm3
793         paddq %xmm2, %xmm11
794         pmuludq %xmm0, %xmm8
795         movdqa %xmm6, %xmm2
796         pmuludq %xmm0, %xmm2
797         movdqa -8(%rsp), %xmm0
798         paddq %xmm4, %xmm13
799         movdqa 312(%rsp), %xmm4
800         paddq %xmm3, %xmm11
801         pmuludq 312(%rsp), %xmm6
802         movdqa 312(%rsp), %xmm3
803         pmuludq %xmm0, %xmm1
804         paddq %xmm2, %xmm12
805         pmuludq %xmm0, %xmm15
806         movdqa %xmm9, %xmm2
807         pmuludq %xmm0, %xmm2
808         pmuludq %xmm7, %xmm3
809         paddq %xmm1, %xmm11
810         movdqa 232(%rsp), %xmm1
811         pmuludq %xmm0, %xmm14
812         paddq %xmm15, %xmm8
813         pmuludq %xmm10, %xmm0
814         paddq %xmm2, %xmm13
815         movdqa 312(%rsp), %xmm2
816         pmuludq %xmm10, %xmm4
817         paddq %xmm3, %xmm13
818         movdqa 152(%rsp), %xmm3
819         pmuludq %xmm9, %xmm2
820         paddq %xmm6, %xmm14
821         pmuludq 232(%rsp), %xmm10
822         paddq %xmm0, %xmm12
823         pmuludq %xmm9, %xmm1
824         paddq %xmm10, %xmm14
825         movdqa 232(%rsp), %xmm0
826         pmuludq %xmm7, %xmm3
827         paddq %xmm4, %xmm8
828         pmuludq 152(%rsp), %xmm9
829         paddq %xmm2, %xmm12
830         paddq %xmm9, %xmm14
831         pmuludq %xmm7, %xmm0
832         paddq %xmm1, %xmm8
833         pmuludq 56(%rsp), %xmm7
834         paddq %xmm3, %xmm8
835         paddq %xmm7, %xmm14
836         paddq %xmm0, %xmm12
837         je .Lpoly1305_blocks_x86_10
838         movdqu (%rsi), %xmm1
839         pxor %xmm0, %xmm0
840         paddq 168(%rsp), %xmm14
841         movdqu 16(%rsi), %xmm2
842         movdqa %xmm1, %xmm3
843         punpckldq %xmm2, %xmm3
844         punpckhdq %xmm2, %xmm1
845         movdqa %xmm3, %xmm4
846         movdqa %xmm1, %xmm2
847         punpckldq %xmm0, %xmm4
848         punpckhdq %xmm0, %xmm3
849         punpckhdq %xmm0, %xmm1
850         punpckldq %xmm0, %xmm2
851         movdqa %xmm2, %xmm0
852         psllq $6, %xmm3
853         paddq %xmm4, %xmm11
854         psllq $12, %xmm0
855         paddq %xmm3, %xmm13
856         psllq $18, %xmm1
857         paddq %xmm0, %xmm12
858         paddq %xmm1, %xmm8
859 .Lpoly1305_blocks_x86_10:
860         movdqa %xmm11, %xmm9
861         movdqa %xmm8, %xmm1
862         movdqa %xmm11, %xmm7
863         psrlq $26, %xmm9
864         movdqa %xmm8, %xmm6
865         pand %xmm5, %xmm7
866         paddq %xmm13, %xmm9
867         psrlq $26, %xmm1
868         pand %xmm5, %xmm6
869         movdqa %xmm9, %xmm10
870         paddq %xmm14, %xmm1
871         pand %xmm5, %xmm9
872         psrlq $26, %xmm10
873         movdqa %xmm1, %xmm0
874         pand %xmm5, %xmm1
875         paddq %xmm12, %xmm10
876         psrlq $26, %xmm0
877         pmuludq 136(%rsp), %xmm0
878         movdqa %xmm10, %xmm2
879         paddq %xmm0, %xmm7
880         psrlq $26, %xmm2
881         movdqa %xmm7, %xmm0
882         pand %xmm5, %xmm10
883         paddq %xmm2, %xmm6
884         psrlq $26, %xmm0
885         pand %xmm5, %xmm7
886         movdqa %xmm6, %xmm2
887         paddq %xmm0, %xmm9
888         pand %xmm5, %xmm6
889         psrlq $26, %xmm2
890         paddq %xmm2, %xmm1
891 .Lpoly1305_blocks_x86_9:
892         testq %rsi, %rsi
893         je .Lpoly1305_blocks_x86_11
894         movdqa %xmm7, 0(%rdi)
895         movdqa %xmm9, 16(%rdi)
896         movdqa %xmm10, 32(%rdi)
897         movdqa %xmm6, 48(%rdi)
898         movdqa %xmm1, 64(%rdi)
899         movq -8(%rbp), %rbx
900         leave
901         ret
902 .Lpoly1305_blocks_x86_5:
903         movdqa 0(%rdi), %xmm7
904         movdqa 16(%rdi), %xmm9
905         movdqa 32(%rdi), %xmm10
906         movdqa 48(%rdi), %xmm6
907         movdqa 64(%rdi), %xmm1
908         jmp .Lpoly1305_blocks_x86_6
909 .Lpoly1305_blocks_x86_11:
910         movdqa %xmm7, %xmm0
911         movdqa %xmm9, %xmm2
912         movdqa %xmm6, %xmm3
913         psrldq $8, %xmm0
914         movabsq $4398046511103, %rbx
915         paddq %xmm0, %xmm7
916         psrldq $8, %xmm2
917         movdqa %xmm10, %xmm0
918         movd %xmm7, %edx
919         paddq %xmm2, %xmm9
920         psrldq $8, %xmm0
921         movl %edx, %ecx
922         movd %xmm9, %eax
923         paddq %xmm0, %xmm10
924         shrl $26, %ecx
925         psrldq $8, %xmm3
926         movdqa %xmm1, %xmm0
927         addl %ecx, %eax
928         movd %xmm10, %ecx
929         paddq %xmm3, %xmm6
930         movl %eax, %r9d
931         shrl $26, %eax
932         psrldq $8, %xmm0
933         addl %ecx, %eax
934         movd %xmm6, %ecx
935         paddq %xmm0, %xmm1
936         movl %eax, %esi
937         andl $67108863, %r9d
938         movd %xmm1, %r10d
939         shrl $26, %esi
940         andl $67108863, %eax
941         andl $67108863, %edx
942         addl %ecx, %esi
943         salq $8, %rax
944         movl %r9d, %ecx
945         shrl $18, %r9d
946         movl %esi, %r8d
947         shrl $26, %esi
948         andl $67108863, %r8d
949         addl %r10d, %esi
950         orq %r9, %rax
951         salq $16, %rsi
952         movq %r8, %r9
953         shrl $10, %r8d
954         salq $26, %rcx
955         orq %r8, %rsi
956         salq $34, %r9
957         orq %rdx, %rcx
958         movq %rsi, %r8
959         shrq $42, %rsi
960         movabsq $17592186044415, %rdx
961         orq %r9, %rax
962         andq %rbx, %r8
963         leaq (%rsi,%rsi,4), %rsi
964         andq %rdx, %rcx
965         andq %rdx, %rax
966         movabsq $-4398046511104, %r10
967         addq %rsi, %rcx
968         movq %rcx, %rsi
969         shrq $44, %rcx
970         addq %rcx, %rax
971         andq %rdx, %rsi
972         movq %rax, %rcx
973         shrq $44, %rax
974         addq %r8, %rax
975         andq %rdx, %rcx
976         andq %rax, %rbx
977         shrq $42, %rax
978         leaq (%rsi,%rax,4), %rsi
979         addq %rbx, %r10
980         addq %rax, %rsi
981         movq %rsi, %r8
982         shrq $44, %rsi
983         andq %rdx, %r8
984         addq %rcx, %rsi
985         leaq 5(%r8), %r9
986         movq %r9, %r11
987         andq %rdx, %r9
988         shrq $44, %r11
989         addq %rsi, %r11
990         movq %r11, %rax
991         andq %r11, %rdx
992         shrq $44, %rax
993         addq %rax, %r10
994         movq %r10, %rax
995         shrq $63, %rax
996         subq $1, %rax
997         movq %rax, %rcx
998         andq %rax, %r9
999         andq %rax, %rdx
1000         notq %rcx
1001         andq %r10, %rax
1002         andq %rcx, %r8
1003         andq %rcx, %rsi
1004         andq %rbx, %rcx
1005         orq %r9, %r8
1006         orq %rdx, %rsi
1007         orq %rax, %rcx
1008         movq %r8, 0(%rdi)
1009         movq %rsi, 8(%rdi)
1010         movq %rcx, 16(%rdi)
1011         movq -8(%rbp), %rbx
1012         movq %rbp, %rax
1013         subq %rsp, %rax
1014         pxor %xmm15, %xmm15
1015         pxor %xmm7, %xmm7
1016         pxor %xmm14, %xmm14
1017         pxor %xmm6, %xmm6
1018         pxor %xmm13, %xmm13
1019         pxor %xmm5, %xmm5
1020         pxor %xmm12, %xmm12
1021         pxor %xmm4, %xmm4
1022         leave
1023         addq $8, %rax
1024         pxor %xmm11, %xmm11
1025         pxor %xmm3, %xmm3
1026         pxor %xmm10, %xmm10
1027         pxor %xmm2, %xmm2
1028         pxor %xmm9, %xmm9
1029         pxor %xmm1, %xmm1
1030         pxor %xmm8, %xmm8
1031         pxor %xmm0, %xmm0
1032         ret
1033 .size _gcry_poly1305_amd64_sse2_blocks,.-_gcry_poly1305_amd64_sse2_blocks;
1034
1035 #endif