
/*============================================================================

This C source file is part of TestFloat, Release 3, a package of programs for
testing the correctness of floating-point arithmetic complying with the IEEE
Standard for Floating-Point, by John R. Hauser.

Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
(Regents).  All Rights Reserved.  Redistribution and use in source and binary
forms, with or without modification, are permitted provided that the following
conditions are met:

Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following two paragraphs of disclaimer.
Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following two paragraphs of disclaimer in the
documentation and/or other materials provided with the distribution.  Neither
the name of the Regents nor the names of its contributors may be used to
endorse or promote products derived from this software without specific prior
written permission.

IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
HEREUNDER IS PROVIDED "AS IS".  REGENTS HAS NO OBLIGATION TO PROVIDE
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

=============================================================================*/

#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "platform.h"
#include "uint128.h"
#include "fail.h"
#include "softfloat.h"
#include "readHex.h"
#include "verCases.h"
#include "writeCase.h"
#include "verLoops.h"

uint_fast8_t *verLoops_trueFlagsPtr;

static bool atEndOfInput( void )
{
    int i;

    i = fgetc( stdin );
    if ( i == EOF ) {
        if ( ! ferror( stdin ) && feof( stdin ) ) return true;
        fail( "Error reading input" );
    }
    ungetc( i, stdin );
    return false;

}

static void failFromBadInput( void )
{

    fail( "Invalid input format" );

}

static void readVerInput_bool( bool *aPtr )
{

    if ( ! readHex_bool( aPtr, ' ' ) ) failFromBadInput();

}

static void readVerInput_ui32( uint_fast32_t *aPtr )
{
    uint32_t a;

    if ( ! readHex_ui32( &a, ' ' ) ) failFromBadInput();
    *aPtr = a;

}

static void readVerInput_ui64( uint_fast64_t *aPtr )
{
    uint64_t a;

    if ( ! readHex_ui64( &a, ' ' ) ) failFromBadInput();
    *aPtr = a;

}

static void readVerInput_i32( int_fast32_t *aPtr )
{
    union { uint32_t ui; int32_t i; } uA;

    if ( ! readHex_ui32( &uA.ui, ' ' ) ) failFromBadInput();
    *aPtr = uA.i;

}

static void readVerInput_i64( int_fast64_t *aPtr )
{
    union { uint64_t ui; int64_t i; } uA;

    if ( ! readHex_ui64( &uA.ui, ' ' ) ) failFromBadInput();
    *aPtr = uA.i;

}

static void readVerInput_f32( float32_t *aPtr )
{
    union { uint32_t ui; float32_t f; } uA;

    if ( ! readHex_ui32( &uA.ui, ' ' ) ) failFromBadInput();
    *aPtr = uA.f;

}

static void readVerInput_f64( float64_t *aPtr )
{
    union { uint64_t ui; float64_t f; } uA;

    if ( ! readHex_ui64( &uA.ui, ' ' ) ) failFromBadInput();
    *aPtr = uA.f;

}

#ifdef EXTFLOAT80

static void readVerInput_extF80( extFloat80_t *aPtr )
{
    struct extFloat80M *aSPtr;

    aSPtr = (struct extFloat80M *) aPtr;
    if (
           ! readHex_ui16( &aSPtr->signExp, 0 )
        || ! readHex_ui64( &aSPtr->signif, ' ' )
    ) {
        failFromBadInput();
    }

}

#endif

#ifdef FLOAT128

static void readVerInput_f128( float128_t *aPtr )
{
    struct uint128 *uiAPtr;

    uiAPtr = (struct uint128 *) aPtr;
    if (
        ! readHex_ui64( &uiAPtr->v64, 0 ) || ! readHex_ui64( &uiAPtr->v0, ' ' )
    ) {
        failFromBadInput();
    }

}

#endif

