diff options
Diffstat (limited to 'src/lib/libcrypto/bn/asm/mips3.s')
-rw-r--r-- | src/lib/libcrypto/bn/asm/mips3.s | 143 |
1 files changed, 73 insertions, 70 deletions
diff --git a/src/lib/libcrypto/bn/asm/mips3.s b/src/lib/libcrypto/bn/asm/mips3.s index 191345d920..2df4dcd4b0 100644 --- a/src/lib/libcrypto/bn/asm/mips3.s +++ b/src/lib/libcrypto/bn/asm/mips3.s | |||
@@ -395,32 +395,32 @@ LEAF(bn_add_words) | |||
395 | 395 | ||
396 | .L_bn_add_words_loop: | 396 | .L_bn_add_words_loop: |
397 | ld ta0,0(a2) | 397 | ld ta0,0(a2) |
398 | subu a3,4 | ||
398 | ld t1,8(a1) | 399 | ld t1,8(a1) |
399 | ld ta1,8(a2) | 400 | and AT,a3,MINUS4 |
400 | ld t2,16(a1) | 401 | ld t2,16(a1) |
401 | ld ta2,16(a2) | 402 | PTR_ADD a2,32 |
402 | ld t3,24(a1) | 403 | ld t3,24(a1) |
403 | ld ta3,24(a2) | 404 | PTR_ADD a0,32 |
405 | ld ta1,-24(a2) | ||
406 | PTR_ADD a1,32 | ||
407 | ld ta2,-16(a2) | ||
408 | ld ta3,-8(a2) | ||
404 | daddu ta0,t0 | 409 | daddu ta0,t0 |
405 | subu a3,4 | ||
406 | sltu t8,ta0,t0 | 410 | sltu t8,ta0,t0 |
407 | daddu t0,ta0,v0 | 411 | daddu t0,ta0,v0 |
408 | PTR_ADD a0,32 | ||
409 | sltu v0,t0,ta0 | 412 | sltu v0,t0,ta0 |
410 | sd t0,-32(a0) | 413 | sd t0,-32(a0) |
411 | daddu v0,t8 | 414 | daddu v0,t8 |
412 | 415 | ||
413 | daddu ta1,t1 | 416 | daddu ta1,t1 |
414 | PTR_ADD a1,32 | ||
415 | sltu t9,ta1,t1 | 417 | sltu t9,ta1,t1 |
416 | daddu t1,ta1,v0 | 418 | daddu t1,ta1,v0 |
417 | PTR_ADD a2,32 | ||
418 | sltu v0,t1,ta1 | 419 | sltu v0,t1,ta1 |
419 | sd t1,-24(a0) | 420 | sd t1,-24(a0) |
420 | daddu v0,t9 | 421 | daddu v0,t9 |
421 | 422 | ||
422 | daddu ta2,t2 | 423 | daddu ta2,t2 |
423 | and AT,a3,MINUS4 | ||
424 | sltu t8,ta2,t2 | 424 | sltu t8,ta2,t2 |
425 | daddu t2,ta2,v0 | 425 | daddu t2,ta2,v0 |
426 | sltu v0,t2,ta2 | 426 | sltu v0,t2,ta2 |
@@ -495,25 +495,26 @@ LEAF(bn_sub_words) | |||
495 | 495 | ||
496 | .L_bn_sub_words_loop: | 496 | .L_bn_sub_words_loop: |
497 | ld ta0,0(a2) | 497 | ld ta0,0(a2) |
498 | subu a3,4 | ||
498 | ld t1,8(a1) | 499 | ld t1,8(a1) |
499 | ld ta1,8(a2) | 500 | and AT,a3,MINUS4 |
500 | ld t2,16(a1) | 501 | ld t2,16(a1) |
501 | ld ta2,16(a2) | 502 | PTR_ADD a2,32 |
502 | ld t3,24(a1) | 503 | ld t3,24(a1) |
503 | ld ta3,24(a2) | 504 | PTR_ADD a0,32 |
505 | ld ta1,-24(a2) | ||
506 | PTR_ADD a1,32 | ||
507 | ld ta2,-16(a2) | ||
508 | ld ta3,-8(a2) | ||
504 | sltu t8,t0,ta0 | 509 | sltu t8,t0,ta0 |
505 | dsubu t0,ta0 | 510 | dsubu t0,ta0 |
506 | subu a3,4 | ||
507 | dsubu ta0,t0,v0 | 511 | dsubu ta0,t0,v0 |
508 | and AT,a3,MINUS4 | 512 | sd ta0,-32(a0) |
509 | sd ta0,0(a0) | ||
510 | MOVNZ (t0,v0,t8) | 513 | MOVNZ (t0,v0,t8) |
511 | 514 | ||
512 | sltu t9,t1,ta1 | 515 | sltu t9,t1,ta1 |
513 | dsubu t1,ta1 | 516 | dsubu t1,ta1 |
514 | PTR_ADD a0,32 | ||
515 | dsubu ta1,t1,v0 | 517 | dsubu ta1,t1,v0 |
516 | PTR_ADD a1,32 | ||
517 | sd ta1,-24(a0) | 518 | sd ta1,-24(a0) |
518 | MOVNZ (t1,v0,t9) | 519 | MOVNZ (t1,v0,t9) |
519 | 520 | ||
@@ -521,7 +522,6 @@ LEAF(bn_sub_words) | |||
521 | sltu t8,t2,ta2 | 522 | sltu t8,t2,ta2 |
522 | dsubu t2,ta2 | 523 | dsubu t2,ta2 |
523 | dsubu ta2,t2,v0 | 524 | dsubu ta2,t2,v0 |
524 | PTR_ADD a2,32 | ||
525 | sd ta2,-16(a0) | 525 | sd ta2,-16(a0) |
526 | MOVNZ (t2,v0,t8) | 526 | MOVNZ (t2,v0,t8) |
527 | 527 | ||
@@ -574,6 +574,51 @@ END(bn_sub_words) | |||
574 | 574 | ||
575 | #undef MINUS4 | 575 | #undef MINUS4 |
576 | 576 | ||
577 | .align 5 | ||
578 | LEAF(bn_div_3_words) | ||
579 | .set reorder | ||
580 | move a3,a0 /* we know that bn_div_words doesn't | ||
581 | * touch a3, ta2, ta3 and preserves a2 | ||
582 | * so that we can save two arguments | ||
583 | * and return address in registers | ||
584 | * instead of stack:-) | ||
585 | */ | ||
586 | ld a0,(a3) | ||
587 | move ta2,a1 | ||
588 | ld a1,-8(a3) | ||
589 | move ta3,ra | ||
590 | move v1,zero | ||
591 | li v0,-1 | ||
592 | beq a0,a2,.L_bn_div_3_words_skip_div | ||
593 | bal bn_div_words | ||
594 | move ra,ta3 | ||
595 | .L_bn_div_3_words_skip_div: | ||
596 | dmultu ta2,v0 | ||
597 | ld t2,-16(a3) | ||
598 | move ta0,zero | ||
599 | mfhi t1 | ||
600 | mflo t0 | ||
601 | sltu t8,t1,v1 | ||
602 | .L_bn_div_3_words_inner_loop: | ||
603 | bnez t8,.L_bn_div_3_words_inner_loop_done | ||
604 | sgeu AT,t2,t0 | ||
605 | seq t9,t1,v1 | ||
606 | and AT,t9 | ||
607 | sltu t3,t0,ta2 | ||
608 | daddu v1,a2 | ||
609 | dsubu t1,t3 | ||
610 | dsubu t0,ta2 | ||
611 | sltu t8,t1,v1 | ||
612 | sltu ta0,v1,a2 | ||
613 | or t8,ta0 | ||
614 | .set noreorder | ||
615 | beqzl AT,.L_bn_div_3_words_inner_loop | ||
616 | dsubu v0,1 | ||
617 | .set reorder | ||
618 | .L_bn_div_3_words_inner_loop_done: | ||
619 | jr ra | ||
620 | END(bn_div_3_words) | ||
621 | |||
577 | .align 5 | 622 | .align 5 |
578 | LEAF(bn_div_words) | 623 | LEAF(bn_div_words) |
579 | .set noreorder | 624 | .set noreorder |
@@ -633,16 +678,16 @@ LEAF(bn_div_words) | |||
633 | seq t8,HH,t1 | 678 | seq t8,HH,t1 |
634 | sltu AT,HH,t1 | 679 | sltu AT,HH,t1 |
635 | and t2,t8 | 680 | and t2,t8 |
681 | sltu v0,t0,a2 | ||
636 | or AT,t2 | 682 | or AT,t2 |
637 | .set noreorder | 683 | .set noreorder |
638 | beqz AT,.L_bn_div_words_inner_loop1_done | 684 | beqz AT,.L_bn_div_words_inner_loop1_done |
639 | sltu t2,t0,a2 | 685 | dsubu t1,v0 |
640 | .set reorder | ||
641 | dsubu QT,1 | ||
642 | dsubu t0,a2 | 686 | dsubu t0,a2 |
643 | dsubu t1,t2 | ||
644 | b .L_bn_div_words_inner_loop1 | 687 | b .L_bn_div_words_inner_loop1 |
645 | .L_bn_div_words_inner_loop1_done: | 688 | dsubu QT,1 |
689 | .set reorder | ||
690 | .L_bn_div_words_inner_loop1_done: | ||
646 | 691 | ||
647 | dsll a1,32 | 692 | dsll a1,32 |
648 | dsubu a0,t3,t0 | 693 | dsubu a0,t3,t0 |
@@ -655,6 +700,7 @@ LEAF(bn_div_words) | |||
655 | ddivu zero,a0,DH | 700 | ddivu zero,a0,DH |
656 | mflo QT | 701 | mflo QT |
657 | .L_bn_div_words_skip_div2: | 702 | .L_bn_div_words_skip_div2: |
703 | #undef DH | ||
658 | dmultu a2,QT | 704 | dmultu a2,QT |
659 | dsll t3,a0,32 | 705 | dsll t3,a0,32 |
660 | dsrl AT,a1,32 | 706 | dsrl AT,a1,32 |
@@ -666,69 +712,26 @@ LEAF(bn_div_words) | |||
666 | seq t8,HH,t1 | 712 | seq t8,HH,t1 |
667 | sltu AT,HH,t1 | 713 | sltu AT,HH,t1 |
668 | and t2,t8 | 714 | and t2,t8 |
715 | sltu v1,t0,a2 | ||
669 | or AT,t2 | 716 | or AT,t2 |
670 | .set noreorder | 717 | .set noreorder |
671 | beqz AT,.L_bn_div_words_inner_loop2_done | 718 | beqz AT,.L_bn_div_words_inner_loop2_done |
672 | sltu t2,t0,a2 | 719 | dsubu t1,v1 |
673 | .set reorder | ||
674 | dsubu QT,1 | ||
675 | dsubu t0,a2 | 720 | dsubu t0,a2 |
676 | dsubu t1,t2 | ||
677 | b .L_bn_div_words_inner_loop2 | 721 | b .L_bn_div_words_inner_loop2 |
722 | dsubu QT,1 | ||
723 | .set reorder | ||
678 | .L_bn_div_words_inner_loop2_done: | 724 | .L_bn_div_words_inner_loop2_done: |
725 | #undef HH | ||
679 | 726 | ||
680 | dsubu a0,t3,t0 | 727 | dsubu a0,t3,t0 |
681 | or v0,QT | 728 | or v0,QT |
682 | dsrl v1,a0,t9 /* v1 contains remainder if anybody wants it */ | 729 | dsrl v1,a0,t9 /* v1 contains remainder if anybody wants it */ |
683 | dsrl a2,t9 /* restore a2 */ | 730 | dsrl a2,t9 /* restore a2 */ |
684 | jr ra | 731 | jr ra |
685 | #undef HH | ||
686 | #undef DH | ||
687 | #undef QT | 732 | #undef QT |
688 | END(bn_div_words) | 733 | END(bn_div_words) |
689 | 734 | ||
690 | .align 5 | ||
691 | LEAF(bn_div_3_words) | ||
692 | .set reorder | ||
693 | move a3,a0 /* we know that bn_div_words doesn't | ||
694 | * touch a3, ta2, ta3 and preserves a2 | ||
695 | * so that we can save two arguments | ||
696 | * and return address in registers | ||
697 | * instead of stack:-) | ||
698 | */ | ||
699 | ld a0,(a3) | ||
700 | move ta2,a2 | ||
701 | move a2,a1 | ||
702 | ld a1,-8(a3) | ||
703 | move ta3,ra | ||
704 | move v1,zero | ||
705 | li v0,-1 | ||
706 | beq a0,a2,.L_bn_div_3_words_skip_div | ||
707 | jal bn_div_words | ||
708 | move ra,ta3 | ||
709 | .L_bn_div_3_words_skip_div: | ||
710 | dmultu ta2,v0 | ||
711 | ld t2,-16(a3) | ||
712 | mflo t0 | ||
713 | mfhi t1 | ||
714 | .L_bn_div_3_words_inner_loop: | ||
715 | sgeu AT,t2,t0 | ||
716 | seq t9,t1,v1 | ||
717 | sltu t8,t1,v1 | ||
718 | and AT,t9 | ||
719 | or AT,t8 | ||
720 | bnez AT,.L_bn_div_3_words_inner_loop_done | ||
721 | daddu v1,a2 | ||
722 | sltu t3,t0,ta2 | ||
723 | sltu AT,v1,a2 | ||
724 | dsubu v0,1 | ||
725 | dsubu t0,ta2 | ||
726 | dsubu t1,t3 | ||
727 | beqz AT,.L_bn_div_3_words_inner_loop | ||
728 | .L_bn_div_3_words_inner_loop_done: | ||
729 | jr ra | ||
730 | END(bn_div_3_words) | ||
731 | |||
732 | #define a_0 t0 | 735 | #define a_0 t0 |
733 | #define a_1 t1 | 736 | #define a_1 t1 |
734 | #define a_2 t2 | 737 | #define a_2 t2 |