mirror of https://github.com/xemu-project/xemu.git
target/ppc: Clean up do_fri
Let float64_round_to_int detect and silence snans. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20211119160502.17432-18-richard.henderson@linaro.org> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
1348d20b16
commit
a496352736
|
@ -644,25 +644,23 @@ FPU_FCFI(fcfidus, uint64_to_float32, 1)
|
||||||
static uint64_t do_fri(CPUPPCState *env, uint64_t arg,
|
static uint64_t do_fri(CPUPPCState *env, uint64_t arg,
|
||||||
FloatRoundMode rounding_mode)
|
FloatRoundMode rounding_mode)
|
||||||
{
|
{
|
||||||
CPU_DoubleU farg;
|
|
||||||
FloatRoundMode old_rounding_mode = get_float_rounding_mode(&env->fp_status);
|
FloatRoundMode old_rounding_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
int flags;
|
||||||
|
|
||||||
farg.ll = arg;
|
set_float_rounding_mode(rounding_mode, &env->fp_status);
|
||||||
|
arg = float64_round_to_int(arg, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_rounding_mode, &env->fp_status);
|
||||||
|
|
||||||
if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
|
flags = get_float_exception_flags(&env->fp_status);
|
||||||
/* sNaN round */
|
if (flags & float_flag_invalid_snan) {
|
||||||
float_invalid_op_vxsnan(env, GETPC());
|
float_invalid_op_vxsnan(env, GETPC());
|
||||||
farg.ll = arg | 0x0008000000000000ULL;
|
|
||||||
} else {
|
|
||||||
set_float_rounding_mode(rounding_mode, &env->fp_status);
|
|
||||||
farg.ll = float64_round_to_int(farg.d, &env->fp_status);
|
|
||||||
set_float_rounding_mode(old_rounding_mode, &env->fp_status);
|
|
||||||
|
|
||||||
/* fri* does not set FPSCR[XX] */
|
|
||||||
env->fp_status.float_exception_flags &= ~float_flag_inexact;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fri* does not set FPSCR[XX] */
|
||||||
|
set_float_exception_flags(flags & ~float_flag_inexact, &env->fp_status);
|
||||||
do_float_check_status(env, GETPC());
|
do_float_check_status(env, GETPC());
|
||||||
return farg.ll;
|
|
||||||
|
return arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t helper_frin(CPUPPCState *env, uint64_t arg)
|
uint64_t helper_frin(CPUPPCState *env, uint64_t arg)
|
||||||
|
|
Loading…
Reference in New Issue