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)