Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Aug 2023 20:36:22 GMT
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 36670fa153a8 - stable/13 - test: remove remainder of testfloat
Message-ID:  <202308062036.376KaMHd042591@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by marius:

URL: https://cgit.FreeBSD.org/src/commit/?id=36670fa153a8dfc2c898217a0d5429675e342f35

commit 36670fa153a8dfc2c898217a0d5429675e342f35
Author:     Marius Strobl <marius@FreeBSD.org>
AuthorDate: 2023-06-30 20:36:39 +0000
Commit:     Marius Strobl <marius@FreeBSD.org>
CommitDate: 2023-08-06 17:11:42 +0000

    test: remove remainder of testfloat
    
    These bits are unused since the sparc64-specific glue has been deleted
    in f33b14f0.
    
    (cherry picked from commit eb33b693b364a4547dfcfd21c159ffc4fb339bc2)
---
 tools/test/testfloat/README.txt            |   50 -
 tools/test/testfloat/fail.c                |   46 -
 tools/test/testfloat/fail.h                |   29 -
 tools/test/testfloat/random.c              |   63 -
 tools/test/testfloat/random.h              |   32 -
 tools/test/testfloat/slowfloat-32.c        | 1183 ---------
 tools/test/testfloat/slowfloat-64.c        | 2109 ----------------
 tools/test/testfloat/slowfloat.c           |   35 -
 tools/test/testfloat/slowfloat.h           |  167 --
 tools/test/testfloat/systemBugs.txt        |  323 ---
 tools/test/testfloat/systflags.h           |   33 -
 tools/test/testfloat/systfloat.c           |  553 -----
 tools/test/testfloat/systmodes.h           |   42 -
 tools/test/testfloat/testCases.c           | 3682 ----------------------------
 tools/test/testfloat/testCases.h           |   69 -
 tools/test/testfloat/testFunction.c        | 1149 ---------
 tools/test/testfloat/testFunction.h        |  135 -
 tools/test/testfloat/testLoops.c           | 2713 --------------------
 tools/test/testfloat/testLoops.h           |  143 --
 tools/test/testfloat/testfloat-history.txt |   57 -
 tools/test/testfloat/testfloat-source.txt  |  444 ----
 tools/test/testfloat/testfloat.c           |  299 ---
 tools/test/testfloat/testfloat.txt         |  771 ------
 tools/test/testfloat/testsoftfloat.c       | 1044 --------
 tools/test/testfloat/writeHex.c            |  183 --
 tools/test/testfloat/writeHex.h            |   42 -
 26 files changed, 15396 deletions(-)

