645 stuff:
646 /* stick the result in the destination */
647 if (opf & 0x80) { /* conversion */
648 if (opf & 0x10) { /* result is an int */
649 switch (info->res.type) {
650 case fex_llong:
651 info->res.val.i = (int) info->res.val.l;
652 break;
653
654 case fex_float:
655 info->res.val.i = (int) info->res.val.f;
656 break;
657
658 case fex_double:
659 info->res.val.i = (int) info->res.val.d;
660 break;
661
662 case fex_ldouble:
663 info->res.val.i = (int) info->res.val.q;
664 break;
665 }
666 *(int*)FPreg(rd) = info->res.val.i;
667 return;
668 }
669
670 switch (opf & 0xc) {
671 case 0: /* result is long long */
672 switch (info->res.type) {
673 case fex_int:
674 info->res.val.l = (long long) info->res.val.i;
675 break;
676
677 case fex_float:
678 info->res.val.l = (long long) info->res.val.f;
679 break;
680
681 case fex_double:
682 info->res.val.l = (long long) info->res.val.d;
683 break;
684
685 case fex_ldouble:
686 info->res.val.l = (long long) info->res.val.q;
687 break;
688 }
689 *(long long*)FPREG(rd) = info->res.val.l;
690 break;
691
692 case 0x4: /* result is float */
693 switch (info->res.type) {
694 case fex_int:
695 info->res.val.f = (float) info->res.val.i;
696 break;
697
698 case fex_llong:
699 info->res.val.f = (float) info->res.val.l;
700 break;
701
702 case fex_double:
703 info->res.val.f = (float) info->res.val.d;
704 break;
705
706 case fex_ldouble:
707 info->res.val.f = (float) info->res.val.q;
708 break;
709 }
710 *(float*)FPreg(rd) = info->res.val.f;
711 break;
712
713 case 0x8: /* result is double */
714 switch (info->res.type) {
715 case fex_int:
716 info->res.val.d = (double) info->res.val.i;
717 break;
718
719 case fex_llong:
720 info->res.val.d = (double) info->res.val.l;
721 break;
722
723 case fex_float:
724 info->res.val.d = (double) info->res.val.f;
725 break;
726
727 case fex_ldouble:
728 info->res.val.d = (double) info->res.val.q;
729 break;
730 }
731 *(double*)FPREG(rd) = info->res.val.d;
732 break;
733
734 case 0xc: /* result is long double */
735 switch (info->res.type) {
736 case fex_int:
737 info->res.val.q = (long double) info->res.val.i;
738 break;
739
740 case fex_llong:
741 info->res.val.q = (long double) info->res.val.l;
742 break;
743
744 case fex_float:
745 info->res.val.q = (long double) info->res.val.f;
746 break;
747
748 case fex_double:
749 info->res.val.q = (long double) info->res.val.d;
750 break;
751 }
752 *(long double*)FPREG(rd) = info->res.val.q;
753 break;
754 }
755 return;
756 }
757
758 if ((opf & 0xf0) == 0x60) { /* fsmuld, fdmulq */
759 switch (opf & 0xc0) {
760 case 0x8: /* result is double */
761 switch (info->res.type) {
762 case fex_int:
763 info->res.val.d = (double) info->res.val.i;
764 break;
765
766 case fex_llong:
767 info->res.val.d = (double) info->res.val.l;
768 break;
769
770 case fex_float:
771 info->res.val.d = (double) info->res.val.f;
772 break;
773
774 case fex_ldouble:
775 info->res.val.d = (double) info->res.val.q;
776 break;
777 }
778 *(double*)FPREG(rd) = info->res.val.d;
779 break;
780
781 case 0xc: /* result is long double */
782 switch (info->res.type) {
783 case fex_int:
784 info->res.val.q = (long double) info->res.val.i;
785 break;
786
787 case fex_llong:
788 info->res.val.q = (long double) info->res.val.l;
789 break;
790
791 case fex_float:
792 info->res.val.q = (long double) info->res.val.f;
793 break;
794
795 case fex_double:
796 info->res.val.q = (long double) info->res.val.d;
797 break;
798 }
799 *(long double*)FPREG(rd) = info->res.val.q;
800 break;
801 }
802 return;
803 }
804
805 switch (opf & 3) { /* other arithmetic op */
806 case 1: /* result is float */
807 switch (info->res.type) {
808 case fex_int:
809 info->res.val.f = (float) info->res.val.i;
810 break;
811
812 case fex_llong:
813 info->res.val.f = (float) info->res.val.l;
814 break;
815
816 case fex_double:
817 info->res.val.f = (float) info->res.val.d;
818 break;
819
820 case fex_ldouble:
821 info->res.val.f = (float) info->res.val.q;
822 break;
823 }
824 *(float*)FPreg(rd) = info->res.val.f;
825 break;
826
827 case 2: /* result is double */
828 switch (info->res.type) {
829 case fex_int:
830 info->res.val.d = (double) info->res.val.i;
831 break;
832
833 case fex_llong:
834 info->res.val.d = (double) info->res.val.l;
835 break;
836
837 case fex_float:
838 info->res.val.d = (double) info->res.val.f;
839 break;
840
841 case fex_ldouble:
842 info->res.val.d = (double) info->res.val.q;
843 break;
844 }
845 *(double*)FPREG(rd) = info->res.val.d;
846 break;
847
848 case 3: /* result is long double */
849 switch (info->res.type) {
850 case fex_int:
851 info->res.val.q = (long double) info->res.val.i;
852 break;
853
854 case fex_llong:
855 info->res.val.q = (long double) info->res.val.l;
856 break;
857
858 case fex_float:
859 info->res.val.q = (long double) info->res.val.f;
860 break;
861
862 case fex_double:
863 info->res.val.q = (long double) info->res.val.d;
864 break;
865 }
866 *(long double*)FPREG(rd) = info->res.val.q;
867 break;
868 }
869 }
870 #endif /* defined(__sparc) */
|
645 stuff:
646 /* stick the result in the destination */
647 if (opf & 0x80) { /* conversion */
648 if (opf & 0x10) { /* result is an int */
649 switch (info->res.type) {
650 case fex_llong:
651 info->res.val.i = (int) info->res.val.l;
652 break;
653
654 case fex_float:
655 info->res.val.i = (int) info->res.val.f;
656 break;
657
658 case fex_double:
659 info->res.val.i = (int) info->res.val.d;
660 break;
661
662 case fex_ldouble:
663 info->res.val.i = (int) info->res.val.q;
664 break;
665
666 default:
667 break;
668 }
669 *(int*)FPreg(rd) = info->res.val.i;
670 return;
671 }
672
673 switch (opf & 0xc) {
674 case 0: /* result is long long */
675 switch (info->res.type) {
676 case fex_int:
677 info->res.val.l = (long long) info->res.val.i;
678 break;
679
680 case fex_float:
681 info->res.val.l = (long long) info->res.val.f;
682 break;
683
684 case fex_double:
685 info->res.val.l = (long long) info->res.val.d;
686 break;
687
688 case fex_ldouble:
689 info->res.val.l = (long long) info->res.val.q;
690 break;
691
692 default:
693 break;
694 }
695 *(long long*)FPREG(rd) = info->res.val.l;
696 break;
697
698 case 0x4: /* result is float */
699 switch (info->res.type) {
700 case fex_int:
701 info->res.val.f = (float) info->res.val.i;
702 break;
703
704 case fex_llong:
705 info->res.val.f = (float) info->res.val.l;
706 break;
707
708 case fex_double:
709 info->res.val.f = (float) info->res.val.d;
710 break;
711
712 case fex_ldouble:
713 info->res.val.f = (float) info->res.val.q;
714 break;
715
716 default:
717 break;
718 }
719 *(float*)FPreg(rd) = info->res.val.f;
720 break;
721
722 case 0x8: /* result is double */
723 switch (info->res.type) {
724 case fex_int:
725 info->res.val.d = (double) info->res.val.i;
726 break;
727
728 case fex_llong:
729 info->res.val.d = (double) info->res.val.l;
730 break;
731
732 case fex_float:
733 info->res.val.d = (double) info->res.val.f;
734 break;
735
736 case fex_ldouble:
737 info->res.val.d = (double) info->res.val.q;
738 break;
739
740 default:
741 break;
742 }
743 *(double*)FPREG(rd) = info->res.val.d;
744 break;
745
746 case 0xc: /* result is long double */
747 switch (info->res.type) {
748 case fex_int:
749 info->res.val.q = (long double) info->res.val.i;
750 break;
751
752 case fex_llong:
753 info->res.val.q = (long double) info->res.val.l;
754 break;
755
756 case fex_float:
757 info->res.val.q = (long double) info->res.val.f;
758 break;
759
760 case fex_double:
761 info->res.val.q = (long double) info->res.val.d;
762 break;
763
764 default:
765 break;
766 }
767 *(long double*)FPREG(rd) = info->res.val.q;
768 break;
769 }
770 return;
771 }
772
773 if ((opf & 0xf0) == 0x60) { /* fsmuld, fdmulq */
774 switch (opf & 0xc0) {
775 case 0x8: /* result is double */
776 switch (info->res.type) {
777 case fex_int:
778 info->res.val.d = (double) info->res.val.i;
779 break;
780
781 case fex_llong:
782 info->res.val.d = (double) info->res.val.l;
783 break;
784
785 case fex_float:
786 info->res.val.d = (double) info->res.val.f;
787 break;
788
789 case fex_ldouble:
790 info->res.val.d = (double) info->res.val.q;
791 break;
792
793 default:
794 break;
795 }
796 *(double*)FPREG(rd) = info->res.val.d;
797 break;
798
799 case 0xc: /* result is long double */
800 switch (info->res.type) {
801 case fex_int:
802 info->res.val.q = (long double) info->res.val.i;
803 break;
804
805 case fex_llong:
806 info->res.val.q = (long double) info->res.val.l;
807 break;
808
809 case fex_float:
810 info->res.val.q = (long double) info->res.val.f;
811 break;
812
813 case fex_double:
814 info->res.val.q = (long double) info->res.val.d;
815 break;
816
817 default:
818 break;
819 }
820 *(long double*)FPREG(rd) = info->res.val.q;
821 break;
822 }
823 return;
824 }
825
826 switch (opf & 3) { /* other arithmetic op */
827 case 1: /* result is float */
828 switch (info->res.type) {
829 case fex_int:
830 info->res.val.f = (float) info->res.val.i;
831 break;
832
833 case fex_llong:
834 info->res.val.f = (float) info->res.val.l;
835 break;
836
837 case fex_double:
838 info->res.val.f = (float) info->res.val.d;
839 break;
840
841 case fex_ldouble:
842 info->res.val.f = (float) info->res.val.q;
843 break;
844
845 default:
846 break;
847 }
848 *(float*)FPreg(rd) = info->res.val.f;
849 break;
850
851 case 2: /* result is double */
852 switch (info->res.type) {
853 case fex_int:
854 info->res.val.d = (double) info->res.val.i;
855 break;
856
857 case fex_llong:
858 info->res.val.d = (double) info->res.val.l;
859 break;
860
861 case fex_float:
862 info->res.val.d = (double) info->res.val.f;
863 break;
864
865 case fex_ldouble:
866 info->res.val.d = (double) info->res.val.q;
867 break;
868
869 default:
870 break;
871 }
872 *(double*)FPREG(rd) = info->res.val.d;
873 break;
874
875 case 3: /* result is long double */
876 switch (info->res.type) {
877 case fex_int:
878 info->res.val.q = (long double) info->res.val.i;
879 break;
880
881 case fex_llong:
882 info->res.val.q = (long double) info->res.val.l;
883 break;
884
885 case fex_float:
886 info->res.val.q = (long double) info->res.val.f;
887 break;
888
889 case fex_double:
890 info->res.val.q = (long double) info->res.val.d;
891 break;
892
893 default:
894 break;
895 }
896 *(long double*)FPREG(rd) = info->res.val.q;
897 break;
898 }
899 }
900 #endif /* defined(__sparc) */
|