ecc: Fix ec_mulm_25519.
[libgcrypt.git] / cipher / salsa20-armv7-neon.S
1 /* salsa-armv7-neon.S  -  ARM NEON implementation of Salsa20 cipher
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 #include <config.h>
22
23 #if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) && \
24     defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) && \
25     defined(HAVE_GCC_INLINE_ASM_NEON) && defined(USE_SALSA20)
26
27 /*
28  * Based on public domain implementation from SUPERCOP benchmarking framework
29  * by Peter Schwabe and D. J. Bernstein. Paper about the implementation at:
30  *   http://cryptojedi.org/papers/#neoncrypto
31  */
32
33 .syntax unified
34 .arm
35 .fpu neon
36 .text
37
38 .align 2
39 .globl _gcry_arm_neon_salsa20_encrypt
40 .type  _gcry_arm_neon_salsa20_encrypt,%function;
41 _gcry_arm_neon_salsa20_encrypt:
42         /* Modifications:
43          *  - arguments changed to (void *c, const void *m, unsigned int nblks,
44          *    void *ctx, unsigned int rounds) from (void *c, const void *m,
45          *    unsigned long long mlen, const void *n, const void *k)
46          *  - nonce and key read from 'ctx' as well as sigma and counter.
47          *  - read in counter from 'ctx' at the start.
48          *  - update counter in 'ctx' at the end.
49          *  - length is input as number of blocks, so don't handle tail bytes
50          *    (this is done in salsa20.c).
51          */
52         lsl r2,r2,#6
53         vpush {q4,q5,q6,q7}
54         mov r12,sp
55         sub sp,sp,#352
56         and sp,sp,#0xffffffe0
57         strd r4,[sp,#0]
58         strd r6,[sp,#8]
59         strd r8,[sp,#16]
60         strd r10,[sp,#24]
61         str r14,[sp,#224]
62         str r12,[sp,#228]
63         str r0,[sp,#232]
64         str r1,[sp,#236]
65         str r2,[sp,#240]
66         ldr r4,[r12,#64]
67         str r4,[sp,#244]
68         mov r2,r3
69         add r3,r2,#48
70         vld1.8 {q3},[r2]
71         add r0,r2,#32
72         add r14,r2,#40
73         vmov.i64 q3,#0xff
74         str r14,[sp,#160]
75         ldrd r8,[r2,#4]
76         vld1.8 {d0},[r0]
77         ldrd r4,[r2,#20]
78         vld1.8 {d8-d9},[r2]!
79         ldrd r6,[r0,#0]
80         vmov d4,d9
81         ldr r0,[r14]
82         vrev64.i32 d0,d0
83         ldr r1,[r14,#4]
84         vld1.8 {d10-d11},[r2]
85         strd r6,[sp,#32]
86         sub r2,r2,#16
87         strd r0,[sp,#40]
88         vmov d5,d11
89         strd r8,[sp,#48]
90         vext.32 d1,d0,d10,#1
91         strd r4,[sp,#56]
92         ldr r1,[r2,#0]
93         vshr.u32 q3,q3,#7
94         ldr r4,[r2,#12]
95         vext.32 d3,d11,d9,#1
96         ldr r11,[r2,#16]
97         vext.32 d2,d8,d0,#1
98         ldr r8,[r2,#28]
99         vext.32 d0,d10,d8,#1
100         ldr r0,[r3,#0]
101         add r2,r2,#44
102         vmov q4,q3
103         vld1.8 {d6-d7},[r14]
104         vadd.i64 q3,q3,q4
105         ldr r5,[r3,#4]
106         add r12,sp,#256
107         vst1.8 {d4-d5},[r12,: 128]
108         ldr r10,[r3,#8]
109         add r14,sp,#272
110         vst1.8 {d2-d3},[r14,: 128]
111         ldr r9,[r3,#12]
112         vld1.8 {d2-d3},[r3]
113         strd r0,[sp,#64]
114         ldr r0,[sp,#240]
115         strd r4,[sp,#72]
116         strd r10,[sp,#80]
117         strd r8,[sp,#88]
118         nop
119         cmp r0,#192
120         blo .L_mlenlowbelow192
121 .L_mlenatleast192:
122         ldrd r2,[sp,#48]
123         vext.32 d7,d6,d6,#1
124         vmov q8,q1
125         ldrd r6,[sp,#32]
126         vld1.8 {d18-d19},[r12,: 128]
127         vmov q10,q0
128         str r0,[sp,#240]
129         vext.32 d4,d7,d19,#1
130         vmov q11,q8
131         vext.32 d10,d18,d7,#1
132         vadd.i64 q3,q3,q4
133         ldrd r0,[sp,#64]
134         vld1.8 {d24-d25},[r14,: 128]
135         vmov d5,d24
136         add r8,sp,#288
137         ldrd r4,[sp,#72]
138         vmov d11,d25
139         add r9,sp,#304
140         ldrd r10,[sp,#80]
141         vst1.8 {d4-d5},[r8,: 128]
142         strd r2,[sp,#96]
143         vext.32 d7,d6,d6,#1
144         vmov q13,q10
145         strd r6,[sp,#104]
146         vmov d13,d24
147         vst1.8 {d10-d11},[r9,: 128]
148         add r2,sp,#320
149         vext.32 d12,d7,d19,#1
150         vmov d15,d25
151         add r6,sp,#336
152         ldr r12,[sp,#244]
153         vext.32 d14,d18,d7,#1
154         vadd.i64 q3,q3,q4
155         ldrd r8,[sp,#88]
156         vst1.8 {d12-d13},[r2,: 128]
157         ldrd r2,[sp,#56]
158         vst1.8 {d14-d15},[r6,: 128]
159         ldrd r6,[sp,#40]
160 .L_mainloop2:
161         str r12,[sp,#248]
162         vadd.i32 q4,q10,q8
163         vadd.i32 q9,q13,q11
164         add r12,r0,r2
165         add r14,r5,r1
166         vshl.i32 q12,q4,#7
167         vshl.i32 q14,q9,#7
168         vshr.u32 q4,q4,#25
169         vshr.u32 q9,q9,#25
170         eor r4,r4,r12,ROR #25
171         eor r7,r7,r14,ROR #25
172         add r12,r4,r0
173         add r14,r7,r5
174         veor q5,q5,q12
175         veor q7,q7,q14
176         veor q4,q5,q4
177         veor q5,q7,q9
178         eor r6,r6,r12,ROR #23
179         eor r3,r3,r14,ROR #23
180         add r12,r6,r4
181         str r7,[sp,#116]
182         add r7,r3,r7
183         ldr r14,[sp,#108]
184         vadd.i32 q7,q8,q4
185         vadd.i32 q9,q11,q5
186         vshl.i32 q12,q7,#9
187         vshl.i32 q14,q9,#9
188         vshr.u32 q7,q7,#23
189         vshr.u32 q9,q9,#23
190         veor q2,q2,q12
191         veor q6,q6,q14
192         veor q2,q2,q7
193         veor q6,q6,q9
194         eor r2,r2,r12,ROR #19
195         str r2,[sp,#120]
196         eor r1,r1,r7,ROR #19
197         ldr r7,[sp,#96]
198         add r2,r2,r6
199         str r6,[sp,#112]
200         add r6,r1,r3
201         ldr r12,[sp,#104]
202         vadd.i32 q7,q4,q2
203         vext.32 q4,q4,q4,#3
204         vadd.i32 q9,q5,q6
205         vshl.i32 q12,q7,#13
206         vext.32 q5,q5,q5,#3
207         vshl.i32 q14,q9,#13
208         eor r0,r0,r2,ROR #14
209         eor r2,r5,r6,ROR #14
210         str r3,[sp,#124]
211         add r3,r10,r12
212         ldr r5,[sp,#100]
213         add r6,r9,r11
214         vshr.u32 q7,q7,#19
215         vshr.u32 q9,q9,#19
216         veor q10,q10,q12
217         veor q12,q13,q14
218         eor r8,r8,r3,ROR #25
219         eor r3,r5,r6,ROR #25
220         add r5,r8,r10
221         add r6,r3,r9
222         veor q7,q10,q7
223         veor q9,q12,q9
224         eor r5,r7,r5,ROR #23
225         eor r6,r14,r6,ROR #23
226         add r7,r5,r8
227         add r14,r6,r3
228         vadd.i32 q10,q2,q7
229         vswp d4,d5
230         vadd.i32 q12,q6,q9
231         vshl.i32 q13,q10,#18
232         vswp d12,d13
233         vshl.i32 q14,q12,#18
234         eor r7,r12,r7,ROR #19
235         eor r11,r11,r14,ROR #19
236         add r12,r7,r5
237         add r14,r11,r6
238         vshr.u32 q10,q10,#14
239         vext.32 q7,q7,q7,#1
240         vshr.u32 q12,q12,#14
241         veor q8,q8,q13
242         vext.32 q9,q9,q9,#1
243         veor q11,q11,q14
244         eor r10,r10,r12,ROR #14
245         eor r9,r9,r14,ROR #14
246         add r12,r0,r3
247         add r14,r2,r4
248         veor q8,q8,q10
249         veor q10,q11,q12
250         eor r1,r1,r12,ROR #25
251         eor r7,r7,r14,ROR #25
252         add r12,r1,r0
253         add r14,r7,r2
254         vadd.i32 q11,q4,q8
255         vadd.i32 q12,q5,q10
256         vshl.i32 q13,q11,#7
257         vshl.i32 q14,q12,#7
258         eor r5,r5,r12,ROR #23
259         eor r6,r6,r14,ROR #23
260         vshr.u32 q11,q11,#25
261         vshr.u32 q12,q12,#25
262         add r12,r5,r1
263         add r14,r6,r7
264         veor q7,q7,q13
265         veor q9,q9,q14
266         veor q7,q7,q11
267         veor q9,q9,q12
268         vadd.i32 q11,q8,q7
269         vadd.i32 q12,q10,q9
270         vshl.i32 q13,q11,#9
271         vshl.i32 q14,q12,#9
272         eor r3,r3,r12,ROR #19
273         str r7,[sp,#104]
274         eor r4,r4,r14,ROR #19
275         ldr r7,[sp,#112]
276         add r12,r3,r5
277         str r6,[sp,#108]
278         add r6,r4,r6
279         ldr r14,[sp,#116]
280         eor r0,r0,r12,ROR #14
281         str r5,[sp,#96]
282         eor r5,r2,r6,ROR #14
283         ldr r2,[sp,#120]
284         vshr.u32 q11,q11,#23
285         vshr.u32 q12,q12,#23
286         veor q2,q2,q13
287         veor q6,q6,q14
288         veor q2,q2,q11
289         veor q6,q6,q12
290         add r6,r10,r14
291         add r12,r9,r8
292         vadd.i32 q11,q7,q2
293         vext.32 q7,q7,q7,#3
294         vadd.i32 q12,q9,q6
295         vshl.i32 q13,q11,#13
296         vext.32 q9,q9,q9,#3
297         vshl.i32 q14,q12,#13
298         vshr.u32 q11,q11,#19
299         vshr.u32 q12,q12,#19
300         eor r11,r11,r6,ROR #25
301         eor r2,r2,r12,ROR #25
302         add r6,r11,r10
303         str r3,[sp,#100]
304         add r3,r2,r9
305         ldr r12,[sp,#124]
306         veor q4,q4,q13
307         veor q5,q5,q14
308         veor q4,q4,q11
309         veor q5,q5,q12
310         eor r6,r7,r6,ROR #23
311         eor r3,r12,r3,ROR #23
312         add r7,r6,r11
313         add r12,r3,r2
314         vadd.i32 q11,q2,q4
315         vswp d4,d5
316         vadd.i32 q12,q6,q5
317         vshl.i32 q13,q11,#18
318         vswp d12,d13
319         vshl.i32 q14,q12,#18
320         eor r7,r14,r7,ROR #19
321         eor r8,r8,r12,ROR #19
322         add r12,r7,r6
323         add r14,r8,r3
324         vshr.u32 q11,q11,#14
325         vext.32 q4,q4,q4,#1
326         vshr.u32 q12,q12,#14
327         veor q8,q8,q13
328         vext.32 q5,q5,q5,#1
329         veor q10,q10,q14
330         eor r10,r10,r12,ROR #14
331         veor q8,q8,q11
332         eor r9,r9,r14,ROR #14
333         veor q10,q10,q12
334         vadd.i32 q11,q7,q8
335         vadd.i32 q12,q9,q10
336         add r12,r0,r2
337         add r14,r5,r1
338         vshl.i32 q13,q11,#7
339         vshl.i32 q14,q12,#7
340         vshr.u32 q11,q11,#25
341         vshr.u32 q12,q12,#25
342         eor r4,r4,r12,ROR #25
343         eor r7,r7,r14,ROR #25
344         add r12,r4,r0
345         add r14,r7,r5
346         veor q4,q4,q13
347         veor q5,q5,q14
348         veor q4,q4,q11
349         veor q5,q5,q12
350         eor r6,r6,r12,ROR #23
351         eor r3,r3,r14,ROR #23
352         add r12,r6,r4
353         str r7,[sp,#116]
354         add r7,r3,r7
355         ldr r14,[sp,#108]
356         vadd.i32 q11,q8,q4
357         vadd.i32 q12,q10,q5
358         vshl.i32 q13,q11,#9
359         vshl.i32 q14,q12,#9
360         vshr.u32 q11,q11,#23
361         vshr.u32 q12,q12,#23
362         veor q2,q2,q13
363         veor q6,q6,q14
364         veor q2,q2,q11
365         veor q6,q6,q12
366         eor r2,r2,r12,ROR #19
367         str r2,[sp,#120]
368         eor r1,r1,r7,ROR #19
369         ldr r7,[sp,#96]
370         add r2,r2,r6
371         str r6,[sp,#112]
372         add r6,r1,r3
373         ldr r12,[sp,#104]
374         vadd.i32 q11,q4,q2
375         vext.32 q4,q4,q4,#3
376         vadd.i32 q12,q5,q6
377         vshl.i32 q13,q11,#13
378         vext.32 q5,q5,q5,#3
379         vshl.i32 q14,q12,#13
380         eor r0,r0,r2,ROR #14
381         eor r2,r5,r6,ROR #14
382         str r3,[sp,#124]
383         add r3,r10,r12
384         ldr r5,[sp,#100]
385         add r6,r9,r11
386         vshr.u32 q11,q11,#19
387         vshr.u32 q12,q12,#19
388         veor q7,q7,q13
389         veor q9,q9,q14
390         eor r8,r8,r3,ROR #25
391         eor r3,r5,r6,ROR #25
392         add r5,r8,r10
393         add r6,r3,r9
394         veor q7,q7,q11
395         veor q9,q9,q12
396         eor r5,r7,r5,ROR #23
397         eor r6,r14,r6,ROR #23
398         add r7,r5,r8
399         add r14,r6,r3
400         vadd.i32 q11,q2,q7
401         vswp d4,d5
402         vadd.i32 q12,q6,q9
403         vshl.i32 q13,q11,#18
404         vswp d12,d13
405         vshl.i32 q14,q12,#18
406         eor r7,r12,r7,ROR #19
407         eor r11,r11,r14,ROR #19
408         add r12,r7,r5
409         add r14,r11,r6
410         vshr.u32 q11,q11,#14
411         vext.32 q7,q7,q7,#1
412         vshr.u32 q12,q12,#14
413         veor q8,q8,q13
414         vext.32 q9,q9,q9,#1
415         veor q10,q10,q14
416         eor r10,r10,r12,ROR #14
417         eor r9,r9,r14,ROR #14
418         add r12,r0,r3
419         add r14,r2,r4
420         veor q8,q8,q11
421         veor q11,q10,q12
422         eor r1,r1,r12,ROR #25
423         eor r7,r7,r14,ROR #25
424         add r12,r1,r0
425         add r14,r7,r2
426         vadd.i32 q10,q4,q8
427         vadd.i32 q12,q5,q11
428         vshl.i32 q13,q10,#7
429         vshl.i32 q14,q12,#7
430         eor r5,r5,r12,ROR #23
431         eor r6,r6,r14,ROR #23
432         vshr.u32 q10,q10,#25
433         vshr.u32 q12,q12,#25
434         add r12,r5,r1
435         add r14,r6,r7
436         veor q7,q7,q13
437         veor q9,q9,q14
438         veor q7,q7,q10
439         veor q9,q9,q12
440         vadd.i32 q10,q8,q7
441         vadd.i32 q12,q11,q9
442         vshl.i32 q13,q10,#9
443         vshl.i32 q14,q12,#9
444         eor r3,r3,r12,ROR #19
445         str r7,[sp,#104]
446         eor r4,r4,r14,ROR #19
447         ldr r7,[sp,#112]
448         add r12,r3,r5
449         str r6,[sp,#108]
450         add r6,r4,r6
451         ldr r14,[sp,#116]
452         eor r0,r0,r12,ROR #14
453         str r5,[sp,#96]
454         eor r5,r2,r6,ROR #14
455         ldr r2,[sp,#120]
456         vshr.u32 q10,q10,#23
457         vshr.u32 q12,q12,#23
458         veor q2,q2,q13
459         veor q6,q6,q14
460         veor q2,q2,q10
461         veor q6,q6,q12
462         add r6,r10,r14
463         add r12,r9,r8
464         vadd.i32 q12,q7,q2
465         vext.32 q10,q7,q7,#3
466         vadd.i32 q7,q9,q6
467         vshl.i32 q14,q12,#13
468         vext.32 q13,q9,q9,#3
469         vshl.i32 q9,q7,#13
470         vshr.u32 q12,q12,#19
471         vshr.u32 q7,q7,#19
472         eor r11,r11,r6,ROR #25
473         eor r2,r2,r12,ROR #25
474         add r6,r11,r10
475         str r3,[sp,#100]
476         add r3,r2,r9
477         ldr r12,[sp,#124]
478         veor q4,q4,q14
479         veor q5,q5,q9
480         veor q4,q4,q12
481         veor q7,q5,q7
482         eor r6,r7,r6,ROR #23
483         eor r3,r12,r3,ROR #23
484         add r7,r6,r11
485         add r12,r3,r2
486         vadd.i32 q5,q2,q4
487         vswp d4,d5
488         vadd.i32 q9,q6,q7
489         vshl.i32 q12,q5,#18
490         vswp d12,d13
491         vshl.i32 q14,q9,#18
492         eor r7,r14,r7,ROR #19
493         eor r8,r8,r12,ROR #19
494         add r12,r7,r6
495         add r14,r8,r3
496         vshr.u32 q15,q5,#14
497         vext.32 q5,q4,q4,#1
498         vshr.u32 q4,q9,#14
499         veor q8,q8,q12
500         vext.32 q7,q7,q7,#1
501         veor q9,q11,q14
502         eor r10,r10,r12,ROR #14
503         ldr r12,[sp,#248]
504         veor q8,q8,q15
505         eor r9,r9,r14,ROR #14
506         veor q11,q9,q4
507         subs r12,r12,#4
508         bhi .L_mainloop2
509         strd r8,[sp,#112]
510         ldrd r8,[sp,#64]
511         strd r2,[sp,#120]
512         ldrd r2,[sp,#96]
513         add r0,r0,r8
514         strd r10,[sp,#96]
515         add r1,r1,r9
516         ldrd r10,[sp,#48]
517         ldrd r8,[sp,#72]
518         add r2,r2,r10
519         strd r6,[sp,#128]
520         add r3,r3,r11
521         ldrd r6,[sp,#104]
522         ldrd r10,[sp,#32]
523         ldr r12,[sp,#236]
524         add r4,r4,r8
525         add r5,r5,r9
526         add r6,r6,r10
527         add r7,r7,r11
528         cmp r12,#0
529         beq .L_nomessage1
530         ldr r8,[r12,#0]
531         ldr r9,[r12,#4]
532         ldr r10,[r12,#8]
533         ldr r11,[r12,#12]
534         eor r0,r0,r8
535         ldr r8,[r12,#16]
536         eor r1,r1,r9
537         ldr r9,[r12,#20]
538         eor r2,r2,r10
539         ldr r10,[r12,#24]
540         eor r3,r3,r11
541         ldr r11,[r12,#28]
542         eor r4,r4,r8
543         eor r5,r5,r9
544         eor r6,r6,r10
545         eor r7,r7,r11
546 .L_nomessage1:
547         ldr r14,[sp,#232]
548         vadd.i32 q4,q8,q1
549         str r0,[r14,#0]
550         add r0,sp,#304
551         str r1,[r14,#4]
552         vld1.8 {d16-d17},[r0,: 128]
553         str r2,[r14,#8]
554         vadd.i32 q5,q8,q5
555         str r3,[r14,#12]
556         add r0,sp,#288
557         str r4,[r14,#16]
558         vld1.8 {d16-d17},[r0,: 128]
559         str r5,[r14,#20]
560         vadd.i32 q9,q10,q0
561         str r6,[r14,#24]
562         vadd.i32 q2,q8,q2
563         str r7,[r14,#28]
564         vmov.i64 q8,#0xffffffff
565         ldrd r6,[sp,#128]
566         vext.32 d20,d8,d10,#1
567         ldrd r0,[sp,#40]
568         vext.32 d25,d9,d11,#1
569         ldrd r2,[sp,#120]
570         vbif q4,q9,q8
571         ldrd r4,[sp,#56]
572         vext.32 d21,d5,d19,#1
573         add r6,r6,r0
574         vext.32 d24,d4,d18,#1
575         add r7,r7,r1
576         vbif q2,q5,q8
577         add r2,r2,r4
578         vrev64.i32 q5,q10
579         add r3,r3,r5
580         vrev64.i32 q9,q12
581         adds r0,r0,#3
582         vswp d5,d9
583         adc r1,r1,#0
584         strd r0,[sp,#40]
585         ldrd r8,[sp,#112]
586         ldrd r0,[sp,#88]
587         ldrd r10,[sp,#96]
588         ldrd r4,[sp,#80]
589         add r0,r8,r0
590         add r1,r9,r1
591         add r4,r10,r4
592         add r5,r11,r5
593         add r8,r14,#64
594         cmp r12,#0
595         beq .L_nomessage2
596         ldr r9,[r12,#32]
597         ldr r10,[r12,#36]
598         ldr r11,[r12,#40]
599         ldr r14,[r12,#44]
600         eor r6,r6,r9
601         ldr r9,[r12,#48]
602         eor r7,r7,r10
603         ldr r10,[r12,#52]
604         eor r4,r4,r11
605         ldr r11,[r12,#56]
606         eor r5,r5,r14
607         ldr r14,[r12,#60]
608         add r12,r12,#64
609         eor r2,r2,r9
610         vld1.8 {d20-d21},[r12]!
611         veor q4,q4,q10
612         eor r3,r3,r10
613         vld1.8 {d20-d21},[r12]!
614         veor q5,q5,q10
615         eor r0,r0,r11
616         vld1.8 {d20-d21},[r12]!
617         veor q2,q2,q10
618         eor r1,r1,r14
619         vld1.8 {d20-d21},[r12]!
620         veor q9,q9,q10
621 .L_nomessage2:
622         vst1.8 {d8-d9},[r8]!
623         vst1.8 {d10-d11},[r8]!
624         vmov.i64 q4,#0xff
625         vst1.8 {d4-d5},[r8]!
626         vst1.8 {d18-d19},[r8]!
627         str r6,[r8,#-96]
628         add r6,sp,#336
629         str r7,[r8,#-92]
630         add r7,sp,#320
631         str r4,[r8,#-88]
632         vadd.i32 q2,q11,q1
633         vld1.8 {d10-d11},[r6,: 128]
634         vadd.i32 q5,q5,q7
635         vld1.8 {d14-d15},[r7,: 128]
636         vadd.i32 q9,q13,q0
637         vadd.i32 q6,q7,q6
638         str r5,[r8,#-84]
639         vext.32 d14,d4,d10,#1
640         str r2,[r8,#-80]
641         vext.32 d21,d5,d11,#1
642         str r3,[r8,#-76]
643         vbif q2,q9,q8
644         str r0,[r8,#-72]
645         vext.32 d15,d13,d19,#1
646         vshr.u32 q4,q4,#7
647         str r1,[r8,#-68]
648         vext.32 d20,d12,d18,#1
649         vbif q6,q5,q8
650         ldr r0,[sp,#240]
651         vrev64.i32 q5,q7
652         vrev64.i32 q7,q10
653         vswp d13,d5
654         vadd.i64 q3,q3,q4
655         sub r0,r0,#192
656         cmp r12,#0
657         beq .L_nomessage21
658         vld1.8 {d16-d17},[r12]!
659         veor q2,q2,q8
660         vld1.8 {d16-d17},[r12]!
661         veor q5,q5,q8
662         vld1.8 {d16-d17},[r12]!
663         veor q6,q6,q8
664         vld1.8 {d16-d17},[r12]!
665         veor q7,q7,q8
666 .L_nomessage21:
667         vst1.8 {d4-d5},[r8]!
668         vst1.8 {d10-d11},[r8]!
669         vst1.8 {d12-d13},[r8]!
670         vst1.8 {d14-d15},[r8]!
671         str r12,[sp,#236]
672         add r14,sp,#272
673         add r12,sp,#256
674         str r8,[sp,#232]
675         cmp r0,#192
676         bhs .L_mlenatleast192
677 .L_mlenlowbelow192:
678         cmp r0,#0
679         beq .L_done
680         b .L_mlenatleast1
681 .L_nextblock:
682         sub r0,r0,#64
683 .L_mlenatleast1:
684 .L_handleblock:
685         str r0,[sp,#248]
686         ldrd r2,[sp,#48]
687         ldrd r6,[sp,#32]
688         ldrd r0,[sp,#64]
689         ldrd r4,[sp,#72]
690         ldrd r10,[sp,#80]
691         ldrd r8,[sp,#88]
692         strd r2,[sp,#96]
693         strd r6,[sp,#104]
694         ldrd r2,[sp,#56]
695         ldrd r6,[sp,#40]
696         ldr r12,[sp,#244]
697 .L_mainloop1:
698         str r12,[sp,#252]
699         add r12,r0,r2
700         add r14,r5,r1
701         eor r4,r4,r12,ROR #25
702         eor r7,r7,r14,ROR #25
703         add r12,r4,r0
704         add r14,r7,r5
705         eor r6,r6,r12,ROR #23
706         eor r3,r3,r14,ROR #23
707         add r12,r6,r4
708         str r7,[sp,#132]
709         add r7,r3,r7
710         ldr r14,[sp,#104]
711         eor r2,r2,r12,ROR #19
712         str r6,[sp,#128]
713         eor r1,r1,r7,ROR #19
714         ldr r7,[sp,#100]
715         add r6,r2,r6
716         str r2,[sp,#120]
717         add r2,r1,r3
718         ldr r12,[sp,#96]
719         eor r0,r0,r6,ROR #14
720         str r3,[sp,#124]
721         eor r2,r5,r2,ROR #14
722         ldr r3,[sp,#108]
723         add r5,r10,r14
724         add r6,r9,r11
725         eor r8,r8,r5,ROR #25
726         eor r5,r7,r6,ROR #25
727         add r6,r8,r10
728         add r7,r5,r9
729         eor r6,r12,r6,ROR #23
730         eor r3,r3,r7,ROR #23
731         add r7,r6,r8
732         add r12,r3,r5
733         eor r7,r14,r7,ROR #19
734         eor r11,r11,r12,ROR #19
735         add r12,r7,r6
736         add r14,r11,r3
737         eor r10,r10,r12,ROR #14
738         eor r9,r9,r14,ROR #14
739         add r12,r0,r5
740         add r14,r2,r4
741         eor r1,r1,r12,ROR #25
742         eor r7,r7,r14,ROR #25
743         add r12,r1,r0
744         add r14,r7,r2
745         eor r6,r6,r12,ROR #23
746         eor r3,r3,r14,ROR #23
747         add r12,r6,r1
748         str r7,[sp,#104]
749         add r7,r3,r7
750         ldr r14,[sp,#128]
751         eor r5,r5,r12,ROR #19
752         str r3,[sp,#108]
753         eor r4,r4,r7,ROR #19
754         ldr r7,[sp,#132]
755         add r12,r5,r6
756         str r6,[sp,#96]
757         add r3,r4,r3
758         ldr r6,[sp,#120]
759         eor r0,r0,r12,ROR #14
760         str r5,[sp,#100]
761         eor r5,r2,r3,ROR #14
762         ldr r3,[sp,#124]
763         add r2,r10,r7
764         add r12,r9,r8
765         eor r11,r11,r2,ROR #25
766         eor r2,r6,r12,ROR #25
767         add r6,r11,r10
768         add r12,r2,r9
769         eor r6,r14,r6,ROR #23
770         eor r3,r3,r12,ROR #23
771         add r12,r6,r11
772         add r14,r3,r2
773         eor r7,r7,r12,ROR #19
774         eor r8,r8,r14,ROR #19
775         add r12,r7,r6
776         add r14,r8,r3
777         eor r10,r10,r12,ROR #14
778         eor r9,r9,r14,ROR #14
779         ldr r12,[sp,#252]
780         subs r12,r12,#2
781         bhi .L_mainloop1
782         strd r6,[sp,#128]
783         strd r2,[sp,#120]
784         strd r10,[sp,#112]
785         strd r8,[sp,#136]
786         ldrd r2,[sp,#96]
787         ldrd r6,[sp,#104]
788         ldrd r8,[sp,#64]
789         ldrd r10,[sp,#48]
790         add r0,r0,r8
791         add r1,r1,r9
792         add r2,r2,r10
793         add r3,r3,r11
794         ldrd r8,[sp,#72]
795         ldrd r10,[sp,#32]
796         add r4,r4,r8
797         add r5,r5,r9
798         add r6,r6,r10
799         add r7,r7,r11
800         ldr r12,[sp,#236]
801         cmp r12,#0
802         beq .L_nomessage10
803         ldr r8,[r12,#0]
804         ldr r9,[r12,#4]
805         ldr r10,[r12,#8]
806         ldr r11,[r12,#12]
807         eor r0,r0,r8
808         ldr r8,[r12,#16]
809         eor r1,r1,r9
810         ldr r9,[r12,#20]
811         eor r2,r2,r10
812         ldr r10,[r12,#24]
813         eor r3,r3,r11
814         ldr r11,[r12,#28]
815         eor r4,r4,r8
816         eor r5,r5,r9
817         eor r6,r6,r10
818         eor r7,r7,r11
819 .L_nomessage10:
820         ldr r14,[sp,#232]
821         str r0,[r14,#0]
822         str r1,[r14,#4]
823         str r2,[r14,#8]
824         str r3,[r14,#12]
825         str r4,[r14,#16]
826         str r5,[r14,#20]
827         str r6,[r14,#24]
828         str r7,[r14,#28]
829         ldrd r6,[sp,#128]
830         ldrd r10,[sp,#112]
831         ldrd r0,[sp,#40]
832         ldrd r4,[sp,#80]
833         add r6,r6,r0
834         add r7,r7,r1
835         add r10,r10,r4
836         add r11,r11,r5
837         adds r0,r0,#1
838         adc r1,r1,#0
839         strd r0,[sp,#40]
840         ldrd r2,[sp,#120]
841         ldrd r8,[sp,#136]
842         ldrd r4,[sp,#56]
843         ldrd r0,[sp,#88]
844         add r2,r2,r4
845         add r3,r3,r5
846         add r0,r8,r0
847         add r1,r9,r1
848         cmp r12,#0
849         beq .L_nomessage11
850         ldr r4,[r12,#32]
851         ldr r5,[r12,#36]
852         ldr r8,[r12,#40]
853         ldr r9,[r12,#44]
854         eor r6,r6,r4
855         ldr r4,[r12,#48]
856         eor r7,r7,r5
857         ldr r5,[r12,#52]
858         eor r10,r10,r8
859         ldr r8,[r12,#56]
860         eor r11,r11,r9
861         ldr r9,[r12,#60]
862         eor r2,r2,r4
863         eor r3,r3,r5
864         eor r0,r0,r8
865         eor r1,r1,r9
866         add r4,r12,#64
867         str r4,[sp,#236]
868 .L_nomessage11:
869         str r6,[r14,#32]
870         str r7,[r14,#36]
871         str r10,[r14,#40]
872         str r11,[r14,#44]
873         str r2,[r14,#48]
874         str r3,[r14,#52]
875         str r0,[r14,#56]
876         str r1,[r14,#60]
877         add r0,r14,#64
878         str r0,[sp,#232]
879         ldr r0,[sp,#248]
880         cmp r0,#64
881         bhi .L_nextblock
882 .L_done:
883         ldr r2,[sp,#160]
884         ldrd r4,[sp,#0]
885         ldrd r6,[sp,#8]
886         ldrd r8,[sp,#16]
887         ldrd r10,[sp,#24]
888         ldr r12,[sp,#228]
889         ldr r14,[sp,#224]
890         ldrd r0,[sp,#40]
891         strd r0,[r2]
892         sub r0,r12,sp
893         mov sp,r12
894         vpop {q4,q5,q6,q7}
895         add r0,r0,#64
896         bx lr
897 .size _gcry_arm_neon_salsa20_encrypt,.-_gcry_arm_neon_salsa20_encrypt;
898
899 #endif