Previous 199869 Revisions Next

r25447 Saturday 28th September, 2013 at 01:57:53 UTC by R. Belmont
m68k: add FSCALE instruction used by e.g. SimCity 2000 [R. Belmont]
[src/emu/cpu/m68000]m68kfpu.c
[src/lib/softfloat]fsincos.c fyl2x.c softfloat-specialize softfloat.h

trunk/src/lib/softfloat/softfloat-specialize
r25446r25447
311311| `b' is a signaling NaN, the invalid exception is raised.
312312*----------------------------------------------------------------------------*/
313313
314static floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b )
314floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b )
315315{
316316    flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
317317
trunk/src/lib/softfloat/softfloat.h
r25446r25447
8989*----------------------------------------------------------------------------*/
9090extern int8 float_exception_flags;
9191enum {
92   float_flag_inexact   =  1,
93   float_flag_underflow =  2,
94   float_flag_overflow  =  4,
95   float_flag_divbyzero =  8,
96   float_flag_invalid   = 16
92  float_flag_invalid = 0x01, float_flag_denormal = 0x02, float_flag_divbyzero = 0x04, float_flag_overflow = 0x08,
93  float_flag_underflow = 0x10, float_flag_inexact = 0x20
9794};
9895
9996/*----------------------------------------------------------------------------
r25446r25447
202199#ifdef FLOAT128
203200float128 floatx80_to_float128( floatx80 );
204201#endif
202floatx80 floatx80_scale(floatx80 a, floatx80 b);
205203
206204/*----------------------------------------------------------------------------
207205| Packs the sign `zSign', exponent `zExp', and significand `zSig' into an
r25446r25447
459457   return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 );
460458
461459}
462
463460#endif
trunk/src/lib/softfloat/fsincos.c
r25446r25447
563563{
564564      return float128_mul(x, EvenPoly(x, arr, n));
565565}
566
567/*----------------------------------------------------------------------------
568| Scales extended double-precision floating-point value in operand `a' by
569| value `b'. The function truncates the value in the second operand 'b' to
570| an integral value and adds that value to the exponent of the operand 'a'.
571| The operation performed according to the IEC/IEEE Standard for Binary
572| Floating-Point Arithmetic.
573*----------------------------------------------------------------------------*/
574
575extern floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b );
576
577floatx80 floatx80_scale(floatx80 a, floatx80 b)
578{
579    sbits32 aExp, bExp;
580    bits64 aSig, bSig;
581
582    // handle unsupported extended double-precision floating encodings
583/*    if (floatx80_is_unsupported(a) || floatx80_is_unsupported(b))
584    {
585        float_raise(float_flag_invalid);
586        return floatx80_default_nan;
587    }*/
588
589    aSig = extractFloatx80Frac(a);
590    aExp = extractFloatx80Exp(a);
591    int aSign = extractFloatx80Sign(a);
592    bSig = extractFloatx80Frac(b);
593    bExp = extractFloatx80Exp(b);
594    int bSign = extractFloatx80Sign(b);
595
596    if (aExp == 0x7FFF) {
597        if ((bits64) (aSig<<1) || ((bExp == 0x7FFF) && (bits64) (bSig<<1)))
598        {
599            return propagateFloatx80NaN(a, b);
600        }
601        if ((bExp == 0x7FFF) && bSign) {
602            float_raise(float_flag_invalid);
603            return floatx80_default_nan;
604        }
605        if (bSig && (bExp == 0)) float_raise(float_flag_denormal);
606        return a;
607    }
608    if (bExp == 0x7FFF) {
609        if ((bits64) (bSig<<1)) return propagateFloatx80NaN(a, b);
610        if ((aExp | aSig) == 0) {
611            if (! bSign) {
612                float_raise(float_flag_invalid);
613                return floatx80_default_nan;
614            }
615            return a;
616        }
617        if (aSig && (aExp == 0)) float_raise(float_flag_denormal);
618        if (bSign) return packFloatx80(aSign, 0, 0);
619        return packFloatx80(aSign, 0x7FFF, U64(0x8000000000000000));
620    }
621    if (aExp == 0) {
622        if (aSig == 0) return a;
623        float_raise(float_flag_denormal);
624        normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
625    }
626    if (bExp == 0) {
627        if (bSig == 0) return a;
628        float_raise(float_flag_denormal);
629        normalizeFloatx80Subnormal(bSig, &bExp, &bSig);
630    }
631
632    if (bExp > 0x400E) {   
633        /* generate appropriate overflow/underflow */
634        return roundAndPackFloatx80(80, aSign,
635                          bSign ? -0x3FFF : 0x7FFF, aSig, 0);
636    }
637    if (bExp < 0x3FFF) return a;
638
639    int shiftCount = 0x403E - bExp;
640    bSig >>= shiftCount;
641    sbits32 scale = bSig;
642    if (bSign) scale = -scale; /* -32768..32767 */
643    return
644        roundAndPackFloatx80(80, aSign, aExp+scale, aSig, 0);
645}
trunk/src/lib/softfloat/fyl2x.c
r25446r25447
3232//#include "softfloat-specialize"
3333#include "fpu_constant.h"
3434
35// FIXME:
36#define float_flag_denormal float_flag_invalid
37
3835static const floatx80 floatx80_log10_2 = packFloatx80(0, 0x3ffd, U64(0x9a209a84fbcff798));
3936static const floatx80 floatx80_ln_2 = packFloatx80(0, 0x3ffe, U64(0xb17217f7d1cf79ac));
4037static const floatx80 floatx80_one = packFloatx80(0, 0x3fff, U64(0x8000000000000000));
trunk/src/emu/cpu/m68000/m68kfpu.c
r25446r25447
14881488         m68k->remaining_cycles -= 43;   // guess
14891489         break;
14901490      }
1491      case 0x26:      // FSCALE
1492      {
1493         REG_FP(m68k)[dst] = floatx80_scale(REG_FP(m68k)[dst], source);
1494         SET_CONDITION_CODES(m68k, REG_FP(m68k)[dst]);
1495         m68k->remaining_cycles -= 43;   // guess
1496         break;
1497      }
14911498      case 0x27:      // FSGLMUL
14921499      {
14931500         float32 a = floatx80_to_float32( REG_FP(m68k)[dst] );

Previous 199869 Revisions Next


© 1997-2024 The MAME Team