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