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