Commit 544540979cb8ebb4b4ca71bd8df89e5d8e7f8600
1 parent
dee96f6c
Less magic constants.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3266 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
29 additions
and
25 deletions
target-mips/op_helper.c
| ... | ... | @@ -613,6 +613,10 @@ void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) |
| 613 | 613 | #define FLOAT_ONE64 (0x3ffULL << 52) |
| 614 | 614 | #define FLOAT_TWO32 (1 << 30) |
| 615 | 615 | #define FLOAT_TWO64 (1ULL << 62) |
| 616 | +#define FLOAT_QNAN32 0x7fbfffff | |
| 617 | +#define FLOAT_QNAN64 0x7ff7ffffffffffffULL | |
| 618 | +#define FLOAT_SNAN32 0x7fffffff | |
| 619 | +#define FLOAT_SNAN64 0x7fffffffffffffffULL | |
| 616 | 620 | |
| 617 | 621 | /* convert MIPS rounding mode in FCR31 to IEEE library */ |
| 618 | 622 | unsigned int ieee_rm[] = { |
| ... | ... | @@ -736,7 +740,7 @@ FLOAT_OP(cvtl, d) |
| 736 | 740 | DT2 = float64_to_int64(FDT0, &env->fpu->fp_status); |
| 737 | 741 | update_fcr31(); |
| 738 | 742 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 739 | - DT2 = 0x7fffffffffffffffULL; | |
| 743 | + DT2 = FLOAT_SNAN64; | |
| 740 | 744 | } |
| 741 | 745 | FLOAT_OP(cvtl, s) |
| 742 | 746 | { |
| ... | ... | @@ -744,7 +748,7 @@ FLOAT_OP(cvtl, s) |
| 744 | 748 | DT2 = float32_to_int64(FST0, &env->fpu->fp_status); |
| 745 | 749 | update_fcr31(); |
| 746 | 750 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 747 | - DT2 = 0x7fffffffffffffffULL; | |
| 751 | + DT2 = FLOAT_SNAN64; | |
| 748 | 752 | } |
| 749 | 753 | |
| 750 | 754 | FLOAT_OP(cvtps, pw) |
| ... | ... | @@ -761,7 +765,7 @@ FLOAT_OP(cvtpw, ps) |
| 761 | 765 | WTH2 = float32_to_int32(FSTH0, &env->fpu->fp_status); |
| 762 | 766 | update_fcr31(); |
| 763 | 767 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 764 | - WT2 = 0x7fffffff; | |
| 768 | + WT2 = FLOAT_SNAN32; | |
| 765 | 769 | } |
| 766 | 770 | FLOAT_OP(cvts, d) |
| 767 | 771 | { |
| ... | ... | @@ -799,7 +803,7 @@ FLOAT_OP(cvtw, s) |
| 799 | 803 | WT2 = float32_to_int32(FST0, &env->fpu->fp_status); |
| 800 | 804 | update_fcr31(); |
| 801 | 805 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 802 | - WT2 = 0x7fffffff; | |
| 806 | + WT2 = FLOAT_SNAN32; | |
| 803 | 807 | } |
| 804 | 808 | FLOAT_OP(cvtw, d) |
| 805 | 809 | { |
| ... | ... | @@ -807,7 +811,7 @@ FLOAT_OP(cvtw, d) |
| 807 | 811 | WT2 = float64_to_int32(FDT0, &env->fpu->fp_status); |
| 808 | 812 | update_fcr31(); |
| 809 | 813 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 810 | - WT2 = 0x7fffffff; | |
| 814 | + WT2 = FLOAT_SNAN32; | |
| 811 | 815 | } |
| 812 | 816 | |
| 813 | 817 | FLOAT_OP(roundl, d) |
| ... | ... | @@ -817,7 +821,7 @@ FLOAT_OP(roundl, d) |
| 817 | 821 | RESTORE_ROUNDING_MODE; |
| 818 | 822 | update_fcr31(); |
| 819 | 823 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 820 | - DT2 = 0x7fffffffffffffffULL; | |
| 824 | + DT2 = FLOAT_SNAN64; | |
| 821 | 825 | } |
| 822 | 826 | FLOAT_OP(roundl, s) |
| 823 | 827 | { |
| ... | ... | @@ -826,7 +830,7 @@ FLOAT_OP(roundl, s) |
| 826 | 830 | RESTORE_ROUNDING_MODE; |
| 827 | 831 | update_fcr31(); |
| 828 | 832 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 829 | - DT2 = 0x7fffffffffffffffULL; | |
| 833 | + DT2 = FLOAT_SNAN64; | |
| 830 | 834 | } |
| 831 | 835 | FLOAT_OP(roundw, d) |
| 832 | 836 | { |
| ... | ... | @@ -835,7 +839,7 @@ FLOAT_OP(roundw, d) |
| 835 | 839 | RESTORE_ROUNDING_MODE; |
| 836 | 840 | update_fcr31(); |
| 837 | 841 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 838 | - WT2 = 0x7fffffff; | |
| 842 | + WT2 = FLOAT_SNAN32; | |
| 839 | 843 | } |
| 840 | 844 | FLOAT_OP(roundw, s) |
| 841 | 845 | { |
| ... | ... | @@ -844,7 +848,7 @@ FLOAT_OP(roundw, s) |
| 844 | 848 | RESTORE_ROUNDING_MODE; |
| 845 | 849 | update_fcr31(); |
| 846 | 850 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 847 | - WT2 = 0x7fffffff; | |
| 851 | + WT2 = FLOAT_SNAN32; | |
| 848 | 852 | } |
| 849 | 853 | |
| 850 | 854 | FLOAT_OP(truncl, d) |
| ... | ... | @@ -852,28 +856,28 @@ FLOAT_OP(truncl, d) |
| 852 | 856 | DT2 = float64_to_int64_round_to_zero(FDT0, &env->fpu->fp_status); |
| 853 | 857 | update_fcr31(); |
| 854 | 858 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 855 | - DT2 = 0x7fffffffffffffffULL; | |
| 859 | + DT2 = FLOAT_SNAN64; | |
| 856 | 860 | } |
| 857 | 861 | FLOAT_OP(truncl, s) |
| 858 | 862 | { |
| 859 | 863 | DT2 = float32_to_int64_round_to_zero(FST0, &env->fpu->fp_status); |
| 860 | 864 | update_fcr31(); |
| 861 | 865 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 862 | - DT2 = 0x7fffffffffffffffULL; | |
| 866 | + DT2 = FLOAT_SNAN64; | |
| 863 | 867 | } |
| 864 | 868 | FLOAT_OP(truncw, d) |
| 865 | 869 | { |
| 866 | 870 | WT2 = float64_to_int32_round_to_zero(FDT0, &env->fpu->fp_status); |
| 867 | 871 | update_fcr31(); |
| 868 | 872 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 869 | - WT2 = 0x7fffffff; | |
| 873 | + WT2 = FLOAT_SNAN32; | |
| 870 | 874 | } |
| 871 | 875 | FLOAT_OP(truncw, s) |
| 872 | 876 | { |
| 873 | 877 | WT2 = float32_to_int32_round_to_zero(FST0, &env->fpu->fp_status); |
| 874 | 878 | update_fcr31(); |
| 875 | 879 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 876 | - WT2 = 0x7fffffff; | |
| 880 | + WT2 = FLOAT_SNAN32; | |
| 877 | 881 | } |
| 878 | 882 | |
| 879 | 883 | FLOAT_OP(ceill, d) |
| ... | ... | @@ -883,7 +887,7 @@ FLOAT_OP(ceill, d) |
| 883 | 887 | RESTORE_ROUNDING_MODE; |
| 884 | 888 | update_fcr31(); |
| 885 | 889 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 886 | - DT2 = 0x7fffffffffffffffULL; | |
| 890 | + DT2 = FLOAT_SNAN64; | |
| 887 | 891 | } |
| 888 | 892 | FLOAT_OP(ceill, s) |
| 889 | 893 | { |
| ... | ... | @@ -892,7 +896,7 @@ FLOAT_OP(ceill, s) |
| 892 | 896 | RESTORE_ROUNDING_MODE; |
| 893 | 897 | update_fcr31(); |
| 894 | 898 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 895 | - DT2 = 0x7fffffffffffffffULL; | |
| 899 | + DT2 = FLOAT_SNAN64; | |
| 896 | 900 | } |
| 897 | 901 | FLOAT_OP(ceilw, d) |
| 898 | 902 | { |
| ... | ... | @@ -901,7 +905,7 @@ FLOAT_OP(ceilw, d) |
| 901 | 905 | RESTORE_ROUNDING_MODE; |
| 902 | 906 | update_fcr31(); |
| 903 | 907 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 904 | - WT2 = 0x7fffffff; | |
| 908 | + WT2 = FLOAT_SNAN32; | |
| 905 | 909 | } |
| 906 | 910 | FLOAT_OP(ceilw, s) |
| 907 | 911 | { |
| ... | ... | @@ -910,7 +914,7 @@ FLOAT_OP(ceilw, s) |
| 910 | 914 | RESTORE_ROUNDING_MODE; |
| 911 | 915 | update_fcr31(); |
| 912 | 916 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 913 | - WT2 = 0x7fffffff; | |
| 917 | + WT2 = FLOAT_SNAN32; | |
| 914 | 918 | } |
| 915 | 919 | |
| 916 | 920 | FLOAT_OP(floorl, d) |
| ... | ... | @@ -920,7 +924,7 @@ FLOAT_OP(floorl, d) |
| 920 | 924 | RESTORE_ROUNDING_MODE; |
| 921 | 925 | update_fcr31(); |
| 922 | 926 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 923 | - DT2 = 0x7fffffffffffffffULL; | |
| 927 | + DT2 = FLOAT_SNAN64; | |
| 924 | 928 | } |
| 925 | 929 | FLOAT_OP(floorl, s) |
| 926 | 930 | { |
| ... | ... | @@ -929,7 +933,7 @@ FLOAT_OP(floorl, s) |
| 929 | 933 | RESTORE_ROUNDING_MODE; |
| 930 | 934 | update_fcr31(); |
| 931 | 935 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 932 | - DT2 = 0x7fffffffffffffffULL; | |
| 936 | + DT2 = FLOAT_SNAN64; | |
| 933 | 937 | } |
| 934 | 938 | FLOAT_OP(floorw, d) |
| 935 | 939 | { |
| ... | ... | @@ -938,7 +942,7 @@ FLOAT_OP(floorw, d) |
| 938 | 942 | RESTORE_ROUNDING_MODE; |
| 939 | 943 | update_fcr31(); |
| 940 | 944 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 941 | - WT2 = 0x7fffffff; | |
| 945 | + WT2 = FLOAT_SNAN32; | |
| 942 | 946 | } |
| 943 | 947 | FLOAT_OP(floorw, s) |
| 944 | 948 | { |
| ... | ... | @@ -947,7 +951,7 @@ FLOAT_OP(floorw, s) |
| 947 | 951 | RESTORE_ROUNDING_MODE; |
| 948 | 952 | update_fcr31(); |
| 949 | 953 | if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) |
| 950 | - WT2 = 0x7fffffff; | |
| 954 | + WT2 = FLOAT_SNAN32; | |
| 951 | 955 | } |
| 952 | 956 | |
| 953 | 957 | /* MIPS specific unary operations */ |
| ... | ... | @@ -1031,7 +1035,7 @@ FLOAT_OP(name, d) \ |
| 1031 | 1035 | FDT2 = float64_ ## name (FDT0, FDT1, &env->fpu->fp_status); \ |
| 1032 | 1036 | update_fcr31(); \ |
| 1033 | 1037 | if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ |
| 1034 | - FDT2 = 0x7ff7ffffffffffffULL; \ | |
| 1038 | + FDT2 = FLOAT_QNAN64; \ | |
| 1035 | 1039 | } \ |
| 1036 | 1040 | FLOAT_OP(name, s) \ |
| 1037 | 1041 | { \ |
| ... | ... | @@ -1039,7 +1043,7 @@ FLOAT_OP(name, s) \ |
| 1039 | 1043 | FST2 = float32_ ## name (FST0, FST1, &env->fpu->fp_status); \ |
| 1040 | 1044 | update_fcr31(); \ |
| 1041 | 1045 | if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ |
| 1042 | - FST2 = 0x7fbfffff; \ | |
| 1046 | + FST2 = FLOAT_QNAN32; \ | |
| 1043 | 1047 | } \ |
| 1044 | 1048 | FLOAT_OP(name, ps) \ |
| 1045 | 1049 | { \ |
| ... | ... | @@ -1048,8 +1052,8 @@ FLOAT_OP(name, ps) \ |
| 1048 | 1052 | FSTH2 = float32_ ## name (FSTH0, FSTH1, &env->fpu->fp_status); \ |
| 1049 | 1053 | update_fcr31(); \ |
| 1050 | 1054 | if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) { \ |
| 1051 | - FST2 = 0x7fbfffff; \ | |
| 1052 | - FSTH2 = 0x7fbfffff; \ | |
| 1055 | + FST2 = FLOAT_QNAN32; \ | |
| 1056 | + FSTH2 = FLOAT_QNAN32; \ | |
| 1053 | 1057 | } \ |
| 1054 | 1058 | } |
| 1055 | 1059 | FLOAT_BINOP(add) | ... | ... |