]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Preparing for 6888x vs 68040/060 infinity special case.
authorToni Wilen <twilen@winuae.net>
Sat, 16 Jun 2018 19:21:20 +0000 (22:21 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 16 Jun 2018 19:21:20 +0000 (22:21 +0300)
fpp.cpp
fpp_native.cpp
fpp_softfloat.cpp
include/fpp.h
od-win32/fpp_native_msvc_80bit.cpp

diff --git a/fpp.cpp b/fpp.cpp
index c95027633081409f6f649bc612575ebbca6a3833..89d55d16ddd3852c0b301013f63ce58ec30995d6 100644 (file)
--- 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)
index c1ccde504db59f88a229e77764d4083536512f55..c4b2b20d0e29f8820f11ca084d6e51c3de5c4f13 100644 (file)
@@ -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;
index fb894c83ec98038a91becd5d0e3a5a7b8be096b4..55883a548cd4ab6abbf2fd84cdb0b308c99bc42a 100644 (file)
@@ -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;
index 3b0a1ce5fd9ec2722ba6fce07fc9b5c5d8af60e8..32c8ca9b13bec545136b01addb3e699791fada76 100644 (file)
@@ -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;
index 91976cd34535cc518dd1908f7e15ea1ee9c5de94..80f3e0758adb06019fef5491c862ca40b9258acf 100644 (file)
@@ -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;