On Fri, 22 May 2026 at 23:10, Richard Henderson
<[email protected]> wrote:
>
> Initialize all of a float_status settings in one place.
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
>  target/arm/cpu.c | 45 +++++++++++++++++++++++++++------------------
>  1 file changed, 27 insertions(+), 18 deletions(-)
>
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index a13e6dae2a..4ea076fe4b 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -304,6 +304,22 @@ static void cp_reg_check_reset(gpointer key, gpointer 
> value,  gpointer opaque)
>      assert(oldvalue == newvalue);
>  }
>
> +static void arm_init_fp_status(float_status *s, bool ah, bool fz, bool dn)
> +{
> +    memset(s, 0, sizeof(*s));
> +
> +    if (ah) {
> +        arm_set_ah_fp_behaviours(s);
> +    } else {
> +        arm_set_default_fp_behaviours(s);
> +    }
> +    set_flush_to_zero(fz, s);
> +    set_flush_inputs_to_zero(fz, s);
> +    set_default_nan_mode(dn, s);
> +
> +    /* We want 0 for all other settings. */
> +}
> +
>  static void arm_cpu_reset_hold(Object *obj, ResetType type)
>  {
>      CPUState *cs = CPU(obj);
> @@ -626,24 +642,17 @@ static void arm_cpu_reset_hold(Object *obj, ResetType 
> type)
>          env->sau.ctrl = 0;
>      }
>
> -    set_flush_to_zero(1, &env->vfp.fp_status[FPST_STD]);
> -    set_flush_inputs_to_zero(1, &env->vfp.fp_status[FPST_STD]);
> -    set_default_nan_mode(1, &env->vfp.fp_status[FPST_STD]);
> -    set_default_nan_mode(1, &env->vfp.fp_status[FPST_STD_F16]);
> -    set_default_nan_mode(1, &env->vfp.fp_status[FPST_ZA]);
> -    set_default_nan_mode(1, &env->vfp.fp_status[FPST_ZA_F16]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_A32]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_A64]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_ZA]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_STD]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_A32_F16]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_A64_F16]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_ZA_F16]);
> -    arm_set_default_fp_behaviours(&env->vfp.fp_status[FPST_STD_F16]);
> -    arm_set_ah_fp_behaviours(&env->vfp.fp_status[FPST_AH]);
> -    set_flush_to_zero(1, &env->vfp.fp_status[FPST_AH]);
> -    set_flush_inputs_to_zero(1, &env->vfp.fp_status[FPST_AH]);
> -    arm_set_ah_fp_behaviours(&env->vfp.fp_status[FPST_AH_F16]);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_A32], false, false, false);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_A32_F16], false, false, 
> false);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_STD], false, true, true);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_STD_F16], false, false, 
> true);
> +
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_A64], false, false, false);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_A64_F16], false, false, 
> false);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_ZA], false, false, true);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_ZA_F16], false, false, true);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_AH], true, true, false);
> +    arm_init_fp_status(&env->vfp.fp_status[FPST_AH_F16], true, false, false);

I think the use of these boolean arguments leaves this looking
less readable than what we had here before, unfortunately
(now you have to go look at the function prototype to figure
out what "false, false, true" means, whereas direct calls
to "set_default_nan_mode()" or "set_flush_to_zero()" are
immediately clear about what they're setting.)

I think it would be clearer to have an arm_init_fp_status()
which doesn't take any arguments and which we use on every
fp_status[] element, before then calling the functions that
override the necessary settings from that default.

thanks
-- PMM

Reply via email to