Commit e3b60f1d9e1f73e75095e885af66473400bef8aa

Authored by ths
1 parent 403f14ef

Fix computation for ceil, floor and round instructions.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3028 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 24 additions and 6 deletions
target-mips/op_helper.c
... ... @@ -783,6 +783,7 @@ FLOAT_OP(roundl, d)
783 783 {
784 784 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
785 785 DT2 = float64_round_to_int(FDT0, &env->fp_status);
  786 + DT2 = float64_to_int64(DT2, &env->fp_status);
786 787 RESTORE_ROUNDING_MODE;
787 788 update_fcr31();
788 789 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -791,7 +792,8 @@ FLOAT_OP(roundl, d)
791 792 FLOAT_OP(roundl, s)
792 793 {
793 794 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
794   - DT2 = float32_round_to_int(FST0, &env->fp_status);
  795 + WT2 = float32_round_to_int(FST0, &env->fp_status);
  796 + DT2 = float32_to_int64(WT2, &env->fp_status);
795 797 RESTORE_ROUNDING_MODE;
796 798 update_fcr31();
797 799 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -800,7 +802,10 @@ FLOAT_OP(roundl, s)
800 802 FLOAT_OP(roundw, d)
801 803 {
802 804 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
803   - WT2 = float64_round_to_int(FDT0, &env->fp_status);
  805 + DT2 = float64_round_to_int(FDT0, &env->fp_status);
  806 +// ???
  807 + env->fp_status.float_exception_flags &= ~float_flag_inexact;
  808 + WT2 = float64_to_int32(DT2, &env->fp_status);
804 809 RESTORE_ROUNDING_MODE;
805 810 update_fcr31();
806 811 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -810,6 +815,7 @@ FLOAT_OP(roundw, s)
810 815 {
811 816 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
812 817 WT2 = float32_round_to_int(FST0, &env->fp_status);
  818 + WT2 = float32_to_int32(WT2, &env->fp_status);
813 819 RESTORE_ROUNDING_MODE;
814 820 update_fcr31();
815 821 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -849,6 +855,7 @@ FLOAT_OP(ceill, d)
849 855 {
850 856 set_float_rounding_mode(float_round_up, &env->fp_status);
851 857 DT2 = float64_round_to_int(FDT0, &env->fp_status);
  858 + DT2 = float64_to_int64(DT2, &env->fp_status);
852 859 RESTORE_ROUNDING_MODE;
853 860 update_fcr31();
854 861 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -857,7 +864,8 @@ FLOAT_OP(ceill, d)
857 864 FLOAT_OP(ceill, s)
858 865 {
859 866 set_float_rounding_mode(float_round_up, &env->fp_status);
860   - DT2 = float32_round_to_int(FST0, &env->fp_status);
  867 + WT2 = float32_round_to_int(FST0, &env->fp_status);
  868 + DT2 = float32_to_int64(WT2, &env->fp_status);
861 869 RESTORE_ROUNDING_MODE;
862 870 update_fcr31();
863 871 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -866,7 +874,10 @@ FLOAT_OP(ceill, s)
866 874 FLOAT_OP(ceilw, d)
867 875 {
868 876 set_float_rounding_mode(float_round_up, &env->fp_status);
869   - WT2 = float64_round_to_int(FDT0, &env->fp_status);
  877 + DT2 = float64_round_to_int(FDT0, &env->fp_status);
  878 +// ???
  879 + env->fp_status.float_exception_flags &= ~float_flag_inexact;
  880 + WT2 = float64_to_int32(DT2, &env->fp_status);
870 881 RESTORE_ROUNDING_MODE;
871 882 update_fcr31();
872 883 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -876,6 +887,7 @@ FLOAT_OP(ceilw, s)
876 887 {
877 888 set_float_rounding_mode(float_round_up, &env->fp_status);
878 889 WT2 = float32_round_to_int(FST0, &env->fp_status);
  890 + WT2 = float32_to_int32(WT2, &env->fp_status);
879 891 RESTORE_ROUNDING_MODE;
880 892 update_fcr31();
881 893 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -886,6 +898,7 @@ FLOAT_OP(floorl, d)
886 898 {
887 899 set_float_rounding_mode(float_round_down, &env->fp_status);
888 900 DT2 = float64_round_to_int(FDT0, &env->fp_status);
  901 + DT2 = float64_to_int64(DT2, &env->fp_status);
889 902 RESTORE_ROUNDING_MODE;
890 903 update_fcr31();
891 904 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -894,7 +907,8 @@ FLOAT_OP(floorl, d)
894 907 FLOAT_OP(floorl, s)
895 908 {
896 909 set_float_rounding_mode(float_round_down, &env->fp_status);
897   - DT2 = float32_round_to_int(FST0, &env->fp_status);
  910 + WT2 = float32_round_to_int(FST0, &env->fp_status);
  911 + DT2 = float32_to_int64(WT2, &env->fp_status);
898 912 RESTORE_ROUNDING_MODE;
899 913 update_fcr31();
900 914 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -903,7 +917,10 @@ FLOAT_OP(floorl, s)
903 917 FLOAT_OP(floorw, d)
904 918 {
905 919 set_float_rounding_mode(float_round_down, &env->fp_status);
906   - WT2 = float64_round_to_int(FDT0, &env->fp_status);
  920 + DT2 = float64_round_to_int(FDT0, &env->fp_status);
  921 +// ???
  922 + env->fp_status.float_exception_flags &= ~float_flag_inexact;
  923 + WT2 = float64_to_int32(DT2, &env->fp_status);
907 924 RESTORE_ROUNDING_MODE;
908 925 update_fcr31();
909 926 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ... @@ -913,6 +930,7 @@ FLOAT_OP(floorw, s)
913 930 {
914 931 set_float_rounding_mode(float_round_down, &env->fp_status);
915 932 WT2 = float32_round_to_int(FST0, &env->fp_status);
  933 + WT2 = float32_to_int32(WT2, &env->fp_status);
916 934 RESTORE_ROUNDING_MODE;
917 935 update_fcr31();
918 936 if (GET_FP_CAUSE(env->fcr31) & (FP_OVERFLOW | FP_INVALID))
... ...