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