On Tue, 21 Apr 2026 at 06:15, Richard Henderson
<[email protected]> wrote:
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
> target/arm/cpu-features.h | 5 +++++
> target/arm/tcg/helper-a64-defs.h | 7 +++++++
> target/arm/tcg/vec_internal.h | 7 +++++++
> target/arm/tcg/translate-a64.c | 14 +++++++++++++
> target/arm/tcg/vec_helper64.c | 35 ++++++++++++++++++++++++++++++++
> target/arm/tcg/a64.decode | 5 +++++
> 6 files changed, 73 insertions(+)
> +#define DO_FAMINMAX(NAME, TYPE, FN) \
> +TYPE TYPE##_##NAME(TYPE a, TYPE b, float_status *s) \
> +{ \
> + bool save_fz = get_flush_to_zero(s); \
> + bool save_fiz = get_flush_inputs_to_zero(s); \
> + int new_flags, save_flags = get_float_exception_flags(s); \
> + \
> + set_flush_to_zero(0, s); \
> + set_flush_inputs_to_zero(0, s); \
> + TYPE r = TYPE##_##FN(TYPE##_abs(a), TYPE##_abs(b), s); \
> + \
> + set_flush_to_zero(save_fz, s); \
> + set_flush_inputs_to_zero(save_fiz, s); \
> + new_flags = get_float_exception_flags(s); \
> + new_flags = (save_flags & float_flag_input_denormal_used) \
> + | (new_flags & ~float_flag_input_denormal_used); \
> + set_float_exception_flags(new_flags, s); \
> + \
> + return r; \
> +}
I don't think this has the right behaviour for NaN inputs.
We don't special-case NaNs in this function, and we pass
our inputs to the floatN_abs() functions, which also don't
special-case NaNs, they just flip the sign bit. So if the
input is a NaN with the sign bit set, the max/min function
will propagate a sign-flipped NaN to the output, rather
than correctly propagating the input NaN untouched.
-- PMM