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