]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Use original extended FP conversion if JIT is enabled.
authorToni Wilen <twilen@winuae.net>
Sat, 10 May 2025 14:15:29 +0000 (17:15 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 10 May 2025 14:15:29 +0000 (17:15 +0300)
fpp_native.cpp

index d66eb0f4211091e64ca80e86d263872ec3ccf315..b5380333aa629af3a23d9481c1e6e25fde84cc68 100644 (file)
@@ -26,7 +26,6 @@
 #include "fpp.h"
 #include "uae/attributes.h"
 #include "uae/vm.h"
-#include "newcpu.h"
 
 #ifdef JIT
 uae_u32 xhex_exp_1[] ={0xa2bb4a9a, 0xadf85458, 0x4000};
@@ -384,70 +383,72 @@ static void fp_from_exten(fpdata *fpd, uae_u32 *wrd1, uae_u32 *wrd2, uae_u32 *wr
 #else // if !USE_LONG_DOUBLE
 static void fp_to_exten(fpdata *fpd, uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
 {
-#if SOFTFLOAT_CONVERSIONS
-       floatx80 fx80;
-       fx80.high = wrd1 >> 16;
-       fx80.low = (((uae_u64)wrd2) << 32) | wrd3;
-       fs.float_exception_flags = 0;
-       float64 f = floatx80_to_float64(fx80, &fs);
-       // overflow -> infinity
-       if (fs.float_exception_flags & float_flag_overflow)
-               f = 0x7ff0000000000000 | (f & 0x8000000000000000);
-       fp_to_double(fpd, f >> 32, (uae_u32)f);
-#else
-    double frac;
-    if ((wrd1 & 0x7fff0000) == 0 && wrd2 == 0 && wrd3 == 0) {
-        fpd->fp = (wrd1 & 0x80000000) ? -0.0 : +0.0;
-        return;
-    }
-    frac = ((double)wrd2 + ((double)wrd3 / twoto32)) / 2147483648.0;
-    if (wrd1 & 0x80000000)
-        frac = -frac;
-    fpd->fp = ldexp (frac, ((wrd1 >> 16) & 0x7fff) - 16383);
-#endif
+       if (!currprefs.cachesize) {
+               floatx80 fx80;
+               fx80.high = wrd1 >> 16;
+               fx80.low = (((uae_u64)wrd2) << 32) | wrd3;
+               fs.float_exception_flags = 0;
+               float64 f = floatx80_to_float64(fx80, &fs);
+               // overflow -> infinity
+               if (fs.float_exception_flags & float_flag_overflow) {
+                       f = 0x7ff0000000000000 | (f & 0x8000000000000000);
+               }
+               fp_to_double(fpd, f >> 32, (uae_u32)f);
+       } else {
+               double frac;
+               if ((wrd1 & 0x7fff0000) == 0 && wrd2 == 0 && wrd3 == 0) {
+                       fpd->fp = (wrd1 & 0x80000000) ? -0.0 : +0.0;
+                       return;
+               }
+               frac = ((double)wrd2 + ((double)wrd3 / twoto32)) / 2147483648.0;
+               if (wrd1 & 0x80000000) {
+                       frac = -frac;
+               }
+               fpd->fp = ldexp (frac, ((wrd1 >> 16) & 0x7fff) - 16383);
+       }
 }
 static void fp_from_exten(fpdata *fpd, uae_u32 *wrd1, uae_u32 *wrd2, uae_u32 *wrd3)
 {
-#if SOFTFLOAT_CONVERSIONS
-       uae_u32 w1, w2;
-       fp_from_double(fpd, &w1, &w2);
-       floatx80 f = float64_to_floatx80(((uae_u64)w1 << 32) | w2, &fs);
-       *wrd1 = f.high << 16;
-       *wrd2 = f.low >> 32;
-       *wrd3 = (uae_u32)f.low;
-#else
-    int expon;
-    double frac;
-    fptype v;
+       if (!currprefs.cachesize) {
+               uae_u32 w1, w2;
+               fp_from_double(fpd, &w1, &w2);
+               floatx80 f = float64_to_floatx80(((uae_u64)w1 << 32) | w2, &fs);
+               *wrd1 = f.high << 16;
+               *wrd2 = f.low >> 32;
+               *wrd3 = (uae_u32)f.low;
+       } else {
+               int expon;
+               double frac;
+               fptype v;
     
-    if (fp_is_zero(fpd)) {
-        *wrd1 = signbit(fpd->fp) ? 0x80000000 : 0;
-        *wrd2 = 0;
-        *wrd3 = 0;
-        return;
-       } else if (fp_is_nan(fpd)) {
-               *wrd1 = 0x7fff0000;
-               *wrd2 = 0xffffffff;
-               *wrd3 = 0xffffffff;
-               return;
+               if (fp_is_zero(fpd)) {
+                       *wrd1 = signbit(fpd->fp) ? 0x80000000 : 0;
+                       *wrd2 = 0;
+                       *wrd3 = 0;
+                       return;
+               } else if (fp_is_nan(fpd)) {
+                       *wrd1 = 0x7fff0000;
+                       *wrd2 = 0xffffffff;
+                       *wrd3 = 0xffffffff;
+                       return;
+               }
+               v = fpd->fp;
+               if (v < 0) {
+                       *wrd1 = 0x80000000;
+                       v = -v;
+               } else {
+                       *wrd1 = 0;
+               }
+               frac = frexp (v, &expon);
+               frac += 0.5 / (twoto32 * twoto32);
+               if (frac >= 1.0) {
+                       frac /= 2.0;
+                       expon++;
+               }
+               *wrd1 |= (((expon + 16383 - 1) & 0x7fff) << 16);
+               *wrd2 = (uae_u32) (frac * twoto32);
+               *wrd3 = (uae_u32) ((frac * twoto32 - *wrd2) * twoto32);
        }
-       v = fpd->fp;
-       if (v < 0) {
-        *wrd1 = 0x80000000;
-        v = -v;
-    } else {
-        *wrd1 = 0;
-    }
-    frac = frexp (v, &expon);
-    frac += 0.5 / (twoto32 * twoto32);
-    if (frac >= 1.0) {
-        frac /= 2.0;
-        expon++;
-    }
-    *wrd1 |= (((expon + 16383 - 1) & 0x7fff) << 16);
-    *wrd2 = (uae_u32) (frac * twoto32);
-    *wrd3 = (uae_u32) ((frac * twoto32 - *wrd2) * twoto32);
-#endif
 }
 #endif // !USE_LONG_DOUBLE