shithub: qk1

Download patch

ref: 8a8dbdd2c19281aa8d06739216281855065197dc
parent: 26684157e0d0b5885f33e88c4d31805f48fa5d15
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Dec 4 15:13:49 EST 2023

clean up softfloat code, leave the things of obvious need

--- a/Makefile
+++ b/Makefile
@@ -124,6 +124,7 @@
 	sbar.h\
 	screen.h\
 	server.h\
+	softfloat.h\
 	spritegn.h\
 	unix/libc.h\
 	unix/u.h\
--- a/dotadd.c
+++ b/dotadd.c
@@ -5,21 +5,15 @@
 dotadd(float *a, float *b)
 {
 	extFloat80_t x, y, m, z;
-	union {
-		float32_t v;
-		float f;
-	}f;
 	int i;
 
-	f.f = b[3];
-	f32_to_extF80M(f.v, &z);
+	f32_to_extF80M(b[3], &z);
 	for(i = 0; i < 3; i++){
-		f.f = a[i]; f32_to_extF80M(f.v, &x);
-		f.f = b[i]; f32_to_extF80M(f.v, &y);
+		f32_to_extF80M(a[i], &x);
+		f32_to_extF80M(b[i], &y);
 		extF80M_mul(&x, &y, &m);
 		extF80M_add(&z, &m, &z);
-		f.v = extF80M_to_f32(&z);
 	}
 
-	return f.f;
+	return extF80M_to_f32(&z);;
 }
--- a/mkfile
+++ b/mkfile
@@ -2,10 +2,9 @@
 
 BIN=/$objtype/bin/games
 TARG=quake
-CFLAGS=$CFLAGS -p -D__plan9__
+CFLAGS=$CFLAGS -D__plan9__
 
 OFILES=\
-	${SOFTFLOAT}\
 	span`{test -f span_$objtype.s && echo -n _$objtype}.$O\
 	span_alpha.$O\
 	dotproduct`{test -f span_$objtype.s && echo -n _$objtype}.$O\
@@ -118,6 +117,7 @@
 	sbar.h\
 	screen.h\
 	server.h\
+	softfloat.h\
 	spritegn.h\
 	vid.h\
 	view.h\
@@ -126,3 +126,9 @@
 	zone.h\
 
 </sys/src/cmd/mkone
+
+dotadd.$O: dotadd.c
+	$CC $CFLAGS -p dotadd.c
+
+softfloat.$O: softfloat.c
+	$CC $CFLAGS -p softfloat.c
--- a/softfloat.c
+++ b/softfloat.c
@@ -40,12 +40,151 @@
 #define UINT64_C(x) x##ULL
 #endif
 
+#if BYTE_ORDER == LITTLE_ENDIAN
+struct uint128 { u64int v0, v64; };
+struct uint64_extra { u64int extra, v; };
+#define wordIncr 1
+#define indexWord( total, n ) (n)
+#define indexWordHi( total ) ((total) - 1)
+#define indexWordLo( total ) 0
+#define indexMultiword( total, m, n ) (n)
+#define indexMultiwordHi( total, n ) ((total) - (n))
+#define indexMultiwordLo( total, n ) 0
+#define indexMultiwordHiBut( total, n ) (n)
+#define indexMultiwordLoBut( total, n ) 0
+#else
+struct uint128 { u64int v64, v0; };
+struct uint64_extra { u64int v, extra; };
+#define wordIncr -1
+#define indexWord( total, n ) ((total) - 1 - (n))
+#define indexWordHi( total ) 0
+#define indexWordLo( total ) ((total) - 1)
+#define indexMultiword( total, m, n ) ((total) - 1 - (m))
+#define indexMultiwordHi( total, n ) 0
+#define indexMultiwordLo( total, n ) ((total) - (n))
+#define indexMultiwordHiBut( total, n ) 0
+#define indexMultiwordLoBut( total, n ) (n)
+#endif
+
+/*----------------------------------------------------------------------------
+| Default value for 'softfloat_detectTininess'.
+*----------------------------------------------------------------------------*/
+#define init_detectTininess softfloat_tininess_afterRounding
+
+/*----------------------------------------------------------------------------
+| "Common NaN" structure, used to transfer NaN representations from one format
+| to another.
+*----------------------------------------------------------------------------*/
+struct commonNaN {
+    bool sign;
+#if BYTE_ORDER == LITTLE_ENDIAN
+    u64int v0, v64;
+#else
+    u64int v64, v0;
+#endif
+};
+
+union ui32_f32 { u32int ui; float32_t f; };
+
+enum {
+    softfloat_mulAdd_subC    = 1,
+    softfloat_mulAdd_subProd = 2
+};
+
+
+/*----------------------------------------------------------------------------
+| Software floating-point underflow tininess-detection mode.
+*----------------------------------------------------------------------------*/
+enum {
+    softfloat_tininess_beforeRounding = 0,
+    softfloat_tininess_afterRounding  = 1
+};
+
+/*----------------------------------------------------------------------------
+| Software floating-point rounding mode.  (Mode "odd" is supported only if
+| SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.)
+*----------------------------------------------------------------------------*/
+enum {
+    softfloat_round_near_even   = 0,
+    softfloat_round_minMag      = 1,
+    softfloat_round_min         = 2,
+    softfloat_round_max         = 3,
+    softfloat_round_near_maxMag = 4,
+    softfloat_round_odd         = 6
+};
+
+/*----------------------------------------------------------------------------
+| Software floating-point exception flags.
+*----------------------------------------------------------------------------*/
+typedef enum {
+    softfloat_flag_inexact   =  1,
+    softfloat_flag_underflow =  2,
+    softfloat_flag_overflow  =  4,
+    softfloat_flag_infinite  =  8,
+    softfloat_flag_invalid   = 16
+} exceptionFlag_t;
+
+/*----------------------------------------------------------------------------
+| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
+| 32-bit floating-point signaling NaN.
+| Note:  This macro evaluates its argument more than once.
+*----------------------------------------------------------------------------*/
+#define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
+
+/*----------------------------------------------------------------------------
+| The bit pattern for a default generated 80-bit extended floating-point NaN.
+*----------------------------------------------------------------------------*/
+#define defaultNaNExtF80UI64 0xFFFF
+#define defaultNaNExtF80UI0  UINT64_C( 0xC000000000000000 )
+
+/*----------------------------------------------------------------------------
+| Returns true when the 80-bit unsigned integer formed from concatenating
+| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended
+| floating-point signaling NaN.
+| Note:  This macro evaluates its arguments more than once.
+*----------------------------------------------------------------------------*/
+#define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))
+
+#define signF32UI( a ) ((bool) ((u32int) (a)>>31))
+#define expF32UI( a ) ((s16int) ((a)>>23) & 0xFF)
+#define fracF32UI( a ) ((a) & 0x007FFFFF)
+#define packToF32UI( sign, exp, sig ) (((u32int) (sign)<<31) + ((u32int) (exp)<<23) + (sig))
+
+#define isNaNF32UI( a ) (((~(a) & 0x7F800000) == 0) && ((a) & 0x007FFFFF))
+
+struct exp16_sig32 { s16int exp; u32int sig; };
+
+static struct exp16_sig32 softfloat_normSubnormalF32Sig( u32int );
+static float32_t softfloat_roundPackToF32( bool, s16int, u32int );
+
+#define signExtF80UI64( a64 ) ((bool) ((u16int) (a64)>>15))
+#define expExtF80UI64( a64 ) ((a64) & 0x7FFF)
+#define packToExtF80UI64( sign, exp ) ((u16int) (sign)<<15 | (exp))
+
+#define isNaNExtF80UI( a64, a0 ) ((((a64) & 0x7FFF) == 0x7FFF) && ((a0) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
+
+struct exp32_sig64 { s32int exp; u64int sig; };
+
+#define signF128UI64( a64 ) ((bool) ((u64int) (a64)>>63))
+#define expF128UI64( a64 ) ((s32int) ((a64)>>48) & 0x7FFF)
+#define fracF128UI64( a64 ) ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))
+#define packToF128UI64( sign, exp, sig64 ) (((u64int) (sign)<<63) + ((u64int) (exp)<<48) + (sig64))
+
+#define isNaNF128UI( a64, a0 ) (((~(a64) & UINT64_C( 0x7FFF000000000000 )) == 0) && (a0 || ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))))
+
+struct exp32_sig128 { s32int exp; struct uint128 sig; };
+
+/*----------------------------------------------------------------------------
+| Routine to raise any or all of the software floating-point exception flags.
+*----------------------------------------------------------------------------*/
+static void softfloat_raiseFlags( u8int );
+
 u8int softfloat_roundingMode = softfloat_round_near_even;
 u8int softfloat_detectTininess = init_detectTininess;
 u8int softfloat_exceptionFlags = 0;
 u8int extF80_roundingPrecision = 80;
 
