From: Richard Henderson Date: Fri, 6 Dec 2024 03:14:28 +0000 (-0600) Subject: target/arm: Use float_round_to_odd in helper_fcvtx_f64_to_f32 X-Git-Tag: v10.0.0-rc0~119^2~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c66be53ce7460d061cbd9061a85ecfb219515901;p=thirdparty%2Fqemu.git target/arm: Use float_round_to_odd in helper_fcvtx_f64_to_f32 Softfloat has native support for round-to-odd. Use it. Signed-off-by: Richard Henderson Message-id: 20241206031428.78634-1-richard.henderson@linaro.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c index 28de7468cd1..fb6fe0fcaa9 100644 --- a/target/arm/tcg/helper-a64.c +++ b/target/arm/tcg/helper-a64.c @@ -408,23 +408,13 @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp) float32 HELPER(fcvtx_f64_to_f32)(float64 a, CPUARMState *env) { - /* Von Neumann rounding is implemented by using round-to-zero - * and then setting the LSB of the result if Inexact was raised. - */ float32 r; float_status *fpst = &env->vfp.fp_status; - float_status tstat = *fpst; - int exflags; - - set_float_rounding_mode(float_round_to_zero, &tstat); - set_float_exception_flags(0, &tstat); - r = float64_to_float32(a, &tstat); - exflags = get_float_exception_flags(&tstat); - if (exflags & float_flag_inexact) { - r = make_float32(float32_val(r) | 1); - } - exflags |= get_float_exception_flags(fpst); - set_float_exception_flags(exflags, fpst); + int old = get_float_rounding_mode(fpst); + + set_float_rounding_mode(float_round_to_odd, fpst); + r = float64_to_float32(a, fpst); + set_float_rounding_mode(old, fpst); return r; }