|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * MC68881 emulation ! 5: * ! 6: * Conversion routines for hosts with unknown floating point format. ! 7: * ! 8: * Copyright 1996 Herman ten Brugge ! 9: */ ! 10: ! 11: #ifndef HAVE_to_single ! 12: STATIC_INLINE double to_single (uae_u32 value) ! 13: { ! 14: double frac; ! 15: ! 16: if ((value & 0x7fffffff) == 0) ! 17: return (0.0); ! 18: frac = (double) ((value & 0x7fffff) | 0x800000) / 8388608.0; ! 19: if (value & 0x80000000) ! 20: frac = -frac; ! 21: return (ldexp (frac, ((value >> 23) & 0xff) - 127)); ! 22: } ! 23: #endif ! 24: ! 25: #ifndef HAVE_from_single ! 26: STATIC_INLINE uae_u32 from_single (double src) ! 27: { ! 28: int expon; ! 29: uae_u32 tmp; ! 30: double frac; ! 31: ! 32: if (src == 0.0) ! 33: return 0; ! 34: if (src < 0) { ! 35: tmp = 0x80000000; ! 36: src = -src; ! 37: } else { ! 38: tmp = 0; ! 39: } ! 40: frac = frexp (src, &expon); ! 41: frac += 0.5 / 16777216.0; ! 42: if (frac >= 1.0) { ! 43: frac /= 2.0; ! 44: expon++; ! 45: } ! 46: return (tmp | (((expon + 127 - 1) & 0xff) << 23) | ! 47: (((int) (frac * 16777216.0)) & 0x7fffff)); ! 48: } ! 49: #endif ! 50: ! 51: #ifndef HAVE_to_exten ! 52: STATIC_INLINE double to_exten(uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3) ! 53: { ! 54: double frac; ! 55: ! 56: if ((wrd1 & 0x7fff0000) == 0 && wrd2 == 0 && wrd3 == 0) ! 57: return 0.0; ! 58: frac = (double) wrd2 / 2147483648.0 + ! 59: (double) wrd3 / 9223372036854775808.0; ! 60: if (wrd1 & 0x80000000) ! 61: frac = -frac; ! 62: return ldexp (frac, ((wrd1 >> 16) & 0x7fff) - 16383); ! 63: } ! 64: #endif ! 65: ! 66: #ifndef HAVE_from_exten ! 67: STATIC_INLINE void from_exten(double src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u32 * wrd3) ! 68: { ! 69: int expon; ! 70: double frac; ! 71: ! 72: if (src == 0.0) { ! 73: *wrd1 = 0; ! 74: *wrd2 = 0; ! 75: *wrd3 = 0; ! 76: return; ! 77: } ! 78: if (src < 0) { ! 79: *wrd1 = 0x80000000; ! 80: src = -src; ! 81: } else { ! 82: *wrd1 = 0; ! 83: } ! 84: frac = frexp (src, &expon); ! 85: frac += 0.5 / 18446744073709551616.0; ! 86: if (frac >= 1.0) { ! 87: frac /= 2.0; ! 88: expon++; ! 89: } ! 90: *wrd1 |= (((expon + 16383 - 1) & 0x7fff) << 16); ! 91: *wrd2 = (uae_u32) (frac * 4294967296.0); ! 92: *wrd3 = (uae_u32) (frac * 18446744073709551616.0 - *wrd2 * 4294967296.0); ! 93: } ! 94: #endif ! 95: ! 96: #ifndef HAVE_to_double ! 97: STATIC_INLINE double to_double(uae_u32 wrd1, uae_u32 wrd2) ! 98: { ! 99: double frac; ! 100: ! 101: if ((wrd1 & 0x7fffffff) == 0 && wrd2 == 0) ! 102: return 0.0; ! 103: frac = (double) ((wrd1 & 0xfffff) | 0x100000) / 1048576.0 + ! 104: (double) wrd2 / 4503599627370496.0; ! 105: if (wrd1 & 0x80000000) ! 106: frac = -frac; ! 107: return ldexp (frac, ((wrd1 >> 20) & 0x7ff) - 1023); ! 108: } ! 109: #endif ! 110: ! 111: #ifndef HAVE_from_double ! 112: STATIC_INLINE void from_double(double src, uae_u32 * wrd1, uae_u32 * wrd2) ! 113: { ! 114: int expon; ! 115: int tmp; ! 116: double frac; ! 117: ! 118: if (src == 0.0) { ! 119: *wrd1 = 0; ! 120: *wrd2 = 0; ! 121: return; ! 122: } ! 123: if (src < 0) { ! 124: *wrd1 = 0x80000000; ! 125: src = -src; ! 126: } else { ! 127: *wrd1 = 0; ! 128: } ! 129: frac = frexp (src, &expon); ! 130: frac += 0.5 / 9007199254740992.0; ! 131: if (frac >= 1.0) { ! 132: frac /= 2.0; ! 133: expon++; ! 134: } ! 135: tmp = (uae_u32) (frac * 2097152.0); ! 136: *wrd1 |= (((expon + 1023 - 1) & 0x7ff) << 20) | (tmp & 0xfffff); ! 137: *wrd2 = (uae_u32) (frac * 9007199254740992.0 - tmp * 4294967296.0); ! 138: } ! 139: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.