2 /* Do not modify. This file is auto-generated from armv4-mont.pl. */
6 #if defined(__thumb2__)
13 #if __ARM_MAX_ARCH__>=7
16 .word OPENSSL_armcap_P-.Lbn_mul_mont
20 .type bn_mul_mont,%function
25 ldr ip,[sp,#4] @ load num
26 stmdb sp!,{r0,r2} @ sp points at argument block
27 #if __ARM_MAX_ARCH__>=7
31 ldr r2,.LOPENSSL_armcap
36 tst r0,#ARMV7_NEON @ NEON available?
53 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers
55 mov r0,r0,lsl#2 @ rescale r0 for byte count
56 sub sp,sp,r0 @ alloca(4*num)
57 sub sp,sp,#4 @ +extra dword
58 sub r0,r0,#4 @ "num=num-1"
59 add r4,r2,r0 @ &bp[num-1]
61 add r0,sp,r0 @ r0 to point at &tp[num-1]
62 ldr r8,[r0,#14*4] @ &n0
64 ldr r5,[r1],#4 @ ap[0],ap++
65 ldr r6,[r3],#4 @ np[0],np++
67 str r4,[r0,#15*4] @ save &bp[num]
69 umull r10,r11,r5,r2 @ ap[0]*bp[0]
70 str r8,[r0,#14*4] @ save n0 value
71 mul r8,r10,r8 @ "tp[0]"*n0
73 umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]"
77 ldr r5,[r1],#4 @ ap[j],ap++
79 ldr r6,[r3],#4 @ np[j],np++
81 umlal r10,r11,r5,r2 @ ap[j]*bp[0]
83 umlal r12,r14,r6,r8 @ np[j]*n0
85 str r12,[r4],#4 @ tp[j-1]=,tp++
91 ldr r4,[r0,#13*4] @ restore bp
93 ldr r8,[r0,#14*4] @ restore n0
95 str r12,[r0] @ tp[num-1]=
97 str r14,[r0,#4] @ tp[num]=
100 sub r7,r0,r7 @ "original" r0-1 value
101 sub r1,r1,r7 @ "rewind" ap to &ap[1]
102 ldr r2,[r4,#4]! @ *(++bp)
103 sub r3,r3,r7 @ "rewind" np to &np[1]
104 ldr r5,[r1,#-4] @ ap[0]
106 ldr r6,[r3,#-4] @ np[0]
107 ldr r7,[sp,#4] @ tp[1]
110 umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0]
111 str r4,[r0,#13*4] @ save bp
114 umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]"
118 ldr r5,[r1],#4 @ ap[j],ap++
119 adds r10,r11,r7 @ +=tp[j]
120 ldr r6,[r3],#4 @ np[j],np++
122 umlal r10,r11,r5,r2 @ ap[j]*bp[i]
124 umlal r12,r14,r6,r8 @ np[j]*n0
126 ldr r7,[r4,#8] @ tp[j+1]
128 str r12,[r4],#4 @ tp[j-1]=,tp++
135 ldr r4,[r0,#13*4] @ restore bp
137 ldr r8,[r0,#14*4] @ restore n0
139 ldr r7,[r0,#15*4] @ restore &bp[num]
141 str r12,[r0] @ tp[num-1]=
142 str r14,[r0,#4] @ tp[num]=
151 ldr r2,[r0,#12*4] @ pull rp
153 add r0,r0,#4 @ r0 to point at &tp[num]
154 sub r5,r0,r5 @ "original" num value
155 mov r4,sp @ "rewind" r4
156 mov r1,r4 @ "borrow" r1
157 sub r3,r3,r5 @ "rewind" r3 to &np[0]
159 subs r7,r7,r7 @ "clear" carry flag
160 .Lsub: ldr r7,[r4],#4
162 sbcs r7,r7,r6 @ tp[j]-np[j]
163 str r7,[r2],#4 @ rp[j]=
164 teq r4,r0 @ preserve carry
166 sbcs r14,r14,#0 @ upmost carry
167 mov r4,sp @ "rewind" r4
168 sub r2,r2,r5 @ "rewind" r2
170 .Lcopy: ldr r7,[r4] @ conditional copy
172 str sp,[r4],#4 @ zap tp
178 teq r4,r0 @ preserve carry
182 add sp,sp,#4 @ skip over tp[num+1]
183 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers
184 add sp,sp,#2*4 @ skip over {r0,r2}
191 moveq pc,lr @ be binary compatible with V4, yet
192 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
194 .size bn_mul_mont,.-bn_mul_mont
195 #if __ARM_MAX_ARCH__>=7
199 .type bn_mul8x_mont_neon,%function
203 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
204 vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so
205 ldmia ip,{r4,r5} @ load rest of parameter block
211 @ special case for r5==8, everything is in register bank...
213 vld1.32 {d28[0]}, [r2,:32]!
216 vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-(
218 vld1.32 {d30[0]}, [r4,:32]
222 vmull.u32 q6,d28,d0[0]
223 vmull.u32 q7,d28,d0[1]
224 vmull.u32 q8,d28,d1[0]
226 vmull.u32 q9,d28,d1[1]
232 vmull.u32 q10,d28,d2[0]
233 vld1.32 {d4,d5,d6,d7}, [r3]!
234 vmull.u32 q11,d28,d2[1]
235 vmull.u32 q12,d28,d3[0]
237 vmull.u32 q13,d28,d3[1]
239 vmlal.u32 q6,d29,d4[0]
241 vmlal.u32 q7,d29,d4[1]
242 vmlal.u32 q8,d29,d5[0]
243 vmlal.u32 q9,d29,d5[1]
245 vmlal.u32 q10,d29,d6[0]
247 vmlal.u32 q11,d29,d6[1]
249 vmlal.u32 q12,d29,d7[0]
251 vmlal.u32 q13,d29,d7[1]
266 vld1.32 {d28[0]}, [r2,:32]!
271 vmlal.u32 q6,d28,d0[0]
272 vmlal.u32 q7,d28,d0[1]
273 vmlal.u32 q8,d28,d1[0]
275 vmlal.u32 q9,d28,d1[1]
282 vmlal.u32 q10,d28,d2[0]
283 vmlal.u32 q11,d28,d2[1]
284 vmlal.u32 q12,d28,d3[0]
286 vmlal.u32 q13,d28,d3[1]
288 vmlal.u32 q6,d29,d4[0]
289 vmlal.u32 q7,d29,d4[1]
290 vmlal.u32 q8,d29,d5[0]
291 vmlal.u32 q9,d29,d5[1]
293 vmlal.u32 q10,d29,d6[0]
295 vmlal.u32 q11,d29,d6[1]
297 vmlal.u32 q12,d29,d7[0]
299 vmlal.u32 q13,d29,d7[1]
341 vst1.64 {q6,q7},[r7,:256]!
343 vst1.64 {q8,q9},[r7,:256]!
344 vst1.64 {q10,q11},[r7,:256]!
345 vst1.64 {q12,q13},[r7,:256]!
349 vld1.32 {d0,d1,d2,d3},[r1]!
351 vld1.32 {d30[0]},[r4,:32]
357 vld1.32 {d28[0]},[r2,:32]! @ *b++
361 vld1.32 {d4,d5,d6,d7},[r3]!
363 vmlal.u32 q6,d28,d0[0]
364 vmlal.u32 q7,d28,d0[1]
366 vmlal.u32 q8,d28,d1[0]
368 vmlal.u32 q9,d28,d1[1]
370 vmlal.u32 q10,d28,d2[0]
372 vmlal.u32 q11,d28,d2[1]
373 vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0]
374 vmlal.u32 q12,d28,d3[0]
376 vmlal.u32 q13,d28,d3[1]
377 vld1.32 {d28[0]},[r2,:32]! @ *b++
378 vmlal.u32 q6,d29,d4[0]
380 vmlal.u32 q7,d29,d4[1]
382 vmlal.u32 q8,d29,d5[0]
384 vmlal.u32 q9,d29,d5[1]
385 vmlal.u32 q10,d29,d6[0]
387 vmlal.u32 q11,d29,d6[1]
389 vmlal.u32 q12,d29,d7[0]
390 vmlal.u32 q13,d29,d7[1]
392 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0]
393 vmlal.u32 q7,d28,d0[0]
394 vld1.64 {q6},[r6,:128]!
395 vmlal.u32 q8,d28,d0[1]
397 vmlal.u32 q9,d28,d1[0]
399 vmlal.u32 q10,d28,d1[1]
401 vmlal.u32 q11,d28,d2[0]
403 vmlal.u32 q12,d28,d2[1]
404 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1]
405 vmlal.u32 q13,d28,d3[0]
407 vmlal.u32 q6,d28,d3[1]
408 vld1.32 {d28[0]},[r2,:32]! @ *b++
409 vmlal.u32 q7,d29,d4[0]
411 vmlal.u32 q8,d29,d4[1]
413 vmlal.u32 q9,d29,d5[0]
415 vmlal.u32 q10,d29,d5[1]
416 vmlal.u32 q11,d29,d6[0]
418 vmlal.u32 q12,d29,d6[1]
420 vmlal.u32 q13,d29,d7[0]
421 vmlal.u32 q6,d29,d7[1]
423 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1]
424 vmlal.u32 q8,d28,d0[0]
425 vld1.64 {q7},[r6,:128]!
426 vmlal.u32 q9,d28,d0[1]
428 vmlal.u32 q10,d28,d1[0]
430 vmlal.u32 q11,d28,d1[1]
432 vmlal.u32 q12,d28,d2[0]
434 vmlal.u32 q13,d28,d2[1]
435 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2]
436 vmlal.u32 q6,d28,d3[0]
438 vmlal.u32 q7,d28,d3[1]
439 vld1.32 {d28[0]},[r2,:32]! @ *b++
440 vmlal.u32 q8,d29,d4[0]
442 vmlal.u32 q9,d29,d4[1]
444 vmlal.u32 q10,d29,d5[0]
446 vmlal.u32 q11,d29,d5[1]
447 vmlal.u32 q12,d29,d6[0]
449 vmlal.u32 q13,d29,d6[1]
451 vmlal.u32 q6,d29,d7[0]
452 vmlal.u32 q7,d29,d7[1]
454 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2]
455 vmlal.u32 q9,d28,d0[0]
456 vld1.64 {q8},[r6,:128]!
457 vmlal.u32 q10,d28,d0[1]
459 vmlal.u32 q11,d28,d1[0]
461 vmlal.u32 q12,d28,d1[1]
463 vmlal.u32 q13,d28,d2[0]
465 vmlal.u32 q6,d28,d2[1]
466 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3]
467 vmlal.u32 q7,d28,d3[0]
469 vmlal.u32 q8,d28,d3[1]
470 vld1.32 {d28[0]},[r2,:32]! @ *b++
471 vmlal.u32 q9,d29,d4[0]
473 vmlal.u32 q10,d29,d4[1]
475 vmlal.u32 q11,d29,d5[0]
477 vmlal.u32 q12,d29,d5[1]
478 vmlal.u32 q13,d29,d6[0]
480 vmlal.u32 q6,d29,d6[1]
482 vmlal.u32 q7,d29,d7[0]
483 vmlal.u32 q8,d29,d7[1]
485 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3]
486 vmlal.u32 q10,d28,d0[0]
487 vld1.64 {q9},[r6,:128]!
488 vmlal.u32 q11,d28,d0[1]
490 vmlal.u32 q12,d28,d1[0]
492 vmlal.u32 q13,d28,d1[1]
494 vmlal.u32 q6,d28,d2[0]
496 vmlal.u32 q7,d28,d2[1]
497 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4]
498 vmlal.u32 q8,d28,d3[0]
500 vmlal.u32 q9,d28,d3[1]
501 vld1.32 {d28[0]},[r2,:32]! @ *b++
502 vmlal.u32 q10,d29,d4[0]
504 vmlal.u32 q11,d29,d4[1]
506 vmlal.u32 q12,d29,d5[0]
508 vmlal.u32 q13,d29,d5[1]
509 vmlal.u32 q6,d29,d6[0]
511 vmlal.u32 q7,d29,d6[1]
513 vmlal.u32 q8,d29,d7[0]
514 vmlal.u32 q9,d29,d7[1]
516 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4]
517 vmlal.u32 q11,d28,d0[0]
518 vld1.64 {q10},[r6,:128]!
519 vmlal.u32 q12,d28,d0[1]
521 vmlal.u32 q13,d28,d1[0]
523 vmlal.u32 q6,d28,d1[1]
525 vmlal.u32 q7,d28,d2[0]
527 vmlal.u32 q8,d28,d2[1]
528 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5]
529 vmlal.u32 q9,d28,d3[0]
531 vmlal.u32 q10,d28,d3[1]
532 vld1.32 {d28[0]},[r2,:32]! @ *b++
533 vmlal.u32 q11,d29,d4[0]
535 vmlal.u32 q12,d29,d4[1]
537 vmlal.u32 q13,d29,d5[0]
539 vmlal.u32 q6,d29,d5[1]
540 vmlal.u32 q7,d29,d6[0]
542 vmlal.u32 q8,d29,d6[1]
544 vmlal.u32 q9,d29,d7[0]
545 vmlal.u32 q10,d29,d7[1]
547 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5]
548 vmlal.u32 q12,d28,d0[0]
549 vld1.64 {q11},[r6,:128]!
550 vmlal.u32 q13,d28,d0[1]
552 vmlal.u32 q6,d28,d1[0]
554 vmlal.u32 q7,d28,d1[1]
556 vmlal.u32 q8,d28,d2[0]
558 vmlal.u32 q9,d28,d2[1]
559 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6]
560 vmlal.u32 q10,d28,d3[0]
562 vmlal.u32 q11,d28,d3[1]
563 vld1.32 {d28[0]},[r2,:32]! @ *b++
564 vmlal.u32 q12,d29,d4[0]
566 vmlal.u32 q13,d29,d4[1]
568 vmlal.u32 q6,d29,d5[0]
570 vmlal.u32 q7,d29,d5[1]
571 vmlal.u32 q8,d29,d6[0]
573 vmlal.u32 q9,d29,d6[1]
575 vmlal.u32 q10,d29,d7[0]
576 vmlal.u32 q11,d29,d7[1]
578 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6]
579 vmlal.u32 q13,d28,d0[0]
580 vld1.64 {q12},[r6,:128]!
581 vmlal.u32 q6,d28,d0[1]
583 vmlal.u32 q7,d28,d1[0]
585 vmlal.u32 q8,d28,d1[1]
587 vmlal.u32 q9,d28,d2[0]
589 vmlal.u32 q10,d28,d2[1]
590 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7]
591 vmlal.u32 q11,d28,d3[0]
593 vmlal.u32 q12,d28,d3[1]
594 vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
595 vmlal.u32 q13,d29,d4[0]
596 vld1.32 {d0,d1,d2,d3},[r1]!
597 vmlal.u32 q6,d29,d4[1]
598 vmlal.u32 q7,d29,d5[0]
600 vmlal.u32 q8,d29,d5[1]
601 vmlal.u32 q9,d29,d6[0]
603 vmlal.u32 q10,d29,d6[1]
605 vmlal.u32 q11,d29,d7[0]
606 vmlal.u32 q12,d29,d7[1]
608 vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]
609 add r10,sp,#8 @ rewind
616 vmlal.u32 q6,d28,d0[0]
617 vld1.64 {q13},[r6,:128]
618 vmlal.u32 q7,d28,d0[1]
619 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0]
620 vmlal.u32 q8,d28,d1[0]
621 vld1.32 {d4,d5,d6,d7},[r3]!
622 vmlal.u32 q9,d28,d1[1]
624 addne r6,r6,#16 @ don't advance in last iteration
625 vmlal.u32 q10,d28,d2[0]
626 vmlal.u32 q11,d28,d2[1]
627 vmlal.u32 q12,d28,d3[0]
628 vmlal.u32 q13,d28,d3[1]
629 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1]
630 vmlal.u32 q6,d29,d4[0]
631 vmlal.u32 q7,d29,d4[1]
632 vmlal.u32 q8,d29,d5[0]
633 vmlal.u32 q9,d29,d5[1]
634 vmlal.u32 q10,d29,d6[0]
635 vmlal.u32 q11,d29,d6[1]
636 vmlal.u32 q12,d29,d7[0]
637 vmlal.u32 q13,d29,d7[1]
638 vst1.64 {q6},[r7,:128]!
639 vmlal.u32 q7,d28,d0[0]
640 vld1.64 {q6},[r6,:128]
641 vmlal.u32 q8,d28,d0[1]
642 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1]
643 vmlal.u32 q9,d28,d1[0]
645 addne r6,r6,#16 @ don't advance in last iteration
646 vmlal.u32 q10,d28,d1[1]
647 vmlal.u32 q11,d28,d2[0]
648 vmlal.u32 q12,d28,d2[1]
649 vmlal.u32 q13,d28,d3[0]
650 vmlal.u32 q6,d28,d3[1]
651 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2]
652 vmlal.u32 q7,d29,d4[0]
653 vmlal.u32 q8,d29,d4[1]
654 vmlal.u32 q9,d29,d5[0]
655 vmlal.u32 q10,d29,d5[1]
656 vmlal.u32 q11,d29,d6[0]
657 vmlal.u32 q12,d29,d6[1]
658 vmlal.u32 q13,d29,d7[0]
659 vmlal.u32 q6,d29,d7[1]
660 vst1.64 {q7},[r7,:128]!
661 vmlal.u32 q8,d28,d0[0]
662 vld1.64 {q7},[r6,:128]
663 vmlal.u32 q9,d28,d0[1]
664 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2]
665 vmlal.u32 q10,d28,d1[0]
667 addne r6,r6,#16 @ don't advance in last iteration
668 vmlal.u32 q11,d28,d1[1]
669 vmlal.u32 q12,d28,d2[0]
670 vmlal.u32 q13,d28,d2[1]
671 vmlal.u32 q6,d28,d3[0]
672 vmlal.u32 q7,d28,d3[1]
673 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3]
674 vmlal.u32 q8,d29,d4[0]
675 vmlal.u32 q9,d29,d4[1]
676 vmlal.u32 q10,d29,d5[0]
677 vmlal.u32 q11,d29,d5[1]
678 vmlal.u32 q12,d29,d6[0]
679 vmlal.u32 q13,d29,d6[1]
680 vmlal.u32 q6,d29,d7[0]
681 vmlal.u32 q7,d29,d7[1]
682 vst1.64 {q8},[r7,:128]!
683 vmlal.u32 q9,d28,d0[0]
684 vld1.64 {q8},[r6,:128]
685 vmlal.u32 q10,d28,d0[1]
686 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3]
687 vmlal.u32 q11,d28,d1[0]
689 addne r6,r6,#16 @ don't advance in last iteration
690 vmlal.u32 q12,d28,d1[1]
691 vmlal.u32 q13,d28,d2[0]
692 vmlal.u32 q6,d28,d2[1]
693 vmlal.u32 q7,d28,d3[0]
694 vmlal.u32 q8,d28,d3[1]
695 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4]
696 vmlal.u32 q9,d29,d4[0]
697 vmlal.u32 q10,d29,d4[1]
698 vmlal.u32 q11,d29,d5[0]
699 vmlal.u32 q12,d29,d5[1]
700 vmlal.u32 q13,d29,d6[0]
701 vmlal.u32 q6,d29,d6[1]
702 vmlal.u32 q7,d29,d7[0]
703 vmlal.u32 q8,d29,d7[1]
704 vst1.64 {q9},[r7,:128]!
705 vmlal.u32 q10,d28,d0[0]
706 vld1.64 {q9},[r6,:128]
707 vmlal.u32 q11,d28,d0[1]
708 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4]
709 vmlal.u32 q12,d28,d1[0]
711 addne r6,r6,#16 @ don't advance in last iteration
712 vmlal.u32 q13,d28,d1[1]
713 vmlal.u32 q6,d28,d2[0]
714 vmlal.u32 q7,d28,d2[1]
715 vmlal.u32 q8,d28,d3[0]
716 vmlal.u32 q9,d28,d3[1]
717 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5]
718 vmlal.u32 q10,d29,d4[0]
719 vmlal.u32 q11,d29,d4[1]
720 vmlal.u32 q12,d29,d5[0]
721 vmlal.u32 q13,d29,d5[1]
722 vmlal.u32 q6,d29,d6[0]
723 vmlal.u32 q7,d29,d6[1]
724 vmlal.u32 q8,d29,d7[0]
725 vmlal.u32 q9,d29,d7[1]
726 vst1.64 {q10},[r7,:128]!
727 vmlal.u32 q11,d28,d0[0]
728 vld1.64 {q10},[r6,:128]
729 vmlal.u32 q12,d28,d0[1]
730 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5]
731 vmlal.u32 q13,d28,d1[0]
733 addne r6,r6,#16 @ don't advance in last iteration
734 vmlal.u32 q6,d28,d1[1]
735 vmlal.u32 q7,d28,d2[0]
736 vmlal.u32 q8,d28,d2[1]
737 vmlal.u32 q9,d28,d3[0]
738 vmlal.u32 q10,d28,d3[1]
739 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6]
740 vmlal.u32 q11,d29,d4[0]
741 vmlal.u32 q12,d29,d4[1]
742 vmlal.u32 q13,d29,d5[0]
743 vmlal.u32 q6,d29,d5[1]
744 vmlal.u32 q7,d29,d6[0]
745 vmlal.u32 q8,d29,d6[1]
746 vmlal.u32 q9,d29,d7[0]
747 vmlal.u32 q10,d29,d7[1]
748 vst1.64 {q11},[r7,:128]!
749 vmlal.u32 q12,d28,d0[0]
750 vld1.64 {q11},[r6,:128]
751 vmlal.u32 q13,d28,d0[1]
752 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6]
753 vmlal.u32 q6,d28,d1[0]
755 addne r6,r6,#16 @ don't advance in last iteration
756 vmlal.u32 q7,d28,d1[1]
757 vmlal.u32 q8,d28,d2[0]
758 vmlal.u32 q9,d28,d2[1]
759 vmlal.u32 q10,d28,d3[0]
760 vmlal.u32 q11,d28,d3[1]
761 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7]
762 vmlal.u32 q12,d29,d4[0]
763 vmlal.u32 q13,d29,d4[1]
764 vmlal.u32 q6,d29,d5[0]
765 vmlal.u32 q7,d29,d5[1]
766 vmlal.u32 q8,d29,d6[0]
767 vmlal.u32 q9,d29,d6[1]
768 vmlal.u32 q10,d29,d7[0]
769 vmlal.u32 q11,d29,d7[1]
770 vst1.64 {q12},[r7,:128]!
771 vmlal.u32 q13,d28,d0[0]
772 vld1.64 {q12},[r6,:128]
773 vmlal.u32 q6,d28,d0[1]
774 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7]
775 vmlal.u32 q7,d28,d1[0]
777 addne r6,r6,#16 @ don't advance in last iteration
778 vmlal.u32 q8,d28,d1[1]
779 vmlal.u32 q9,d28,d2[0]
780 vmlal.u32 q10,d28,d2[1]
781 vmlal.u32 q11,d28,d3[0]
782 vmlal.u32 q12,d28,d3[1]
784 subeq r1,r1,r5,lsl#2 @ rewind
785 vmlal.u32 q13,d29,d4[0]
786 vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
787 vmlal.u32 q6,d29,d4[1]
788 vld1.32 {d0,d1,d2,d3},[r1]!
789 vmlal.u32 q7,d29,d5[0]
790 add r10,sp,#8 @ rewind
791 vmlal.u32 q8,d29,d5[1]
792 vmlal.u32 q9,d29,d6[0]
793 vmlal.u32 q10,d29,d6[1]
794 vmlal.u32 q11,d29,d7[0]
795 vst1.64 {q13},[r7,:128]!
796 vmlal.u32 q12,d29,d7[1]
800 vst1.64 {q6,q7},[r7,:256]!
801 veor q2,q2,q2 @ d4-d5
802 vst1.64 {q8,q9},[r7,:256]!
803 veor q3,q3,q3 @ d6-d7
804 vst1.64 {q10,q11},[r7,:256]!
805 vst1.64 {q12},[r7,:128]
808 vld1.64 {q6,q7},[r6,:256]!
809 vld1.64 {q8,q9},[r6,:256]!
810 vld1.64 {q10,q11},[r6,:256]!
811 vld1.64 {q12,q13},[r6,:256]!
814 subne r3,r3,r5,lsl#2 @ rewind
818 vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame
820 vst1.64 {q2,q3},[sp,:256]!
822 vst1.64 {q2,q3}, [sp,:256]!
824 vst1.64 {q2,q3}, [sp,:256]!
834 vld1.64 {q8,q9}, [r6, :256]!
836 vld1.64 {q10,q11}, [r6, :256]!
838 vld1.64 {q12,q13}, [r6, :256]!
843 vst1.32 {d12[0]}, [r7, :32]!
849 vst1.32 {d14[0]}, [r7, :32]!
855 vst1.32 {d16[0]}, [r7, :32]!
861 vst1.32 {d18[0]}, [r7, :32]!
867 vst1.32 {d20[0]}, [r7, :32]!
873 vst1.32 {d22[0]}, [r7, :32]!
879 vst1.32 {d24[0]}, [r7, :32]!
884 vld1.64 {q6,q7}, [r6, :256]!
886 vst1.32 {d26[0]}, [r7, :32]!
889 vst1.32 {d10[0]}, [r7, :32] @ top-most bit
890 sub r3,r3,r5,lsl#2 @ rewind r3
891 subs r1,sp,#0 @ clear carry flag
895 ldmia r1!, {r4,r5,r6,r7}
896 ldmia r3!, {r8,r9,r10,r11}
901 teq r1,r2 @ preserves carry
902 stmia r0!, {r8,r9,r10,r11}
905 ldr r10, [r1] @ load top-most bit
908 sub r11,r2,r11 @ this is num*4
911 sub r0,r0,r11 @ rewind r0
912 mov r3,r2 @ second 3/4th of frame
913 sbcs r10,r10,#0 @ result is carry flag
916 ldmia r1!, {r4,r5,r6,r7}
917 ldmia r0, {r8,r9,r10,r11}
920 vst1.64 {q0,q1}, [r3,:256]! @ wipe
924 vst1.64 {q0,q1}, [r3,:256]! @ wipe
927 ldmia r1, {r4,r5,r6,r7}
928 stmia r0!, {r8,r9,r10,r11}
930 ldmia r0, {r8,r9,r10,r11}
933 vst1.64 {q0,q1}, [r1,:256]! @ wipe
937 vst1.64 {q0,q1}, [r3,:256]! @ wipe
940 teq r1,r2 @ preserves carry
941 stmia r0!, {r8,r9,r10,r11}
942 bne .LNEON_copy_n_zap
945 vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
946 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
948 .size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
950 .byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
953 #if __ARM_MAX_ARCH__>=7
954 .comm OPENSSL_armcap_P,4,4