Enable AMD64 SHA512 implementations for WIN64
[libgcrypt.git] / cipher / chacha20-ssse3-amd64.S
1 /* chacha20-ssse3-amd64.S  -  AMD64/SSSE3 implementation of ChaCha20
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/chacha-opt
24  */
25
26 #ifdef __x86_64__
27 #include <config.h>
28
29 #if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && \
30     defined(HAVE_GCC_INLINE_ASM_SSSE3) && USE_CHACHA20
31
32 #ifdef __PIC__
33 #  define RIP (%rip)
34 #else
35 #  define RIP
36 #endif
37
38 .text
39
40 .align 8
41 .globl _gcry_chacha20_amd64_ssse3_blocks
42 .type  _gcry_chacha20_amd64_ssse3_blocks,@function;
43 _gcry_chacha20_amd64_ssse3_blocks:
44 .Lchacha_blocks_ssse3_local:
45         pushq %rbx
46         pushq %rbp
47         movq %rsp, %rbp
48         andq $~63, %rsp
49         subq $512, %rsp
50         leaq .LC RIP, %rax
51         movdqa 0(%rax), %xmm6
52         movdqa 16(%rax), %xmm7
53         movdqu 0(%rdi), %xmm8
54         movdqu 16(%rdi), %xmm9
55         movdqu 32(%rdi), %xmm10
56         movdqu 48(%rdi), %xmm11
57         movl $20, %eax
58         movq $1, %r9
59         movdqa %xmm8, 0(%rsp)
60         movdqa %xmm9, 16(%rsp)
61         movdqa %xmm10, 32(%rsp)
62         movdqa %xmm11, 48(%rsp)
63         movdqa %xmm6, 80(%rsp)
64         movdqa %xmm7, 96(%rsp)
65         movq %rax, 64(%rsp)
66         cmpq $256, %rcx
67         jb .Lchacha_blocks_ssse3_below256
68         pshufd $0x00, %xmm8, %xmm0
69         pshufd $0x55, %xmm8, %xmm1
70         pshufd $0xaa, %xmm8, %xmm2
71         pshufd $0xff, %xmm8, %xmm3
72         movdqa %xmm0, 128(%rsp)
73         movdqa %xmm1, 144(%rsp)
74         movdqa %xmm2, 160(%rsp)
75         movdqa %xmm3, 176(%rsp)
76         pshufd $0x00, %xmm9, %xmm0
77         pshufd $0x55, %xmm9, %xmm1
78         pshufd $0xaa, %xmm9, %xmm2
79         pshufd $0xff, %xmm9, %xmm3
80         movdqa %xmm0, 192(%rsp)
81         movdqa %xmm1, 208(%rsp)
82         movdqa %xmm2, 224(%rsp)
83         movdqa %xmm3, 240(%rsp)
84         pshufd $0x00, %xmm10, %xmm0
85         pshufd $0x55, %xmm10, %xmm1
86         pshufd $0xaa, %xmm10, %xmm2
87         pshufd $0xff, %xmm10, %xmm3
88         movdqa %xmm0, 256(%rsp)
89         movdqa %xmm1, 272(%rsp)
90         movdqa %xmm2, 288(%rsp)
91         movdqa %xmm3, 304(%rsp)
92         pshufd $0xaa, %xmm11, %xmm0
93         pshufd $0xff, %xmm11, %xmm1
94         movdqa %xmm0, 352(%rsp)
95         movdqa %xmm1, 368(%rsp)
96         jmp .Lchacha_blocks_ssse3_atleast256
97 .p2align 6,,63
98         # align to 4 mod 64
99         nop;nop;nop;nop;
100 .Lchacha_blocks_ssse3_atleast256:
101         movq 48(%rsp), %rax
102         leaq 1(%rax), %r8
103         leaq 2(%rax), %r9
104         leaq 3(%rax), %r10
105         leaq 4(%rax), %rbx
106         movl %eax, 320(%rsp)
107         movl %r8d, 4+320(%rsp)
108         movl %r9d, 8+320(%rsp)
109         movl %r10d, 12+320(%rsp)
110         shrq $32, %rax
111         shrq $32, %r8
112         shrq $32, %r9
113         shrq $32, %r10
114         movl %eax, 336(%rsp)
115         movl %r8d, 4+336(%rsp)
116         movl %r9d, 8+336(%rsp)
117         movl %r10d, 12+336(%rsp)
118         movq %rbx, 48(%rsp)
119         movq 64(%rsp), %rax
120         movdqa 128(%rsp), %xmm0
121         movdqa 144(%rsp), %xmm1
122         movdqa 160(%rsp), %xmm2
123         movdqa 176(%rsp), %xmm3
124         movdqa 192(%rsp), %xmm4
125         movdqa 208(%rsp), %xmm5
126         movdqa 224(%rsp), %xmm6
127         movdqa 240(%rsp), %xmm7
128         movdqa 256(%rsp), %xmm8
129         movdqa 272(%rsp), %xmm9
130         movdqa 288(%rsp), %xmm10
131         movdqa 304(%rsp), %xmm11
132         movdqa 320(%rsp), %xmm12
133         movdqa 336(%rsp), %xmm13
134         movdqa 352(%rsp), %xmm14
135         movdqa 368(%rsp), %xmm15
136 .Lchacha_blocks_ssse3_mainloop1:
137         paddd %xmm4, %xmm0
138         paddd %xmm5, %xmm1
139         pxor %xmm0, %xmm12
140         pxor %xmm1, %xmm13
141         paddd %xmm6, %xmm2
142         paddd %xmm7, %xmm3
143         pxor %xmm2, %xmm14
144         pxor %xmm3, %xmm15
145         pshufb 80(%rsp), %xmm12
146         pshufb 80(%rsp), %xmm13
147         paddd %xmm12, %xmm8
148         paddd %xmm13, %xmm9
149         pshufb 80(%rsp), %xmm14
150         pshufb 80(%rsp), %xmm15
151         paddd %xmm14, %xmm10
152         paddd %xmm15, %xmm11
153         movdqa %xmm12, 112(%rsp)
154         pxor %xmm8, %xmm4
155         pxor %xmm9, %xmm5
156         movdqa %xmm4, %xmm12
157         pslld $ 12, %xmm4
158         psrld $20, %xmm12
159         pxor %xmm12, %xmm4
160         movdqa %xmm5, %xmm12
161         pslld $ 12, %xmm5
162         psrld $20, %xmm12
163         pxor %xmm12, %xmm5
164         pxor %xmm10, %xmm6
165         pxor %xmm11, %xmm7
166         movdqa %xmm6, %xmm12
167         pslld $ 12, %xmm6
168         psrld $20, %xmm12
169         pxor %xmm12, %xmm6
170         movdqa %xmm7, %xmm12
171         pslld $ 12, %xmm7
172         psrld $20, %xmm12
173         pxor %xmm12, %xmm7
174         movdqa 112(%rsp), %xmm12
175         paddd %xmm4, %xmm0
176         paddd %xmm5, %xmm1
177         pxor %xmm0, %xmm12
178         pxor %xmm1, %xmm13
179         paddd %xmm6, %xmm2
180         paddd %xmm7, %xmm3
181         pxor %xmm2, %xmm14
182         pxor %xmm3, %xmm15
183         pshufb 96(%rsp), %xmm12
184         pshufb 96(%rsp), %xmm13
185         paddd %xmm12, %xmm8
186         paddd %xmm13, %xmm9
187         pshufb 96(%rsp), %xmm14
188         pshufb 96(%rsp), %xmm15
189         paddd %xmm14, %xmm10
190         paddd %xmm15, %xmm11
191         movdqa %xmm12, 112(%rsp)
192         pxor %xmm8, %xmm4
193         pxor %xmm9, %xmm5
194         movdqa %xmm4, %xmm12
195         pslld $ 7, %xmm4
196         psrld $25, %xmm12
197         pxor %xmm12, %xmm4
198         movdqa %xmm5, %xmm12
199         pslld $ 7, %xmm5
200         psrld $25, %xmm12
201         pxor %xmm12, %xmm5
202         pxor %xmm10, %xmm6
203         pxor %xmm11, %xmm7
204         movdqa %xmm6, %xmm12
205         pslld $ 7, %xmm6
206         psrld $25, %xmm12
207         pxor %xmm12, %xmm6
208         movdqa %xmm7, %xmm12
209         pslld $ 7, %xmm7
210         psrld $25, %xmm12
211         pxor %xmm12, %xmm7
212         movdqa 112(%rsp), %xmm12
213         paddd %xmm5, %xmm0
214         paddd %xmm6, %xmm1
215         pxor %xmm0, %xmm15
216         pxor %xmm1, %xmm12
217         paddd %xmm7, %xmm2
218         paddd %xmm4, %xmm3
219         pxor %xmm2, %xmm13
220         pxor %xmm3, %xmm14
221         pshufb 80(%rsp), %xmm15
222         pshufb 80(%rsp), %xmm12
223         paddd %xmm15, %xmm10
224         paddd %xmm12, %xmm11
225         pshufb 80(%rsp), %xmm13
226         pshufb 80(%rsp), %xmm14
227         paddd %xmm13, %xmm8
228         paddd %xmm14, %xmm9
229         movdqa %xmm15, 112(%rsp)
230         pxor %xmm10, %xmm5
231         pxor %xmm11, %xmm6
232         movdqa %xmm5, %xmm15
233         pslld $ 12, %xmm5
234         psrld $20, %xmm15
235         pxor %xmm15, %xmm5
236         movdqa %xmm6, %xmm15
237         pslld $ 12, %xmm6
238         psrld $20, %xmm15
239         pxor %xmm15, %xmm6
240         pxor %xmm8, %xmm7
241         pxor %xmm9, %xmm4
242         movdqa %xmm7, %xmm15
243         pslld $ 12, %xmm7
244         psrld $20, %xmm15
245         pxor %xmm15, %xmm7
246         movdqa %xmm4, %xmm15
247         pslld $ 12, %xmm4
248         psrld $20, %xmm15
249         pxor %xmm15, %xmm4
250         movdqa 112(%rsp), %xmm15
251         paddd %xmm5, %xmm0
252         paddd %xmm6, %xmm1
253         pxor %xmm0, %xmm15
254         pxor %xmm1, %xmm12
255         paddd %xmm7, %xmm2
256         paddd %xmm4, %xmm3
257         pxor %xmm2, %xmm13
258         pxor %xmm3, %xmm14
259         pshufb 96(%rsp), %xmm15
260         pshufb 96(%rsp), %xmm12
261         paddd %xmm15, %xmm10
262         paddd %xmm12, %xmm11
263         pshufb 96(%rsp), %xmm13
264         pshufb 96(%rsp), %xmm14
265         paddd %xmm13, %xmm8
266         paddd %xmm14, %xmm9
267         movdqa %xmm15, 112(%rsp)
268         pxor %xmm10, %xmm5
269         pxor %xmm11, %xmm6
270         movdqa %xmm5, %xmm15
271         pslld $ 7, %xmm5
272         psrld $25, %xmm15
273         pxor %xmm15, %xmm5
274         movdqa %xmm6, %xmm15
275         pslld $ 7, %xmm6
276         psrld $25, %xmm15
277         pxor %xmm15, %xmm6
278         pxor %xmm8, %xmm7
279         pxor %xmm9, %xmm4
280         movdqa %xmm7, %xmm15
281         pslld $ 7, %xmm7
282         psrld $25, %xmm15
283         pxor %xmm15, %xmm7
284         movdqa %xmm4, %xmm15
285         pslld $ 7, %xmm4
286         psrld $25, %xmm15
287         pxor %xmm15, %xmm4
288         subq $2, %rax
289         movdqa 112(%rsp), %xmm15
290         jnz .Lchacha_blocks_ssse3_mainloop1
291         paddd 128(%rsp), %xmm0
292         paddd 144(%rsp), %xmm1
293         paddd 160(%rsp), %xmm2
294         paddd 176(%rsp), %xmm3
295         paddd 192(%rsp), %xmm4
296         paddd 208(%rsp), %xmm5
297         paddd 224(%rsp), %xmm6
298         paddd 240(%rsp), %xmm7
299         paddd 256(%rsp), %xmm8
300         paddd 272(%rsp), %xmm9
301         paddd 288(%rsp), %xmm10
302         paddd 304(%rsp), %xmm11
303         paddd 320(%rsp), %xmm12
304         paddd 336(%rsp), %xmm13
305         paddd 352(%rsp), %xmm14
306         paddd 368(%rsp), %xmm15
307         movdqa %xmm8, 384(%rsp)
308         movdqa %xmm9, 400(%rsp)
309         movdqa %xmm10, 416(%rsp)
310         movdqa %xmm11, 432(%rsp)
311         movdqa %xmm12, 448(%rsp)
312         movdqa %xmm13, 464(%rsp)
313         movdqa %xmm14, 480(%rsp)
314         movdqa %xmm15, 496(%rsp)
315         movdqa %xmm0, %xmm8
316         movdqa %xmm2, %xmm9
317         movdqa %xmm4, %xmm10
318         movdqa %xmm6, %xmm11
319         punpckhdq %xmm1, %xmm0
320         punpckhdq %xmm3, %xmm2
321         punpckhdq %xmm5, %xmm4
322         punpckhdq %xmm7, %xmm6
323         punpckldq %xmm1, %xmm8
324         punpckldq %xmm3, %xmm9
325         punpckldq %xmm5, %xmm10
326         punpckldq %xmm7, %xmm11
327         movdqa %xmm0, %xmm1
328         movdqa %xmm4, %xmm3
329         movdqa %xmm8, %xmm5
330         movdqa %xmm10, %xmm7
331         punpckhqdq %xmm2, %xmm0
332         punpckhqdq %xmm6, %xmm4
333         punpckhqdq %xmm9, %xmm8
334         punpckhqdq %xmm11, %xmm10
335         punpcklqdq %xmm2, %xmm1
336         punpcklqdq %xmm6, %xmm3
337         punpcklqdq %xmm9, %xmm5
338         punpcklqdq %xmm11, %xmm7
339         andq %rsi, %rsi
340         jz .Lchacha_blocks_ssse3_noinput1
341         movdqu 0(%rsi), %xmm2
342         movdqu 16(%rsi), %xmm6
343         movdqu 64(%rsi), %xmm9
344         movdqu 80(%rsi), %xmm11
345         movdqu 128(%rsi), %xmm12
346         movdqu 144(%rsi), %xmm13
347         movdqu 192(%rsi), %xmm14
348         movdqu 208(%rsi), %xmm15
349         pxor %xmm2, %xmm5
350         pxor %xmm6, %xmm7
351         pxor %xmm9, %xmm8
352         pxor %xmm11, %xmm10
353         pxor %xmm12, %xmm1
354         pxor %xmm13, %xmm3
355         pxor %xmm14, %xmm0
356         pxor %xmm15, %xmm4
357         movdqu %xmm5, 0(%rdx)
358         movdqu %xmm7, 16(%rdx)
359         movdqu %xmm8, 64(%rdx)
360         movdqu %xmm10, 80(%rdx)
361         movdqu %xmm1, 128(%rdx)
362         movdqu %xmm3, 144(%rdx)
363         movdqu %xmm0, 192(%rdx)
364         movdqu %xmm4, 208(%rdx)
365         movdqa 384(%rsp), %xmm0
366         movdqa 400(%rsp), %xmm1
367         movdqa 416(%rsp), %xmm2
368         movdqa 432(%rsp), %xmm3
369         movdqa 448(%rsp), %xmm4
370         movdqa 464(%rsp), %xmm5
371         movdqa 480(%rsp), %xmm6
372         movdqa 496(%rsp), %xmm7
373         movdqa %xmm0, %xmm8
374         movdqa %xmm2, %xmm9
375         movdqa %xmm4, %xmm10
376         movdqa %xmm6, %xmm11
377         punpckldq %xmm1, %xmm8
378         punpckldq %xmm3, %xmm9
379         punpckhdq %xmm1, %xmm0
380         punpckhdq %xmm3, %xmm2
381         punpckldq %xmm5, %xmm10
382         punpckldq %xmm7, %xmm11
383         punpckhdq %xmm5, %xmm4
384         punpckhdq %xmm7, %xmm6
385         movdqa %xmm8, %xmm1
386         movdqa %xmm0, %xmm3
387         movdqa %xmm10, %xmm5
388         movdqa %xmm4, %xmm7
389         punpcklqdq %xmm9, %xmm1
390         punpcklqdq %xmm11, %xmm5
391         punpckhqdq %xmm9, %xmm8
392         punpckhqdq %xmm11, %xmm10
393         punpcklqdq %xmm2, %xmm3
394         punpcklqdq %xmm6, %xmm7
395         punpckhqdq %xmm2, %xmm0
396         punpckhqdq %xmm6, %xmm4
397         movdqu 32(%rsi), %xmm2
398         movdqu 48(%rsi), %xmm6
399         movdqu 96(%rsi), %xmm9
400         movdqu 112(%rsi), %xmm11
401         movdqu 160(%rsi), %xmm12
402         movdqu 176(%rsi), %xmm13
403         movdqu 224(%rsi), %xmm14
404         movdqu 240(%rsi), %xmm15
405         pxor %xmm2, %xmm1
406         pxor %xmm6, %xmm5
407         pxor %xmm9, %xmm8
408         pxor %xmm11, %xmm10
409         pxor %xmm12, %xmm3
410         pxor %xmm13, %xmm7
411         pxor %xmm14, %xmm0
412         pxor %xmm15, %xmm4
413         movdqu %xmm1, 32(%rdx)
414         movdqu %xmm5, 48(%rdx)
415         movdqu %xmm8, 96(%rdx)
416         movdqu %xmm10, 112(%rdx)
417         movdqu %xmm3, 160(%rdx)
418         movdqu %xmm7, 176(%rdx)
419         movdqu %xmm0, 224(%rdx)
420         movdqu %xmm4, 240(%rdx)
421         addq $256, %rsi
422         jmp .Lchacha_blocks_ssse3_mainloop_cont
423 .Lchacha_blocks_ssse3_noinput1:
424         movdqu %xmm5, 0(%rdx)
425         movdqu %xmm7, 16(%rdx)
426         movdqu %xmm8, 64(%rdx)
427         movdqu %xmm10, 80(%rdx)
428         movdqu %xmm1, 128(%rdx)
429         movdqu %xmm3, 144(%rdx)
430         movdqu %xmm0, 192(%rdx)
431         movdqu %xmm4, 208(%rdx)
432         movdqa 384(%rsp), %xmm0
433         movdqa 400(%rsp), %xmm1
434         movdqa 416(%rsp), %xmm2
435         movdqa 432(%rsp), %xmm3
436         movdqa 448(%rsp), %xmm4
437         movdqa 464(%rsp), %xmm5
438         movdqa 480(%rsp), %xmm6
439         movdqa 496(%rsp), %xmm7
440         movdqa %xmm0, %xmm8
441         movdqa %xmm2, %xmm9
442         movdqa %xmm4, %xmm10
443         movdqa %xmm6, %xmm11
444         punpckldq %xmm1, %xmm8
445         punpckldq %xmm3, %xmm9
446         punpckhdq %xmm1, %xmm0
447         punpckhdq %xmm3, %xmm2
448         punpckldq %xmm5, %xmm10
449         punpckldq %xmm7, %xmm11
450         punpckhdq %xmm5, %xmm4
451         punpckhdq %xmm7, %xmm6
452         movdqa %xmm8, %xmm1
453         movdqa %xmm0, %xmm3
454         movdqa %xmm10, %xmm5
455         movdqa %xmm4, %xmm7
456         punpcklqdq %xmm9, %xmm1
457         punpcklqdq %xmm11, %xmm5
458         punpckhqdq %xmm9, %xmm8
459         punpckhqdq %xmm11, %xmm10
460         punpcklqdq %xmm2, %xmm3
461         punpcklqdq %xmm6, %xmm7
462         punpckhqdq %xmm2, %xmm0
463         punpckhqdq %xmm6, %xmm4
464         movdqu %xmm1, 32(%rdx)
465         movdqu %xmm5, 48(%rdx)
466         movdqu %xmm8, 96(%rdx)
467         movdqu %xmm10, 112(%rdx)
468         movdqu %xmm3, 160(%rdx)
469         movdqu %xmm7, 176(%rdx)
470         movdqu %xmm0, 224(%rdx)
471         movdqu %xmm4, 240(%rdx)
472 .Lchacha_blocks_ssse3_mainloop_cont:
473         addq $256, %rdx
474         subq $256, %rcx
475         cmp $256, %rcx
476         jae .Lchacha_blocks_ssse3_atleast256
477         movdqa 80(%rsp), %xmm6
478         movdqa 96(%rsp), %xmm7
479         movdqa 0(%rsp), %xmm8
480         movdqa 16(%rsp), %xmm9
481         movdqa 32(%rsp), %xmm10
482         movdqa 48(%rsp), %xmm11
483         movq $1, %r9
484 .Lchacha_blocks_ssse3_below256:
485         movq %r9, %xmm5
486         andq %rcx, %rcx
487         jz .Lchacha_blocks_ssse3_done
488         cmpq $64, %rcx
489         jae .Lchacha_blocks_ssse3_above63
490         movq %rdx, %r9
491         andq %rsi, %rsi
492         jz .Lchacha_blocks_ssse3_noinput2
493         movq %rcx, %r10
494         movq %rsp, %rdx
495         addq %r10, %rsi
496         addq %r10, %rdx
497         negq %r10
498 .Lchacha_blocks_ssse3_copyinput:
499         movb (%rsi, %r10), %al
500         movb %al, (%rdx, %r10)
501         incq %r10
502         jnz .Lchacha_blocks_ssse3_copyinput
503         movq %rsp, %rsi
504 .Lchacha_blocks_ssse3_noinput2:
505         movq %rsp, %rdx
506 .Lchacha_blocks_ssse3_above63:
507         movdqa %xmm8, %xmm0
508         movdqa %xmm9, %xmm1
509         movdqa %xmm10, %xmm2
510         movdqa %xmm11, %xmm3
511         movq 64(%rsp), %rax
512 .Lchacha_blocks_ssse3_mainloop2:
513         paddd %xmm1, %xmm0
514         pxor %xmm0, %xmm3
515         pshufb %xmm6, %xmm3
516         paddd %xmm3, %xmm2
517         pxor %xmm2, %xmm1
518         movdqa %xmm1, %xmm4
519         pslld $12, %xmm4
520         psrld $20, %xmm1
521         pxor %xmm4, %xmm1
522         paddd %xmm1, %xmm0
523         pxor %xmm0, %xmm3
524         pshufb %xmm7, %xmm3
525         pshufd $0x93, %xmm0, %xmm0
526         paddd %xmm3, %xmm2
527         pshufd $0x4e, %xmm3, %xmm3
528         pxor %xmm2, %xmm1
529         pshufd $0x39, %xmm2, %xmm2
530         movdqa %xmm1, %xmm4
531         pslld $7, %xmm4
532         psrld $25, %xmm1
533         pxor %xmm4, %xmm1
534         paddd %xmm1, %xmm0
535         pxor %xmm0, %xmm3
536         pshufb %xmm6, %xmm3
537         paddd %xmm3, %xmm2
538         pxor %xmm2, %xmm1
539         movdqa %xmm1, %xmm4
540         pslld $12, %xmm4
541         psrld $20, %xmm1
542         pxor %xmm4, %xmm1
543         paddd %xmm1, %xmm0
544         pxor %xmm0, %xmm3
545         pshufb %xmm7, %xmm3
546         pshufd $0x39, %xmm0, %xmm0
547         paddd %xmm3, %xmm2
548         pshufd $0x4e, %xmm3, %xmm3
549         pxor %xmm2, %xmm1
550         pshufd $0x93, %xmm2, %xmm2
551         movdqa %xmm1, %xmm4
552         pslld $7, %xmm4
553         psrld $25, %xmm1
554         pxor %xmm4, %xmm1
555         subq $2, %rax
556         jnz .Lchacha_blocks_ssse3_mainloop2
557         paddd %xmm8, %xmm0
558         paddd %xmm9, %xmm1
559         paddd %xmm10, %xmm2
560         paddd %xmm11, %xmm3
561         andq %rsi, %rsi
562         jz .Lchacha_blocks_ssse3_noinput3
563         movdqu 0(%rsi), %xmm12
564         movdqu 16(%rsi), %xmm13
565         movdqu 32(%rsi), %xmm14
566         movdqu 48(%rsi), %xmm15
567         pxor %xmm12, %xmm0
568         pxor %xmm13, %xmm1
569         pxor %xmm14, %xmm2
570         pxor %xmm15, %xmm3
571         addq $64, %rsi
572 .Lchacha_blocks_ssse3_noinput3:
573         movdqu %xmm0, 0(%rdx)
574         movdqu %xmm1, 16(%rdx)
575         movdqu %xmm2, 32(%rdx)
576         movdqu %xmm3, 48(%rdx)
577         paddq %xmm5, %xmm11
578         cmpq $64, %rcx
579         jbe .Lchacha_blocks_ssse3_mainloop2_finishup
580         addq $64, %rdx
581         subq $64, %rcx
582         jmp .Lchacha_blocks_ssse3_below256
583 .Lchacha_blocks_ssse3_mainloop2_finishup:
584         cmpq $64, %rcx
585         je .Lchacha_blocks_ssse3_done
586         addq %rcx, %r9
587         addq %rcx, %rdx
588         negq %rcx
589 .Lchacha_blocks_ssse3_copyoutput:
590         movb (%rdx, %rcx), %al
591         movb %al, (%r9, %rcx)
592         incq %rcx
593         jnz .Lchacha_blocks_ssse3_copyoutput
594 .Lchacha_blocks_ssse3_done:
595         movdqu %xmm11, 48(%rdi)
596         movq %rbp, %rsp
597         pxor %xmm15, %xmm15
598         pxor %xmm7, %xmm7
599         pxor %xmm14, %xmm14
600         pxor %xmm6, %xmm6
601         pxor %xmm13, %xmm13
602         pxor %xmm5, %xmm5
603         pxor %xmm12, %xmm12
604         pxor %xmm4, %xmm4
605         popq %rbp
606         popq %rbx
607         movl $(63 + 512 + 16), %eax
608         pxor %xmm11, %xmm11
609         pxor %xmm3, %xmm3
610         pxor %xmm10, %xmm10
611         pxor %xmm2, %xmm2
612         pxor %xmm9, %xmm9
613         pxor %xmm1, %xmm1
614         pxor %xmm8, %xmm8
615         pxor %xmm0, %xmm0
616         ret
617 .size _gcry_chacha20_amd64_ssse3_blocks,.-_gcry_chacha20_amd64_ssse3_blocks;
618
619 .data
620 .align 16;
621 .LC:
622 .byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13       /* pshufb rotate by 16 */
623 .byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14       /* pshufb rotate by 8 */
624
625 #endif /*defined(USE_CHACHA20)*/
626 #endif /*__x86_64*/