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