-bool
+static bool
 extF80M_isSignalingNaN( const extFloat80_t *aPtr )
 {
     const struct extFloat80M *aSPtr;
@@ -65,7 +204,7 @@
 | floating-point NaN, and stores this NaN at the location pointed to by
 | `zSPtr'.
 *----------------------------------------------------------------------------*/
-void
+static void
 softfloat_commonNaNToExtF80M(const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
 {
 
@@ -78,7 +217,7 @@
 | Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
 | NaN, and returns the bit pattern of this value as an unsigned integer.
 *----------------------------------------------------------------------------*/
-u32int
+static u32int
 softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
 {
 
@@ -92,7 +231,7 @@
 | common NaN at the location pointed to by `zPtr'.  If the NaN is a signaling
 | NaN, the invalid exception is raised.
 *----------------------------------------------------------------------------*/
-void
+static void
 softfloat_extF80MToCommonNaN(const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
 {
 
@@ -111,7 +250,7 @@
 | location pointed to by `zPtr'.  If the NaN is a signaling NaN, the invalid
 | exception is raised.
 *----------------------------------------------------------------------------*/
-void
+static void
 softfloat_f32UIToCommonNaN( u32int uiA, struct commonNaN *zPtr )
 {
 
@@ -130,7 +269,7 @@
 | at the location pointed to by `zSPtr'.  If either original floating-point
 | value is a signaling NaN, the invalid exception is raised.
 *----------------------------------------------------------------------------*/
-void
+static void
 softfloat_propagateNaNExtF80M(
      const struct extFloat80M *aSPtr,
      const struct extFloat80M *bSPtr,
@@ -197,7 +336,7 @@
 | result.  If either original floating-point value is a signaling NaN, the
 | invalid exception is raised.
 *----------------------------------------------------------------------------*/
-struct uint128
+static struct uint128
  softfloat_propagateNaNExtF80UI(
      u16int uiA64,
      u64int uiA0,
@@ -257,20 +396,16 @@
 | to substitute a result value.  If traps are not implemented, this routine
 | should be simply `softfloat_exceptionFlags |= flags;'.
 *----------------------------------------------------------------------------*/
-void
+static void
 softfloat_raiseFlags( u8int flags )
 {
-
     softfloat_exceptionFlags |= flags;
-
 }
 
-u64int
+static u64int
 softfloat_shortShiftRightJam64( u64int a, u8int dist )
 {
-
     return a>>dist | ((a & (((u64int) 1<<dist) - 1)) != 0);
-
 }
 
 /*----------------------------------------------------------------------------
@@ -297,7 +432,7 @@
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
-u8int
+static u8int
 softfloat_countLeadingZeros64( u64int a )
 {
     u8int count;
@@ -325,7 +460,7 @@
 
 }
 
-int
+static int
 softfloat_normExtF80SigM( u64int *sigPtr )
 {
     u64int sig;
@@ -338,7 +473,7 @@
 
 }
 
-u8int
+static u8int
 softfloat_countLeadingZeros32( u32int a )
 {
     u8int count;
@@ -357,7 +492,7 @@
 
 }
 
-struct exp16_sig32
+static struct exp16_sig32
 softfloat_normSubnormalF32Sig( u32int sig )
 {
     s8int shiftDist;
@@ -370,7 +505,7 @@
 
 }
 
-u32int
+static u32int
 softfloat_shiftRightJam32( u32int a, u16int dist )
 {
 
@@ -379,7 +514,7 @@
 
 }
 
-float32_t
+static float32_t
  softfloat_roundPackToF32( bool sign, s16int exp, u32int sig )
 {
     u8int roundingMode;
@@ -431,18 +566,11 @@
     sig = (sig + roundIncrement)>>7;
     if ( roundBits ) {
         softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-        if ( roundingMode == softfloat_round_odd ) {
-            sig |= 1;
-            goto packReturn;
-        }
-#endif
     }
     sig &= ~(u32int) (! (roundBits ^ 0x40) & roundNearEven);
     if ( ! sig ) exp = 0;
     /*------------------------------------------------------------------------
     *------------------------------------------------------------------------*/
- packReturn:
     uiZ = packToF32UI( sign, exp, sig );
  uiZ:
     uZ.ui = uiZ;
@@ -450,120 +578,7 @@
 
 }
 
-void
-f32_to_extF80M( float32_t a, extFloat80_t *zPtr )
-{
-    struct extFloat80M *zSPtr;
-    union ui32_f32 uA;
-    u32int uiA;
-    bool sign;
-    s16int exp;
-    u32int frac;
-    struct commonNaN commonNaN;
-    u16int uiZ64;
-    u32int uiZ32;
-    struct exp16_sig32 normExpSig;
-
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    zSPtr = (struct extFloat80M *) zPtr;
-    uA.f = a;
-    uiA = uA.ui;
-    sign = signF32UI( uiA );
-    exp  = expF32UI( uiA );
-    frac = fracF32UI( uiA );
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    if ( exp == 0xFF ) {
-        if ( frac ) {
-            softfloat_f32UIToCommonNaN( uiA, &commonNaN );
-            softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
-            return;
-        }
-        uiZ64 = packToExtF80UI64( sign, 0x7FFF );
-        uiZ32 = 0x80000000;
-        goto uiZ;
-    }
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    if ( ! exp ) {
-        if ( ! frac ) {
-            uiZ64 = packToExtF80UI64( sign, 0 );
-            uiZ32 = 0;
-            goto uiZ;
-        }
-        normExpSig = softfloat_normSubnormalF32Sig( frac );
-        exp = normExpSig.exp;
-        frac = normExpSig.sig;
-    }
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    uiZ64 = packToExtF80UI64( sign, exp + 0x3F80 );
-    uiZ32 = 0x80000000 | (u32int) frac<<8;
- uiZ:
-    zSPtr->signExp = uiZ64;
-    zSPtr->signif = (u64int) uiZ32<<32;
-
-}
-
-float32_t
-extF80M_to_f32( const extFloat80_t *aPtr )
-{
-    const struct extFloat80M *aSPtr;
-    u16int uiA64;
-    bool sign;
-    s32int exp;
-    u64int sig;
-    struct commonNaN commonNaN;
-    u32int uiZ, sig32;
-    union ui32_f32 uZ;
-
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    aSPtr = (const struct extFloat80M *) aPtr;
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    uiA64 = aSPtr->signExp;
-    sign = signExtF80UI64( uiA64 );
-    exp  = expExtF80UI64( uiA64 );
-    sig = aSPtr->signif;
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    if ( exp == 0x7FFF ) {
-        if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
-            softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
-            uiZ = softfloat_commonNaNToF32UI( &commonNaN );
-        } else {
-            uiZ = packToF32UI( sign, 0xFF, 0 );
-        }
-        goto uiZ;
-    }
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
-        if ( ! sig ) {
-            uiZ = packToF32UI( sign, 0, 0 );
-            goto uiZ;
-        }
-        exp += softfloat_normExtF80SigM( &sig );
-    }
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
-    sig32 = softfloat_shortShiftRightJam64( sig, 33 );
-    exp -= 0x3F81;
-    if ( sizeof (s16int) < sizeof (s32int) ) {
-        if ( exp < -0x1000 ) exp = -0x1000;
-    }
-    return softfloat_roundPackToF32( sign, exp, sig32 );
-    /*------------------------------------------------------------------------
-    *------------------------------------------------------------------------*/
- uiZ:
-    uZ.ui = uiZ;
-    return uZ.f;
-
-}
-
-struct uint64_extra
+static struct uint64_extra
  softfloat_shiftRightJam64Extra(
      u64int a, u64int extra, u32int dist )
 {
@@ -581,7 +596,7 @@
 
 }
 
-struct uint128
+static struct uint128
  softfloat_shiftRightJam128( u64int a64, u64int a0, u32int dist )
 {
     u8int u8NegDist;
@@ -606,7 +621,7 @@
 
 }
 
-struct uint64_extra
+static struct uint64_extra
  softfloat_shortShiftRightJam64Extra(
      u64int a, u64int extra, u8int dist )
 {
@@ -618,7 +633,7 @@
 
 }
 
-struct exp32_sig64
+static struct exp32_sig64
 softfloat_normSubnormalExtF80Sig( u64int sig )
 {
     s8int shiftDist;
@@ -631,7 +646,7 @@
 
 }
 
-struct uint128
+static struct uint128
  softfloat_sub128( u64int a64, u64int a0, u64int b64, u64int b0 )
 {
     struct uint128 z;
@@ -642,7 +657,7 @@
 
 }
 
-u64int
+static u64int
 softfloat_shiftRightJam64( u64int a, u32int dist )
 {
     return
@@ -650,7 +665,7 @@
 
 }
 
-struct uint128
+static struct uint128
  softfloat_shortShiftLeft128( u64int a64, u64int a0, u8int dist )
 {
     struct uint128 z;
@@ -661,37 +676,7 @@
 
 }
 
-extFloat80_t
- softfloat_normRoundPackToExtF80(
-     bool sign,
-     s32int exp,
-     u64int sig,
-     u64int sigExtra,
-     u8int roundingPrecision
- )
-{
-    s8int shiftDist;
-    struct uint128 sig128;
-
-    if ( ! sig ) {
-        exp -= 64;
-        sig = sigExtra;
-        sigExtra = 0;
-    }
-    shiftDist = softfloat_countLeadingZeros64( sig );
-    exp -= shiftDist;
-    if ( shiftDist ) {
-        sig128 = softfloat_shortShiftLeft128( sig, sigExtra, shiftDist );
-        sig = sig128.v64;
-        sigExtra = sig128.v0;
-    }
-    return
-        softfloat_roundPackToExtF80(
-            sign, exp, sig, sigExtra, roundingPrecision );
-
-}
-
-extFloat80_t
+static extFloat80_t
  softfloat_roundPackToExtF80(
      bool sign,
      s32int exp,
@@ -746,11 +731,6 @@
             if ( roundBits ) {
                 if ( isTiny ) softfloat_raiseFlags( softfloat_flag_underflow );
                 softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-                if ( roundingMode == softfloat_round_odd ) {
-                    sig |= roundMask + 1;
-                }
-#endif
             }
             sig += roundIncrement;
             exp = ((sig & UINT64_C( 0x8000000000000000 )) != 0);
@@ -772,12 +752,6 @@
     *------------------------------------------------------------------------*/
     if ( roundBits ) {
         softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-        if ( roundingMode == softfloat_round_odd ) {
-            sig = (sig & ~roundMask) | (roundMask + 1);
-            goto packReturn;
-        }
-#endif
     }
     sig = (u64int) (sig + roundIncrement);
     if ( sig < roundIncrement ) {
@@ -820,12 +794,6 @@
             if ( sigExtra ) {
                 if ( isTiny ) softfloat_raiseFlags( softfloat_flag_underflow );
                 softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-                if ( roundingMode == softfloat_round_odd ) {
-                    sig |= 1;
-                    goto packReturn;
-                }
-#endif
             }
             doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
             if (
@@ -877,12 +845,6 @@
     *------------------------------------------------------------------------*/
     if ( sigExtra ) {
         softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-        if ( roundingMode == softfloat_round_odd ) {
-            sig |= 1;
-            goto packReturn;
-        }
-#endif
     }
     if ( doIncrement ) {
         ++sig;
@@ -905,7 +867,37 @@
 
 }
 
-extFloat80_t
+static extFloat80_t
+ softfloat_normRoundPackToExtF80(
+     bool sign,
+     s32int exp,
+     u64int sig,
+     u64int sigExtra,
+     u8int roundingPrecision
+ )
+{
+    s8int shiftDist;
+    struct uint128 sig128;
+
+    if ( ! sig ) {
+        exp -= 64;
+        sig = sigExtra;
+        sigExtra = 0;
+    }
+    shiftDist = softfloat_countLeadingZeros64( sig );
+    exp -= shiftDist;
+    if ( shiftDist ) {
+        sig128 = softfloat_shortShiftLeft128( sig, sigExtra, shiftDist );
+        sig = sig128.v64;
+        sigExtra = sig128.v0;
+    }
+    return
+        softfloat_roundPackToExtF80(
+            sign, exp, sig, sigExtra, roundingPrecision );
+
+}
+
+static extFloat80_t
  softfloat_subMagsExtF80(
      u16int uiA64,
      u64int uiA0,
@@ -1020,7 +1012,7 @@
 
 }
 
-extFloat80_t
+static extFloat80_t
  softfloat_addMagsExtF80(
      u16int uiA64,
      u64int uiA0,
@@ -1133,46 +1125,7 @@
 
 }
 
-void
- extF80M_add(
-     const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
-{
-    const struct extFloat80M *aSPtr, *bSPtr;
-    u16int uiA64;
-    u64int uiA0;
-    bool signA;
-    u16int uiB64;
-    u64int uiB0;
-    bool signB;
-#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
-    extFloat80_t
-        (*magsFuncPtr)(
-            u16int, u64int, u16int, u64int, bool );
-#endif
-
-    aSPtr = (const struct extFloat80M *) aPtr;
-    bSPtr = (const struct extFloat80M *) bPtr;
-    uiA64 = aSPtr->signExp;
-    uiA0  = aSPtr->signif;
-    signA = signExtF80UI64( uiA64 );
-    uiB64 = bSPtr->signExp;
-    uiB0  = bSPtr->signif;
-    signB = signExtF80UI64( uiB64 );
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-    if ( signA == signB ) {
-        *zPtr = softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
-    } else {
-        *zPtr = softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
-    }
-#else
-    magsFuncPtr =
-        (signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80;
-    *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
-#endif
-
-}
-
-void
+static void
  softfloat_addM(
      u8int size_words,
      const u32int *aPtr,
@@ -1204,7 +1157,7 @@
 *----------------------------------------------------------------------------*/
 #define softfloat_add96M( aPtr, bPtr, zPtr ) softfloat_addM( 3, aPtr, bPtr, zPtr )
 
-void
+static void
 softfloat_mul64To128M( u64int a, u64int b, u32int *zPtr )
 {
     u32int a32, a0, b32, b0;
@@ -1229,7 +1182,7 @@
 
 }
 
-void
+static void
 softfloat_invalidExtF80M( struct extFloat80M *zSPtr )
 {
 
@@ -1239,7 +1192,7 @@
 
 }
 
-bool
+static bool
  softfloat_tryPropagateNaNExtF80M(
      const struct extFloat80M *aSPtr,
      const struct extFloat80M *bSPtr,
@@ -1262,7 +1215,7 @@
 
 }
 
-void
+static void
  softfloat_shortShiftRightJamM(
      u8int size_words,
      const u32int *aPtr,
@@ -1296,7 +1249,7 @@
 *----------------------------------------------------------------------------*/
 #define softfloat_shiftRightJam96M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 3, aPtr, dist, zPtr )
 
-void
+static void
  softfloat_shiftRightJamM(
      u8int size_words,
      const u32int *aPtr,
@@ -1352,7 +1305,7 @@
 
 }
 
-void
+static void
  softfloat_roundPackMToExtF80M(
      bool sign,
      s32int exp,
@@ -1412,11 +1365,6 @@
             if ( roundBits ) {
                 if ( isTiny ) softfloat_raiseFlags( softfloat_flag_underflow );
                 softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-                if ( roundingMode == softfloat_round_odd ) {
-                    sig |= roundMask + 1;
-                }
-#endif
             }
             sig += roundIncrement;
             exp = ((sig & UINT64_C( 0x8000000000000000 )) != 0);
@@ -1438,12 +1386,6 @@
     *------------------------------------------------------------------------*/
     if ( roundBits ) {
         softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-        if ( roundingMode == softfloat_round_odd ) {
-            sig = (sig & ~roundMask) | (roundMask + 1);
-            goto packReturn;
-        }
-#endif
     }
     sig += roundIncrement;
     if ( sig < roundIncrement ) {
@@ -1488,12 +1430,6 @@
             if ( sigExtra ) {
                 if ( isTiny ) softfloat_raiseFlags( softfloat_flag_underflow );
                 softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-                if ( roundingMode == softfloat_round_odd ) {
-                    sig |= 1;
-                    goto packReturn;
-                }
-#endif
             }
             doIncrement = (0x80000000 <= sigExtra);
             if (
@@ -1542,12 +1478,6 @@
     *------------------------------------------------------------------------*/
     if ( sigExtra ) {
         softfloat_exceptionFlags |= softfloat_flag_inexact;
-#ifdef SOFTFLOAT_ROUND_ODD
-        if ( roundingMode == softfloat_round_odd ) {
-            sig |= 1;
-            goto packReturn;
-        }
-#endif
     }
     if ( doIncrement ) {
         ++sig;
@@ -1564,6 +1494,146 @@
     zSPtr->signExp = packToExtF80UI64( sign, exp );
     zSPtr->signif = sig;
 
+}
+
+void
+f32_to_extF80M( float32_t a, extFloat80_t *zPtr )
+{
+    struct extFloat80M *zSPtr;
+    union ui32_f32 uA;
+    u32int uiA;
+    bool sign;
+    s16int exp;
+    u32int frac;
+    struct commonNaN commonNaN;
+    u16int uiZ64;
+    u32int uiZ32;
+    struct exp16_sig32 normExpSig;
+
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    zSPtr = (struct extFloat80M *) zPtr;
+    uA.f = a;
+    uiA = uA.ui;
+    sign = signF32UI( uiA );
+    exp  = expF32UI( uiA );
+    frac = fracF32UI( uiA );
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    if ( exp == 0xFF ) {
+        if ( frac ) {
+            softfloat_f32UIToCommonNaN( uiA, &commonNaN );
+            softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
+            return;
+        }
+        uiZ64 = packToExtF80UI64( sign, 0x7FFF );
+        uiZ32 = 0x80000000;
+        goto uiZ;
+    }
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    if ( ! exp ) {
+        if ( ! frac ) {
+            uiZ64 = packToExtF80UI64( sign, 0 );
+            uiZ32 = 0;
+            goto uiZ;
+        }
+        normExpSig = softfloat_normSubnormalF32Sig( frac );
+        exp = normExpSig.exp;
+        frac = normExpSig.sig;
+    }
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    uiZ64 = packToExtF80UI64( sign, exp + 0x3F80 );
+    uiZ32 = 0x80000000 | (u32int) frac<<8;
+ uiZ:
+    zSPtr->signExp = uiZ64;
+    zSPtr->signif = (u64int) uiZ32<<32;
+
+}
+
+float32_t
+extF80M_to_f32( const extFloat80_t *aPtr )
+{
+    const struct extFloat80M *aSPtr;
+    u16int uiA64;
+    bool sign;
+    s32int exp;
+    u64int sig;
+    struct commonNaN commonNaN;
+    u32int uiZ, sig32;
+    union ui32_f32 uZ;
+
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    aSPtr = (const struct extFloat80M *) aPtr;
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    uiA64 = aSPtr->signExp;
+    sign = signExtF80UI64( uiA64 );
+    exp  = expExtF80UI64( uiA64 );
+    sig = aSPtr->signif;
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    if ( exp == 0x7FFF ) {
+        if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
+            softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
+            uiZ = softfloat_commonNaNToF32UI( &commonNaN );
+        } else {
+            uiZ = packToF32UI( sign, 0xFF, 0 );
+        }
+        goto uiZ;
+    }
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
+        if ( ! sig ) {
+            uiZ = packToF32UI( sign, 0, 0 );
+            goto uiZ;
+        }
+        exp += softfloat_normExtF80SigM( &sig );
+    }
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+    sig32 = softfloat_shortShiftRightJam64( sig, 33 );
+    exp -= 0x3F81;
+    if ( sizeof (s16int) < sizeof (s32int) ) {
+        if ( exp < -0x1000 ) exp = -0x1000;
+    }
+    return softfloat_roundPackToF32( sign, exp, sig32 );
+    /*------------------------------------------------------------------------
+    *------------------------------------------------------------------------*/
+ uiZ:
+    uZ.ui = uiZ;
+    return uZ.f;
+
+}
+
+void
+ extF80M_add(
+     const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
+{
+    const struct extFloat80M *aSPtr, *bSPtr;
+    u16int uiA64;
+    u64int uiA0;
+    bool signA;
+    u16int uiB64;
+    u64int uiB0;
+    bool signB;
+
+    aSPtr = (const struct extFloat80M *) aPtr;
+    bSPtr = (const struct extFloat80M *) bPtr;
+    uiA64 = aSPtr->signExp;
+    uiA0  = aSPtr->signif;
+    signA = signExtF80UI64( uiA64 );
+    uiB64 = bSPtr->signExp;
+    uiB0  = bSPtr->signif;
+    signB = signExtF80UI64( uiB64 );
+    if ( signA == signB ) {
+        *zPtr = softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
+    } else {
+        *zPtr = softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
+    }
 }
 
 void
--- a/softfloat.h
+++ b/softfloat.h
@@ -35,2084 +35,35 @@
 
 #pragma once
 
-#define SOFTFLOAT_FAST_INT64
-#define LITTLEENDIAN
-#define INLINE_LEVEL 0
-#define SOFTFLOAT_FAST_DIV64TO32
-#define SOFTFLOAT_FAST_DIV32TO16
-#define SOFTFLOAT_ROUND_ODD
-#define INLINE inline
-
-#ifdef SOFTFLOAT_FAST_INT64
-
-#ifdef LITTLEENDIAN
-struct uint128 { u64int v0, v64; };
-struct uint64_extra { u64int extra, v; };
-struct uint128_extra { u64int extra; struct uint128 v; };
-#else
-struct uint128 { u64int v64, v0; };
-struct uint64_extra { u64int v, extra; };
-struct uint128_extra { struct uint128 v; u64int extra; };
-#endif
-
-#endif
-
-/*----------------------------------------------------------------------------
-| These macros are used to isolate the differences in word order between big-
-| endian and little-endian platforms.
-*----------------------------------------------------------------------------*/
-#ifdef LITTLEENDIAN
-#define wordIncr 1
-#define indexWord( total, n ) (n)
-#define indexWordHi( total ) ((total) - 1)
-#define indexWordLo( total ) 0
-#define indexMultiword( total, m, n ) (n)
-#define indexMultiwordHi( total, n ) ((total) - (n))
-#define indexMultiwordLo( total, n ) 0
-#define indexMultiwordHiBut( total, n ) (n)
-#define indexMultiwordLoBut( total, n ) 0
-#define INIT_UINTM4( v3, v2, v1, v0 ) { v0, v1, v2, v3 }
-#else
-#define wordIncr -1
-#define indexWord( total, n ) ((total) - 1 - (n))
-#define indexWordHi( total ) 0
-#define indexWordLo( total ) ((total) - 1)
-#define indexMultiword( total, m, n ) ((total) - 1 - (m))
-#define indexMultiwordHi( total, n ) 0
-#define indexMultiwordLo( total, n ) ((total) - (n))
-#define indexMultiwordHiBut( total, n ) 0
-#define indexMultiwordLoBut( total, n ) (n)
-#define INIT_UINTM4( v3, v2, v1, v0 ) { v3, v2, v1, v0 }
-#endif
-
-#ifndef softfloat_shortShiftRightJam64
-/*----------------------------------------------------------------------------
-| Shifts 'a' right by the number of bits given in 'dist', which must be in
-| the range 1 to 63.  If any nonzero bits are shifted off, they are "jammed"
-| into the least-significant bit of the shifted value by setting the least-
-| significant bit to 1.  This shifted-and-jammed value is returned.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-u64int softfloat_shortShiftRightJam64( u64int a, u8int dist )
-    { return a>>dist | ((a & (((u64int) 1<<dist) - 1)) != 0); }
-#else
-u64int softfloat_shortShiftRightJam64( u64int a, u8int dist );
-#endif
-#endif
-
-#ifndef softfloat_shiftRightJam32
-/*----------------------------------------------------------------------------
-| Shifts 'a' right by the number of bits given in 'dist', which must not
-| be zero.  If any nonzero bits are shifted off, they are "jammed" into the
-| least-significant bit of the shifted value by setting the least-significant
-| bit to 1.  This shifted-and-jammed value is returned.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
-| greater than 32, the result will be either 0 or 1, depending on whether 'a'
-| is zero or nonzero.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE u32int softfloat_shiftRightJam32( u32int a, u16int dist )
-{
-    return
-        (dist < 31) ? a>>dist | ((u32int) (a<<(-dist & 31)) != 0) : (a != 0);
-}
-#else
-u32int softfloat_shiftRightJam32( u32int a, u16int dist );
-#endif
-#endif
-
-#ifndef softfloat_shiftRightJam64
-/*----------------------------------------------------------------------------
-| Shifts 'a' right by the number of bits given in 'dist', which must not
-| be zero.  If any nonzero bits are shifted off, they are "jammed" into the
-| least-significant bit of the shifted value by setting the least-significant
-| bit to 1.  This shifted-and-jammed value is returned.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
-| greater than 64, the result will be either 0 or 1, depending on whether 'a'
-| is zero or nonzero.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
-INLINE u64int softfloat_shiftRightJam64( u64int a, u32int dist )
-{
-    return
-        (dist < 63) ? a>>dist | ((u64int) (a<<(-dist & 63)) != 0) : (a != 0);
-}
-#else
-u64int softfloat_shiftRightJam64( u64int a, u32int dist );
-#endif
-#endif
-
-#ifndef softfloat_countLeadingZeros16
-/*----------------------------------------------------------------------------
-| Returns the number of leading 0 bits before the most-significant 1 bit of
-| 'a'.  If 'a' is zero, 16 is returned.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE u8int softfloat_countLeadingZeros16( u16int a )
-{
-    u8int count = 8;
-    if ( 0x100 <= a ) {
-        count = 0;
-        a >>= 8;
-    }
-    count += softfloat_countLeadingZeros8[a];
-    return count;
-}
-#else
-u8int softfloat_countLeadingZeros16( u16int a );
-#endif
-#endif
-
-#ifndef softfloat_countLeadingZeros32
-/*----------------------------------------------------------------------------
-| Returns the number of leading 0 bits before the most-significant 1 bit of
-| 'a'.  If 'a' is zero, 32 is returned.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
-INLINE u8int softfloat_countLeadingZeros32( u32int a )
-{
-    u8int count = 0;
-    if ( a < 0x10000 ) {
-        count = 16;
-        a <<= 16;
-    }
-    if ( a < 0x1000000 ) {
-        count += 8;
-        a <<= 8;
-    }
-    count += softfloat_countLeadingZeros8[a>>24];
-    return count;
-}
-#else
-u8int softfloat_countLeadingZeros32( u32int a );
-#endif
-#endif
-
-#ifndef softfloat_countLeadingZeros64
-/*----------------------------------------------------------------------------
-| Returns the number of leading 0 bits before the most-significant 1 bit of
-| 'a'.  If 'a' is zero, 64 is returned.
-*----------------------------------------------------------------------------*/
-u8int softfloat_countLeadingZeros64( u64int a );
-#endif
-
-extern const u16int softfloat_approxRecip_1k0s[16];
-extern const u16int softfloat_approxRecip_1k1s[16];
-
-#ifndef softfloat_approxRecip32_1
-/*----------------------------------------------------------------------------
-| Returns an approximation to the reciprocal of the number represented by 'a',
-| where 'a' is interpreted as an unsigned fixed-point number with one integer
-| bit and 31 fraction bits.  The 'a' input must be "normalized", meaning that
-| its most-significant bit (bit 31) must be 1.  Thus, if A is the value of
-| the fixed-point interpretation of 'a', then 1 <= A < 2.  The returned value
-| is interpreted as a pure unsigned fraction, having no integer bits and 32
-| fraction bits.  The approximation returned is never greater than the true
-| reciprocal 1/A, and it differs from the true reciprocal by at most 2.006 ulp
-| (units in the last place).
-*----------------------------------------------------------------------------*/
-#ifdef SOFTFLOAT_FAST_DIV64TO32
-#define softfloat_approxRecip32_1( a ) ((u32int) (UINT64_C( 0x7FFFFFFFFFFFFFFF ) / (u32int) (a)))
-#else
-u32int softfloat_approxRecip32_1( u32int a );
-#endif
-#endif
-
-extern const u16int softfloat_approxRecipSqrt_1k0s[16];
-extern const u16int softfloat_approxRecipSqrt_1k1s[16];
-
-#ifndef softfloat_approxRecipSqrt32_1
-/*----------------------------------------------------------------------------
-| Returns an approximation to the reciprocal of the square root of the number
-| represented by 'a', where 'a' is interpreted as an unsigned fixed-point
-| number either with one integer bit and 31 fraction bits or with two integer
-| bits and 30 fraction bits.  The format of 'a' is determined by 'oddExpA',
-| which must be either 0 or 1.  If 'oddExpA' is 1, 'a' is interpreted as
-| having one integer bit, and if 'oddExpA' is 0, 'a' is interpreted as having
-| two integer bits.  The 'a' input must be "normalized", meaning that its
-| most-significant bit (bit 31) must be 1.  Thus, if A is the value of the
-| fixed-point interpretation of 'a', it follows that 1 <= A < 2 when 'oddExpA'
-| is 1, and 2 <= A < 4 when 'oddExpA' is 0.
-|   The returned value is interpreted as a pure unsigned fraction, having
-| no integer bits and 32 fraction bits.  The approximation returned is never
-| greater than the true reciprocal 1/sqrt(A), and it differs from the true
-| reciprocal by at most 2.06 ulp (units in the last place).  The approximation
-| returned is also always within the range 0.5 to 1; thus, the most-
-| significant bit of the result is always set.
-*----------------------------------------------------------------------------*/
-u32int softfloat_approxRecipSqrt32_1( unsigned int oddExpA, u32int a );
-#endif
-
-#ifdef SOFTFLOAT_FAST_INT64
-
-/*----------------------------------------------------------------------------
-| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
-| defined.
-*----------------------------------------------------------------------------*/
-
-#ifndef softfloat_eq128
-/*----------------------------------------------------------------------------
-| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
-| and 'a0' is equal to the 128-bit unsigned integer formed by concatenating
-| 'b64' and 'b0'.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
-INLINE
-bool softfloat_eq128( u64int a64, u64int a0, u64int b64, u64int b0 )
-    { return (a64 == b64) && (a0 == b0); }
-#else
-bool softfloat_eq128( u64int a64, u64int a0, u64int b64, u64int b0 );
-#endif
-#endif
-
-#ifndef softfloat_le128
-/*----------------------------------------------------------------------------
-| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
-| and 'a0' is less than or equal to the 128-bit unsigned integer formed by
-| concatenating 'b64' and 'b0'.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-bool softfloat_le128( u64int a64, u64int a0, u64int b64, u64int b0 )
-    { return (a64 < b64) || ((a64 == b64) && (a0 <= b0)); }
-#else
-bool softfloat_le128( u64int a64, u64int a0, u64int b64, u64int b0 );
-#endif
-#endif
-
-#ifndef softfloat_lt128
-/*----------------------------------------------------------------------------
-| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
-| and 'a0' is less than the 128-bit unsigned integer formed by concatenating
-| 'b64' and 'b0'.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-bool softfloat_lt128( u64int a64, u64int a0, u64int b64, u64int b0 )
-    { return (a64 < b64) || ((a64 == b64) && (a0 < b0)); }
-#else
-bool softfloat_lt128( u64int a64, u64int a0, u64int b64, u64int b0 );
-#endif
-#endif
-
-#ifndef softfloat_shortShiftLeft128
-/*----------------------------------------------------------------------------
-| Shifts the 128 bits formed by concatenating 'a64' and 'a0' left by the
-| number of bits given in 'dist', which must be in the range 1 to 63.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-struct uint128
- softfloat_shortShiftLeft128( u64int a64, u64int a0, u8int dist )
-{
-    struct uint128 z;
-    z.v64 = a64<<dist | a0>>(-dist & 63);
-    z.v0 = a0<<dist;
-    return z;
-}
-#else
-struct uint128
- softfloat_shortShiftLeft128( u64int a64, u64int a0, u8int dist );
-#endif
-#endif
-
-#ifndef softfloat_shortShiftRight128
-/*----------------------------------------------------------------------------
-| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
-| number of bits given in 'dist', which must be in the range 1 to 63.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-struct uint128
- softfloat_shortShiftRight128( u64int a64, u64int a0, u8int dist )
-{
-    struct uint128 z;
-    z.v64 = a64>>dist;
-    z.v0 = a64<<(-dist & 63) | a0>>dist;
-    return z;
-}
-#else
-struct uint128
- softfloat_shortShiftRight128( u64int a64, u64int a0, u8int dist );
-#endif
-#endif
-
-#ifndef softfloat_shortShiftRightJam64Extra
-/*----------------------------------------------------------------------------
-| This function is the same as 'softfloat_shiftRightJam64Extra' (below),
-| except that 'dist' must be in the range 1 to 63.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-struct uint64_extra
- softfloat_shortShiftRightJam64Extra(
-     u64int a, u64int extra, u8int dist )
-{
-    struct uint64_extra z;
-    z.v = a>>dist;
-    z.extra = a<<(-dist & 63) | (extra != 0);
-    return z;
-}
-#else
-struct uint64_extra
- softfloat_shortShiftRightJam64Extra(
-     u64int a, u64int extra, u8int dist );
-#endif
-#endif
-
-#ifndef softfloat_shortShiftRightJam128
-/*----------------------------------------------------------------------------
-| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
-| number of bits given in 'dist', which must be in the range 1 to 63.  If any
-| nonzero bits are shifted off, they are "jammed" into the least-significant
-| bit of the shifted value by setting the least-significant bit to 1.  This
-| shifted-and-jammed value is returned.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
-INLINE
-struct uint128
- softfloat_shortShiftRightJam128(
-     u64int a64, u64int a0, u8int dist )
-{
-    u8int negDist = -dist;
-    struct uint128 z;
-    z.v64 = a64>>dist;
-    z.v0 =
-        a64<<(negDist & 63) | a0>>dist
-            | ((u64int) (a0<<(negDist & 63)) != 0);
-    return z;
-}
-#else
-struct uint128
- softfloat_shortShiftRightJam128(
-     u64int a64, u64int a0, u8int dist );
-#endif
-#endif
-
-#ifndef softfloat_shortShiftRightJam128Extra
-/*----------------------------------------------------------------------------
-| This function is the same as 'softfloat_shiftRightJam128Extra' (below),
-| except that 'dist' must be in the range 1 to 63.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
-INLINE
-struct uint128_extra
- softfloat_shortShiftRightJam128Extra(
-     u64int a64, u64int a0, u64int extra, u8int dist )
-{
-    u8int negDist = -dist;
-    struct uint128_extra z;
-    z.v.v64 = a64>>dist;
-    z.v.v0 = a64<<(negDist & 63) | a0>>dist;
-    z.extra = a0<<(negDist & 63) | (extra != 0);
-    return z;
-}
-#else
-struct uint128_extra
- softfloat_shortShiftRightJam128Extra(
-     u64int a64, u64int a0, u64int extra, u8int dist );
-#endif
-#endif
-
-#ifndef softfloat_shiftRightJam64Extra
-/*----------------------------------------------------------------------------
-| Shifts the 128 bits formed by concatenating 'a' and 'extra' right by 64
-| _plus_ the number of bits given in 'dist', which must not be zero.  This
-| shifted value is at most 64 nonzero bits and is returned in the 'v' field
-| of the 'struct uint64_extra' result.  The 64-bit 'extra' field of the result
-| contains a value formed as follows from the bits that were shifted off:  The
-| _last_ bit shifted off is the most-significant bit of the 'extra' field, and
-| the other 63 bits of the 'extra' field are all zero if and only if _all_but_
-| _the_last_ bits shifted off were all zero.
-|   (This function makes more sense if 'a' and 'extra' are considered to form
-| an unsigned fixed-point number with binary point between 'a' and 'extra'.
-| This fixed-point value is shifted right by the number of bits given in
-| 'dist', and the integer part of this shifted value is returned in the 'v'
-| field of the result.  The fractional part of the shifted value is modified
-| as described above and returned in the 'extra' field of the result.)
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)
-INLINE
-struct uint64_extra
- softfloat_shiftRightJam64Extra(
-     u64int a, u64int extra, u32int dist )
-{
-    struct uint64_extra z;
-    if ( dist < 64 ) {
-        z.v = a>>dist;
-        z.extra = a<<(-dist & 63);
-    } else {
-        z.v = 0;
-        z.extra = (dist == 64) ? a : (a != 0);
-    }
-    z.extra |= (extra != 0);
-    return z;
-}
-#else
-struct uint64_extra
- softfloat_shiftRightJam64Extra(
-     u64int a, u64int extra, u32int dist );
-#endif
-#endif
-
-#ifndef softfloat_shiftRightJam128
-/*----------------------------------------------------------------------------
-| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
-| number of bits given in 'dist', which must not be zero.  If any nonzero bits
-| are shifted off, they are "jammed" into the least-significant bit of the
-| shifted value by setting the least-significant bit to 1.  This shifted-and-
-| jammed value is returned.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
-| greater than 128, the result will be either 0 or 1, depending on whether the
-| original 128 bits are all zeros.
-*----------------------------------------------------------------------------*/
-struct uint128
- softfloat_shiftRightJam128( u64int a64, u64int a0, u32int dist );
-#endif
-
-#ifndef softfloat_shiftRightJam128Extra
-/*----------------------------------------------------------------------------
-| Shifts the 192 bits formed by concatenating 'a64', 'a0', and 'extra' right
-| by 64 _plus_ the number of bits given in 'dist', which must not be zero.
-| This shifted value is at most 128 nonzero bits and is returned in the 'v'
-| field of the 'struct uint128_extra' result.  The 64-bit 'extra' field of the
-| result contains a value formed as follows from the bits that were shifted
-| off:  The _last_ bit shifted off is the most-significant bit of the 'extra'
-| field, and the other 63 bits of the 'extra' field are all zero if and only
-| if _all_but_the_last_ bits shifted off were all zero.
-|   (This function makes more sense if 'a64', 'a0', and 'extra' are considered
-| to form an unsigned fixed-point number with binary point between 'a0' and
-| 'extra'.  This fixed-point value is shifted right by the number of bits
-| given in 'dist', and the integer part of this shifted value is returned
-| in the 'v' field of the result.  The fractional part of the shifted value
-| is modified as described above and returned in the 'extra' field of the
-| result.)
-*----------------------------------------------------------------------------*/
-struct uint128_extra
- softfloat_shiftRightJam128Extra(
-     u64int a64, u64int a0, u64int extra, u32int dist );
-#endif
-
-#ifndef softfloat_shiftRightJam256M
-/*----------------------------------------------------------------------------
-| Shifts the 256-bit unsigned integer pointed to by 'aPtr' right by the number
-| of bits given in 'dist', which must not be zero.  If any nonzero bits are
-| shifted off, they are "jammed" into the least-significant bit of the shifted
-| value by setting the least-significant bit to 1.  This shifted-and-jammed
-| value is stored at the location pointed to by 'zPtr'.  Each of 'aPtr' and
-| 'zPtr' points to an array of four 64-bit elements that concatenate in the
-| platform's normal endian order to form a 256-bit integer.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist'
-| is greater than 256, the stored result will be either 0 or 1, depending on
-| whether the original 256 bits are all zeros.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shiftRightJam256M(
-     const u64int *aPtr, u32int dist, u64int *zPtr );
-#endif
-
-#ifndef softfloat_add128
-/*----------------------------------------------------------------------------
-| Returns the sum of the 128-bit integer formed by concatenating 'a64' and
-| 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.  The
-| addition is modulo 2^128, so any carry out is lost.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-struct uint128
- softfloat_add128( u64int a64, u64int a0, u64int b64, u64int b0 )
-{
-    struct uint128 z;
-    z.v0 = a0 + b0;
-    z.v64 = a64 + b64 + (z.v0 < a0);
-    return z;
-}
-#else
-struct uint128
- softfloat_add128( u64int a64, u64int a0, u64int b64, u64int b0 );
-#endif
-#endif
-
-#ifndef softfloat_add256M
-/*----------------------------------------------------------------------------
-| Adds the two 256-bit integers pointed to by 'aPtr' and 'bPtr'.  The addition
-| is modulo 2^256, so any carry out is lost.  The sum is stored at the
-| location pointed to by 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to
-| an array of four 64-bit elements that concatenate in the platform's normal
-| endian order to form a 256-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_add256M(
-     const u64int *aPtr, const u64int *bPtr, u64int *zPtr );
-#endif
-
-#ifndef softfloat_sub128
-/*----------------------------------------------------------------------------
-| Returns the difference of the 128-bit integer formed by concatenating 'a64'
-| and 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.
-| The subtraction is modulo 2^128, so any borrow out (carry out) is lost.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-struct uint128
- softfloat_sub128( u64int a64, u64int a0, u64int b64, u64int b0 )
-{
-    struct uint128 z;
-    z.v0 = a0 - b0;
-    z.v64 = a64 - b64;
-    z.v64 -= (a0 < b0);
-    return z;
-}
-#else
-struct uint128
- softfloat_sub128( u64int a64, u64int a0, u64int b64, u64int b0 );
-#endif
-#endif
-
-#ifndef softfloat_sub256M
-/*----------------------------------------------------------------------------
-| Subtracts the 256-bit integer pointed to by 'bPtr' from the 256-bit integer
-| pointed to by 'aPtr'.  The addition is modulo 2^256, so any borrow out
-| (carry out) is lost.  The difference is stored at the location pointed to
-| by 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to an array of four
-| 64-bit elements that concatenate in the platform's normal endian order to
-| form a 256-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_sub256M(
-     const u64int *aPtr, const u64int *bPtr, u64int *zPtr );
-#endif
-
-#ifndef softfloat_mul64ByShifted32To128
-/*----------------------------------------------------------------------------
-| Returns the 128-bit product of 'a', 'b', and 2^32.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
-INLINE struct uint128 softfloat_mul64ByShifted32To128( u64int a, u32int b )
-{
-    u64int mid;
-    struct uint128 z;
-    mid = (u64int) (u32int) a * b;
-    z.v0 = mid<<32;
-    z.v64 = (u64int) (u32int) (a>>32) * b + (mid>>32);
-    return z;
-}
-#else
-struct uint128 softfloat_mul64ByShifted32To128( u64int a, u32int b );
-#endif
-#endif
+typedef struct extFloat80M extFloat80_t;
+typedef float float32_t;
 
-#ifndef softfloat_mul64To128
-/*----------------------------------------------------------------------------
-| Returns the 128-bit product of 'a' and 'b'.
-*----------------------------------------------------------------------------*/
-struct uint128 softfloat_mul64To128( u64int a, u64int b );
-#endif
-
-#ifndef softfloat_mul128By32
-/*----------------------------------------------------------------------------
-| Returns the product of the 128-bit integer formed by concatenating 'a64' and
-| 'a0', multiplied by 'b'.  The multiplication is modulo 2^128; any overflow
-| bits are discarded.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)
-INLINE
-struct uint128 softfloat_mul128By32( u64int a64, u64int a0, u32int b )
-{
-    struct uint128 z;
-    u64int mid;
-    u32int carry;
-    z.v0 = a0 * b;
-    mid = (u64int) (u32int) (a0>>32) * b;
-    carry = (u32int) ((u32int) (z.v0>>32) - (u32int) mid);
-    z.v64 = a64 * b + (u32int) ((mid + carry)>>32);
-    return z;
-}
+#ifdef __plan9__
+#define LITTLE_ENDIAN 1234
+#define BIG_ENDIAN 4321
+#if defined(__mips__) || \
+    defined(__power__) || defined(__power64__) || \
+    defined(__sparc__) || defined(__sparc64__)
+#define BYTE_ORDER BIG_ENDIAN
 #else
-struct uint128 softfloat_mul128By32( u64int a64, u64int a0, u32int b );
+#define BYTE_ORDER LITTLE_ENDIAN
 #endif
-#endif
-
-#ifndef softfloat_mul128To256M
-/*----------------------------------------------------------------------------
-| Multiplies the 128-bit unsigned integer formed by concatenating 'a64' and
-| 'a0' by the 128-bit unsigned integer formed by concatenating 'b64' and
-| 'b0'.  The 256-bit product is stored at the location pointed to by 'zPtr'.
-| Argument 'zPtr' points to an array of four 64-bit elements that concatenate
-| in the platform's normal endian order to form a 256-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_mul128To256M(
-     u64int a64, u64int a0, u64int b64, u64int b0, u64int *zPtr );
-#endif
-
 #else
-
-/*----------------------------------------------------------------------------
-| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
-| defined.
-*----------------------------------------------------------------------------*/
-
-#ifndef softfloat_compare96M
-/*----------------------------------------------------------------------------
-| Compares the two 96-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.
-| Returns -1 if the first integer (A) is less than the second (B); returns 0
-| if the two integers are equal; and returns +1 if the first integer (A)
-| is greater than the second (B).  (The result is thus the signum of A - B.)
-| Each of 'aPtr' and 'bPtr' points to an array of three 32-bit elements that
-| concatenate in the platform's normal endian order to form a 96-bit integer.
-*----------------------------------------------------------------------------*/
-s8int softfloat_compare96M( const u32int *aPtr, const u32int *bPtr );
+#include <endian.h>
+#ifndef BYTE_ORDER
+#define LITTLE_ENDIAN __LITTLE_ENDIAN
+#define BIG_ENDIAN __BIG_ENDIAN
+#define BYTE_ORDER __BYTE_ORDER
 #endif
-
-#ifndef softfloat_compare128M
-/*----------------------------------------------------------------------------
-| Compares the two 128-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.
-| Returns -1 if the first integer (A) is less than the second (B); returns 0
-| if the two integers are equal; and returns +1 if the first integer (A)
-| is greater than the second (B).  (The result is thus the signum of A - B.)
-| Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that
-| concatenate in the platform's normal endian order to form a 128-bit integer.
-*----------------------------------------------------------------------------*/
-s8int
- softfloat_compare128M( const u32int *aPtr, const u32int *bPtr );
 #endif
 
-#ifndef softfloat_shortShiftLeft64To96M
-/*----------------------------------------------------------------------------
-| Extends 'a' to 96 bits and shifts the value left by the number of bits given
-| in 'dist', which must be in the range 1 to 31.  The result is stored at the
-| location pointed to by 'zPtr'.  Argument 'zPtr' points to an array of three
-| 32-bit elements that concatenate in the platform's normal endian order to
-| form a 96-bit integer.
-*----------------------------------------------------------------------------*/
-#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
-INLINE
-void
- softfloat_shortShiftLeft64To96M(
-     u64int a, u8int dist, u32int *zPtr )
-{
-    zPtr[indexWord( 3, 0 )] = (u32int) a<<dist;
-    a >>= 32 - dist;
-    zPtr[indexWord( 3, 2 )] = a>>32;
-    zPtr[indexWord( 3, 1 )] = a;
-}
-#else
-void
- softfloat_shortShiftLeft64To96M(
-     u64int a, u8int dist, u32int *zPtr );
-#endif
-#endif
-
-#ifndef softfloat_shortShiftLeftM
-/*----------------------------------------------------------------------------
-| Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number
-| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
-| must be in the range 1 to 31.  Any nonzero bits shifted off are lost.  The
-| shifted N-bit result is stored at the location pointed to by 'zPtr'.  Each
-| of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements
-| that concatenate in the platform's normal endian order to form an N-bit
-| integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shortShiftLeftM(
-     u8int size_words,
-     const u32int *aPtr,
-     u8int dist,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_shortShiftLeft96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shortShiftLeftM' with
-| 'size_words' = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_shortShiftLeft96M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 3, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shortShiftLeft128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shortShiftLeftM' with
-| 'size_words' = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_shortShiftLeft128M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 4, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shortShiftLeft160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shortShiftLeftM' with
-| 'size_words' = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_shortShiftLeft160M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 5, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shiftLeftM
-/*----------------------------------------------------------------------------
-| Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number
-| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
-| must not be zero.  Any nonzero bits shifted off are lost.  The shifted
-| N-bit result is stored at the location pointed to by 'zPtr'.  Each of 'aPtr'
-| and 'zPtr' points to a 'size_words'-long array of 32-bit elements that
-| concatenate in the platform's normal endian order to form an N-bit integer.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
-| greater than N, the stored result will be 0.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shiftLeftM(
-     u8int size_words,
-     const u32int *aPtr,
-     u32int dist,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_shiftLeft96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shiftLeftM' with
-| 'size_words' = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_shiftLeft96M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 3, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shiftLeft128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shiftLeftM' with
-| 'size_words' = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_shiftLeft128M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 4, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shiftLeft160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shiftLeftM' with
-| 'size_words' = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_shiftLeft160M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 5, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shortShiftRightM
-/*----------------------------------------------------------------------------
-| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
-| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
-| must be in the range 1 to 31.  Any nonzero bits shifted off are lost.  The
-| shifted N-bit result is stored at the location pointed to by 'zPtr'.  Each
-| of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements
-| that concatenate in the platform's normal endian order to form an N-bit
-| integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shortShiftRightM(
-     u8int size_words,
-     const u32int *aPtr,
-     u8int dist,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_shortShiftRight128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shortShiftRightM' with
-| 'size_words' = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_shortShiftRight128M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 4, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shortShiftRight160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shortShiftRightM' with
-| 'size_words' = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_shortShiftRight160M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 5, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shortShiftRightJamM
-/*----------------------------------------------------------------------------
-| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
-| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
-| must be in the range 1 to 31.  If any nonzero bits are shifted off, they are
-| "jammed" into the least-significant bit of the shifted value by setting the
-| least-significant bit to 1.  This shifted-and-jammed N-bit result is stored
-| at the location pointed to by 'zPtr'.  Each of 'aPtr' and 'zPtr' points
-| to a 'size_words'-long array of 32-bit elements that concatenate in the
-| platform's normal endian order to form an N-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shortShiftRightJamM(
-     u8int, const u32int *, u8int, u32int * );
-#endif
-
-#ifndef softfloat_shortShiftRightJam160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shortShiftRightJamM' with
-| 'size_words' = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_shortShiftRightJam160M( aPtr, dist, zPtr ) softfloat_shortShiftRightJamM( 5, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shiftRightM
-/*----------------------------------------------------------------------------
-| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
-| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
-| must not be zero.  Any nonzero bits shifted off are lost.  The shifted
-| N-bit result is stored at the location pointed to by 'zPtr'.  Each of 'aPtr'
-| and 'zPtr' points to a 'size_words'-long array of 32-bit elements that
-| concatenate in the platform's normal endian order to form an N-bit integer.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
-| greater than N, the stored result will be 0.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shiftRightM(
-     u8int size_words,
-     const u32int *aPtr,
-     u32int dist,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_shiftRight96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shiftRightM' with
-| 'size_words' = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_shiftRight96M( aPtr, dist, zPtr ) softfloat_shiftRightM( 3, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shiftRightJamM
-/*----------------------------------------------------------------------------
-| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
-| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
-| must not be zero.  If any nonzero bits are shifted off, they are "jammed"
-| into the least-significant bit of the shifted value by setting the least-
-| significant bit to 1.  This shifted-and-jammed N-bit result is stored
-| at the location pointed to by 'zPtr'.  Each of 'aPtr' and 'zPtr' points
-| to a 'size_words'-long array of 32-bit elements that concatenate in the
-| platform's normal endian order to form an N-bit integer.
-|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist'
-| is greater than N, the stored result will be either 0 or 1, depending on
-| whether the original N bits are all zeros.
-*----------------------------------------------------------------------------*/
-void
- softfloat_shiftRightJamM(
-     u8int size_words,
-     const u32int *aPtr,
-     u32int dist,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_shiftRightJam128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shiftRightJamM' with
-| 'size_words' = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_shiftRightJam128M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 4, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_shiftRightJam160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_shiftRightJamM' with
-| 'size_words' = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_shiftRightJam160M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 5, aPtr, dist, zPtr )
-#endif
-
-#ifndef softfloat_addM
-/*----------------------------------------------------------------------------
-| Adds the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =
-| 'size_words' * 32.  The addition is modulo 2^N, so any carry out is lost.
-| The N-bit sum is stored at the location pointed to by 'zPtr'.  Each of
-| 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long array of 32-bit
-| elements that concatenate in the platform's normal endian order to form an
-| N-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_addM(
-     u8int size_words,
-     const u32int *aPtr,
-     const u32int *bPtr,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_add128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_addM' with 'size_words'
-| = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_add128M( aPtr, bPtr, zPtr ) softfloat_addM( 4, aPtr, bPtr, zPtr )
-#endif
-
-#ifndef softfloat_add160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_addM' with 'size_words'
-| = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_add160M( aPtr, bPtr, zPtr ) softfloat_addM( 5, aPtr, bPtr, zPtr )
-#endif
-
-#ifndef softfloat_addCarryM
-/*----------------------------------------------------------------------------
-| Adds the two N-bit unsigned integers pointed to by 'aPtr' and 'bPtr', where
-| N = 'size_words' * 32, plus 'carry', which must be either 0 or 1.  The N-bit
-| sum (modulo 2^N) is stored at the location pointed to by 'zPtr', and any
-| carry out is returned as the result.  Each of 'aPtr', 'bPtr', and 'zPtr'
-| points to a 'size_words'-long array of 32-bit elements that concatenate in
-| the platform's normal endian order to form an N-bit integer.
-*----------------------------------------------------------------------------*/
-u8int
- softfloat_addCarryM(
-     u8int size_words,
-     const u32int *aPtr,
-     const u32int *bPtr,
-     u8int carry,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_addComplCarryM
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_addCarryM', except that
-| the value of the unsigned integer pointed to by 'bPtr' is bit-wise completed
-| before the addition.
-*----------------------------------------------------------------------------*/
-u8int
- softfloat_addComplCarryM(
-     u8int size_words,
-     const u32int *aPtr,
-     const u32int *bPtr,
-     u8int carry,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_addComplCarry96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_addComplCarryM' with
-| 'size_words' = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_addComplCarry96M( aPtr, bPtr, carry, zPtr ) softfloat_addComplCarryM( 3, aPtr, bPtr, carry, zPtr )
-#endif
-
-#ifndef softfloat_negXM
-/*----------------------------------------------------------------------------
-| Replaces the N-bit unsigned integer pointed to by 'zPtr' by the
-| 2s-complement of itself, where N = 'size_words' * 32.  Argument 'zPtr'
-| points to a 'size_words'-long array of 32-bit elements that concatenate in
-| the platform's normal endian order to form an N-bit integer.
-*----------------------------------------------------------------------------*/
-void softfloat_negXM( u8int size_words, u32int *zPtr );
-#endif
-
-#ifndef softfloat_negX96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_negXM' with 'size_words'
-| = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_negX96M( zPtr ) softfloat_negXM( 3, zPtr )
-#endif
-
-#ifndef softfloat_negX128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_negXM' with 'size_words'
-| = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_negX128M( zPtr ) softfloat_negXM( 4, zPtr )
-#endif
-
-#ifndef softfloat_negX160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_negXM' with 'size_words'
-| = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_negX160M( zPtr ) softfloat_negXM( 5, zPtr )
-#endif
-
-#ifndef softfloat_negX256M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_negXM' with 'size_words'
-| = 8 (N = 256).
-*----------------------------------------------------------------------------*/
-#define softfloat_negX256M( zPtr ) softfloat_negXM( 8, zPtr )
-#endif
-
-#ifndef softfloat_sub1XM
-/*----------------------------------------------------------------------------
-| Subtracts 1 from the N-bit integer pointed to by 'zPtr', where N =
-| 'size_words' * 32.  The subtraction is modulo 2^N, so any borrow out (carry
-| out) is lost.  Argument 'zPtr' points to a 'size_words'-long array of 32-bit
-| elements that concatenate in the platform's normal endian order to form an
-| N-bit integer.
-*----------------------------------------------------------------------------*/
-void softfloat_sub1XM( u8int size_words, u32int *zPtr );
-#endif
-
-#ifndef softfloat_sub1X96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_sub1XM' with 'size_words'
-| = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_sub1X96M( zPtr ) softfloat_sub1XM( 3, zPtr )
-#endif
-
-#ifndef softfloat_sub1X160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_sub1XM' with 'size_words'
-| = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_sub1X160M( zPtr ) softfloat_sub1XM( 5, zPtr )
-#endif
-
-#ifndef softfloat_subM
-/*----------------------------------------------------------------------------
-| Subtracts the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =
-| 'size_words' * 32.  The subtraction is modulo 2^N, so any borrow out (carry
-| out) is lost.  The N-bit difference is stored at the location pointed to by
-| 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long
-| array of 32-bit elements that concatenate in the platform's normal endian
-| order to form an N-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_subM(
-     u8int size_words,
-     const u32int *aPtr,
-     const u32int *bPtr,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_sub96M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_subM' with 'size_words'
-| = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_sub96M( aPtr, bPtr, zPtr ) softfloat_subM( 3, aPtr, bPtr, zPtr )
-#endif
-
-#ifndef softfloat_sub128M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_subM' with 'size_words'
-| = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_sub128M( aPtr, bPtr, zPtr ) softfloat_subM( 4, aPtr, bPtr, zPtr )
-#endif
-
-#ifndef softfloat_sub160M
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_subM' with 'size_words'
-| = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_sub160M( aPtr, bPtr, zPtr ) softfloat_subM( 5, aPtr, bPtr, zPtr )
-#endif
-
-#ifndef softfloat_mul64To128M
-/*----------------------------------------------------------------------------
-| Multiplies 'a' and 'b' and stores the 128-bit product at the location
-| pointed to by 'zPtr'.  Argument 'zPtr' points to an array of four 32-bit
-| elements that concatenate in the platform's normal endian order to form a
-| 128-bit integer.
-*----------------------------------------------------------------------------*/
-void softfloat_mul64To128M( u64int a, u64int b, u32int *zPtr );
-#endif
-
-#ifndef softfloat_mul128MTo256M
-/*----------------------------------------------------------------------------
-| Multiplies the two 128-bit unsigned integers pointed to by 'aPtr' and
-| 'bPtr', and stores the 256-bit product at the location pointed to by 'zPtr'.
-| Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that
-| concatenate in the platform's normal endian order to form a 128-bit integer.
-| Argument 'zPtr' points to an array of eight 32-bit elements that concatenate
-| to form a 256-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_mul128MTo256M(
-     const u32int *aPtr, const u32int *bPtr, u32int *zPtr );
-#endif
-
-#ifndef softfloat_remStepMBy32
-/*----------------------------------------------------------------------------
-| Performs a "remainder reduction step" as follows:  Arguments 'remPtr' and
-| 'bPtr' both point to N-bit unsigned integers, where N = 'size_words' * 32.
-| Defining R and B as the values of those integers, the expression (R<<'dist')
-| - B * q is computed modulo 2^N, and the N-bit result is stored at the
-| location pointed to by 'zPtr'.  Each of 'remPtr', 'bPtr', and 'zPtr' points
-| to a 'size_words'-long array of 32-bit elements that concatenate in the
-| platform's normal endian order to form an N-bit integer.
-*----------------------------------------------------------------------------*/
-void
- softfloat_remStepMBy32(
-     u8int size_words,
-     const u32int *remPtr,
-     u8int dist,
-     const u32int *bPtr,
-     u32int q,
-     u32int *zPtr
- );
-#endif
-
-#ifndef softfloat_remStep96MBy32
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_remStepMBy32' with
-| 'size_words' = 3 (N = 96).
-*----------------------------------------------------------------------------*/
-#define softfloat_remStep96MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 3, remPtr, dist, bPtr, q, zPtr )
-#endif
-
-#ifndef softfloat_remStep128MBy32
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_remStepMBy32' with
-| 'size_words' = 4 (N = 128).
-*----------------------------------------------------------------------------*/
-#define softfloat_remStep128MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 4, remPtr, dist, bPtr, q, zPtr )
-#endif
-
-#ifndef softfloat_remStep160MBy32
-/*----------------------------------------------------------------------------
-| This function or macro is the same as 'softfloat_remStepMBy32' with
-| 'size_words' = 5 (N = 160).
-*----------------------------------------------------------------------------*/
-#define softfloat_remStep160MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 5, remPtr, dist, bPtr, q, zPtr )
-#endif
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Types used to pass 16-bit, 32-bit, 64-bit, and 128-bit floating-point
-| arguments and results to/from functions.  These types must be exactly
-| 16 bits, 32 bits, 64 bits, and 128 bits in size, respectively.  Where a
-| platform has "native" support for IEEE-Standard floating-point formats,
-| the types below may, if desired, be defined as aliases for the native types
-| (typically 'float' and 'double', and possibly 'long double').
-*----------------------------------------------------------------------------*/
-
-typedef struct { u16int v; } float16_t;
-typedef struct { u16int v; } bfloat16_t;
-typedef struct { u32int v; } float32_t;
-typedef struct { u64int v; } float64_t;
-typedef struct { u64int v[2]; } float128_t;
-
-/*----------------------------------------------------------------------------
-| The format of an 80-bit extended floating-point number in memory.  This
-| structure must contain a 16-bit field named 'signExp' and a 64-bit field
-| named 'signif'.
-*----------------------------------------------------------------------------*/
-#ifdef LITTLEENDIAN
+#if BYTE_ORDER == LITTLE_ENDIAN
 struct extFloat80M { u64int signif; u16int signExp; };
 #else
 struct extFloat80M { u16int signExp; u64int signif; };
 #endif
 
-/*----------------------------------------------------------------------------
-| The type used to pass 80-bit extended floating-point arguments and
-| results to/from functions.  This type must have size identical to
-| 'struct extFloat80M'.  Type 'extFloat80_t' can be defined as an alias for
-| 'struct extFloat80M'.  Alternatively, if a platform has "native" support
-| for IEEE-Standard 80-bit extended floating-point, it may be possible,
-| if desired, to define 'extFloat80_t' as an alias for the native type
-| (presumably either 'long double' or a nonstandard compiler-intrinsic type).
-| In that case, the 'signif' and 'signExp' fields of 'struct extFloat80M'
-| must align exactly with the locations in memory of the sign, exponent, and
-| significand of the native type.
-*----------------------------------------------------------------------------*/
-typedef struct extFloat80M extFloat80_t;
-
-union ui16_f16 { u16int ui; float16_t f; };
-union ui16_bf16 { u16int ui; bfloat16_t f; };
-union ui32_f32 { u32int ui; float32_t f; };
-union ui64_f64 { u64int ui; float64_t f; };
-
-#ifdef SOFTFLOAT_FAST_INT64
-union extF80M_extF80 { struct extFloat80M fM; extFloat80_t f; };
-union ui128_f128 { struct uint128 ui; float128_t f; };
-#endif
-
-enum {
-    softfloat_mulAdd_subC    = 1,
-    softfloat_mulAdd_subProd = 2
-};
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-u32int softfloat_roundToUI32( bool, u64int, u8int, bool );
-
-#ifdef SOFTFLOAT_FAST_INT64
-u64int
- softfloat_roundToUI64(
-     bool, u64int, u64int, u8int, bool );
-#else
-u64int softfloat_roundMToUI64( bool, u32int *, u8int, bool );
-#endif
-
-s32int softfloat_roundToI32( bool, u64int, u8int, bool );
-
-#ifdef SOFTFLOAT_FAST_INT64
-s64int
- softfloat_roundToI64(
-     bool, u64int, u64int, u8int, bool );
-#else
-s64int softfloat_roundMToI64( bool, u32int *, u8int, bool );
-#endif
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signF16UI( a ) ((bool) ((u16int) (a)>>15))
-#define expF16UI( a ) ((s8int) ((a)>>10) & 0x1F)
-#define fracF16UI( a ) ((a) & 0x03FF)
-#define packToF16UI( sign, exp, sig ) (((u16int) (sign)<<15) + ((u16int) (exp)<<10) + (sig))
-
-#define isNaNF16UI( a ) (((~(a) & 0x7C00) == 0) && ((a) & 0x03FF))
-
-struct exp8_sig16 { s8int exp; u16int sig; };
-struct exp8_sig16 softfloat_normSubnormalF16Sig( u16int );
-
-float16_t softfloat_roundPackToF16( bool, s16int, u16int );
-float16_t softfloat_normRoundPackToF16( bool, s16int, u16int );
-
-float16_t softfloat_addMagsF16( u16int, u16int );
-float16_t softfloat_subMagsF16( u16int, u16int );
-float16_t
- softfloat_mulAddF16(
-     u16int, u16int, u16int, u8int );
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signBF16UI( a ) ((bool) ((u16int) (a)>>15))
-#define expBF16UI( a ) ((s16int) ((a)>>7) & 0xFF)
-#define fracBF16UI( a ) ((a) & 0x07F)
-#define packToBF16UI( sign, exp, sig ) (((u16int) (sign)<<15) + ((u16int) (exp)<<7) + (sig))
-
-#define isNaNBF16UI( a ) (((~(a) & 0x7FC0) == 0) && ((a) & 0x07F))
-
-bfloat16_t softfloat_roundPackToBF16( bool, s16int, u16int );
-struct exp8_sig16 softfloat_normSubnormalBF16Sig( u16int );
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signF32UI( a ) ((bool) ((u32int) (a)>>31))
-#define expF32UI( a ) ((s16int) ((a)>>23) & 0xFF)
-#define fracF32UI( a ) ((a) & 0x007FFFFF)
-#define packToF32UI( sign, exp, sig ) (((u32int) (sign)<<31) + ((u32int) (exp)<<23) + (sig))
-
-#define isNaNF32UI( a ) (((~(a) & 0x7F800000) == 0) && ((a) & 0x007FFFFF))
-
-struct exp16_sig32 { s16int exp; u32int sig; };
-struct exp16_sig32 softfloat_normSubnormalF32Sig( u32int );
-
-float32_t softfloat_roundPackToF32( bool, s16int, u32int );
-float32_t softfloat_normRoundPackToF32( bool, s16int, u32int );
-
-float32_t softfloat_addMagsF32( u32int, u32int );
-float32_t softfloat_subMagsF32( u32int, u32int );
-float32_t
- softfloat_mulAddF32(
-     u32int, u32int, u32int, u8int );
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signF64UI( a ) ((bool) ((u64int) (a)>>63))
-#define expF64UI( a ) ((s16int) ((a)>>52) & 0x7FF)
-#define fracF64UI( a ) ((a) & UINT64_C( 0x000FFFFFFFFFFFFF ))
-#define packToF64UI( sign, exp, sig ) ((u64int) (((u64int) (sign)<<63) + ((u64int) (exp)<<52) + (sig)))
-
-#define isNaNF64UI( a ) (((~(a) & UINT64_C( 0x7FF0000000000000 )) == 0) && ((a) & UINT64_C( 0x000FFFFFFFFFFFFF )))
-
-struct exp16_sig64 { s16int exp; u64int sig; };
-struct exp16_sig64 softfloat_normSubnormalF64Sig( u64int );
-
-float64_t softfloat_roundPackToF64( bool, s16int, u64int );
-float64_t softfloat_normRoundPackToF64( bool, s16int, u64int );
-
-float64_t softfloat_addMagsF64( u64int, u64int, bool );
-float64_t softfloat_subMagsF64( u64int, u64int, bool );
-float64_t
- softfloat_mulAddF64(
-     u64int, u64int, u64int, u8int );
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signExtF80UI64( a64 ) ((bool) ((u16int) (a64)>>15))
-#define expExtF80UI64( a64 ) ((a64) & 0x7FFF)
-#define packToExtF80UI64( sign, exp ) ((u16int) (sign)<<15 | (exp))
-
-#define isNaNExtF80UI( a64, a0 ) ((((a64) & 0x7FFF) == 0x7FFF) && ((a0) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
-
-#ifdef SOFTFLOAT_FAST_INT64
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-
-struct exp32_sig64 { s32int exp; u64int sig; };
-struct exp32_sig64 softfloat_normSubnormalExtF80Sig( u64int );
-
-extFloat80_t
- softfloat_roundPackToExtF80(
-     bool, s32int, u64int, u64int, u8int );
-extFloat80_t
- softfloat_normRoundPackToExtF80(
-     bool, s32int, u64int, u64int, u8int );
-
-extFloat80_t
- softfloat_addMagsExtF80(
-     u16int, u64int, u16int, u64int, bool );
-extFloat80_t
- softfloat_subMagsExtF80(
-     u16int, u64int, u16int, u64int, bool );
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signF128UI64( a64 ) ((bool) ((u64int) (a64)>>63))
-#define expF128UI64( a64 ) ((s32int) ((a64)>>48) & 0x7FFF)
-#define fracF128UI64( a64 ) ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))
-#define packToF128UI64( sign, exp, sig64 ) (((u64int) (sign)<<63) + ((u64int) (exp)<<48) + (sig64))
-
-#define isNaNF128UI( a64, a0 ) (((~(a64) & UINT64_C( 0x7FFF000000000000 )) == 0) && (a0 || ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))))
-
-struct exp32_sig128 { s32int exp; struct uint128 sig; };
-struct exp32_sig128
- softfloat_normSubnormalF128Sig( u64int, u64int );
-
-float128_t
- softfloat_roundPackToF128(
-     bool, s32int, u64int, u64int, u64int );
-float128_t
- softfloat_normRoundPackToF128(
-     bool, s32int, u64int, u64int );
-
-float128_t
- softfloat_addMagsF128(
-     u64int, u64int, u64int, u64int, bool );
-float128_t
- softfloat_subMagsF128(
-     u64int, u64int, u64int, u64int, bool );
-float128_t
- softfloat_mulAddF128(
-     u64int,
-     u64int,
-     u64int,
-     u64int,
-     u64int,
-     u64int,
-     u8int
- );
-
-#else
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-
-bool
- softfloat_tryPropagateNaNExtF80M(
-     const struct extFloat80M *,
-     const struct extFloat80M *,
-     struct extFloat80M *
- );
-void softfloat_invalidExtF80M( struct extFloat80M * );
-
-int softfloat_normExtF80SigM( u64int * );
-
-void
- softfloat_roundPackMToExtF80M(
-     bool, s32int, u32int *, u8int, struct extFloat80M * );
-void
- softfloat_normRoundPackMToExtF80M(
-     bool, s32int, u32int *, u8int, struct extFloat80M * );
-
-void
- softfloat_addExtF80M(
-     const struct extFloat80M *,
-     const struct extFloat80M *,
-     struct extFloat80M *,
-     bool
- );
-
-int
- softfloat_compareNonnormExtF80M(
-     const struct extFloat80M *, const struct extFloat80M * );
-
-/*----------------------------------------------------------------------------
-*----------------------------------------------------------------------------*/
-#define signF128UI96( a96 ) ((bool) ((u32int) (a96)>>31))
-#define expF128UI96( a96 ) ((s32int) ((a96)>>16) & 0x7FFF)
-#define fracF128UI96( a96 ) ((a96) & 0x0000FFFF)
-#define packToF128UI96( sign, exp, sig96 ) (((u32int) (sign)<<31) + ((u32int) (exp)<<16) + (sig96))
-
-bool softfloat_isNaNF128M( const u32int * );
-
-bool
- softfloat_tryPropagateNaNF128M(
-     const u32int *, const u32int *, u32int * );
-void softfloat_invalidF128M( u32int * );
-
-int softfloat_shiftNormSigF128M( const u32int *, u8int, u32int * );
-
-void softfloat_roundPackMToF128M( bool, s32int, u32int *, u32int * );
-void softfloat_normRoundPackMToF128M( bool, s32int, u32int *, u32int * );
-
-void
- softfloat_addF128M( const u32int *, const u32int *, u32int *, bool );
-void
- softfloat_mulAddF128M(
-     const u32int *,
-     const u32int *,
-     const u32int *,
-     u32int *,
-     u8int
- );
-
-#endif
-
-#ifndef THREAD_LOCAL
-#define THREAD_LOCAL
-#endif
-
-/*----------------------------------------------------------------------------
-| Software floating-point underflow tininess-detection mode.
-*----------------------------------------------------------------------------*/
-extern THREAD_LOCAL u8int softfloat_detectTininess;
-enum {
-    softfloat_tininess_beforeRounding = 0,
-    softfloat_tininess_afterRounding  = 1
-};
-
-/*----------------------------------------------------------------------------
-| Software floating-point rounding mode.  (Mode "odd" is supported only if
-| SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.)
-*----------------------------------------------------------------------------*/
-extern THREAD_LOCAL u8int softfloat_roundingMode;
-enum {
-    softfloat_round_near_even   = 0,
-    softfloat_round_minMag      = 1,
-    softfloat_round_min         = 2,
-    softfloat_round_max         = 3,
-    softfloat_round_near_maxMag = 4,
-    softfloat_round_odd         = 6
-};
-
-/*----------------------------------------------------------------------------
-| Software floating-point exception flags.
-*----------------------------------------------------------------------------*/
-extern THREAD_LOCAL u8int softfloat_exceptionFlags;
-typedef enum {
-    softfloat_flag_inexact   =  1,
-    softfloat_flag_underflow =  2,
-    softfloat_flag_overflow  =  4,
-    softfloat_flag_infinite  =  8,
-    softfloat_flag_invalid   = 16
-} exceptionFlag_t;
-
-/*----------------------------------------------------------------------------
-| Routine to raise any or all of the software floating-point exception flags.
-*----------------------------------------------------------------------------*/
-void softfloat_raiseFlags( u8int );
-
-/*----------------------------------------------------------------------------
-| Integer-to-floating-point conversion routines.
-*----------------------------------------------------------------------------*/
-float16_t ui32_to_f16( u32int );
-float32_t ui32_to_f32( u32int );
-float64_t ui32_to_f64( u32int );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t ui32_to_extF80( u32int );
-float128_t ui32_to_f128( u32int );
-#endif
-void ui32_to_extF80M( u32int, extFloat80_t * );
-void ui32_to_f128M( u32int, float128_t * );
-float16_t ui64_to_f16( u64int );
-float32_t ui64_to_f32( u64int );
-float64_t ui64_to_f64( u64int );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t ui64_to_extF80( u64int );
-float128_t ui64_to_f128( u64int );
-#endif
-void ui64_to_extF80M( u64int, extFloat80_t * );
-void ui64_to_f128M( u64int, float128_t * );
-float16_t i32_to_f16( s32int );
-float32_t i32_to_f32( s32int );
-float64_t i32_to_f64( s32int );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t i32_to_extF80( s32int );
-float128_t i32_to_f128( s32int );
-#endif
-void i32_to_extF80M( s32int, extFloat80_t * );
-void i32_to_f128M( s32int, float128_t * );
-float16_t i64_to_f16( s64int );
-float32_t i64_to_f32( s64int );
-float64_t i64_to_f64( s64int );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t i64_to_extF80( s64int );
-float128_t i64_to_f128( s64int );
-#endif
-void i64_to_extF80M( s64int, extFloat80_t * );
-void i64_to_f128M( s64int, float128_t * );
-
-/*----------------------------------------------------------------------------
-| 16-bit (half-precision) floating-point operations.
-*----------------------------------------------------------------------------*/
-u32int f16_to_ui32( float16_t, u8int, bool );
-u64int f16_to_ui64( float16_t, u8int, bool );
-s32int f16_to_i32( float16_t, u8int, bool );
-s64int f16_to_i64( float16_t, u8int, bool );
-u32int f16_to_ui32_r_minMag( float16_t, bool );
-u64int f16_to_ui64_r_minMag( float16_t, bool );
-s32int f16_to_i32_r_minMag( float16_t, bool );
-s64int f16_to_i64_r_minMag( float16_t, bool );
-float32_t f16_to_f32( float16_t );
-float64_t f16_to_f64( float16_t );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t f16_to_extF80( float16_t );
-float128_t f16_to_f128( float16_t );
-#endif
-void f16_to_extF80M( float16_t, extFloat80_t * );
-void f16_to_f128M( float16_t, float128_t * );
-float16_t f16_roundToInt( float16_t, u8int, bool );
-float16_t f16_add( float16_t, float16_t );
-float16_t f16_sub( float16_t, float16_t );
-float16_t f16_mul( float16_t, float16_t );
-float16_t f16_mulAdd( float16_t, float16_t, float16_t );
-float16_t f16_div( float16_t, float16_t );
-float16_t f16_rem( float16_t, float16_t );
-float16_t f16_sqrt( float16_t );
-bool f16_eq( float16_t, float16_t );
-bool f16_le( float16_t, float16_t );
-bool f16_lt( float16_t, float16_t );
-bool f16_eq_signaling( float16_t, float16_t );
-bool f16_le_quiet( float16_t, float16_t );
-bool f16_lt_quiet( float16_t, float16_t );
-bool f16_isSignalingNaN( float16_t );
-
-/*----------------------------------------------------------------------------
-| 16-bit (brain float 16) floating-point operations.
-*----------------------------------------------------------------------------*/
-float32_t bf16_to_f32( bfloat16_t );
-bfloat16_t f32_to_bf16( float32_t );
-bool bf16_isSignalingNaN( bfloat16_t );
-
-/*----------------------------------------------------------------------------
-| 32-bit (single-precision) floating-point operations.
-*----------------------------------------------------------------------------*/
-u32int f32_to_ui32( float32_t, u8int, bool );
-u64int f32_to_ui64( float32_t, u8int, bool );
-s32int f32_to_i32( float32_t, u8int, bool );
-s64int f32_to_i64( float32_t, u8int, bool );
-u32int f32_to_ui32_r_minMag( float32_t, bool );
-u64int f32_to_ui64_r_minMag( float32_t, bool );
-s32int f32_to_i32_r_minMag( float32_t, bool );
-s64int f32_to_i64_r_minMag( float32_t, bool );
-float16_t f32_to_f16( float32_t );
-float64_t f32_to_f64( float32_t );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t f32_to_extF80( float32_t );
-float128_t f32_to_f128( float32_t );
-#endif
 void f32_to_extF80M( float32_t, extFloat80_t * );
-void f32_to_f128M( float32_t, float128_t * );
-float32_t f32_roundToInt( float32_t, u8int, bool );
-float32_t f32_add( float32_t, float32_t );
-float32_t f32_sub( float32_t, float32_t );
-float32_t f32_mul( float32_t, float32_t );
-float32_t f32_mulAdd( float32_t, float32_t, float32_t );
-float32_t f32_div( float32_t, float32_t );
-float32_t f32_rem( float32_t, float32_t );
-float32_t f32_sqrt( float32_t );
-bool f32_eq( float32_t, float32_t );
-bool f32_le( float32_t, float32_t );
-bool f32_lt( float32_t, float32_t );
-bool f32_eq_signaling( float32_t, float32_t );
-bool f32_le_quiet( float32_t, float32_t );
-bool f32_lt_quiet( float32_t, float32_t );
-bool f32_isSignalingNaN( float32_t );
-
-/*----------------------------------------------------------------------------
-| 64-bit (double-precision) floating-point operations.
-*----------------------------------------------------------------------------*/
-u32int f64_to_ui32( float64_t, u8int, bool );
-u64int f64_to_ui64( float64_t, u8int, bool );
-s32int f64_to_i32( float64_t, u8int, bool );
-s64int f64_to_i64( float64_t, u8int, bool );
-u32int f64_to_ui32_r_minMag( float64_t, bool );
-u64int f64_to_ui64_r_minMag( float64_t, bool );
-s32int f64_to_i32_r_minMag( float64_t, bool );
-s64int f64_to_i64_r_minMag( float64_t, bool );
-float16_t f64_to_f16( float64_t );
-float32_t f64_to_f32( float64_t );
-#ifdef SOFTFLOAT_FAST_INT64
-extFloat80_t f64_to_extF80( float64_t );
-float128_t f64_to_f128( float64_t );
-#endif
-void f64_to_extF80M( float64_t, extFloat80_t * );
-void f64_to_f128M( float64_t, float128_t * );
-float64_t f64_roundToInt( float64_t, u8int, bool );
-float64_t f64_add( float64_t, float64_t );
-float64_t f64_sub( float64_t, float64_t );
-float64_t f64_mul( float64_t, float64_t );
-float64_t f64_mulAdd( float64_t, float64_t, float64_t );
-float64_t f64_div( float64_t, float64_t );
-float64_t f64_rem( float64_t, float64_t );
-float64_t f64_sqrt( float64_t );
-bool f64_eq( float64_t, float64_t );
-bool f64_le( float64_t, float64_t );
-bool f64_lt( float64_t, float64_t );
-bool f64_eq_signaling( float64_t, float64_t );
-bool f64_le_quiet( float64_t, float64_t );
-bool f64_lt_quiet( float64_t, float64_t );
-bool f64_isSignalingNaN( float64_t );
-
-/*----------------------------------------------------------------------------
-| Rounding precision for 80-bit extended double-precision floating-point.
-| Valid values are 32, 64, and 80.
-*----------------------------------------------------------------------------*/
-extern THREAD_LOCAL u8int extF80_roundingPrecision;
-
-/*----------------------------------------------------------------------------
-| 80-bit extended double-precision floating-point operations.
-*----------------------------------------------------------------------------*/
-#ifdef SOFTFLOAT_FAST_INT64
-u32int extF80_to_ui32( extFloat80_t, u8int, bool );
-u64int extF80_to_ui64( extFloat80_t, u8int, bool );
-s32int extF80_to_i32( extFloat80_t, u8int, bool );
-s64int extF80_to_i64( extFloat80_t, u8int, bool );
-u32int extF80_to_ui32_r_minMag( extFloat80_t, bool );
-u64int extF80_to_ui64_r_minMag( extFloat80_t, bool );
-s32int extF80_to_i32_r_minMag( extFloat80_t, bool );
-s64int extF80_to_i64_r_minMag( extFloat80_t, bool );
-float16_t extF80_to_f16( extFloat80_t );
-float32_t extF80_to_f32( extFloat80_t );
-float64_t extF80_to_f64( extFloat80_t );
-float128_t extF80_to_f128( extFloat80_t );
-extFloat80_t extF80_roundToInt( extFloat80_t, u8int, bool );
-extFloat80_t extF80_add( extFloat80_t, extFloat80_t );
-extFloat80_t extF80_sub( extFloat80_t, extFloat80_t );
-extFloat80_t extF80_mul( extFloat80_t, extFloat80_t );
-extFloat80_t extF80_div( extFloat80_t, extFloat80_t );
-extFloat80_t extF80_rem( extFloat80_t, extFloat80_t );
-extFloat80_t extF80_sqrt( extFloat80_t );
-bool extF80_eq( extFloat80_t, extFloat80_t );
-bool extF80_le( extFloat80_t, extFloat80_t );
-bool extF80_lt( extFloat80_t, extFloat80_t );
-bool extF80_eq_signaling( extFloat80_t, extFloat80_t );
-bool extF80_le_quiet( extFloat80_t, extFloat80_t );
-bool extF80_lt_quiet( extFloat80_t, extFloat80_t );
-bool extF80_isSignalingNaN( extFloat80_t );
-#endif
-u32int extF80M_to_ui32( const extFloat80_t *, u8int, bool );
-u64int extF80M_to_ui64( const extFloat80_t *, u8int, bool );
-s32int extF80M_to_i32( const extFloat80_t *, u8int, bool );
-s64int extF80M_to_i64( const extFloat80_t *, u8int, bool );
-u32int extF80M_to_ui32_r_minMag( const extFloat80_t *, bool );
-u64int extF80M_to_ui64_r_minMag( const extFloat80_t *, bool );
-s32int extF80M_to_i32_r_minMag( const extFloat80_t *, bool );
-s64int extF80M_to_i64_r_minMag( const extFloat80_t *, bool );
-float16_t extF80M_to_f16( const extFloat80_t * );
 float32_t extF80M_to_f32( const extFloat80_t * );
-float64_t extF80M_to_f64( const extFloat80_t * );
-void extF80M_to_f128M( const extFloat80_t *, float128_t * );
-void
- extF80M_roundToInt(
-     const extFloat80_t *, u8int, bool, extFloat80_t * );
 void extF80M_add( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );
-void extF80M_sub( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );
 void extF80M_mul( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );
-void extF80M_div( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );
-void extF80M_rem( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );
-void extF80M_sqrt( const extFloat80_t *, extFloat80_t * );
-bool extF80M_eq( const extFloat80_t *, const extFloat80_t * );
-bool extF80M_le( const extFloat80_t *, const extFloat80_t * );
-bool extF80M_lt( const extFloat80_t *, const extFloat80_t * );
-bool extF80M_eq_signaling( const extFloat80_t *, const extFloat80_t * );
-bool extF80M_le_quiet( const extFloat80_t *, const extFloat80_t * );
-bool extF80M_lt_quiet( const extFloat80_t *, const extFloat80_t * );
-bool extF80M_isSignalingNaN( const extFloat80_t * );
-
-/*----------------------------------------------------------------------------
-| 128-bit (quadruple-precision) floating-point operations.
-*----------------------------------------------------------------------------*/
-#ifdef SOFTFLOAT_FAST_INT64
-u32int f128_to_ui32( float128_t, u8int, bool );
-u64int f128_to_ui64( float128_t, u8int, bool );
-s32int f128_to_i32( float128_t, u8int, bool );
-s64int f128_to_i64( float128_t, u8int, bool );
-u32int f128_to_ui32_r_minMag( float128_t, bool );
-u64int f128_to_ui64_r_minMag( float128_t, bool );
-s32int f128_to_i32_r_minMag( float128_t, bool );
-s64int f128_to_i64_r_minMag( float128_t, bool );
-float16_t f128_to_f16( float128_t );
-float32_t f128_to_f32( float128_t );
-float64_t f128_to_f64( float128_t );
-extFloat80_t f128_to_extF80( float128_t );
-float128_t f128_roundToInt( float128_t, u8int, bool );
-float128_t f128_add( float128_t, float128_t );
-float128_t f128_sub( float128_t, float128_t );
-float128_t f128_mul( float128_t, float128_t );
-float128_t f128_mulAdd( float128_t, float128_t, float128_t );
-float128_t f128_div( float128_t, float128_t );
-float128_t f128_rem( float128_t, float128_t );
-float128_t f128_sqrt( float128_t );
-bool f128_eq( float128_t, float128_t );
-bool f128_le( float128_t, float128_t );
-bool f128_lt( float128_t, float128_t );
-bool f128_eq_signaling( float128_t, float128_t );
-bool f128_le_quiet( float128_t, float128_t );
-bool f128_lt_quiet( float128_t, float128_t );
-bool f128_isSignalingNaN( float128_t );
-#endif
-u32int f128M_to_ui32( const float128_t *, u8int, bool );
-u64int f128M_to_ui64( const float128_t *, u8int, bool );
-s32int f128M_to_i32( const float128_t *, u8int, bool );
-s64int f128M_to_i64( const float128_t *, u8int, bool );
-u32int f128M_to_ui32_r_minMag( const float128_t *, bool );
-u64int f128M_to_ui64_r_minMag( const float128_t *, bool );
-s32int f128M_to_i32_r_minMag( const float128_t *, bool );
-s64int f128M_to_i64_r_minMag( const float128_t *, bool );
-float16_t f128M_to_f16( const float128_t * );
-float32_t f128M_to_f32( const float128_t * );
-float64_t f128M_to_f64( const float128_t * );
-void f128M_to_extF80M( const float128_t *, extFloat80_t * );
-void f128M_roundToInt( const float128_t *, u8int, bool, float128_t * );
-void f128M_add( const float128_t *, const float128_t *, float128_t * );
-void f128M_sub( const float128_t *, const float128_t *, float128_t * );
-void f128M_mul( const float128_t *, const float128_t *, float128_t * );
-void
- f128M_mulAdd(
-     const float128_t *, const float128_t *, const float128_t *, float128_t *
- );
-void f128M_div( const float128_t *, const float128_t *, float128_t * );
-void f128M_rem( const float128_t *, const float128_t *, float128_t * );
-void f128M_sqrt( const float128_t *, float128_t * );
-bool f128M_eq( const float128_t *, const float128_t * );
-bool f128M_le( const float128_t *, const float128_t * );
-bool f128M_lt( const float128_t *, const float128_t * );
-bool f128M_eq_signaling( const float128_t *, const float128_t * );
-bool f128M_le_quiet( const float128_t *, const float128_t * );
-bool f128M_lt_quiet( const float128_t *, const float128_t * );
-bool f128M_isSignalingNaN( const float128_t * );
-
-/*----------------------------------------------------------------------------
-| Default value for 'softfloat_detectTininess'.
-*----------------------------------------------------------------------------*/
-#define init_detectTininess softfloat_tininess_afterRounding
-
-/*----------------------------------------------------------------------------
-| The values to return on conversions to 32-bit integer formats that raise an
-| invalid exception.
-*----------------------------------------------------------------------------*/
-#define ui32_fromPosOverflow 0xFFFFFFFF
-#define ui32_fromNegOverflow 0xFFFFFFFF
-#define ui32_fromNaN         0xFFFFFFFF
-#define i32_fromPosOverflow  (-0x7FFFFFFF - 1)
-#define i32_fromNegOverflow  (-0x7FFFFFFF - 1)
-#define i32_fromNaN          (-0x7FFFFFFF - 1)
-
-/*----------------------------------------------------------------------------
-| The values to return on conversions to 64-bit integer formats that raise an
-| invalid exception.
-*----------------------------------------------------------------------------*/
-#define ui64_fromPosOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
-#define ui64_fromNegOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
-#define ui64_fromNaN         UINT64_C( 0xFFFFFFFFFFFFFFFF )
-#define i64_fromPosOverflow  (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
-#define i64_fromNegOverflow  (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
-#define i64_fromNaN          (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
-
-/*----------------------------------------------------------------------------
-| "Common NaN" structure, used to transfer NaN representations from one format
-| to another.
-*----------------------------------------------------------------------------*/
-struct commonNaN {
-    bool sign;
-#ifdef LITTLEENDIAN
-    u64int v0, v64;
-#else
-    u64int v64, v0;
-#endif
-};
-
-/*----------------------------------------------------------------------------
-| The bit pattern for a default generated 16-bit floating-point NaN.
-*----------------------------------------------------------------------------*/
-#define defaultNaNF16UI 0xFE00
-
-/*----------------------------------------------------------------------------
-| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
-| 16-bit floating-point signaling NaN.
-| Note:  This macro evaluates its argument more than once.
-*----------------------------------------------------------------------------*/
-#define softfloat_isSigNaNF16UI( uiA ) ((((uiA) & 0x7E00) == 0x7C00) && ((uiA) & 0x01FF))
-
-/*----------------------------------------------------------------------------
-| Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts
-| this NaN to the common NaN form, and stores the resulting common NaN at the
-| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-void softfloat_f16UIToCommonNaN( u16int uiA, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point
-| NaN, and returns the bit pattern of this value as an unsigned integer.
-*----------------------------------------------------------------------------*/
-u16int softfloat_commonNaNToF16UI( const struct commonNaN *aPtr );
-
-/*----------------------------------------------------------------------------
-| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-
-| point values, at least one of which is a NaN, returns the bit pattern of
-| the combined NaN result.  If either 'uiA' or 'uiB' has the pattern of a
-| signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-u16int
- softfloat_propagateNaNF16UI( u16int uiA, u16int uiB );
-
-/*----------------------------------------------------------------------------
-| The bit pattern for a default generated 32-bit floating-point NaN.
-*----------------------------------------------------------------------------*/
-#define defaultNaNF32UI 0xFFC00000
-
-/*----------------------------------------------------------------------------
-| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
-| 32-bit floating-point signaling NaN.
-| Note:  This macro evaluates its argument more than once.
-*----------------------------------------------------------------------------*/
-#define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
-
-/*----------------------------------------------------------------------------
-| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts
-| this NaN to the common NaN form, and stores the resulting common NaN at the
-| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-void softfloat_f32UIToCommonNaN( u32int uiA, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point
-| NaN, and returns the bit pattern of this value as an unsigned integer.
-*----------------------------------------------------------------------------*/
-u32int softfloat_commonNaNToF32UI( const struct commonNaN *aPtr );
-
-/*----------------------------------------------------------------------------
-| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-
-| point values, at least one of which is a NaN, returns the bit pattern of
-| the combined NaN result.  If either 'uiA' or 'uiB' has the pattern of a
-| signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-u32int
- softfloat_propagateNaNF32UI( u32int uiA, u32int uiB );
-
-/*----------------------------------------------------------------------------
-| The bit pattern for a default generated 64-bit floating-point NaN.
-*----------------------------------------------------------------------------*/
-#define defaultNaNF64UI UINT64_C( 0xFFF8000000000000 )
-
-/*----------------------------------------------------------------------------
-| Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
-| 64-bit floating-point signaling NaN.
-| Note:  This macro evaluates its argument more than once.
-*----------------------------------------------------------------------------*/
-#define softfloat_isSigNaNF64UI( uiA ) ((((uiA) & UINT64_C( 0x7FF8000000000000 )) == UINT64_C( 0x7FF0000000000000 )) && ((uiA) & UINT64_C( 0x0007FFFFFFFFFFFF )))
-
-/*----------------------------------------------------------------------------
-| Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts
-| this NaN to the common NaN form, and stores the resulting common NaN at the
-| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-void softfloat_f64UIToCommonNaN( u64int uiA, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point
-| NaN, and returns the bit pattern of this value as an unsigned integer.
-*----------------------------------------------------------------------------*/
-u64int softfloat_commonNaNToF64UI( const struct commonNaN *aPtr );
-
-/*----------------------------------------------------------------------------
-| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-
-| point values, at least one of which is a NaN, returns the bit pattern of
-| the combined NaN result.  If either 'uiA' or 'uiB' has the pattern of a
-| signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-u64int
- softfloat_propagateNaNF64UI( u64int uiA, u64int uiB );
-
-/*----------------------------------------------------------------------------
-| The bit pattern for a default generated 80-bit extended floating-point NaN.
-*----------------------------------------------------------------------------*/
-#define defaultNaNExtF80UI64 0xFFFF
-#define defaultNaNExtF80UI0  UINT64_C( 0xC000000000000000 )
-
-/*----------------------------------------------------------------------------
-| Returns true when the 80-bit unsigned integer formed from concatenating
-| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended
-| floating-point signaling NaN.
-| Note:  This macro evaluates its arguments more than once.
-*----------------------------------------------------------------------------*/
-#define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))
-
-#ifdef SOFTFLOAT_FAST_INT64
-
-/*----------------------------------------------------------------------------
-| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
-| defined.
-*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
-| has the bit pattern of an 80-bit extended floating-point NaN, converts
-| this NaN to the common NaN form, and stores the resulting common NaN at the
-| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-void
- softfloat_extF80UIToCommonNaN(
-     u16int uiA64, u64int uiA0, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
-| floating-point NaN, and returns the bit pattern of this value as an unsigned
-| integer.
-*----------------------------------------------------------------------------*/
-struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr );
-
-/*----------------------------------------------------------------------------
-| Interpreting the unsigned integer formed from concatenating 'uiA64' and
-| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
-| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
-| 80-bit extended floating-point value, and assuming at least on of these
-| floating-point values is a NaN, returns the bit pattern of the combined NaN
-| result.  If either original floating-point value is a signaling NaN, the
-| invalid exception is raised.
-*----------------------------------------------------------------------------*/
-struct uint128
- softfloat_propagateNaNExtF80UI(
-     u16int uiA64,
-     u64int uiA0,
-     u16int uiB64,
-     u64int uiB0
- );
-
-/*----------------------------------------------------------------------------
-| The bit pattern for a default generated 128-bit floating-point NaN.
-*----------------------------------------------------------------------------*/
-#define defaultNaNF128UI64 UINT64_C( 0xFFFF800000000000 )
-#define defaultNaNF128UI0  UINT64_C( 0 )
-
-/*----------------------------------------------------------------------------
-| Returns true when the 128-bit unsigned integer formed from concatenating
-| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating-
-| point signaling NaN.
-| Note:  This macro evaluates its arguments more than once.
-*----------------------------------------------------------------------------*/
-#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
-
-/*----------------------------------------------------------------------------
-| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
-| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
-| the common NaN form, and stores the resulting common NaN at the location
-| pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid exception
-| is raised.
-*----------------------------------------------------------------------------*/
-void
- softfloat_f128UIToCommonNaN(
-     u64int uiA64, u64int uiA0, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
-| NaN, and returns the bit pattern of this value as an unsigned integer.
-*----------------------------------------------------------------------------*/
-struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN * );
-
-/*----------------------------------------------------------------------------
-| Interpreting the unsigned integer formed from concatenating 'uiA64' and
-| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
-| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
-| 128-bit floating-point value, and assuming at least on of these floating-
-| point values is a NaN, returns the bit pattern of the combined NaN result.
-| If either original floating-point value is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-struct uint128
- softfloat_propagateNaNF128UI(
-     u64int uiA64,
-     u64int uiA0,
-     u64int uiB64,
-     u64int uiB0
- );
-
-#else
-
-/*----------------------------------------------------------------------------
-| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
-| defined.
-*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is
-| a NaN, converts this NaN to the common NaN form, and stores the resulting
-| common NaN at the location pointed to by 'zPtr'.  If the NaN is a signaling
-| NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-void
- softfloat_extF80MToCommonNaN(
-     const struct extFloat80M *aSPtr, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
-| floating-point NaN, and stores this NaN at the location pointed to by
-| 'zSPtr'.
-*----------------------------------------------------------------------------*/
-void
- softfloat_commonNaNToExtF80M(
-     const struct commonNaN *aPtr, struct extFloat80M *zSPtr );
-
-/*----------------------------------------------------------------------------
-| Assuming at least one of the two 80-bit extended floating-point values
-| pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result
-| at the location pointed to by 'zSPtr'.  If either original floating-point
-| value is a signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-void
- softfloat_propagateNaNExtF80M(
-     const struct extFloat80M *aSPtr,
-     const struct extFloat80M *bSPtr,
-     struct extFloat80M *zSPtr
- );
-
-/*----------------------------------------------------------------------------
-| The bit pattern for a default generated 128-bit floating-point NaN.
-*----------------------------------------------------------------------------*/
-#define defaultNaNF128UI96 0xFFFF8000
-#define defaultNaNF128UI64 0
-#define defaultNaNF128UI32 0
-#define defaultNaNF128UI0  0
-
-/*----------------------------------------------------------------------------
-| Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN,
-| converts this NaN to the common NaN form, and stores the resulting common
-| NaN at the location pointed to by 'zPtr'.  If the NaN is a signaling NaN,
-| the invalid exception is raised.  Argument 'aWPtr' points to an array of
-| four 32-bit elements that concatenate in the platform's normal endian order
-| to form a 128-bit floating-point value.
-*----------------------------------------------------------------------------*/
-void
- softfloat_f128MToCommonNaN( const u32int *aWPtr, struct commonNaN *zPtr );
-
-/*----------------------------------------------------------------------------
-| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
-| NaN, and stores this NaN at the location pointed to by 'zWPtr'.  Argument
-| 'zWPtr' points to an array of four 32-bit elements that concatenate in the
-| platform's normal endian order to form a 128-bit floating-point value.
-*----------------------------------------------------------------------------*/
-void
- softfloat_commonNaNToF128M( const struct commonNaN *aPtr, u32int *zWPtr );
-
-/*----------------------------------------------------------------------------
-| Assuming at least one of the two 128-bit floating-point values pointed to by
-| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location
-| pointed to by 'zWPtr'.  If either original floating-point value is a
-| signaling NaN, the invalid exception is raised.  Each of 'aWPtr', 'bWPtr',
-| and 'zWPtr' points to an array of four 32-bit elements that concatenate in
-| the platform's normal endian order to form a 128-bit floating-point value.
-*----------------------------------------------------------------------------*/
-void
- softfloat_propagateNaNF128M(
-     const u32int *aWPtr, const u32int *bWPtr, u32int *zWPtr );
-
-#endif