Revision d7e4b87e target-ppc/op_helper.c

b/target-ppc/op_helper.c
700 700

  
701 701
#endif
702 702

  
703
static inline void do_fri (int rounding_mode)
704
{
705
    int curmode;
706

  
707
    curmode = env->fp_status.float_rounding_mode;
708
    set_float_rounding_mode(rounding_mode, &env->fp_status);
709
    FT0 = float64_round_to_int(FT0, &env->fp_status);
710
    set_float_rounding_mode(curmode, &env->fp_status);
711
}
712

  
713
void do_frin (void)
714
{
715
    do_fri(float_round_nearest_even);
716
}
717

  
718
void do_friz (void)
719
{
720
    do_fri(float_round_to_zero);
721
}
722

  
723
void do_frip (void)
724
{
725
    do_fri(float_round_up);
726
}
727

  
728
void do_frim (void)
729
{
730
    do_fri(float_round_down);
731
}
732

  
703 733
#if USE_PRECISE_EMULATION
704 734
void do_fmadd (void)
705 735
{
......
789 819
    FT0 = float64_sqrt(FT0, &env->fp_status);
790 820
}
791 821

  
822
void do_fre (void)
823
{
824
    union {
825
        double d;
826
        uint64_t i;
827
    } p;
828

  
829
    if (likely(isnormal(FT0))) {
830
        FT0 = float64_div(1.0, FT0, &env->fp_status);
831
    } else {
832
        p.d = FT0;
833
        if (p.i == 0x8000000000000000ULL) {
834
            p.i = 0xFFF0000000000000ULL;
835
        } else if (p.i == 0x0000000000000000ULL) {
836
            p.i = 0x7FF0000000000000ULL;
837
        } else if (isnan(FT0)) {
838
            p.i = 0x7FF8000000000000ULL;
839
        } else if (FT0 < 0.0) {
840
            p.i = 0x8000000000000000ULL;
841
        } else {
842
            p.i = 0x0000000000000000ULL;
843
        }
844
        FT0 = p.d;
845
    }
846
}
847

  
792 848
void do_fres (void)
793 849
{
794 850
    union {

Also available in: Unified diff