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


Reply via email to