aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2024-12-11 15:31:02 +0000
committerPeter Maydell <peter.maydell@linaro.org>2024-12-11 15:31:02 +0000
commitb1969a5dd4ad72669d739ef6e8caaefb7c7f962c (patch)
treec48e92bb6930944981a1544306efb6c0940a87cb
parenta0c4297738880393a1a74d5db551ee7a832e7a91 (diff)
downloadqemu-b1969a5dd4ad72669d739ef6e8caaefb7c7f962c.zip
qemu-b1969a5dd4ad72669d739ef6e8caaefb7c7f962c.tar.gz
qemu-b1969a5dd4ad72669d739ef6e8caaefb7c7f962c.tar.bz2
target/m68k: In frem helper, initialize local float_status from env->fp_status
In the frem helper, we have a local float_status because we want to execute the floatx80_div() with a custom rounding mode. Instead of zero-initializing the local float_status and then having to set it up with the m68k standard behaviour (including the NaN propagation rule and copying the rounding precision from env->fp_status), initialize it as a complete copy of env->fp_status. This will avoid our having to add new code in this function for every new config knob we add to fp_status. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20241202131347.498124-31-peter.maydell@linaro.org
-rw-r--r--target/m68k/fpu_helper.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c
index a605162..e3f4a18 100644
--- a/target/m68k/fpu_helper.c
+++ b/target/m68k/fpu_helper.c
@@ -615,15 +615,13 @@ void HELPER(frem)(CPUM68KState *env, FPReg *res, FPReg *val0, FPReg *val1)
fp_rem = floatx80_rem(val1->d, val0->d, &env->fp_status);
if (!floatx80_is_any_nan(fp_rem)) {
- float_status fp_status = { };
+ /* Use local temporary fp_status to set different rounding mode */
+ float_status fp_status = env->fp_status;
uint32_t quotient;
int sign;
/* Calculate quotient directly using round to nearest mode */
- set_float_2nan_prop_rule(float_2nan_prop_ab, &fp_status);
set_float_rounding_mode(float_round_nearest_even, &fp_status);
- set_floatx80_rounding_precision(
- get_floatx80_rounding_precision(&env->fp_status), &fp_status);
fp_quot.d = floatx80_div(val1->d, val0->d, &fp_status);
sign = extractFloatx80Sign(fp_quot.d);