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