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