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