FPP_IS fpp_is_neg;
FPP_IS fpp_is_denormal;
FPP_IS fpp_is_unnormal;
+FPP_A fpp_fix_infinity;
FPP_GET_STATUS fpp_get_status;
FPP_CLEAR_STATUS fpp_clear_status;
return false;
}
+#if 0
+// 68040/060 automatically converts infinity
+static void check_and_fix_infinity(fpdata *value)
+{
+ if (fpp_fix_infinity && (currprefs.fpu_model == 68040 || currprefs.fpu_model == 68060)) {
+ if (fpp_is_infinity(value)) {
+ fpp_fix_infinity(value);
+ }
+ }
+}
+#endif
+
static int get_fp_value (uae_u32 opcode, uae_u16 extra, fpdata *src, uaecptr oldpc, uae_u32 *adp)
{
int size, mode, reg;
if (fault_if_no_fpu (opcode, extra, 0, oldpc))
return -1;
*src = regs.fp[(extra >> 10) & 7];
+#if 0
+ check_and_fix_infinity(src);
+#endif
normalize_or_fault_if_no_denormal_support(opcode, extra, 0, oldpc, src);
return 1;
}
v = fp_arithmetic(&src, &dst, extra);
+#if 0
+ check_and_fix_infinity(&dst);
+#endif
+
fpsr_check_arithmetic_exception(0, &src, opcode, extra, ad);
if (v)
fpp_is_neg = fp_is_neg;
fpp_is_denormal = fp_is_denormal;
fpp_is_unnormal = fp_is_unnormal;
+ fpp_fix_infinity = NULL;
fpp_get_status = fp_get_status;
fpp_clear_status = fp_clear_status;
{
return floatx80_is_infinity(fpd->fpx) != 0;
}
+static void fp_fix_infinity(fpdata *fpd)
+{
+ fpd->fpx.low = 0;
+}
static bool fp_is_zero(fpdata *fpd)
{
return floatx80_is_zero(fpd->fpx) != 0;
fpp_is_neg = fp_is_neg;
fpp_is_denormal = fp_is_denormal;
fpp_is_unnormal = fp_is_unnormal;
+ fpp_fix_infinity = fp_fix_infinity;
fpp_get_status = fp_get_status;
fpp_clear_status = fp_clear_status;
extern FPP_IS fpp_is_neg;
extern FPP_IS fpp_is_denormal;
extern FPP_IS fpp_is_unnormal;
+extern FPP_A fpp_fix_infinity;
extern FPP_GET_STATUS fpp_get_status;
extern FPP_CLEAR_STATUS fpp_clear_status;
fpp_is_neg = fp_is_neg;
fpp_is_denormal = fp_is_denormal;
fpp_is_unnormal = fp_is_unnormal;
+ fpp_fix_infinity = NULL;
fpp_get_status = fp_get_status;
fpp_clear_status = fp_clear_status;