diff mbox series

target/arm: Use float_round_to_odd in helper_fcvtx_f64_to_f32

Message ID 20241206031428.78634-1-richard.henderson@linaro.org (mailing list archive)
State New
Headers show
Series target/arm: Use float_round_to_odd in helper_fcvtx_f64_to_f32 | expand

Commit Message

Richard Henderson Dec. 6, 2024, 3:14 a.m. UTC
Softfloat has native support for round-to-odd.  Use it.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/arm/tcg/helper-a64.c | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)

Comments

Peter Maydell Dec. 13, 2024, 3:33 p.m. UTC | #1
On Fri, 6 Dec 2024 at 03:14, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Softfloat has native support for round-to-odd.  Use it.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---




Applied to target-arm.next, thanks.

-- PMM
diff mbox series

Patch

diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
index 1daf3f27c0..ff48bac1a8 100644
--- a/target/arm/tcg/helper-a64.c
+++ b/target/arm/tcg/helper-a64.c
@@ -386,23 +386,13 @@  float64 HELPER(frecpx_f64)(float64 a, float_status *fpst)
 
 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;
+    int old = get_float_rounding_mode(fpst);
 
-    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);
+    set_float_rounding_mode(float_round_to_odd, fpst);
+    r = float64_to_float32(a, fpst);
+    set_float_rounding_mode(old, fpst);
     return r;
 }