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);
#ifndef CONFIG_USER_ONLY
if (kvm_enabled()) {
--
2.43.0