From 02a169fc83173b409c3d43285b4768454cea3be4 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 10 May 2025 17:15:29 +0300 Subject: [PATCH] Use original extended FP conversion if JIT is enabled. --- fpp_native.cpp | 121 +++++++++++++++++++++++++------------------------ 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/fpp_native.cpp b/fpp_native.cpp index d66eb0f4..b5380333 100644 --- a/fpp_native.cpp +++ b/fpp_native.cpp @@ -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 -- 2.47.3