aboutsummaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
Diffstat (limited to 'target')
-rw-r--r--target/m68k/fpu_helper.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c
index 5fd094a..3a37d8f 100644
--- a/target/m68k/fpu_helper.c
+++ b/target/m68k/fpu_helper.c
@@ -538,18 +538,27 @@ void HELPER(fmod)(CPUM68KState *env, FPReg *res, FPReg *val0, FPReg *val1)
void HELPER(frem)(CPUM68KState *env, FPReg *res, FPReg *val0, FPReg *val1)
{
- uint32_t quotient;
- int sign;
-
- res->d = floatx80_rem(val1->d, val0->d, &env->fp_status);
-
- if (floatx80_is_any_nan(res->d)) {
- return;
+ FPReg fp_quot;
+ floatx80 fp_rem;
+
+ fp_rem = floatx80_rem(val1->d, val0->d, &env->fp_status);
+ if (!floatx80_is_any_nan(fp_rem)) {
+ float_status fp_status = { };
+ uint32_t quotient;
+ int sign;
+
+ /* Calculate quotient directly using round to nearest mode */
+ 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);
+ quotient = floatx80_to_int32(floatx80_abs(fp_quot.d), &env->fp_status);
+ make_quotient(env, sign, quotient);
}
- sign = extractFloatx80Sign(res->d);
- quotient = floatx80_to_int32(floatx80_abs(res->d), &env->fp_status);
- make_quotient(env, sign, quotient);
+ res->d = fp_rem;
}
void HELPER(fgetexp)(CPUM68KState *env, FPReg *res, FPReg *val)