diff --git a/tools/test/testfloat/README.txt b/tools/test/testfloat/README.txt
deleted file mode 100644
index fe99fd95d641..000000000000
--- a/tools/test/testfloat/README.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-
-Package Overview for TestFloat Release 2a
-
-John R. Hauser
-1998 December 16
-
-
-TestFloat is a program for testing that a floating-point implementation
-conforms to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-TestFloat is distributed in the form of C source code.  The TestFloat
-package actually provides two related programs:
-
--- The `testfloat' program tests a system's floating-point for conformance
-   to the IEC/IEEE Standard.  This program uses the SoftFloat software
-   floating-point implementation as a basis for comparison.
-
--- The `testsoftfloat' program tests SoftFloat itself for conformance to
-   the IEC/IEEE Standard.  These tests are performed by comparing against a
-   separate, slower software floating-point that is included in the TestFloat
-   package.
-
-TestFloat depends on SoftFloat, but SoftFloat is not included in the
-TestFloat package.  SoftFloat can be obtained through the Web page `http://
-HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/SoftFloat.html'.
-
-TestFloat is documented in three text files:
-
-   testfloat.txt          Documentation for using the TestFloat programs
-                              (both `testfloat' and `testsoftfloat').
-   testfloat-source.txt   Documentation for porting and compiling TestFloat.
-   testfloat-history.txt  History of major changes to TestFloat.
-
-The following file is also provided:
-
-   systemBugs.txt         Information about processor bugs found using
-                              TestFloat.
-
-Other files in the package comprise the source code for TestFloat.
-
-Please be aware that some work is involved in porting this software to other
-targets.  It is not just a matter of getting `make' to complete without
-error messages.  I would have written the code that way if I could, but
-there are fundamental differences between systems that I can't make go away.
-You should not attempt to compile the TestFloat sources without first
-reading `testfloat-source.txt'.
-
-At the time of this writing, the most up-to-date information about
-TestFloat and the latest release can be found at the Web page `http://
-HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
-
diff --git a/tools/test/testfloat/fail.c b/tools/test/testfloat/fail.c
deleted file mode 100644
index 30bbea6bd7d7..000000000000
--- a/tools/test/testfloat/fail.c
+++ /dev/null
@@ -1,46 +0,0 @@
-
-/*
-===============================================================================
-
-This C source file is part of TestFloat, Release 2a, a package of programs
-for testing the correctness of floating-point arithmetic complying to the
-IEC/IEEE Standard for Floating-Point.
-
-Written by John R. Hauser.  More information is available through the Web
-page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
-AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) they include prominent notice that the work is derivative, and (2) they
-include prominent notice akin to these four paragraphs for those parts of
-this code that are retained.
-
-===============================================================================
-*/
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include "milieu.h"
-#include "fail.h"
-
-char *fail_programName = "";
-
-void fail( const char *message, ... )
-{
-    va_list varArgs;
-
-    fprintf( stderr, "%s: ", fail_programName );
-    va_start( varArgs, message );
-    vfprintf( stderr, message, varArgs );
-    va_end( varArgs );
-    fputs( ".\n", stderr );
-    exit( EXIT_FAILURE );
-
-}
-
diff --git a/tools/test/testfloat/fail.h b/tools/test/testfloat/fail.h
deleted file mode 100644
index 9c338da260aa..000000000000
--- a/tools/test/testfloat/fail.h
+++ /dev/null
@@ -1,29 +0,0 @@
-
-/*
-===============================================================================
-
-This C header file is part of TestFloat, Release 2a, a package of programs
-for testing the correctness of floating-point arithmetic complying to the
-IEC/IEEE Standard for Floating-Point.
-
-Written by John R. Hauser.  More information is available through the Web
-page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
-AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) they include prominent notice that the work is derivative, and (2) they
-include prominent notice akin to these four paragraphs for those parts of
-this code that are retained.
-
-===============================================================================
-*/
-
-extern char *fail_programName;
-
-void fail( const char *, ... );
-
diff --git a/tools/test/testfloat/random.c b/tools/test/testfloat/random.c
deleted file mode 100644
index 21326c1ff23f..000000000000
--- a/tools/test/testfloat/random.c
+++ /dev/null
@@ -1,63 +0,0 @@
-
-/*
-===============================================================================
-
-This C source file is part of TestFloat, Release 2a, a package of programs
-for testing the correctness of floating-point arithmetic complying to the
-IEC/IEEE Standard for Floating-Point.
-
-Written by John R. Hauser.  More information is available through the Web
-page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
-AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) they include prominent notice that the work is derivative, and (2) they
-include prominent notice akin to these four paragraphs for those parts of
-this code that are retained.
-
-===============================================================================
-*/
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "milieu.h"
-#include "random.h"
-
-uint8 randomUint8( void )
-{
-
-    return (bits8) ( random()>>4 );
-
-}
-
-uint16 randomUint16( void )
-{
-
-    return ( random() & 0x0000ffff );
-
-}
-
-uint32 randomUint32( void )
-{
-
-    return ( ( (uint32) random()<<16) | ( (uint32) random() & 0x0000ffff) );
-}
-
-#ifdef BITS64
-
-uint64 randomUint64( void )
-{
-
-    return ( ( (uint64) randomUint32() )<<32 ) | randomUint32();
-
-}
-
-#endif
-
diff --git a/tools/test/testfloat/random.h b/tools/test/testfloat/random.h
deleted file mode 100644
index 7375499ea965..000000000000
--- a/tools/test/testfloat/random.h
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/*
-===============================================================================
-
-This C header file is part of TestFloat, Release 2a, a package of programs
-for testing the correctness of floating-point arithmetic complying to the
-IEC/IEEE Standard for Floating-Point.
-
-Written by John R. Hauser.  More information is available through the Web
-page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
-AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) they include prominent notice that the work is derivative, and (2) they
-include prominent notice akin to these four paragraphs for those parts of
-this code that are retained.
-
-===============================================================================
-*/
-
-uint8 randomUint8( void );
-uint16 randomUint16( void );
-uint32 randomUint32( void );
-#ifdef BITS64
-uint64 randomUint64( void );
-#endif
-
diff --git a/tools/test/testfloat/slowfloat-32.c b/tools/test/testfloat/slowfloat-32.c
deleted file mode 100644
index 549654b05e63..000000000000
--- a/tools/test/testfloat/slowfloat-32.c
+++ /dev/null
@@ -1,1183 +0,0 @@
-
-/*
-===============================================================================
-
-This C source file is part of TestFloat, Release 2a, a package of programs
-for testing the correctness of floating-point arithmetic complying to the
-IEC/IEEE Standard for Floating-Point.
-
-Written by John R. Hauser.  More information is available through the Web
-page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
-AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) they include prominent notice that the work is derivative, and (2) they
-include prominent notice akin to these four paragraphs for those parts of
-this code that are retained.
-
-===============================================================================
-*/
-
-int8 slow_float_rounding_mode;
-int8 slow_float_exception_flags;
-int8 slow_float_detect_tininess;
-
-typedef struct {
-    bits32 a0, a1;
-} bits64X;
-
-typedef struct {
-    flag isNaN;
-    flag isInf;
-    flag isZero;
-    flag sign;
-    int16 exp;
-    bits64X sig;
-} floatX;
-
-static const floatX floatXNaN = { TRUE, FALSE, FALSE, FALSE, 0, { 0, 0 } };
-static const floatX floatXPositiveZero =
-    { FALSE, FALSE, TRUE, FALSE, 0, { 0, 0 } };
-static const floatX floatXNegativeZero =
-    { FALSE, FALSE, TRUE, TRUE, 0, { 0, 0 } };
-
-static bits64X shortShift64Left( bits64X a, int8 shiftCount )
-{
-    int8 negShiftCount;
-
-    negShiftCount = ( - shiftCount & 31 );
-    a.a0 = ( a.a0<<shiftCount ) | ( a.a1>>negShiftCount );
-    a.a1 <<= shiftCount;
-    return a;
-
-}
-
-static bits64X shortShift64RightJamming( bits64X a, int8 shiftCount )
-{
-    int8 negShiftCount;
-    bits32 extra;
-
-    negShiftCount = ( - shiftCount & 31 );
-    extra = a.a1<<negShiftCount;
-    a.a1 = ( a.a0<<negShiftCount ) | ( a.a1>>shiftCount ) | ( extra != 0 );
-    a.a0 >>= shiftCount;
-    return a;
-
-}
-
-static bits64X neg64( bits64X a )
-{
-
-    if ( a.a1 == 0 ) {
-        a.a0 = - a.a0;
-    }
-    else {
-        a.a1 = - a.a1;
-        a.a0 = ~ a.a0;
-    }
-    return a;
-
-}
-
-static bits64X add64( bits64X a, bits64X b )
-{
-
-    a.a1 += b.a1;
-    a.a0 += b.a0 + ( a.a1 < b.a1 );
-    return a;
-
-}
-
-static flag eq64( bits64X a, bits64X b )
-{
-
-    return ( a.a0 == b.a0 ) && ( a.a1 == b.a1 );
-
-}
-
-static flag le64( bits64X a, bits64X b )
-{
-
-    return ( a.a0 < b.a0 ) || ( ( a.a0 == b.a0 ) && ( a.a1 <= b.a1 ) );
-
-}
-
-static flag lt64( bits64X a, bits64X b )
-{
-
-    return ( a.a0 < b.a0 ) || ( ( a.a0 == b.a0 ) && ( a.a1 < b.a1 ) );
-
-}
-
-static floatX roundFloatXTo24( flag isTiny, floatX zx )
-{
-
-    if ( zx.sig.a1 ) {
-        slow_float_exception_flags |= float_flag_inexact;
-        if ( isTiny ) slow_float_exception_flags |= float_flag_underflow;
-        switch ( slow_float_rounding_mode ) {
-         case float_round_nearest_even:
-            if ( zx.sig.a1 < 0x80000000 ) goto noIncrement;
-            if ( ( zx.sig.a1 == 0x80000000 ) && ! ( zx.sig.a0 & 1 ) ) {
-                goto noIncrement;
-            }
-            break;
-         case float_round_to_zero:
-            goto noIncrement;
-         case float_round_down:
-            if ( ! zx.sign ) goto noIncrement;
-            break;
-         case float_round_up:
-            if ( zx.sign ) goto noIncrement;
-            break;
-        }
-        ++zx.sig.a0;
-        if ( zx.sig.a0 == 0x01000000 ) {
-            zx.sig.a0 = 0x00800000;
-            ++zx.exp;
-        }
-    }
- noIncrement:
-    zx.sig.a1 = 0;
-    return zx;
-
-}
-
-static floatX roundFloatXTo53( flag isTiny, floatX zx )
-{
-    int8 roundBits;
-
-    roundBits = zx.sig.a1 & 7;
-    zx.sig.a1 -= roundBits;
-    if ( roundBits ) {
-        slow_float_exception_flags |= float_flag_inexact;
-        if ( isTiny ) slow_float_exception_flags |= float_flag_underflow;
-        switch ( slow_float_rounding_mode ) {
-         case float_round_nearest_even:
-            if ( roundBits < 4 ) goto noIncrement;
-            if ( ( roundBits == 4 ) && ! ( zx.sig.a1 & 8 ) ) goto noIncrement;
-            break;
-         case float_round_to_zero:
-            goto noIncrement;
-         case float_round_down:
-            if ( ! zx.sign ) goto noIncrement;
-            break;
-         case float_round_up:
-            if ( zx.sign ) goto noIncrement;
-            break;
-        }
-        zx.sig.a1 += 8;
-        zx.sig.a0 += ( zx.sig.a1 == 0 );
-        if ( zx.sig.a0 == 0x01000000 ) {
-            zx.sig.a0 = 0x00800000;
-            ++zx.exp;
-        }
-    }
- noIncrement:
-    return zx;
-
-}
-
-static floatX int32ToFloatX( int32 a )
-{
-    floatX ax;
-
-    ax.isNaN = FALSE;
-    ax.isInf = FALSE;
-    ax.sign = ( a < 0 );
-    ax.sig.a1 = ax.sign ? - a : a;
-    ax.sig.a0 = 0;
-    if ( a == 0 ) {
-        ax.isZero = TRUE;
-        return ax;
-    }
-    ax.isZero = FALSE;
-    ax.sig = shortShift64Left( ax.sig, 23 );
-    ax.exp = 32;
-    while ( ax.sig.a0 < 0x00800000 ) {
-        ax.sig = shortShift64Left( ax.sig, 1 );
-        --ax.exp;
-    }
-    return ax;
-
-}
-
-static int32 floatXToInt32( floatX ax )
-{
-    int8 savedExceptionFlags;
-    int16 shiftCount;
-    int32 z;
-
-    if ( ax.isInf || ax.isNaN ) {
-        slow_float_exception_flags |= float_flag_invalid;
-        return ( ax.isInf & ax.sign ) ? 0x80000000 : 0x7FFFFFFF;
-    }
-    if ( ax.isZero ) return 0;
-    savedExceptionFlags = slow_float_exception_flags;
-    shiftCount = 52 - ax.exp;
-    if ( 56 < shiftCount ) {
-        ax.sig.a1 = 1;
-        ax.sig.a0 = 0;
-    }
-    else {
-        while ( 0 < shiftCount ) {
-            ax.sig = shortShift64RightJamming( ax.sig, 1 );
-            --shiftCount;
-        }
-    }
-    ax = roundFloatXTo53( FALSE, ax );
-    ax.sig = shortShift64RightJamming( ax.sig, 3 );
-    z = ax.sig.a1;
-    if ( ax.sign ) z = - z;
-    if (    ( shiftCount < 0 )
-         || ax.sig.a0
-         || ( ( z != 0 ) && ( ( ax.sign ^ ( z < 0 ) ) != 0 ) )
-       ) {
-        slow_float_exception_flags = savedExceptionFlags | float_flag_invalid;
-        return ax.sign ? 0x80000000 : 0x7FFFFFFF;
-    }
-    return z;
-
-}
-
-static floatX float32ToFloatX( float32 a )
-{
-    int16 expField;
-    floatX ax;
-
-    ax.isNaN = FALSE;
-    ax.isInf = FALSE;
-    ax.isZero = FALSE;
-    ax.sign = ( ( a & 0x80000000 ) != 0 );
-    expField = ( a>>23 ) & 0xFF;
-    ax.sig.a1 = 0;
-    ax.sig.a0 = a & 0x007FFFFF;
-    if ( expField == 0 ) {
-        if ( ax.sig.a0 == 0 ) {
-            ax.isZero = TRUE;
-        }
-        else {
-            expField = 1 - 0x7F;
-            do {
-                ax.sig.a0 <<= 1;
-                --expField;
-            } while ( ax.sig.a0 < 0x00800000 );
-            ax.exp = expField;
-        }
-    }
-    else if ( expField == 0xFF ) {
-        if ( ax.sig.a0 == 0 ) {
-            ax.isInf = TRUE;
-        }
-        else {
-            ax.isNaN = TRUE;
-        }
-    }
-    else {
-        ax.sig.a0 |= 0x00800000;
-        ax.exp = expField - 0x7F;
-    }
-    return ax;
-
-}
-
-static float32 floatXToFloat32( floatX zx )
-{
-    floatX savedZ;
-    flag isTiny;
-    int16 expField;
-    float32 z;
-
-    if ( zx.isZero ) return zx.sign ? 0x80000000 : 0;
-    if ( zx.isInf ) return zx.sign ? 0xFF800000 : 0x7F800000;
-    if ( zx.isNaN ) return 0xFFFFFFFF;
-    while ( 0x01000000 <= zx.sig.a0 ) {
-        zx.sig = shortShift64RightJamming( zx.sig, 1 );
-        ++zx.exp;
-    }
-    while ( zx.sig.a0 < 0x00800000 ) {
-        zx.sig = shortShift64Left( zx.sig, 1 );
-        --zx.exp;
-    }
-    savedZ = zx;
-    isTiny =
-           ( slow_float_detect_tininess == float_tininess_before_rounding )
-        && ( zx.exp + 0x7F <= 0 );
-    zx = roundFloatXTo24( isTiny, zx );
-    expField = zx.exp + 0x7F;
-    if ( 0xFF <= expField ) {
-        slow_float_exception_flags |=
-            float_flag_overflow | float_flag_inexact;
-        if ( zx.sign ) {
-            switch ( slow_float_rounding_mode ) {
-             case float_round_nearest_even:
-             case float_round_down:
-                z = 0xFF800000;
-                break;
-             case float_round_to_zero:
-             case float_round_up:
-                z = 0xFF7FFFFF;
-                break;
-            }
-        }
-        else {
-            switch ( slow_float_rounding_mode ) {
-             case float_round_nearest_even:
-             case float_round_up:
-                z = 0x7F800000;
-                break;
-             case float_round_to_zero:
-             case float_round_down:
-                z = 0x7F7FFFFF;
-                break;
-            }
-        }
-        return z;
-    }
-    if ( expField <= 0 ) {
-        isTiny = TRUE;
-        zx = savedZ;
-        expField = zx.exp + 0x7F;
-        if ( expField < -27 ) {
-            zx.sig.a1 = ( zx.sig.a0 != 0 ) || ( zx.sig.a1 != 0 );
-            zx.sig.a0 = 0;
-        }
-        else {
-            while ( expField <= 0 ) {
-                zx.sig = shortShift64RightJamming( zx.sig, 1 );
-                ++expField;
-            }
-        }
-        zx = roundFloatXTo24( isTiny, zx );
-        expField = ( 0x00800000 <= zx.sig.a0 ) ? 1 : 0;
-    }
-    z = expField;
-    z <<= 23;
-    if ( zx.sign ) z |= 0x80000000;
-    z |= zx.sig.a0 & 0x007FFFFF;
-    return z;
-
-}
-
-static floatX float64ToFloatX( float64 a )
-{
-    int16 expField;
-    floatX ax;
-
-    ax.isNaN = FALSE;
-    ax.isInf = FALSE;
-    ax.isZero = FALSE;
-#ifdef BITS64
-    ax.sign = ( ( a & LIT64( 0x8000000000000000 ) ) != 0 );
-    expField = ( a>>52 ) & 0x7FF;
-    ax.sig.a1 = a;
-    ax.sig.a0 = ( a>>32 ) & 0x000FFFFF;
-#else
-    ax.sign = ( ( a.high & 0x80000000 ) != 0 );
-    expField = ( a.high>>( 52 - 32 ) ) & 0x7FF;
-    ax.sig.a1 = a.low;
-    ax.sig.a0 = a.high & 0x000FFFFF;
-#endif
-    if ( expField == 0 ) {
-        if ( ( ax.sig.a0 == 0 ) && ( ax.sig.a1 == 0 ) ) {
-            ax.isZero = TRUE;
-        }
-        else {
-            expField = 1 - 0x3FF;
-            do {
-                ax.sig = shortShift64Left( ax.sig, 1 );
-                --expField;
-            } while ( ax.sig.a0 < 0x00100000 );
-            ax.exp = expField;
-        }
-    }
-    else if ( expField == 0x7FF ) {
-        if ( ( ax.sig.a0 == 0 ) && ( ax.sig.a1 == 0 ) ) {
-            ax.isInf = TRUE;
-        }
-        else {
-            ax.isNaN = TRUE;
-        }
-    }
-    else {
-        ax.exp = expField - 0x3FF;
-        ax.sig.a0 |= 0x00100000;
-    }
-    ax.sig = shortShift64Left( ax.sig, 3 );
-    return ax;
-
-}
-
-static float64 floatXToFloat64( floatX zx )
-{
-    floatX savedZ;
-    flag isTiny;
-    int16 expField;
-    float64 z;
-
-#ifdef BITS64
-    if ( zx.isZero ) return zx.sign ? LIT64( 0x8000000000000000 ) : 0;
-    if ( zx.isInf ) {
-        return
-              zx.sign ? LIT64( 0xFFF0000000000000 )
-            : LIT64( 0x7FF0000000000000 );
-    }
-    if ( zx.isNaN ) return LIT64( 0xFFFFFFFFFFFFFFFF );
-#else
-    if ( zx.isZero ) {
-        z.low = 0;
-        z.high = zx.sign ? 0x80000000 : 0;
-        return z;
-    }
-    if ( zx.isInf ) {
-        z.low = 0;
-        z.high = zx.sign ? 0xFFF00000 : 0x7FF00000;
-        return z;
-    }
-    if ( zx.isNaN ) {
-        z.high = z.low = 0xFFFFFFFF;
-        return z;
-    }
-#endif
-    while ( 0x01000000 <= zx.sig.a0 ) {
-        zx.sig = shortShift64RightJamming( zx.sig, 1 );
-        ++zx.exp;
-    }
-    while ( zx.sig.a0 < 0x00800000 ) {
-        zx.sig = shortShift64Left( zx.sig, 1 );
-        --zx.exp;
-    }
-    savedZ = zx;
-    isTiny =
-           ( slow_float_detect_tininess == float_tininess_before_rounding )
-        && ( zx.exp + 0x3FF <= 0 );
-    zx = roundFloatXTo53( isTiny, zx );
-    expField = zx.exp + 0x3FF;
-    if ( 0x7FF <= expField ) {
-        slow_float_exception_flags |=
-            float_flag_overflow | float_flag_inexact;
-#ifdef BITS64
-        if ( zx.sign ) {
-            switch ( slow_float_rounding_mode ) {
-             case float_round_nearest_even:
-             case float_round_down:
-                z = LIT64( 0xFFF0000000000000 );
-                break;
-             case float_round_to_zero:
-             case float_round_up:
-                z = LIT64( 0xFFEFFFFFFFFFFFFF );
-                break;
-            }
-        }
-        else {
-            switch ( slow_float_rounding_mode ) {
-             case float_round_nearest_even:
-             case float_round_up:
-                z = LIT64( 0x7FF0000000000000 );
-                break;
-             case float_round_to_zero:
-             case float_round_down:
-                z = LIT64( 0x7FEFFFFFFFFFFFFF );
-                break;
-            }
-        }
-#else
-        if ( zx.sign ) {
-            switch ( slow_float_rounding_mode ) {
-             case float_round_nearest_even:
-             case float_round_down:
-                z.low = 0;
-                z.high = 0xFFF00000;
-                break;
-             case float_round_to_zero:
-             case float_round_up:
-                z.low = 0xFFFFFFFF;
-                z.high = 0xFFEFFFFF;
-                break;
-            }
-        }
-        else {
-            switch ( slow_float_rounding_mode ) {
-             case float_round_nearest_even:
-             case float_round_up:
-                z.low = 0;
-                z.high = 0x7FF00000;
-                break;
-             case float_round_to_zero:
-             case float_round_down:
-                z.low = 0xFFFFFFFF;
-                z.high = 0x7FEFFFFF;
-                break;
-            }
-        }
-#endif
-        return z;
-    }
-    if ( expField <= 0 ) {
-        isTiny = TRUE;
-        zx = savedZ;
-        expField = zx.exp + 0x3FF;
-        if ( expField < -56 ) {
-            zx.sig.a1 = ( zx.sig.a0 != 0 ) || ( zx.sig.a1 != 0 );
-            zx.sig.a0 = 0;
-        }
-        else {
-            while ( expField <= 0 ) {
-                zx.sig = shortShift64RightJamming( zx.sig, 1 );
-                ++expField;
-            }
-        }
-        zx = roundFloatXTo53( isTiny, zx );
-        expField = ( 0x00800000 <= zx.sig.a0 ) ? 1 : 0;
-    }
-    zx.sig = shortShift64RightJamming( zx.sig, 3 );
-#ifdef BITS64
-    z = expField;
-    z <<= 52;
-    if ( zx.sign ) z |= LIT64( 0x8000000000000000 );
-    z |= ( ( (bits64) ( zx.sig.a0 & 0x000FFFFF ) )<<32 ) | zx.sig.a1;
-#else
-    z.low = zx.sig.a1;
-    z.high = expField;
-    z.high <<= 52 - 32;
-    if ( zx.sign ) z.high |= 0x80000000;
-    z.high |= zx.sig.a0 & 0x000FFFFF;
-#endif
-    return z;
-
-}
-
-static floatX floatXInvalid( void )
-{
-
-    slow_float_exception_flags |= float_flag_invalid;
-    return floatXNaN;
-
-}
-
-static floatX floatXRoundToInt( floatX ax )
-{
-    int16 shiftCount, i;
-
-    if ( ax.isNaN || ax.isInf ) return ax;
-    shiftCount = 52 - ax.exp;
-    if ( shiftCount <= 0 ) return ax;
-    if ( 55 < shiftCount ) {
-        ax.exp = 52;
-        ax.sig.a1 = ! ax.isZero;
-        ax.sig.a0 = 0;
-    }
-    else {
-        while ( 0 < shiftCount ) {
-            ax.sig = shortShift64RightJamming( ax.sig, 1 );
-            ++ax.exp;
-            --shiftCount;
-        }
-    }
-    ax = roundFloatXTo53( FALSE, ax );
-    if ( ( ax.sig.a0 == 0 ) && ( ax.sig.a1 == 0 ) ) ax.isZero = TRUE;
-    return ax;
-
-}
-
-static floatX floatXAdd( floatX ax, floatX bx )
-{
-    int16 expDiff;
-    floatX zx;
-
-    if ( ax.isNaN ) return ax;
-    if ( bx.isNaN ) return bx;
-    if ( ax.isInf && bx.isInf ) {
-        if ( ax.sign == bx.sign ) return ax;
-        return floatXInvalid();
-    }
-    if ( ax.isInf ) return ax;
-    if ( bx.isInf ) return bx;
-    if ( ax.isZero && bx.isZero ) {
-        if ( ax.sign == bx.sign ) return ax;
-        goto completeCancellation;
-    }
-    if (    ( ax.sign != bx.sign )
-         && ( ax.exp == bx.exp )
-         && eq64( ax.sig, bx.sig )
-       ) {
- completeCancellation:
-        return
-              ( slow_float_rounding_mode == float_round_down ) ?
-                  floatXNegativeZero
-            : floatXPositiveZero;
-    }
-    if ( ax.isZero ) return bx;
-    if ( bx.isZero ) return ax;
-    expDiff = ax.exp - bx.exp;
-    if ( expDiff < 0 ) {
-        zx = ax;
-        zx.exp = bx.exp;
-        if ( expDiff < -56 ) {
-            zx.sig.a1 = 1;
-            zx.sig.a0 = 0;
-        }
-        else {
-            while ( expDiff < 0 ) {
-                zx.sig = shortShift64RightJamming( zx.sig, 1 );
-                ++expDiff;
-            }
-        }
-        if ( ax.sign != bx.sign ) zx.sig = neg64( zx.sig );
-        zx.sign = bx.sign;
-        zx.sig = add64( zx.sig, bx.sig );
-    }
-    else {
-        zx = bx;
-        zx.exp = ax.exp;
-        if ( 56 < expDiff ) {
-            zx.sig.a1 = 1;
-            zx.sig.a0 = 0;
-        }
-        else {
-            while ( 0 < expDiff ) {
-                zx.sig = shortShift64RightJamming( zx.sig, 1 );
-                --expDiff;
-            }
-        }
-        if ( ax.sign != bx.sign ) zx.sig = neg64( zx.sig );
-        zx.sign = ax.sign;
-        zx.sig = add64( zx.sig, ax.sig );
-    }
-    if ( zx.sig.a0 & 0x80000000 ) {
-        zx.sig = neg64( zx.sig );
-        zx.sign = ! zx.sign;
-    }
-    return zx;
-
-}
-
-static floatX floatXMul( floatX ax, floatX bx )
-{
-    int8 bitNum;
-    floatX zx;
-
-    if ( ax.isNaN ) return ax;
-    if ( bx.isNaN ) return bx;
-    if ( ax.isInf ) {
-        if ( bx.isZero ) return floatXInvalid();
-        if ( bx.sign ) ax.sign = ! ax.sign;
-        return ax;
-    }
-    if ( bx.isInf ) {
-        if ( ax.isZero ) return floatXInvalid();
-        if ( ax.sign ) bx.sign = ! bx.sign;
-        return bx;
-    }
-    zx = ax;
-    zx.sign ^= bx.sign;
-    if ( ax.isZero || bx.isZero ) {
-        return zx.sign ? floatXNegativeZero : floatXPositiveZero;
-    }
-    zx.exp += bx.exp + 1;
-    zx.sig.a1 = 0;
-    zx.sig.a0 = 0;
-    for ( bitNum = 0; bitNum < 55; ++bitNum ) {
-        if ( bx.sig.a1 & 2 ) zx.sig = add64( zx.sig, ax.sig );
*** 14610 LINES SKIPPED ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202308062036.376KaMHd042591>