blob: 363aeee5f50147caf6c2e2889a05e881442d1567 [file] [log] [blame]
Robert Sloanc9abfe42018-11-26 12:19:07 -08001// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
Pete Bentley0c61efe2019-08-13 09:32:23 +01004#if !defined(__has_feature)
5#define __has_feature(x) 0
6#endif
Robert Sloan726e9d12018-09-11 11:45:04 -07007#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
8#define OPENSSL_NO_ASM
9#endif
Robert Sloan726e9d12018-09-11 11:45:04 -070010
11#if !defined(OPENSSL_NO_ASM)
David Benjamin4969cc92016-04-22 15:02:23 -040012#if defined(__arm__)
Robert Sloan726e9d12018-09-11 11:45:04 -070013#if defined(BORINGSSL_PREFIX)
14#include <boringssl_prefix_symbols_asm.h>
15#endif
David Benjamin4969cc92016-04-22 15:02:23 -040016#include <openssl/arm_arch.h>
17
Robert Sloan55818102017-12-18 11:26:17 -080018@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
19@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
20.arch armv7-a
21
David Benjamin4969cc92016-04-22 15:02:23 -040022.text
Robert Sloan927a4952017-07-03 11:25:09 -070023#if defined(__thumb2__) || defined(__clang__)
David Benjamin4969cc92016-04-22 15:02:23 -040024.syntax unified
Robert Sloan927a4952017-07-03 11:25:09 -070025#endif
26#if defined(__thumb2__)
David Benjamin4969cc92016-04-22 15:02:23 -040027.thumb
28#else
29.code 32
30#endif
31
32#if defined(__thumb2__) || defined(__clang__)
33#define ldrhsb ldrbhs
34#endif
35
36.align 5
37.Lsigma:
38.long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral
39.Lone:
40.long 1,0,0,0
41#if __ARM_MAX_ARCH__>=7
42.LOPENSSL_armcap:
43.word OPENSSL_armcap_P-.LChaCha20_ctr32
44#else
45.word -1
46#endif
47
48.globl ChaCha20_ctr32
49.hidden ChaCha20_ctr32
50.type ChaCha20_ctr32,%function
51.align 5
52ChaCha20_ctr32:
53.LChaCha20_ctr32:
54 ldr r12,[sp,#0] @ pull pointer to counter and nonce
55 stmdb sp!,{r0,r1,r2,r4-r11,lr}
56#if __ARM_ARCH__<7 && !defined(__thumb2__)
57 sub r14,pc,#16 @ ChaCha20_ctr32
58#else
59 adr r14,.LChaCha20_ctr32
60#endif
61 cmp r2,#0 @ len==0?
62#ifdef __thumb2__
63 itt eq
64#endif
65 addeq sp,sp,#4*3
66 beq .Lno_data
67#if __ARM_MAX_ARCH__>=7
68 cmp r2,#192 @ test len
69 bls .Lshort
70 ldr r4,[r14,#-32]
71 ldr r4,[r14,r4]
72# ifdef __APPLE__
73 ldr r4,[r4]
74# endif
75 tst r4,#ARMV7_NEON
76 bne .LChaCha20_neon
77.Lshort:
78#endif
79 ldmia r12,{r4,r5,r6,r7} @ load counter and nonce
80 sub sp,sp,#4*(16) @ off-load area
81 sub r14,r14,#64 @ .Lsigma
82 stmdb sp!,{r4,r5,r6,r7} @ copy counter and nonce
83 ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key
84 ldmia r14,{r0,r1,r2,r3} @ load sigma
85 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy key
86 stmdb sp!,{r0,r1,r2,r3} @ copy sigma
87 str r10,[sp,#4*(16+10)] @ off-load "rx"
88 str r11,[sp,#4*(16+11)] @ off-load "rx"
89 b .Loop_outer_enter
90
91.align 4
92.Loop_outer:
93 ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material
94 str r11,[sp,#4*(32+2)] @ save len
95 str r12, [sp,#4*(32+1)] @ save inp
96 str r14, [sp,#4*(32+0)] @ save out
97.Loop_outer_enter:
98 ldr r11, [sp,#4*(15)]
99 ldr r12,[sp,#4*(12)] @ modulo-scheduled load
100 ldr r10, [sp,#4*(13)]
101 ldr r14,[sp,#4*(14)]
102 str r11, [sp,#4*(16+15)]
103 mov r11,#10
104 b .Loop
105
106.align 4
107.Loop:
108 subs r11,r11,#1
109 add r0,r0,r4
110 mov r12,r12,ror#16
111 add r1,r1,r5
112 mov r10,r10,ror#16
113 eor r12,r12,r0,ror#16
114 eor r10,r10,r1,ror#16
115 add r8,r8,r12
116 mov r4,r4,ror#20
117 add r9,r9,r10
118 mov r5,r5,ror#20
119 eor r4,r4,r8,ror#20
120 eor r5,r5,r9,ror#20
121 add r0,r0,r4
122 mov r12,r12,ror#24
123 add r1,r1,r5
124 mov r10,r10,ror#24
125 eor r12,r12,r0,ror#24
126 eor r10,r10,r1,ror#24
127 add r8,r8,r12
128 mov r4,r4,ror#25
129 add r9,r9,r10
130 mov r5,r5,ror#25
131 str r10,[sp,#4*(16+13)]
132 ldr r10,[sp,#4*(16+15)]
133 eor r4,r4,r8,ror#25
134 eor r5,r5,r9,ror#25
135 str r8,[sp,#4*(16+8)]
136 ldr r8,[sp,#4*(16+10)]
137 add r2,r2,r6
138 mov r14,r14,ror#16
139 str r9,[sp,#4*(16+9)]
140 ldr r9,[sp,#4*(16+11)]
141 add r3,r3,r7
142 mov r10,r10,ror#16
143 eor r14,r14,r2,ror#16
144 eor r10,r10,r3,ror#16
145 add r8,r8,r14
146 mov r6,r6,ror#20
147 add r9,r9,r10
148 mov r7,r7,ror#20
149 eor r6,r6,r8,ror#20
150 eor r7,r7,r9,ror#20
151 add r2,r2,r6
152 mov r14,r14,ror#24
153 add r3,r3,r7
154 mov r10,r10,ror#24
155 eor r14,r14,r2,ror#24
156 eor r10,r10,r3,ror#24
157 add r8,r8,r14
158 mov r6,r6,ror#25
159 add r9,r9,r10
160 mov r7,r7,ror#25
161 eor r6,r6,r8,ror#25
162 eor r7,r7,r9,ror#25
163 add r0,r0,r5
164 mov r10,r10,ror#16
165 add r1,r1,r6
166 mov r12,r12,ror#16
167 eor r10,r10,r0,ror#16
168 eor r12,r12,r1,ror#16
169 add r8,r8,r10
170 mov r5,r5,ror#20
171 add r9,r9,r12
172 mov r6,r6,ror#20
173 eor r5,r5,r8,ror#20
174 eor r6,r6,r9,ror#20
175 add r0,r0,r5
176 mov r10,r10,ror#24
177 add r1,r1,r6
178 mov r12,r12,ror#24
179 eor r10,r10,r0,ror#24
180 eor r12,r12,r1,ror#24
181 add r8,r8,r10
182 mov r5,r5,ror#25
183 str r10,[sp,#4*(16+15)]
184 ldr r10,[sp,#4*(16+13)]
185 add r9,r9,r12
186 mov r6,r6,ror#25
187 eor r5,r5,r8,ror#25
188 eor r6,r6,r9,ror#25
189 str r8,[sp,#4*(16+10)]
190 ldr r8,[sp,#4*(16+8)]
191 add r2,r2,r7
192 mov r10,r10,ror#16
193 str r9,[sp,#4*(16+11)]
194 ldr r9,[sp,#4*(16+9)]
195 add r3,r3,r4
196 mov r14,r14,ror#16
197 eor r10,r10,r2,ror#16
198 eor r14,r14,r3,ror#16
199 add r8,r8,r10
200 mov r7,r7,ror#20
201 add r9,r9,r14
202 mov r4,r4,ror#20
203 eor r7,r7,r8,ror#20
204 eor r4,r4,r9,ror#20
205 add r2,r2,r7
206 mov r10,r10,ror#24
207 add r3,r3,r4
208 mov r14,r14,ror#24
209 eor r10,r10,r2,ror#24
210 eor r14,r14,r3,ror#24
211 add r8,r8,r10
212 mov r7,r7,ror#25
213 add r9,r9,r14
214 mov r4,r4,ror#25
215 eor r7,r7,r8,ror#25
216 eor r4,r4,r9,ror#25
217 bne .Loop
218
219 ldr r11,[sp,#4*(32+2)] @ load len
220
221 str r8, [sp,#4*(16+8)] @ modulo-scheduled store
222 str r9, [sp,#4*(16+9)]
223 str r12,[sp,#4*(16+12)]
224 str r10, [sp,#4*(16+13)]
225 str r14,[sp,#4*(16+14)]
226
227 @ at this point we have first half of 512-bit result in
228 @ rx and second half at sp+4*(16+8)
229
230 cmp r11,#64 @ done yet?
231#ifdef __thumb2__
232 itete lo
233#endif
234 addlo r12,sp,#4*(0) @ shortcut or ...
235 ldrhs r12,[sp,#4*(32+1)] @ ... load inp
236 addlo r14,sp,#4*(0) @ shortcut or ...
237 ldrhs r14,[sp,#4*(32+0)] @ ... load out
238
239 ldr r8,[sp,#4*(0)] @ load key material
240 ldr r9,[sp,#4*(1)]
241
242#if __ARM_ARCH__>=6 || !defined(__ARMEB__)
243# if __ARM_ARCH__<7
244 orr r10,r12,r14
245 tst r10,#3 @ are input and output aligned?
246 ldr r10,[sp,#4*(2)]
247 bne .Lunaligned
248 cmp r11,#64 @ restore flags
249# else
250 ldr r10,[sp,#4*(2)]
251# endif
252 ldr r11,[sp,#4*(3)]
253
254 add r0,r0,r8 @ accumulate key material
255 add r1,r1,r9
256# ifdef __thumb2__
257 itt hs
258# endif
259 ldrhs r8,[r12],#16 @ load input
260 ldrhs r9,[r12,#-12]
261
262 add r2,r2,r10
263 add r3,r3,r11
264# ifdef __thumb2__
265 itt hs
266# endif
267 ldrhs r10,[r12,#-8]
268 ldrhs r11,[r12,#-4]
269# if __ARM_ARCH__>=6 && defined(__ARMEB__)
270 rev r0,r0
271 rev r1,r1
272 rev r2,r2
273 rev r3,r3
274# endif
275# ifdef __thumb2__
276 itt hs
277# endif
278 eorhs r0,r0,r8 @ xor with input
279 eorhs r1,r1,r9
280 add r8,sp,#4*(4)
281 str r0,[r14],#16 @ store output
282# ifdef __thumb2__
283 itt hs
284# endif
285 eorhs r2,r2,r10
286 eorhs r3,r3,r11
287 ldmia r8,{r8,r9,r10,r11} @ load key material
288 str r1,[r14,#-12]
289 str r2,[r14,#-8]
290 str r3,[r14,#-4]
291
292 add r4,r4,r8 @ accumulate key material
293 add r5,r5,r9
294# ifdef __thumb2__
295 itt hs
296# endif
297 ldrhs r8,[r12],#16 @ load input
298 ldrhs r9,[r12,#-12]
299 add r6,r6,r10
300 add r7,r7,r11
301# ifdef __thumb2__
302 itt hs
303# endif
304 ldrhs r10,[r12,#-8]
305 ldrhs r11,[r12,#-4]
306# if __ARM_ARCH__>=6 && defined(__ARMEB__)
307 rev r4,r4
308 rev r5,r5
309 rev r6,r6
310 rev r7,r7
311# endif
312# ifdef __thumb2__
313 itt hs
314# endif
315 eorhs r4,r4,r8
316 eorhs r5,r5,r9
317 add r8,sp,#4*(8)
318 str r4,[r14],#16 @ store output
319# ifdef __thumb2__
320 itt hs
321# endif
322 eorhs r6,r6,r10
323 eorhs r7,r7,r11
324 str r5,[r14,#-12]
325 ldmia r8,{r8,r9,r10,r11} @ load key material
326 str r6,[r14,#-8]
327 add r0,sp,#4*(16+8)
328 str r7,[r14,#-4]
329
330 ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half
331
332 add r0,r0,r8 @ accumulate key material
333 add r1,r1,r9
334# ifdef __thumb2__
335 itt hs
336# endif
337 ldrhs r8,[r12],#16 @ load input
338 ldrhs r9,[r12,#-12]
339# ifdef __thumb2__
340 itt hi
341# endif
342 strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it
343 strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it
344 add r2,r2,r10
345 add r3,r3,r11
346# ifdef __thumb2__
347 itt hs
348# endif
349 ldrhs r10,[r12,#-8]
350 ldrhs r11,[r12,#-4]
351# if __ARM_ARCH__>=6 && defined(__ARMEB__)
352 rev r0,r0
353 rev r1,r1
354 rev r2,r2
355 rev r3,r3
356# endif
357# ifdef __thumb2__
358 itt hs
359# endif
360 eorhs r0,r0,r8
361 eorhs r1,r1,r9
362 add r8,sp,#4*(12)
363 str r0,[r14],#16 @ store output
364# ifdef __thumb2__
365 itt hs
366# endif
367 eorhs r2,r2,r10
368 eorhs r3,r3,r11
369 str r1,[r14,#-12]
370 ldmia r8,{r8,r9,r10,r11} @ load key material
371 str r2,[r14,#-8]
372 str r3,[r14,#-4]
373
374 add r4,r4,r8 @ accumulate key material
375 add r5,r5,r9
376# ifdef __thumb2__
377 itt hi
378# endif
379 addhi r8,r8,#1 @ next counter value
380 strhi r8,[sp,#4*(12)] @ save next counter value
381# ifdef __thumb2__
382 itt hs
383# endif
384 ldrhs r8,[r12],#16 @ load input
385 ldrhs r9,[r12,#-12]
386 add r6,r6,r10
387 add r7,r7,r11
388# ifdef __thumb2__
389 itt hs
390# endif
391 ldrhs r10,[r12,#-8]
392 ldrhs r11,[r12,#-4]
393# if __ARM_ARCH__>=6 && defined(__ARMEB__)
394 rev r4,r4
395 rev r5,r5
396 rev r6,r6
397 rev r7,r7
398# endif
399# ifdef __thumb2__
400 itt hs
401# endif
402 eorhs r4,r4,r8
403 eorhs r5,r5,r9
404# ifdef __thumb2__
405 it ne
406# endif
407 ldrne r8,[sp,#4*(32+2)] @ re-load len
408# ifdef __thumb2__
409 itt hs
410# endif
411 eorhs r6,r6,r10
412 eorhs r7,r7,r11
413 str r4,[r14],#16 @ store output
414 str r5,[r14,#-12]
415# ifdef __thumb2__
416 it hs
417# endif
418 subhs r11,r8,#64 @ len-=64
419 str r6,[r14,#-8]
420 str r7,[r14,#-4]
421 bhi .Loop_outer
422
423 beq .Ldone
424# if __ARM_ARCH__<7
425 b .Ltail
426
427.align 4
428.Lunaligned:@ unaligned endian-neutral path
429 cmp r11,#64 @ restore flags
430# endif
431#endif
432#if __ARM_ARCH__<7
433 ldr r11,[sp,#4*(3)]
434 add r0,r0,r8 @ accumulate key material
435 add r1,r1,r9
436 add r2,r2,r10
437# ifdef __thumb2__
438 itete lo
439# endif
440 eorlo r8,r8,r8 @ zero or ...
441 ldrhsb r8,[r12],#16 @ ... load input
442 eorlo r9,r9,r9
443 ldrhsb r9,[r12,#-12]
444
445 add r3,r3,r11
446# ifdef __thumb2__
447 itete lo
448# endif
449 eorlo r10,r10,r10
450 ldrhsb r10,[r12,#-8]
451 eorlo r11,r11,r11
452 ldrhsb r11,[r12,#-4]
453
454 eor r0,r8,r0 @ xor with input (or zero)
455 eor r1,r9,r1
456# ifdef __thumb2__
457 itt hs
458# endif
459 ldrhsb r8,[r12,#-15] @ load more input
460 ldrhsb r9,[r12,#-11]
461 eor r2,r10,r2
462 strb r0,[r14],#16 @ store output
463 eor r3,r11,r3
464# ifdef __thumb2__
465 itt hs
466# endif
467 ldrhsb r10,[r12,#-7]
468 ldrhsb r11,[r12,#-3]
469 strb r1,[r14,#-12]
470 eor r0,r8,r0,lsr#8
471 strb r2,[r14,#-8]
472 eor r1,r9,r1,lsr#8
473# ifdef __thumb2__
474 itt hs
475# endif
476 ldrhsb r8,[r12,#-14] @ load more input
477 ldrhsb r9,[r12,#-10]
478 strb r3,[r14,#-4]
479 eor r2,r10,r2,lsr#8
480 strb r0,[r14,#-15]
481 eor r3,r11,r3,lsr#8
482# ifdef __thumb2__
483 itt hs
484# endif
485 ldrhsb r10,[r12,#-6]
486 ldrhsb r11,[r12,#-2]
487 strb r1,[r14,#-11]
488 eor r0,r8,r0,lsr#8
489 strb r2,[r14,#-7]
490 eor r1,r9,r1,lsr#8
491# ifdef __thumb2__
492 itt hs
493# endif
494 ldrhsb r8,[r12,#-13] @ load more input
495 ldrhsb r9,[r12,#-9]
496 strb r3,[r14,#-3]
497 eor r2,r10,r2,lsr#8
498 strb r0,[r14,#-14]
499 eor r3,r11,r3,lsr#8
500# ifdef __thumb2__
501 itt hs
502# endif
503 ldrhsb r10,[r12,#-5]
504 ldrhsb r11,[r12,#-1]
505 strb r1,[r14,#-10]
506 strb r2,[r14,#-6]
507 eor r0,r8,r0,lsr#8
508 strb r3,[r14,#-2]
509 eor r1,r9,r1,lsr#8
510 strb r0,[r14,#-13]
511 eor r2,r10,r2,lsr#8
512 strb r1,[r14,#-9]
513 eor r3,r11,r3,lsr#8
514 strb r2,[r14,#-5]
515 strb r3,[r14,#-1]
516 add r8,sp,#4*(4+0)
517 ldmia r8,{r8,r9,r10,r11} @ load key material
518 add r0,sp,#4*(16+8)
519 add r4,r4,r8 @ accumulate key material
520 add r5,r5,r9
521 add r6,r6,r10
522# ifdef __thumb2__
523 itete lo
524# endif
525 eorlo r8,r8,r8 @ zero or ...
526 ldrhsb r8,[r12],#16 @ ... load input
527 eorlo r9,r9,r9
528 ldrhsb r9,[r12,#-12]
529
530 add r7,r7,r11
531# ifdef __thumb2__
532 itete lo
533# endif
534 eorlo r10,r10,r10
535 ldrhsb r10,[r12,#-8]
536 eorlo r11,r11,r11
537 ldrhsb r11,[r12,#-4]
538
539 eor r4,r8,r4 @ xor with input (or zero)
540 eor r5,r9,r5
541# ifdef __thumb2__
542 itt hs
543# endif
544 ldrhsb r8,[r12,#-15] @ load more input
545 ldrhsb r9,[r12,#-11]
546 eor r6,r10,r6
547 strb r4,[r14],#16 @ store output
548 eor r7,r11,r7
549# ifdef __thumb2__
550 itt hs
551# endif
552 ldrhsb r10,[r12,#-7]
553 ldrhsb r11,[r12,#-3]
554 strb r5,[r14,#-12]
555 eor r4,r8,r4,lsr#8
556 strb r6,[r14,#-8]
557 eor r5,r9,r5,lsr#8
558# ifdef __thumb2__
559 itt hs
560# endif
561 ldrhsb r8,[r12,#-14] @ load more input
562 ldrhsb r9,[r12,#-10]
563 strb r7,[r14,#-4]
564 eor r6,r10,r6,lsr#8
565 strb r4,[r14,#-15]
566 eor r7,r11,r7,lsr#8
567# ifdef __thumb2__
568 itt hs
569# endif
570 ldrhsb r10,[r12,#-6]
571 ldrhsb r11,[r12,#-2]
572 strb r5,[r14,#-11]
573 eor r4,r8,r4,lsr#8
574 strb r6,[r14,#-7]
575 eor r5,r9,r5,lsr#8
576# ifdef __thumb2__
577 itt hs
578# endif
579 ldrhsb r8,[r12,#-13] @ load more input
580 ldrhsb r9,[r12,#-9]
581 strb r7,[r14,#-3]
582 eor r6,r10,r6,lsr#8
583 strb r4,[r14,#-14]
584 eor r7,r11,r7,lsr#8
585# ifdef __thumb2__
586 itt hs
587# endif
588 ldrhsb r10,[r12,#-5]
589 ldrhsb r11,[r12,#-1]
590 strb r5,[r14,#-10]
591 strb r6,[r14,#-6]
592 eor r4,r8,r4,lsr#8
593 strb r7,[r14,#-2]
594 eor r5,r9,r5,lsr#8
595 strb r4,[r14,#-13]
596 eor r6,r10,r6,lsr#8
597 strb r5,[r14,#-9]
598 eor r7,r11,r7,lsr#8
599 strb r6,[r14,#-5]
600 strb r7,[r14,#-1]
601 add r8,sp,#4*(4+4)
602 ldmia r8,{r8,r9,r10,r11} @ load key material
603 ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half
604# ifdef __thumb2__
605 itt hi
606# endif
607 strhi r10,[sp,#4*(16+10)] @ copy "rx"
608 strhi r11,[sp,#4*(16+11)] @ copy "rx"
609 add r0,r0,r8 @ accumulate key material
610 add r1,r1,r9
611 add r2,r2,r10
612# ifdef __thumb2__
613 itete lo
614# endif
615 eorlo r8,r8,r8 @ zero or ...
616 ldrhsb r8,[r12],#16 @ ... load input
617 eorlo r9,r9,r9
618 ldrhsb r9,[r12,#-12]
619
620 add r3,r3,r11
621# ifdef __thumb2__
622 itete lo
623# endif
624 eorlo r10,r10,r10
625 ldrhsb r10,[r12,#-8]
626 eorlo r11,r11,r11
627 ldrhsb r11,[r12,#-4]
628
629 eor r0,r8,r0 @ xor with input (or zero)
630 eor r1,r9,r1
631# ifdef __thumb2__
632 itt hs
633# endif
634 ldrhsb r8,[r12,#-15] @ load more input
635 ldrhsb r9,[r12,#-11]
636 eor r2,r10,r2
637 strb r0,[r14],#16 @ store output
638 eor r3,r11,r3
639# ifdef __thumb2__
640 itt hs
641# endif
642 ldrhsb r10,[r12,#-7]
643 ldrhsb r11,[r12,#-3]
644 strb r1,[r14,#-12]
645 eor r0,r8,r0,lsr#8
646 strb r2,[r14,#-8]
647 eor r1,r9,r1,lsr#8
648# ifdef __thumb2__
649 itt hs
650# endif
651 ldrhsb r8,[r12,#-14] @ load more input
652 ldrhsb r9,[r12,#-10]
653 strb r3,[r14,#-4]
654 eor r2,r10,r2,lsr#8
655 strb r0,[r14,#-15]
656 eor r3,r11,r3,lsr#8
657# ifdef __thumb2__
658 itt hs
659# endif
660 ldrhsb r10,[r12,#-6]
661 ldrhsb r11,[r12,#-2]
662 strb r1,[r14,#-11]
663 eor r0,r8,r0,lsr#8
664 strb r2,[r14,#-7]
665 eor r1,r9,r1,lsr#8
666# ifdef __thumb2__
667 itt hs
668# endif
669 ldrhsb r8,[r12,#-13] @ load more input
670 ldrhsb r9,[r12,#-9]
671 strb r3,[r14,#-3]
672 eor r2,r10,r2,lsr#8
673 strb r0,[r14,#-14]
674 eor r3,r11,r3,lsr#8
675# ifdef __thumb2__
676 itt hs
677# endif
678 ldrhsb r10,[r12,#-5]
679 ldrhsb r11,[r12,#-1]
680 strb r1,[r14,#-10]
681 strb r2,[r14,#-6]
682 eor r0,r8,r0,lsr#8
683 strb r3,[r14,#-2]
684 eor r1,r9,r1,lsr#8
685 strb r0,[r14,#-13]
686 eor r2,r10,r2,lsr#8
687 strb r1,[r14,#-9]
688 eor r3,r11,r3,lsr#8
689 strb r2,[r14,#-5]
690 strb r3,[r14,#-1]
691 add r8,sp,#4*(4+8)
692 ldmia r8,{r8,r9,r10,r11} @ load key material
693 add r4,r4,r8 @ accumulate key material
694# ifdef __thumb2__
695 itt hi
696# endif
697 addhi r8,r8,#1 @ next counter value
698 strhi r8,[sp,#4*(12)] @ save next counter value
699 add r5,r5,r9
700 add r6,r6,r10
701# ifdef __thumb2__
702 itete lo
703# endif
704 eorlo r8,r8,r8 @ zero or ...
705 ldrhsb r8,[r12],#16 @ ... load input
706 eorlo r9,r9,r9
707 ldrhsb r9,[r12,#-12]
708
709 add r7,r7,r11
710# ifdef __thumb2__
711 itete lo
712# endif
713 eorlo r10,r10,r10
714 ldrhsb r10,[r12,#-8]
715 eorlo r11,r11,r11
716 ldrhsb r11,[r12,#-4]
717
718 eor r4,r8,r4 @ xor with input (or zero)
719 eor r5,r9,r5
720# ifdef __thumb2__
721 itt hs
722# endif
723 ldrhsb r8,[r12,#-15] @ load more input
724 ldrhsb r9,[r12,#-11]
725 eor r6,r10,r6
726 strb r4,[r14],#16 @ store output
727 eor r7,r11,r7
728# ifdef __thumb2__
729 itt hs
730# endif
731 ldrhsb r10,[r12,#-7]
732 ldrhsb r11,[r12,#-3]
733 strb r5,[r14,#-12]
734 eor r4,r8,r4,lsr#8
735 strb r6,[r14,#-8]
736 eor r5,r9,r5,lsr#8
737# ifdef __thumb2__
738 itt hs
739# endif
740 ldrhsb r8,[r12,#-14] @ load more input
741 ldrhsb r9,[r12,#-10]
742 strb r7,[r14,#-4]
743 eor r6,r10,r6,lsr#8
744 strb r4,[r14,#-15]
745 eor r7,r11,r7,lsr#8
746# ifdef __thumb2__
747 itt hs
748# endif
749 ldrhsb r10,[r12,#-6]
750 ldrhsb r11,[r12,#-2]
751 strb r5,[r14,#-11]
752 eor r4,r8,r4,lsr#8
753 strb r6,[r14,#-7]
754 eor r5,r9,r5,lsr#8
755# ifdef __thumb2__
756 itt hs
757# endif
758 ldrhsb r8,[r12,#-13] @ load more input
759 ldrhsb r9,[r12,#-9]
760 strb r7,[r14,#-3]
761 eor r6,r10,r6,lsr#8
762 strb r4,[r14,#-14]
763 eor r7,r11,r7,lsr#8
764# ifdef __thumb2__
765 itt hs
766# endif
767 ldrhsb r10,[r12,#-5]
768 ldrhsb r11,[r12,#-1]
769 strb r5,[r14,#-10]
770 strb r6,[r14,#-6]
771 eor r4,r8,r4,lsr#8
772 strb r7,[r14,#-2]
773 eor r5,r9,r5,lsr#8
774 strb r4,[r14,#-13]
775 eor r6,r10,r6,lsr#8
776 strb r5,[r14,#-9]
777 eor r7,r11,r7,lsr#8
778 strb r6,[r14,#-5]
779 strb r7,[r14,#-1]
780# ifdef __thumb2__
781 it ne
782# endif
783 ldrne r8,[sp,#4*(32+2)] @ re-load len
784# ifdef __thumb2__
785 it hs
786# endif
787 subhs r11,r8,#64 @ len-=64
788 bhi .Loop_outer
789
790 beq .Ldone
791#endif
792
793.Ltail:
794 ldr r12,[sp,#4*(32+1)] @ load inp
795 add r9,sp,#4*(0)
796 ldr r14,[sp,#4*(32+0)] @ load out
797
798.Loop_tail:
799 ldrb r10,[r9],#1 @ read buffer on stack
800 ldrb r11,[r12],#1 @ read input
801 subs r8,r8,#1
802 eor r11,r11,r10
803 strb r11,[r14],#1 @ store output
804 bne .Loop_tail
805
806.Ldone:
807 add sp,sp,#4*(32+3)
808.Lno_data:
809 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc}
810.size ChaCha20_ctr32,.-ChaCha20_ctr32
811#if __ARM_MAX_ARCH__>=7
812.arch armv7-a
813.fpu neon
814
815.type ChaCha20_neon,%function
816.align 5
817ChaCha20_neon:
818 ldr r12,[sp,#0] @ pull pointer to counter and nonce
819 stmdb sp!,{r0,r1,r2,r4-r11,lr}
820.LChaCha20_neon:
821 adr r14,.Lsigma
822 vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI spec says so
823 stmdb sp!,{r0,r1,r2,r3}
824
825 vld1.32 {q1,q2},[r3] @ load key
826 ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key
827
828 sub sp,sp,#4*(16+16)
829 vld1.32 {q3},[r12] @ load counter and nonce
830 add r12,sp,#4*8
831 ldmia r14,{r0,r1,r2,r3} @ load sigma
832 vld1.32 {q0},[r14]! @ load sigma
833 vld1.32 {q12},[r14] @ one
834 vst1.32 {q2,q3},[r12] @ copy 1/2key|counter|nonce
835 vst1.32 {q0,q1},[sp] @ copy sigma|1/2key
836
837 str r10,[sp,#4*(16+10)] @ off-load "rx"
838 str r11,[sp,#4*(16+11)] @ off-load "rx"
839 vshl.i32 d26,d24,#1 @ two
840 vstr d24,[sp,#4*(16+0)]
841 vshl.i32 d28,d24,#2 @ four
842 vstr d26,[sp,#4*(16+2)]
843 vmov q4,q0
844 vstr d28,[sp,#4*(16+4)]
845 vmov q8,q0
846 vmov q5,q1
847 vmov q9,q1
848 b .Loop_neon_enter
849
850.align 4
851.Loop_neon_outer:
852 ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material
853 cmp r11,#64*2 @ if len<=64*2
854 bls .Lbreak_neon @ switch to integer-only
855 vmov q4,q0
856 str r11,[sp,#4*(32+2)] @ save len
857 vmov q8,q0
858 str r12, [sp,#4*(32+1)] @ save inp
859 vmov q5,q1
860 str r14, [sp,#4*(32+0)] @ save out
861 vmov q9,q1
862.Loop_neon_enter:
863 ldr r11, [sp,#4*(15)]
864 vadd.i32 q7,q3,q12 @ counter+1
865 ldr r12,[sp,#4*(12)] @ modulo-scheduled load
866 vmov q6,q2
867 ldr r10, [sp,#4*(13)]
868 vmov q10,q2
869 ldr r14,[sp,#4*(14)]
870 vadd.i32 q11,q7,q12 @ counter+2
871 str r11, [sp,#4*(16+15)]
872 mov r11,#10
873 add r12,r12,#3 @ counter+3
874 b .Loop_neon
875
876.align 4
877.Loop_neon:
878 subs r11,r11,#1
879 vadd.i32 q0,q0,q1
880 add r0,r0,r4
881 vadd.i32 q4,q4,q5
882 mov r12,r12,ror#16
883 vadd.i32 q8,q8,q9
884 add r1,r1,r5
885 veor q3,q3,q0
886 mov r10,r10,ror#16
887 veor q7,q7,q4
888 eor r12,r12,r0,ror#16
889 veor q11,q11,q8
890 eor r10,r10,r1,ror#16
891 vrev32.16 q3,q3
892 add r8,r8,r12
893 vrev32.16 q7,q7
894 mov r4,r4,ror#20
895 vrev32.16 q11,q11
896 add r9,r9,r10
897 vadd.i32 q2,q2,q3
898 mov r5,r5,ror#20
899 vadd.i32 q6,q6,q7
900 eor r4,r4,r8,ror#20
901 vadd.i32 q10,q10,q11
902 eor r5,r5,r9,ror#20
903 veor q12,q1,q2
904 add r0,r0,r4
905 veor q13,q5,q6
906 mov r12,r12,ror#24
907 veor q14,q9,q10
908 add r1,r1,r5
909 vshr.u32 q1,q12,#20
910 mov r10,r10,ror#24
911 vshr.u32 q5,q13,#20
912 eor r12,r12,r0,ror#24
913 vshr.u32 q9,q14,#20
914 eor r10,r10,r1,ror#24
915 vsli.32 q1,q12,#12
916 add r8,r8,r12
917 vsli.32 q5,q13,#12
918 mov r4,r4,ror#25
919 vsli.32 q9,q14,#12
920 add r9,r9,r10
921 vadd.i32 q0,q0,q1
922 mov r5,r5,ror#25
923 vadd.i32 q4,q4,q5
924 str r10,[sp,#4*(16+13)]
925 vadd.i32 q8,q8,q9
926 ldr r10,[sp,#4*(16+15)]
927 veor q12,q3,q0
928 eor r4,r4,r8,ror#25
929 veor q13,q7,q4
930 eor r5,r5,r9,ror#25
931 veor q14,q11,q8
932 str r8,[sp,#4*(16+8)]
933 vshr.u32 q3,q12,#24
934 ldr r8,[sp,#4*(16+10)]
935 vshr.u32 q7,q13,#24
936 add r2,r2,r6
937 vshr.u32 q11,q14,#24
938 mov r14,r14,ror#16
939 vsli.32 q3,q12,#8
940 str r9,[sp,#4*(16+9)]
941 vsli.32 q7,q13,#8
942 ldr r9,[sp,#4*(16+11)]
943 vsli.32 q11,q14,#8
944 add r3,r3,r7
945 vadd.i32 q2,q2,q3
946 mov r10,r10,ror#16
947 vadd.i32 q6,q6,q7
948 eor r14,r14,r2,ror#16
949 vadd.i32 q10,q10,q11
950 eor r10,r10,r3,ror#16
951 veor q12,q1,q2
952 add r8,r8,r14
953 veor q13,q5,q6
954 mov r6,r6,ror#20
955 veor q14,q9,q10
956 add r9,r9,r10
957 vshr.u32 q1,q12,#25
958 mov r7,r7,ror#20
959 vshr.u32 q5,q13,#25
960 eor r6,r6,r8,ror#20
961 vshr.u32 q9,q14,#25
962 eor r7,r7,r9,ror#20
963 vsli.32 q1,q12,#7
964 add r2,r2,r6
965 vsli.32 q5,q13,#7
966 mov r14,r14,ror#24
967 vsli.32 q9,q14,#7
968 add r3,r3,r7
969 vext.8 q2,q2,q2,#8
970 mov r10,r10,ror#24
971 vext.8 q6,q6,q6,#8
972 eor r14,r14,r2,ror#24
973 vext.8 q10,q10,q10,#8
974 eor r10,r10,r3,ror#24
975 vext.8 q1,q1,q1,#4
976 add r8,r8,r14
977 vext.8 q5,q5,q5,#4
978 mov r6,r6,ror#25
979 vext.8 q9,q9,q9,#4
980 add r9,r9,r10
981 vext.8 q3,q3,q3,#12
982 mov r7,r7,ror#25
983 vext.8 q7,q7,q7,#12
984 eor r6,r6,r8,ror#25
985 vext.8 q11,q11,q11,#12
986 eor r7,r7,r9,ror#25
987 vadd.i32 q0,q0,q1
988 add r0,r0,r5
989 vadd.i32 q4,q4,q5
990 mov r10,r10,ror#16
991 vadd.i32 q8,q8,q9
992 add r1,r1,r6
993 veor q3,q3,q0
994 mov r12,r12,ror#16
995 veor q7,q7,q4
996 eor r10,r10,r0,ror#16
997 veor q11,q11,q8
998 eor r12,r12,r1,ror#16
999 vrev32.16 q3,q3
1000 add r8,r8,r10
1001 vrev32.16 q7,q7
1002 mov r5,r5,ror#20
1003 vrev32.16 q11,q11
1004 add r9,r9,r12
1005 vadd.i32 q2,q2,q3
1006 mov r6,r6,ror#20
1007 vadd.i32 q6,q6,q7
1008 eor r5,r5,r8,ror#20
1009 vadd.i32 q10,q10,q11
1010 eor r6,r6,r9,ror#20
1011 veor q12,q1,q2
1012 add r0,r0,r5
1013 veor q13,q5,q6
1014 mov r10,r10,ror#24
1015 veor q14,q9,q10
1016 add r1,r1,r6
1017 vshr.u32 q1,q12,#20
1018 mov r12,r12,ror#24
1019 vshr.u32 q5,q13,#20
1020 eor r10,r10,r0,ror#24
1021 vshr.u32 q9,q14,#20
1022 eor r12,r12,r1,ror#24
1023 vsli.32 q1,q12,#12
1024 add r8,r8,r10
1025 vsli.32 q5,q13,#12
1026 mov r5,r5,ror#25
1027 vsli.32 q9,q14,#12
1028 str r10,[sp,#4*(16+15)]
1029 vadd.i32 q0,q0,q1
1030 ldr r10,[sp,#4*(16+13)]
1031 vadd.i32 q4,q4,q5
1032 add r9,r9,r12
1033 vadd.i32 q8,q8,q9
1034 mov r6,r6,ror#25
1035 veor q12,q3,q0
1036 eor r5,r5,r8,ror#25
1037 veor q13,q7,q4
1038 eor r6,r6,r9,ror#25
1039 veor q14,q11,q8
1040 str r8,[sp,#4*(16+10)]
1041 vshr.u32 q3,q12,#24
1042 ldr r8,[sp,#4*(16+8)]
1043 vshr.u32 q7,q13,#24
1044 add r2,r2,r7
1045 vshr.u32 q11,q14,#24
1046 mov r10,r10,ror#16
1047 vsli.32 q3,q12,#8
1048 str r9,[sp,#4*(16+11)]
1049 vsli.32 q7,q13,#8
1050 ldr r9,[sp,#4*(16+9)]
1051 vsli.32 q11,q14,#8
1052 add r3,r3,r4
1053 vadd.i32 q2,q2,q3
1054 mov r14,r14,ror#16
1055 vadd.i32 q6,q6,q7
1056 eor r10,r10,r2,ror#16
1057 vadd.i32 q10,q10,q11
1058 eor r14,r14,r3,ror#16
1059 veor q12,q1,q2
1060 add r8,r8,r10
1061 veor q13,q5,q6
1062 mov r7,r7,ror#20
1063 veor q14,q9,q10
1064 add r9,r9,r14
1065 vshr.u32 q1,q12,#25
1066 mov r4,r4,ror#20
1067 vshr.u32 q5,q13,#25
1068 eor r7,r7,r8,ror#20
1069 vshr.u32 q9,q14,#25
1070 eor r4,r4,r9,ror#20
1071 vsli.32 q1,q12,#7
1072 add r2,r2,r7
1073 vsli.32 q5,q13,#7
1074 mov r10,r10,ror#24
1075 vsli.32 q9,q14,#7
1076 add r3,r3,r4
1077 vext.8 q2,q2,q2,#8
1078 mov r14,r14,ror#24
1079 vext.8 q6,q6,q6,#8
1080 eor r10,r10,r2,ror#24
1081 vext.8 q10,q10,q10,#8
1082 eor r14,r14,r3,ror#24
1083 vext.8 q1,q1,q1,#12
1084 add r8,r8,r10
1085 vext.8 q5,q5,q5,#12
1086 mov r7,r7,ror#25
1087 vext.8 q9,q9,q9,#12
1088 add r9,r9,r14
1089 vext.8 q3,q3,q3,#4
1090 mov r4,r4,ror#25
1091 vext.8 q7,q7,q7,#4
1092 eor r7,r7,r8,ror#25
1093 vext.8 q11,q11,q11,#4
1094 eor r4,r4,r9,ror#25
1095 bne .Loop_neon
1096
1097 add r11,sp,#32
1098 vld1.32 {q12,q13},[sp] @ load key material
1099 vld1.32 {q14,q15},[r11]
1100
1101 ldr r11,[sp,#4*(32+2)] @ load len
1102
1103 str r8, [sp,#4*(16+8)] @ modulo-scheduled store
1104 str r9, [sp,#4*(16+9)]
1105 str r12,[sp,#4*(16+12)]
1106 str r10, [sp,#4*(16+13)]
1107 str r14,[sp,#4*(16+14)]
1108
1109 @ at this point we have first half of 512-bit result in
1110 @ rx and second half at sp+4*(16+8)
1111
1112 ldr r12,[sp,#4*(32+1)] @ load inp
1113 ldr r14,[sp,#4*(32+0)] @ load out
1114
1115 vadd.i32 q0,q0,q12 @ accumulate key material
1116 vadd.i32 q4,q4,q12
1117 vadd.i32 q8,q8,q12
1118 vldr d24,[sp,#4*(16+0)] @ one
1119
1120 vadd.i32 q1,q1,q13
1121 vadd.i32 q5,q5,q13
1122 vadd.i32 q9,q9,q13
1123 vldr d26,[sp,#4*(16+2)] @ two
1124
1125 vadd.i32 q2,q2,q14
1126 vadd.i32 q6,q6,q14
1127 vadd.i32 q10,q10,q14
1128 vadd.i32 d14,d14,d24 @ counter+1
1129 vadd.i32 d22,d22,d26 @ counter+2
1130
1131 vadd.i32 q3,q3,q15
1132 vadd.i32 q7,q7,q15
1133 vadd.i32 q11,q11,q15
1134
1135 cmp r11,#64*4
1136 blo .Ltail_neon
1137
1138 vld1.8 {q12,q13},[r12]! @ load input
1139 mov r11,sp
1140 vld1.8 {q14,q15},[r12]!
1141 veor q0,q0,q12 @ xor with input
1142 veor q1,q1,q13
1143 vld1.8 {q12,q13},[r12]!
1144 veor q2,q2,q14
1145 veor q3,q3,q15
1146 vld1.8 {q14,q15},[r12]!
1147
1148 veor q4,q4,q12
1149 vst1.8 {q0,q1},[r14]! @ store output
1150 veor q5,q5,q13
1151 vld1.8 {q12,q13},[r12]!
1152 veor q6,q6,q14
1153 vst1.8 {q2,q3},[r14]!
1154 veor q7,q7,q15
1155 vld1.8 {q14,q15},[r12]!
1156
1157 veor q8,q8,q12
1158 vld1.32 {q0,q1},[r11]! @ load for next iteration
1159 veor d25,d25,d25
1160 vldr d24,[sp,#4*(16+4)] @ four
1161 veor q9,q9,q13
1162 vld1.32 {q2,q3},[r11]
1163 veor q10,q10,q14
1164 vst1.8 {q4,q5},[r14]!
1165 veor q11,q11,q15
1166 vst1.8 {q6,q7},[r14]!
1167
1168 vadd.i32 d6,d6,d24 @ next counter value
1169 vldr d24,[sp,#4*(16+0)] @ one
1170
1171 ldmia sp,{r8,r9,r10,r11} @ load key material
1172 add r0,r0,r8 @ accumulate key material
1173 ldr r8,[r12],#16 @ load input
1174 vst1.8 {q8,q9},[r14]!
1175 add r1,r1,r9
1176 ldr r9,[r12,#-12]
1177 vst1.8 {q10,q11},[r14]!
1178 add r2,r2,r10
1179 ldr r10,[r12,#-8]
1180 add r3,r3,r11
1181 ldr r11,[r12,#-4]
1182# ifdef __ARMEB__
1183 rev r0,r0
1184 rev r1,r1
1185 rev r2,r2
1186 rev r3,r3
1187# endif
1188 eor r0,r0,r8 @ xor with input
1189 add r8,sp,#4*(4)
1190 eor r1,r1,r9
1191 str r0,[r14],#16 @ store output
1192 eor r2,r2,r10
1193 str r1,[r14,#-12]
1194 eor r3,r3,r11
1195 ldmia r8,{r8,r9,r10,r11} @ load key material
1196 str r2,[r14,#-8]
1197 str r3,[r14,#-4]
1198
1199 add r4,r4,r8 @ accumulate key material
1200 ldr r8,[r12],#16 @ load input
1201 add r5,r5,r9
1202 ldr r9,[r12,#-12]
1203 add r6,r6,r10
1204 ldr r10,[r12,#-8]
1205 add r7,r7,r11
1206 ldr r11,[r12,#-4]
1207# ifdef __ARMEB__
1208 rev r4,r4
1209 rev r5,r5
1210 rev r6,r6
1211 rev r7,r7
1212# endif
1213 eor r4,r4,r8
1214 add r8,sp,#4*(8)
1215 eor r5,r5,r9
1216 str r4,[r14],#16 @ store output
1217 eor r6,r6,r10
1218 str r5,[r14,#-12]
1219 eor r7,r7,r11
1220 ldmia r8,{r8,r9,r10,r11} @ load key material
1221 str r6,[r14,#-8]
1222 add r0,sp,#4*(16+8)
1223 str r7,[r14,#-4]
1224
1225 ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half
1226
1227 add r0,r0,r8 @ accumulate key material
1228 ldr r8,[r12],#16 @ load input
1229 add r1,r1,r9
1230 ldr r9,[r12,#-12]
1231# ifdef __thumb2__
1232 it hi
1233# endif
1234 strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it
1235 add r2,r2,r10
1236 ldr r10,[r12,#-8]
1237# ifdef __thumb2__
1238 it hi
1239# endif
1240 strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it
1241 add r3,r3,r11
1242 ldr r11,[r12,#-4]
1243# ifdef __ARMEB__
1244 rev r0,r0
1245 rev r1,r1
1246 rev r2,r2
1247 rev r3,r3
1248# endif
1249 eor r0,r0,r8
1250 add r8,sp,#4*(12)
1251 eor r1,r1,r9
1252 str r0,[r14],#16 @ store output
1253 eor r2,r2,r10
1254 str r1,[r14,#-12]
1255 eor r3,r3,r11
1256 ldmia r8,{r8,r9,r10,r11} @ load key material
1257 str r2,[r14,#-8]
1258 str r3,[r14,#-4]
1259
1260 add r4,r4,r8 @ accumulate key material
1261 add r8,r8,#4 @ next counter value
1262 add r5,r5,r9
1263 str r8,[sp,#4*(12)] @ save next counter value
1264 ldr r8,[r12],#16 @ load input
1265 add r6,r6,r10
1266 add r4,r4,#3 @ counter+3
1267 ldr r9,[r12,#-12]
1268 add r7,r7,r11
1269 ldr r10,[r12,#-8]
1270 ldr r11,[r12,#-4]
1271# ifdef __ARMEB__
1272 rev r4,r4
1273 rev r5,r5
1274 rev r6,r6
1275 rev r7,r7
1276# endif
1277 eor r4,r4,r8
1278# ifdef __thumb2__
1279 it hi
1280# endif
1281 ldrhi r8,[sp,#4*(32+2)] @ re-load len
1282 eor r5,r5,r9
1283 eor r6,r6,r10
1284 str r4,[r14],#16 @ store output
1285 eor r7,r7,r11
1286 str r5,[r14,#-12]
1287 sub r11,r8,#64*4 @ len-=64*4
1288 str r6,[r14,#-8]
1289 str r7,[r14,#-4]
1290 bhi .Loop_neon_outer
1291
1292 b .Ldone_neon
1293
1294.align 4
1295.Lbreak_neon:
1296 @ harmonize NEON and integer-only stack frames: load data
1297 @ from NEON frame, but save to integer-only one; distance
1298 @ between the two is 4*(32+4+16-32)=4*(20).
1299
1300 str r11, [sp,#4*(20+32+2)] @ save len
1301 add r11,sp,#4*(32+4)
1302 str r12, [sp,#4*(20+32+1)] @ save inp
1303 str r14, [sp,#4*(20+32+0)] @ save out
1304
1305 ldr r12,[sp,#4*(16+10)]
1306 ldr r14,[sp,#4*(16+11)]
1307 vldmia r11,{d8,d9,d10,d11,d12,d13,d14,d15} @ fulfill ABI requirement
1308 str r12,[sp,#4*(20+16+10)] @ copy "rx"
1309 str r14,[sp,#4*(20+16+11)] @ copy "rx"
1310
1311 ldr r11, [sp,#4*(15)]
1312 ldr r12,[sp,#4*(12)] @ modulo-scheduled load
1313 ldr r10, [sp,#4*(13)]
1314 ldr r14,[sp,#4*(14)]
1315 str r11, [sp,#4*(20+16+15)]
1316 add r11,sp,#4*(20)
1317 vst1.32 {q0,q1},[r11]! @ copy key
1318 add sp,sp,#4*(20) @ switch frame
1319 vst1.32 {q2,q3},[r11]
1320 mov r11,#10
1321 b .Loop @ go integer-only
1322
1323.align 4
1324.Ltail_neon:
1325 cmp r11,#64*3
1326 bhs .L192_or_more_neon
1327 cmp r11,#64*2
1328 bhs .L128_or_more_neon
1329 cmp r11,#64*1
1330 bhs .L64_or_more_neon
1331
1332 add r8,sp,#4*(8)
1333 vst1.8 {q0,q1},[sp]
1334 add r10,sp,#4*(0)
1335 vst1.8 {q2,q3},[r8]
1336 b .Loop_tail_neon
1337
1338.align 4
1339.L64_or_more_neon:
1340 vld1.8 {q12,q13},[r12]!
1341 vld1.8 {q14,q15},[r12]!
1342 veor q0,q0,q12
1343 veor q1,q1,q13
1344 veor q2,q2,q14
1345 veor q3,q3,q15
1346 vst1.8 {q0,q1},[r14]!
1347 vst1.8 {q2,q3},[r14]!
1348
1349 beq .Ldone_neon
1350
1351 add r8,sp,#4*(8)
1352 vst1.8 {q4,q5},[sp]
1353 add r10,sp,#4*(0)
1354 vst1.8 {q6,q7},[r8]
1355 sub r11,r11,#64*1 @ len-=64*1
1356 b .Loop_tail_neon
1357
1358.align 4
1359.L128_or_more_neon:
1360 vld1.8 {q12,q13},[r12]!
1361 vld1.8 {q14,q15},[r12]!
1362 veor q0,q0,q12
1363 veor q1,q1,q13
1364 vld1.8 {q12,q13},[r12]!
1365 veor q2,q2,q14
1366 veor q3,q3,q15
1367 vld1.8 {q14,q15},[r12]!
1368
1369 veor q4,q4,q12
1370 veor q5,q5,q13
1371 vst1.8 {q0,q1},[r14]!
1372 veor q6,q6,q14
1373 vst1.8 {q2,q3},[r14]!
1374 veor q7,q7,q15
1375 vst1.8 {q4,q5},[r14]!
1376 vst1.8 {q6,q7},[r14]!
1377
1378 beq .Ldone_neon
1379
1380 add r8,sp,#4*(8)
1381 vst1.8 {q8,q9},[sp]
1382 add r10,sp,#4*(0)
1383 vst1.8 {q10,q11},[r8]
1384 sub r11,r11,#64*2 @ len-=64*2
1385 b .Loop_tail_neon
1386
1387.align 4
1388.L192_or_more_neon:
1389 vld1.8 {q12,q13},[r12]!
1390 vld1.8 {q14,q15},[r12]!
1391 veor q0,q0,q12
1392 veor q1,q1,q13
1393 vld1.8 {q12,q13},[r12]!
1394 veor q2,q2,q14
1395 veor q3,q3,q15
1396 vld1.8 {q14,q15},[r12]!
1397
1398 veor q4,q4,q12
1399 veor q5,q5,q13
1400 vld1.8 {q12,q13},[r12]!
1401 veor q6,q6,q14
1402 vst1.8 {q0,q1},[r14]!
1403 veor q7,q7,q15
1404 vld1.8 {q14,q15},[r12]!
1405
1406 veor q8,q8,q12
1407 vst1.8 {q2,q3},[r14]!
1408 veor q9,q9,q13
1409 vst1.8 {q4,q5},[r14]!
1410 veor q10,q10,q14
1411 vst1.8 {q6,q7},[r14]!
1412 veor q11,q11,q15
1413 vst1.8 {q8,q9},[r14]!
1414 vst1.8 {q10,q11},[r14]!
1415
1416 beq .Ldone_neon
1417
1418 ldmia sp,{r8,r9,r10,r11} @ load key material
1419 add r0,r0,r8 @ accumulate key material
1420 add r8,sp,#4*(4)
1421 add r1,r1,r9
1422 add r2,r2,r10
1423 add r3,r3,r11
1424 ldmia r8,{r8,r9,r10,r11} @ load key material
1425
1426 add r4,r4,r8 @ accumulate key material
1427 add r8,sp,#4*(8)
1428 add r5,r5,r9
1429 add r6,r6,r10
1430 add r7,r7,r11
1431 ldmia r8,{r8,r9,r10,r11} @ load key material
1432# ifdef __ARMEB__
1433 rev r0,r0
1434 rev r1,r1
1435 rev r2,r2
1436 rev r3,r3
1437 rev r4,r4
1438 rev r5,r5
1439 rev r6,r6
1440 rev r7,r7
1441# endif
1442 stmia sp,{r0,r1,r2,r3,r4,r5,r6,r7}
1443 add r0,sp,#4*(16+8)
1444
1445 ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half
1446
1447 add r0,r0,r8 @ accumulate key material
1448 add r8,sp,#4*(12)
1449 add r1,r1,r9
1450 add r2,r2,r10
1451 add r3,r3,r11
1452 ldmia r8,{r8,r9,r10,r11} @ load key material
1453
1454 add r4,r4,r8 @ accumulate key material
1455 add r8,sp,#4*(8)
1456 add r5,r5,r9
1457 add r4,r4,#3 @ counter+3
1458 add r6,r6,r10
1459 add r7,r7,r11
1460 ldr r11,[sp,#4*(32+2)] @ re-load len
1461# ifdef __ARMEB__
1462 rev r0,r0
1463 rev r1,r1
1464 rev r2,r2
1465 rev r3,r3
1466 rev r4,r4
1467 rev r5,r5
1468 rev r6,r6
1469 rev r7,r7
1470# endif
1471 stmia r8,{r0,r1,r2,r3,r4,r5,r6,r7}
1472 add r10,sp,#4*(0)
1473 sub r11,r11,#64*3 @ len-=64*3
1474
1475.Loop_tail_neon:
1476 ldrb r8,[r10],#1 @ read buffer on stack
1477 ldrb r9,[r12],#1 @ read input
1478 subs r11,r11,#1
1479 eor r8,r8,r9
Robert Sloana94fe052017-02-21 08:49:28 -08001480 strb r8,[r14],#1 @ store output
David Benjamin4969cc92016-04-22 15:02:23 -04001481 bne .Loop_tail_neon
1482
1483.Ldone_neon:
1484 add sp,sp,#4*(32+4)
1485 vldmia sp,{d8,d9,d10,d11,d12,d13,d14,d15}
1486 add sp,sp,#4*(16+3)
1487 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc}
1488.size ChaCha20_neon,.-ChaCha20_neon
1489.comm OPENSSL_armcap_P,4,4
1490#endif
1491#endif
Robert Sloan726e9d12018-09-11 11:45:04 -07001492#endif // !OPENSSL_NO_ASM
Tobias Thiererb201fcd2019-10-15 21:48:16 +01001493.section .note.GNU-stack,"",%progbits