Revision 54454097 target-mips/op_helper.c

b/target-mips/op_helper.c
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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)

Also available in: Unified diff