From: Toni Wilen Date: Sat, 16 Jun 2018 19:21:20 +0000 (+0300) Subject: Preparing for 6888x vs 68040/060 infinity special case. X-Git-Tag: 4000~11 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=c1cc6ff0a95496d9a2bf01cbe2c4f60ca24a334f;p=francis%2Fwinuae.git Preparing for 6888x vs 68040/060 infinity special case. --- diff --git a/fpp.cpp b/fpp.cpp index c9502763..89d55d16 100644 --- a/fpp.cpp +++ b/fpp.cpp @@ -56,6 +56,7 @@ FPP_IS fpp_is_zero; 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; @@ -1305,6 +1306,18 @@ static bool fault_if_68040_integer_nonmaskable(uae_u16 opcode, uae_u16 extra, ua 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; @@ -1318,6 +1331,9 @@ static int get_fp_value (uae_u32 opcode, uae_u16 extra, fpdata *src, uaecptr old 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; } @@ -3096,6 +3112,10 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra) 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) diff --git a/fpp_native.cpp b/fpp_native.cpp index c1ccde50..c4b2b20d 100644 --- a/fpp_native.cpp +++ b/fpp_native.cpp @@ -1283,6 +1283,7 @@ void fp_init_native(void) 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; diff --git a/fpp_softfloat.cpp b/fpp_softfloat.cpp index fb894c83..55883a54 100644 --- a/fpp_softfloat.cpp +++ b/fpp_softfloat.cpp @@ -167,6 +167,10 @@ static bool fp_is_infinity(fpdata *fpd) { 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; @@ -746,6 +750,7 @@ void fp_init_softfloat(void) 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; diff --git a/include/fpp.h b/include/fpp.h index 3b0a1ce5..32c8ca9b 100644 --- a/include/fpp.h +++ b/include/fpp.h @@ -84,6 +84,7 @@ extern FPP_IS fpp_is_zero; 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; diff --git a/od-win32/fpp_native_msvc_80bit.cpp b/od-win32/fpp_native_msvc_80bit.cpp index 91976cd3..80f3e075 100644 --- a/od-win32/fpp_native_msvc_80bit.cpp +++ b/od-win32/fpp_native_msvc_80bit.cpp @@ -1036,6 +1036,7 @@ void fp_init_native_80(void) 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;