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 <richard.henderson@linaro.org> Message-id: 20241206031428.78634-1-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
53ac794af6
commit
c66be53ce7
@ -408,23 +408,13 @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
|
|||||||
|
|
||||||
float32 HELPER(fcvtx_f64_to_f32)(float64 a, CPUARMState *env)
|
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;
|
float32 r;
|
||||||
float_status *fpst = &env->vfp.fp_status;
|
float_status *fpst = &env->vfp.fp_status;
|
||||||
float_status tstat = *fpst;
|
int old = get_float_rounding_mode(fpst);
|
||||||
int exflags;
|
|
||||||
|
|
||||||
set_float_rounding_mode(float_round_to_zero, &tstat);
|
set_float_rounding_mode(float_round_to_odd, fpst);
|
||||||
set_float_exception_flags(0, &tstat);
|
r = float64_to_float32(a, fpst);
|
||||||
r = float64_to_float32(a, &tstat);
|
set_float_rounding_mode(old, fpst);
|
||||||
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);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user