target/mips: Set Float3NaNPropRule explicitly

Set the Float3NaNPropRule explicitly for Arm, and remove the
ifdef from pickNaNMulAdd().

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20241202131347.498124-23-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2024-12-11 15:30:58 +00:00
parent 49866dcb59
commit 3a45371291
3 changed files with 8 additions and 7 deletions

View File

@ -505,13 +505,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
} }
if (rule == float_3nan_prop_none) { if (rule == float_3nan_prop_none) {
#if defined(TARGET_MIPS) #if defined(TARGET_XTENSA)
if (snan_bit_is_one(status)) {
rule = float_3nan_prop_s_abc;
} else {
rule = float_3nan_prop_s_cab;
}
#elif defined(TARGET_XTENSA)
if (status->use_first_nan) { if (status->use_first_nan) {
rule = float_3nan_prop_abc; rule = float_3nan_prop_abc;
} else { } else {

View File

@ -29,6 +29,7 @@ static inline void restore_snan_bit_mode(CPUMIPSState *env)
{ {
bool nan2008 = env->active_fpu.fcr31 & (1 << FCR31_NAN2008); bool nan2008 = env->active_fpu.fcr31 & (1 << FCR31_NAN2008);
FloatInfZeroNaNRule izn_rule; FloatInfZeroNaNRule izn_rule;
Float3NaNPropRule nan3_rule;
/* /*
* With nan2008, SNaNs are silenced in the usual way. * With nan2008, SNaNs are silenced in the usual way.
@ -44,6 +45,9 @@ static inline void restore_snan_bit_mode(CPUMIPSState *env)
*/ */
izn_rule = nan2008 ? float_infzeronan_dnan_never : float_infzeronan_dnan_always; izn_rule = nan2008 ? float_infzeronan_dnan_never : float_infzeronan_dnan_always;
set_float_infzeronan_rule(izn_rule, &env->active_fpu.fp_status); set_float_infzeronan_rule(izn_rule, &env->active_fpu.fp_status);
nan3_rule = nan2008 ? float_3nan_prop_s_cab : float_3nan_prop_s_abc;
set_float_3nan_prop_rule(nan3_rule, &env->active_fpu.fp_status);
} }
static inline void restore_fp_status(CPUMIPSState *env) static inline void restore_fp_status(CPUMIPSState *env)

View File

@ -66,6 +66,9 @@ void msa_reset(CPUMIPSState *env)
set_float_2nan_prop_rule(float_2nan_prop_s_ab, set_float_2nan_prop_rule(float_2nan_prop_s_ab,
&env->active_tc.msa_fp_status); &env->active_tc.msa_fp_status);
set_float_3nan_prop_rule(float_3nan_prop_s_cab,
&env->active_tc.msa_fp_status);
/* clear float_status exception flags */ /* clear float_status exception flags */
set_float_exception_flags(0, &env->active_tc.msa_fp_status); set_float_exception_flags(0, &env->active_tc.msa_fp_status);