static void readVerInput_flags( uint_fast8_t *flagsPtr )
{
    uint_least8_t commonFlags;
    uint_fast8_t flags;

    if ( ! readHex_ui8( &commonFlags, '\n' ) || (0x20 <= commonFlags) ) {
        failFromBadInput();
    }
    flags = 0;
    if ( commonFlags & 0x10 ) flags |= softfloat_flag_invalid;
    if ( commonFlags & 0x08 ) flags |= softfloat_flag_infinite;
    if ( commonFlags & 0x04 ) flags |= softfloat_flag_overflow;
    if ( commonFlags & 0x02 ) flags |= softfloat_flag_underflow;
    if ( commonFlags & 0x01 ) flags |= softfloat_flag_inexact;
    *flagsPtr = flags;

}

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
void ver_a_ui32_z_f32( float32_t trueFunction( uint_fast32_t ) )
{
    int count;
    uint_fast32_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui32( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui32( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_ui32_z_f64( float64_t trueFunction( uint_fast32_t ) )
{
    int count;
    uint_fast32_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui32( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui32( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void ver_a_ui32_z_extF80( void trueFunction( uint_fast32_t, extFloat80_t * ) )
{
    int count;
    uint_fast32_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui32( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui32( a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

#ifdef FLOAT128

void ver_a_ui32_z_f128( void trueFunction( uint_fast32_t, float128_t * ) )
{
    int count;
    uint_fast32_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui32( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui32( a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
void ver_a_ui64_z_f32( float32_t trueFunction( uint_fast64_t ) )
{
    int count;
    uint_fast64_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui64( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui64( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_ui64_z_f64( float64_t trueFunction( uint_fast64_t ) )
{
    int count;
    uint_fast64_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui64( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui64( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void ver_a_ui64_z_extF80( void trueFunction( uint_fast64_t, extFloat80_t * ) )
{
    int count;
    uint_fast64_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui64( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui64( a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

#ifdef FLOAT128

void ver_a_ui64_z_f128( void trueFunction( uint_fast64_t, float128_t * ) )
{
    int count;
    uint_fast64_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_ui64( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_ui64( a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
void ver_a_i32_z_f32( float32_t trueFunction( int_fast32_t ) )
{
    int count;
    int_fast32_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i32( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i32( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_i32_z_f64( float64_t trueFunction( int_fast32_t ) )
{
    int count;
    int_fast32_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i32( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i32( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void ver_a_i32_z_extF80( void trueFunction( int_fast32_t, extFloat80_t * ) )
{
    int count;
    int_fast32_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i32( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i32( a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

#ifdef FLOAT128

void ver_a_i32_z_f128( void trueFunction( int_fast32_t, float128_t * ) )
{
    int count;
    int_fast32_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i32( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i32( a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
void ver_a_i64_z_f32( float32_t trueFunction( int_fast64_t ) )
{
    int count;
    int_fast64_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i64( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i64( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_i64_z_f64( float64_t trueFunction( int_fast64_t ) )
{
    int count;
    int_fast64_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i64( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i64( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void ver_a_i64_z_extF80( void trueFunction( int_fast64_t, extFloat80_t * ) )
{
    int count;
    int_fast64_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i64( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i64( a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

#ifdef FLOAT128

void ver_a_i64_z_f128( void trueFunction( int_fast64_t, float128_t * ) )
{
    int count;
    int_fast64_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_i64( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_i64( a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
void
 ver_a_f32_z_ui32_rx(
     uint_fast32_t trueFunction( float32_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float32_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_ui64_rx(
     uint_fast64_t trueFunction( float32_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float32_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_i32_rx(
     int_fast32_t trueFunction( float32_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float32_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_i64_rx(
     int_fast64_t trueFunction( float32_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float32_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_ui32_x(
     uint_fast32_t trueFunction( float32_t, bool ), bool exact )
{
    int count;
    float32_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_ui64_x(
     uint_fast64_t trueFunction( float32_t, bool ), bool exact )
{
    int count;
    float32_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_i32_x(
     int_fast32_t trueFunction( float32_t, bool ), bool exact )
{
    int count;
    float32_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f32_z_i64_x(
     int_fast64_t trueFunction( float32_t, bool ), bool exact )
{
    int count;
    float32_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_f32_z_f64( float64_t trueFunction( float32_t ) )
{
    int count;
    float32_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void ver_a_f32_z_extF80( void trueFunction( float32_t, extFloat80_t * ) )
{
    int count;
    float32_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

#ifdef FLOAT128

void ver_a_f32_z_f128( void trueFunction( float32_t, float128_t * ) )
{
    int count;
    float32_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

void ver_az_f32( float32_t trueFunction( float32_t ) )
{
    int count;
    float32_t a, subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_az_f32_rx(
     float32_t trueFunction( float32_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float32_t a, subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f32_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f32( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_abz_f32( float32_t trueFunction( float32_t, float32_t ) )
{
    int count;
    float32_t a, b, subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f32( &b );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, b );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f32_isSignalingNaN( a ) || f32_isSignalingNaN( b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_f32( a, b, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_abcz_f32( float32_t trueFunction( float32_t, float32_t, float32_t ) )
{
    int count;
    float32_t a, b, c, subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f32( &b );
        readVerInput_f32( &c );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, b, c );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                   ! verCases_checkNaNs
                && (f32_isSignalingNaN( a ) || f32_isSignalingNaN( b )
                        || f32_isSignalingNaN( c ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_abc_f32( a, b, c, "\n\t" );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_ab_f32_z_bool( bool trueFunction( float32_t, float32_t ) )
{
    int count;
    float32_t a, b;
    bool subjZ;
    uint_fast8_t subjFlags;
    bool trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f32( &a );
        readVerInput_f32( &b );
        readVerInput_bool( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, b );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f32_isSignalingNaN( a ) || f32_isSignalingNaN( b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_f32( a, b, "  " );
                writeCase_z_bool( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
void
 ver_a_f64_z_ui32_rx(
     uint_fast32_t trueFunction( float64_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float64_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_ui64_rx(
     uint_fast64_t trueFunction( float64_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float64_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_i32_rx(
     int_fast32_t trueFunction( float64_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float64_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_i64_rx(
     int_fast64_t trueFunction( float64_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float64_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_ui32_x(
     uint_fast32_t trueFunction( float64_t, bool ), bool exact )
{
    int count;
    float64_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_ui64_x(
     uint_fast64_t trueFunction( float64_t, bool ), bool exact )
{
    int count;
    float64_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_i32_x(
     int_fast32_t trueFunction( float64_t, bool ), bool exact )
{
    int count;
    float64_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f64_z_i64_x(
     int_fast64_t trueFunction( float64_t, bool ), bool exact )
{
    int count;
    float64_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_f64_z_f32( float32_t trueFunction( float64_t ) )
{
    int count;
    float64_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void ver_a_f64_z_extF80( void trueFunction( float64_t, extFloat80_t * ) )
{
    int count;
    float64_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

#ifdef FLOAT128

void ver_a_f64_z_f128( void trueFunction( float64_t, float128_t * ) )
{
    int count;
    float64_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

void ver_az_f64( float64_t trueFunction( float64_t ) )
{
    int count;
    float64_t a, subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_az_f64_rx(
     float64_t trueFunction( float64_t, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float64_t a, subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f64_isSignalingNaN( a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f64( a, "  " );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_abz_f64( float64_t trueFunction( float64_t, float64_t ) )
{
    int count;
    float64_t a, b, subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f64( &b );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, b );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f64_isSignalingNaN( a ) || f64_isSignalingNaN( b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_f64( a, b, "\n\t" );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_abcz_f64( float64_t trueFunction( float64_t, float64_t, float64_t ) )
{
    int count;
    float64_t a, b, c, subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f64( &b );
        readVerInput_f64( &c );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, b, c );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f64_isSignalingNaN( a ) || f64_isSignalingNaN( b )
                             || f64_isSignalingNaN( c ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_abc_f64( a, b, c, "\n\t" );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_ab_f64_z_bool( bool trueFunction( float64_t, float64_t ) )
{
    int count;
    float64_t a, b;
    bool subjZ;
    uint_fast8_t subjFlags;
    bool trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f64( &a );
        readVerInput_f64( &b );
        readVerInput_bool( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( a, b );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f64_isSignalingNaN( a ) || f64_isSignalingNaN( b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_f64( a, b, "  " );
                writeCase_z_bool( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#ifdef EXTFLOAT80

void
 ver_a_extF80_z_ui32_rx(
     uint_fast32_t trueFunction( const extFloat80_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    extFloat80_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_ui64_rx(
     uint_fast64_t trueFunction( const extFloat80_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    extFloat80_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_i32_rx(
     int_fast32_t trueFunction( const extFloat80_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    extFloat80_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_i64_rx(
     int_fast64_t trueFunction( const extFloat80_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    extFloat80_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                    && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_ui32_x(
     uint_fast32_t trueFunction( const extFloat80_t *, bool ), bool exact )
{
    int count;
    extFloat80_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_ui64_x(
     uint_fast64_t trueFunction( const extFloat80_t *, bool ), bool exact )
{
    int count;
    extFloat80_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_i32_x(
     int_fast32_t trueFunction( const extFloat80_t *, bool ), bool exact )
{
    int count;
    extFloat80_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_extF80_z_i64_x(
     int_fast64_t trueFunction( const extFloat80_t *, bool ), bool exact )
{
    int count;
    extFloat80_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_extF80_z_f32( float32_t trueFunction( const extFloat80_t * ) )
{
    int count;
    extFloat80_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_extF80_z_f64( float64_t trueFunction( const extFloat80_t * ) )
{
    int count;
    extFloat80_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef FLOAT128

void
 ver_a_extF80_z_f128( void trueFunction( const extFloat80_t *, float128_t * ) )
{
    int count;
    extFloat80_t a;
    float128_t subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "\n\t" );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

void ver_az_extF80( void trueFunction( const extFloat80_t *, extFloat80_t * ) )
{
    int count;
    extFloat80_t a, subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_az_extF80_rx(
     void
      trueFunction( const extFloat80_t *, uint_fast8_t, bool, extFloat80_t * ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    extFloat80_t a, subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, roundingMode, exact, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && extF80M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_extF80M( &a, "  " );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_abz_extF80(
     void
      trueFunction(
          const extFloat80_t *, const extFloat80_t *, extFloat80_t * )
 )
{
    int count;
    extFloat80_t a, b, subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_extF80( &b );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &b, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (extF80M_isSignalingNaN( &a )
                            || extF80M_isSignalingNaN( &b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_extF80M( &a, &b, "\n\t" );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_abcz_extF80(
     void
      trueFunction(
          const extFloat80_t *,
          const extFloat80_t *,
          const extFloat80_t *,
          extFloat80_t *
      )
 )
{
    int count;
    extFloat80_t a, b, c, subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_extF80( &b );
        readVerInput_extF80( &c );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &b, &c, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (   extF80M_isSignalingNaN( &a )
                        || extF80M_isSignalingNaN( &b )
                        || extF80M_isSignalingNaN( &c )
                       )
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_abc_extF80M( &a, &b, &c, "\n\t" );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_ab_extF80_z_bool(
     bool trueFunction( const extFloat80_t *, const extFloat80_t * ) )
{
    int count;
    extFloat80_t a, b;
    bool subjZ;
    uint_fast8_t subjFlags;
    bool trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_extF80( &a );
        readVerInput_extF80( &b );
        readVerInput_bool( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, &b );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (extF80M_isSignalingNaN( &a )
                            || extF80M_isSignalingNaN( &b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_extF80M( &a, &b, "  " );
                writeCase_z_bool( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#ifdef FLOAT128

void
 ver_a_f128_z_ui32_rx(
     uint_fast32_t trueFunction( const float128_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float128_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_ui64_rx(
     uint_fast64_t trueFunction( const float128_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float128_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_i32_rx(
     int_fast32_t trueFunction( const float128_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float128_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_i64_rx(
     int_fast64_t trueFunction( const float128_t *, uint_fast8_t, bool ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float128_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, roundingMode, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_ui32_x(
     uint_fast32_t trueFunction( const float128_t *, bool ), bool exact )
{
    int count;
    float128_t a;
    uint_fast32_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_ui32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0xFFFFFFFF)
                || (subjZ != 0xFFFFFFFF)
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "  " );
                writeCase_z_ui32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_ui64_x(
     uint_fast64_t trueFunction( const float128_t *, bool ), bool exact )
{
    int count;
    float128_t a;
    uint_fast64_t subjZ;
    uint_fast8_t subjFlags;
    uint_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_ui64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (subjZ != UINT64_C( 0xFFFFFFFFFFFFFFFF ))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_ui64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_i32_x(
     int_fast32_t trueFunction( const float128_t *, bool ), bool exact )
{
    int count;
    float128_t a;
    int_fast32_t subjZ;
    uint_fast8_t subjFlags;
    int_fast32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_i32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != 0x7FFFFFFF)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "  " );
                writeCase_z_i32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_a_f128_z_i64_x(
     int_fast64_t trueFunction( const float128_t *, bool ), bool exact )
{
    int count;
    float128_t a;
    int_fast64_t subjZ;
    uint_fast8_t subjFlags;
    int_fast64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_i64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, exact );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   (trueZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                || ((subjZ != INT64_C( 0x7FFFFFFFFFFFFFFF ))
                        && (subjZ != -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1))
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_i64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_f128_z_f32( float32_t trueFunction( const float128_t * ) )
{
    int count;
    float128_t a;
    float32_t subjZ;
    uint_fast8_t subjFlags;
    float32_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f32( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f32_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f32_isNaN( trueZ )
                || ! f32_isNaN( subjZ )
                || f32_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_f32( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void ver_a_f128_z_f64( float64_t trueFunction( const float128_t * ) )
{
    int count;
    float128_t a;
    float64_t subjZ;
    uint_fast8_t subjFlags;
    float64_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f64( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f64_same( trueZ, subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f64_isNaN( trueZ )
                || ! f64_isNaN( subjZ )
                || f64_isSignalingNaN( subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_f64( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#ifdef EXTFLOAT80

void
 ver_a_f128_z_extF80( void trueFunction( const float128_t *, extFloat80_t * ) )
{
    int count;
    float128_t a;
    extFloat80_t subjZ;
    uint_fast8_t subjFlags;
    extFloat80_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_extF80( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! extF80M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! extF80M_isNaN( &trueZ )
                || ! extF80M_isNaN( &subjZ )
                || extF80M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "\n\t" );
                writeCase_z_extF80M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

void ver_az_f128( void trueFunction( const float128_t *, float128_t * ) )
{
    int count;
    float128_t a, subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_az_f128_rx(
     void trueFunction( const float128_t *, uint_fast8_t, bool, float128_t * ),
     uint_fast8_t roundingMode,
     bool exact
 )
{
    int count;
    float128_t a, subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, roundingMode, exact, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if ( ! verCases_checkNaNs && f128M_isSignalingNaN( &a ) ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_a_f128M( &a, "  " );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_abz_f128(
     void trueFunction( const float128_t *, const float128_t *, float128_t * )
 )
{
    int count;
    float128_t a, b, subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f128( &b );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &b, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f128M_isSignalingNaN( &a )
                            || f128M_isSignalingNaN( &b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_f128M( &a, &b, "\n\t" );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_abcz_f128(
     void
      trueFunction(
          const float128_t *,
          const float128_t *,
          const float128_t *,
          float128_t *
      )
 )
{
    int count;
    float128_t a, b, c, subjZ;
    uint_fast8_t subjFlags;
    float128_t trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f128( &b );
        readVerInput_f128( &c );
        readVerInput_f128( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueFunction( &a, &b, &c, &trueZ );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( ! f128M_same( &trueZ, &subjZ ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (   f128M_isSignalingNaN( &a )
                        || f128M_isSignalingNaN( &b )
                        || f128M_isSignalingNaN( &c )
                       )
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if (
                   verCases_checkNaNs
                || ! f128M_isNaN( &trueZ )
                || ! f128M_isNaN( &subjZ )
                || f128M_isSignalingNaN( &subjZ )
                || (trueFlags != subjFlags)
            ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_abc_f128M( &a, &b, &c, "\n\t" );
                writeCase_z_f128M( &trueZ, trueFlags, &subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

void
 ver_ab_f128_z_bool(
     bool trueFunction( const float128_t *, const float128_t * ) )
{
    int count;
    float128_t a, b;
    bool subjZ;
    uint_fast8_t subjFlags;
    bool trueZ;
    uint_fast8_t trueFlags;

    verCases_errorCount = 0;
    verCases_tenThousandsCount = 0;
    count = 10000;
    while ( ! atEndOfInput() ) {
        readVerInput_f128( &a );
        readVerInput_f128( &b );
        readVerInput_bool( &subjZ );
        readVerInput_flags( &subjFlags );
        *verLoops_trueFlagsPtr = 0;
        trueZ = trueFunction( &a, &b );
        trueFlags = *verLoops_trueFlagsPtr;
        --count;
        if ( ! count ) {
            verCases_perTenThousand();
            count = 10000;
        }
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if (
                ! verCases_checkNaNs
                    && (f128M_isSignalingNaN( &a )
                            || f128M_isSignalingNaN( &b ))
            ) {
                trueFlags |= softfloat_flag_invalid;
            }
            if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
                ++verCases_errorCount;
                verCases_writeErrorFound( 10000 - count );
                writeCase_ab_f128M( &a, &b, "  " );
                writeCase_z_bool( trueZ, trueFlags, subjZ, subjFlags );
                if ( verCases_errorCount == verCases_maxErrorCount ) break;
            }
        }
    }
    verCases_writeTestsPerformed( 10000 - count );

}

#endif

