#include "fpp.h"
#include "uae/attributes.h"
#include "uae/vm.h"
-#include "newcpu.h"
#ifdef JIT
uae_u32 xhex_exp_1[] ={0xa2bb4a9a, 0xadf85458, 0x4000};
#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