diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2024-12-11 15:30:57 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2024-12-11 15:30:57 +0000 |
commit | ac1254c4e75cd365283eca90cebc64cdb5a7e48d (patch) | |
tree | db2751c4371f135d8f320f97e810862e309a6ec9 | |
parent | 9d0b8f96056f45510c3f0ed7216dbc969e5e5fec (diff) | |
download | qemu-ac1254c4e75cd365283eca90cebc64cdb5a7e48d.zip qemu-ac1254c4e75cd365283eca90cebc64cdb5a7e48d.tar.gz qemu-ac1254c4e75cd365283eca90cebc64cdb5a7e48d.tar.bz2 |
target/ppc: Set Float3NaNPropRule explicitly
Set the Float3NaNPropRule explicitly for PPC, 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-20-peter.maydell@linaro.org
-rw-r--r-- | fpu/softfloat-specialize.c.inc | 6 | ||||
-rw-r--r-- | target/ppc/cpu_init.c | 8 |
2 files changed, 8 insertions, 6 deletions
diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc index d610f46..173b9ea 100644 --- a/fpu/softfloat-specialize.c.inc +++ b/fpu/softfloat-specialize.c.inc @@ -511,12 +511,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls, } else { rule = float_3nan_prop_s_cab; } -#elif defined(TARGET_PPC) - /* - * If fRA is a NaN return it; otherwise if fRB is a NaN return it; - * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB - */ - rule = float_3nan_prop_acb; #elif defined(TARGET_S390X) rule = float_3nan_prop_s_abc; #elif defined(TARGET_SPARC) diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c index f18908a..eb9d7b1 100644 --- a/target/ppc/cpu_init.c +++ b/target/ppc/cpu_init.c @@ -7271,6 +7271,14 @@ static void ppc_cpu_reset_hold(Object *obj, ResetType type) set_float_2nan_prop_rule(float_2nan_prop_ab, &env->fp_status); set_float_2nan_prop_rule(float_2nan_prop_ab, &env->vec_status); /* + * NaN propagation for fused multiply-add: + * if fRA is a NaN return it; otherwise if fRB is a NaN return it; + * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB + * whereas QEMU labels the operands as (a * b) + c. + */ + set_float_3nan_prop_rule(float_3nan_prop_acb, &env->fp_status); + set_float_3nan_prop_rule(float_3nan_prop_acb, &env->vec_status); + /* * For PPC, the (inf,zero,qnan) case sets InvalidOp, but we prefer * to return an input NaN if we have one (ie c) rather than generating * a default NaN |