blob: b4ea5eda14ce5588175c3c8495c0f5b0ddf5a0a5 [file] [log] [blame]
/*============================================================================
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 <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include "platform.h"
#include "fail.h"
#include "softfloat.h"
#include "functions.h"
#include "genCases.h"
#include "genLoops.h"
enum {
TYPE_UI32 = NUM_FUNCTIONS,
TYPE_UI64,
TYPE_I32,
TYPE_I64,
TYPE_F32,
TYPE_F32_2,
TYPE_F32_3,
TYPE_F64,
TYPE_F64_2,
TYPE_F64_3,
TYPE_EXTF80,
TYPE_EXTF80_2,
TYPE_EXTF80_3,
TYPE_F128,
TYPE_F128_2,
TYPE_F128_3
};
static void catchSIGINT( int signalCode )
{
if ( genLoops_stop ) exit( EXIT_FAILURE );
genLoops_stop = true;
}
int main( int argc, char *argv[] )
{
const char *prefixTextPtr;
uint_fast8_t roundingMode;
bool exact;
int functionCode;
const char *argPtr;
long i;
int functionAttribs;
float32_t (*trueFunction_abz_f32)( float32_t, float32_t );
bool (*trueFunction_ab_f32_z_bool)( float32_t, float32_t );
float64_t (*trueFunction_abz_f64)( float64_t, float64_t );
bool (*trueFunction_ab_f64_z_bool)( float64_t, float64_t );
#ifdef EXTFLOAT80
void
(*trueFunction_abz_extF80)(
const extFloat80_t *, const extFloat80_t *, extFloat80_t * );
bool
(*trueFunction_ab_extF80_z_bool)(
const extFloat80_t *, const extFloat80_t * );
#endif
#ifdef FLOAT128
void
(*trueFunction_abz_f128)(
const float128_t *, const float128_t *, float128_t * );
bool
(*trueFunction_ab_f128_z_bool)( const float128_t *, const float128_t * );
#endif
/*------------------------------------------------------------------------
*------------------------------------------------------------------------*/
fail_programName = "testfloat_gen";
if ( argc <= 1 ) goto writeHelpMessage;
prefixTextPtr = 0;
softfloat_detectTininess = softfloat_tininess_beforeRounding;
#ifdef EXTFLOAT80
extF80_roundingPrecision = 80;
#endif
roundingMode = softfloat_round_near_even;
exact = false;
genCases_setLevel( 1 );
genLoops_trueFlagsPtr = &softfloat_exceptionFlags;
genLoops_forever = false;
genLoops_givenCount = false;
functionCode = 0;
for (;;) {
--argc;
if ( ! argc ) break;
argPtr = *++argv;
if ( ! argPtr ) break;
if ( argPtr[0] == '-' ) ++argPtr;
if (
! strcmp( argPtr, "help" ) || ! strcmp( argPtr, "-help" )
|| ! strcmp( argPtr, "h" )
) {
writeHelpMessage:
fputs(
"testfloat_gen [<option>...] <type>|<function>\n"
" <option>: (* is default)\n"
" -help --Write this message and exit.\n"
" -prefix <text> --Write <text> as a line of output before any test cases.\n"
" -level <num> --Testing level <num> (1 or 2).\n"
" * -level 1\n"
" -n <num> --Generate <num> test cases.\n"
" -forever --Generate test cases indefinitely (implies `-level 2').\n"
#ifdef EXTFLOAT80
" -precision32 --For extF80, rounding precision is 32 bits.\n"
" -precision64 --For extF80, rounding precision is 64 bits.\n"
" * -precision80 --For extF80, rounding precision is 80 bits.\n"
#endif
" * -rnear_even --Round to nearest/even.\n"
" -rminMag --Round to minimum magnitude (toward zero).\n"
" -rmin --Round to minimum (down).\n"
" -rmax --Round to maximum (up).\n"
" -rnear_maxMag --Round to nearest/maximum magnitude (nearest/away).\n"
" * -tininessbefore --Detect underflow tininess before rounding.\n"
" -tininessafter --Detect underflow tininess after rounding.\n"
" * -notexact --Rounding to integer is not exact (no inexact\n"
" exceptions).\n"
" -exact --Rounding to integer is exact (raising inexact\n"
" exceptions).\n"
" <type>:\n"
" <int> --Generate test cases with one integer operand.\n"
" <float> --Generate test cases with one floating-point operand.\n"
" <float> <num> --Generate test cases with <num> (1, 2, or 3)\n"
" floating-point operands.\n"
" <function>:\n"
" <int>_to_<float> <float>_add <float>_eq\n"
" <float>_to_<int> <float>_sub <float>_le\n"
" <float>_to_<float> <float>_mul <float>_lt\n"
" <float>_roundToInt <float>_mulAdd <float>_eq_signaling\n"
" <float>_div <float>_le_quiet\n"
" <float>_rem <float>_lt_quiet\n"
" <float>_sqrt\n"
" <int>:\n"
" ui32 --Unsigned 32-bit integer.\n"
" ui64 --Unsigned 64-bit integer.\n"
" i32 --Signed 32-bit integer.\n"
" i64 --Signed 64-bit integer.\n"
" <float>:\n"
" f32 --Binary 32-bit floating-point (single-precision).\n"
" f64 --Binary 64-bit floating-point (double-precision).\n"
#ifdef EXTFLOAT80
" extF80 --Binary 80-bit extended floating-point.\n"
#endif
#ifdef FLOAT128
" f128 --Binary 128-bit floating-point (quadruple-precision).\n"
#endif
,
stdout
);
return EXIT_SUCCESS;
} else if ( ! strcmp( argPtr, "prefix" ) ) {
if ( argc < 2 ) goto optionError;
prefixTextPtr = argv[1];
--argc;
++argv;
} else if ( ! strcmp( argPtr, "level" ) ) {
if ( argc < 2 ) goto optionError;
i = strtol( argv[1], (char **) &argPtr, 10 );
if ( *argPtr ) goto optionError;
genCases_setLevel( i );
--argc;
++argv;
} else if ( ! strcmp( argPtr, "level1" ) ) {
genCases_setLevel( 1 );
} else if ( ! strcmp( argPtr, "level2" ) ) {
genCases_setLevel( 2 );
} else if ( ! strcmp( argPtr, "n" ) ) {
if ( argc < 2 ) goto optionError;
genLoops_forever = true;
genLoops_givenCount = true;
i = strtol( argv[1], (char **) &argPtr, 10 );
if ( *argPtr ) goto optionError;
genLoops_count = i;
--argc;
++argv;
} else if ( ! strcmp( argPtr, "forever" ) ) {
genCases_setLevel( 2 );
genLoops_forever = true;
genLoops_givenCount = false;
#ifdef EXTFLOAT80
} else if ( ! strcmp( argPtr, "precision32" ) ) {
extF80_roundingPrecision = 32;
} else if ( ! strcmp( argPtr, "precision64" ) ) {
extF80_roundingPrecision = 64;
} else if ( ! strcmp( argPtr, "precision80" ) ) {
extF80_roundingPrecision = 80;
#endif
} else if (
! strcmp( argPtr, "rnear_even" )
|| ! strcmp( argPtr, "rneareven" )
|| ! strcmp( argPtr, "rnearest_even" )
) {
roundingMode = softfloat_round_near_even;
} else if (
! strcmp( argPtr, "rminmag" ) || ! strcmp( argPtr, "rminMag" )
) {
roundingMode = softfloat_round_minMag;
} else if ( ! strcmp( argPtr, "rmin" ) ) {
roundingMode = softfloat_round_min;
} else if ( ! strcmp( argPtr, "rmax" ) ) {
roundingMode = softfloat_round_max;
} else if (
! strcmp( argPtr, "rnear_maxmag" )
|| ! strcmp( argPtr, "rnear_maxMag" )
|| ! strcmp( argPtr, "rnearmaxmag" )
|| ! strcmp( argPtr, "rnearest_maxmag" )
|| ! strcmp( argPtr, "rnearest_maxMag" )
) {
roundingMode = softfloat_round_near_maxMag;
} else if ( ! strcmp( argPtr, "tininessbefore" ) ) {
softfloat_detectTininess = softfloat_tininess_beforeRounding;
} else if ( ! strcmp( argPtr, "tininessafter" ) ) {
softfloat_detectTininess = softfloat_tininess_afterRounding;
} else if ( ! strcmp( argPtr, "notexact" ) ) {
exact = false;
} else if ( ! strcmp( argPtr, "exact" ) ) {
exact = true;
} else if (
! strcmp( argPtr, "ui32" ) || ! strcmp( argPtr, "uint32" )
) {
functionCode = TYPE_UI32;
if ( 2 <= argc ) goto absorbArg1;
} else if (
! strcmp( argPtr, "ui64" ) || ! strcmp( argPtr, "uint64" )
) {
functionCode = TYPE_UI64;
if ( 2 <= argc ) goto absorbArg1;
} else if (
! strcmp( argPtr, "i32" ) || ! strcmp( argPtr, "int32" )
) {
functionCode = TYPE_I32;
if ( 2 <= argc ) goto absorbArg1;
} else if (
! strcmp( argPtr, "i64" ) || ! strcmp( argPtr, "int64" )
) {
functionCode = TYPE_I64;
if ( 2 <= argc ) goto absorbArg1;
} else if (
! strcmp( argPtr, "f32" ) || ! strcmp( argPtr, "float32" )
) {
functionCode = TYPE_F32;
goto absorbArg;
} else if (
! strcmp( argPtr, "f64" ) || ! strcmp( argPtr, "float64" )
) {
functionCode = TYPE_F64;
#ifdef EXTFLOAT80
goto absorbArg;
} else if (
! strcmp( argPtr, "extF80" ) || ! strcmp( argPtr, "extFloat80" )
) {
functionCode = TYPE_EXTF80;
#endif
#ifdef FLOAT128
goto absorbArg;
} else if (
! strcmp( argPtr, "f128" ) || ! strcmp( argPtr, "float128" )
) {
functionCode = TYPE_F128;
#endif
absorbArg:
if ( 2 <= argc ) {
if ( ! strcmp( argv[1], "2" ) ) {
--argc;
++argv;
++functionCode;
} else if ( ! strcmp( argv[1], "3" ) ) {
--argc;
++argv;
functionCode += 2;
} else {
absorbArg1:
if ( ! strcmp( argv[1], "1" ) ) {
--argc;
++argv;
}
}
}
} else {
functionCode = 1;
while ( strcmp( argPtr, functionInfos[functionCode].namePtr ) ) {
++functionCode;
if ( functionCode == NUM_FUNCTIONS ) goto invalidArg;
}
functionAttribs = functionInfos[functionCode].attribs;
if (
(functionAttribs & FUNC_ARG_EXACT)
&& ! (functionAttribs & FUNC_ARG_ROUNDINGMODE)
) {
goto invalidArg;
}
}
}
if ( ! functionCode ) fail( "Type or function argument required" );
/*------------------------------------------------------------------------
*------------------------------------------------------------------------*/
if ( prefixTextPtr ) {
fputs( prefixTextPtr, stdout );
fputc( '\n', stdout );
}
softfloat_roundingMode = roundingMode;
signal( SIGINT, catchSIGINT );
signal( SIGTERM, catchSIGINT );
switch ( functionCode ) {
/*--------------------------------------------------------------------
*--------------------------------------------------------------------*/
case TYPE_UI32:
gen_a_ui32();
break;
case TYPE_UI64:
gen_a_ui64();
break;
case TYPE_I32:
gen_a_i32();
break;
case TYPE_I64:
gen_a_i64();
break;
case TYPE_F32:
gen_a_f32();
break;
case TYPE_F32_2:
gen_ab_f32();
break;
case TYPE_F32_3:
gen_abc_f32();
break;
case TYPE_F64:
gen_a_f64();
break;
case TYPE_F64_2:
gen_ab_f64();
break;
case TYPE_F64_3:
gen_abc_f64();
break;
#ifdef EXTFLOAT80
case TYPE_EXTF80:
gen_a_extF80();
break;
case TYPE_EXTF80_2:
gen_ab_extF80();
break;
case TYPE_EXTF80_3:
gen_abc_extF80();
break;
#endif
#ifdef FLOAT128
case TYPE_F128:
gen_a_f128();
break;
case TYPE_F128_2:
gen_ab_f128();
break;
case TYPE_F128_3:
gen_abc_f128();
break;
#endif
/*--------------------------------------------------------------------
*--------------------------------------------------------------------*/
case UI32_TO_F32:
gen_a_ui32_z_f32( ui32_to_f32 );
break;
case UI32_TO_F64:
gen_a_ui32_z_f64( ui32_to_f64 );
break;
#ifdef EXTFLOAT80
case UI32_TO_EXTF80:
gen_a_ui32_z_extF80( ui32_to_extF80M );
break;
#endif
#ifdef FLOAT128
case UI32_TO_F128:
gen_a_ui32_z_f128( ui32_to_f128M );
break;
#endif
case UI64_TO_F32:
gen_a_ui64_z_f32( ui64_to_f32 );
break;
case UI64_TO_F64:
gen_a_ui64_z_f64( ui64_to_f64 );
break;
#ifdef EXTFLOAT80
case UI64_TO_EXTF80:
gen_a_ui64_z_extF80( ui64_to_extF80M );
break;
#endif
#ifdef FLOAT128
case UI64_TO_F128:
gen_a_ui64_z_f128( ui64_to_f128M );
break;
#endif
case I32_TO_F32:
gen_a_i32_z_f32( i32_to_f32 );
break;
case I32_TO_F64:
gen_a_i32_z_f64( i32_to_f64 );
break;
#ifdef EXTFLOAT80
case I32_TO_EXTF80:
gen_a_i32_z_extF80( i32_to_extF80M );
break;
#endif
#ifdef FLOAT128
case I32_TO_F128:
gen_a_i32_z_f128( i32_to_f128M );
break;
#endif
case I64_TO_F32:
gen_a_i64_z_f32( i64_to_f32 );
break;
case I64_TO_F64:
gen_a_i64_z_f64( i64_to_f64 );
break;
#ifdef EXTFLOAT80
case I64_TO_EXTF80:
gen_a_i64_z_extF80( i64_to_extF80M );
break;
#endif
#ifdef FLOAT128
case I64_TO_F128:
gen_a_i64_z_f128( i64_to_f128M );
break;
#endif
/*--------------------------------------------------------------------
*--------------------------------------------------------------------*/
case F32_TO_UI32:
gen_a_f32_z_ui32_rx( f32_to_ui32, roundingMode, exact );
break;
case F32_TO_UI64:
gen_a_f32_z_ui64_rx( f32_to_ui64, roundingMode, exact );
break;
case F32_TO_I32:
gen_a_f32_z_i32_rx( f32_to_i32, roundingMode, exact );
break;
case F32_TO_I64:
gen_a_f32_z_i64_rx( f32_to_i64, roundingMode, exact );
break;
case F32_TO_F64:
gen_a_f32_z_f64( f32_to_f64 );
break;
#ifdef EXTFLOAT80
case F32_TO_EXTF80:
gen_a_f32_z_extF80( f32_to_extF80M );
break;
#endif
#ifdef FLOAT128
case F32_TO_F128:
gen_a_f32_z_f128( f32_to_f128M );
break;
#endif
case F32_ROUNDTOINT:
gen_az_f32_rx( f32_roundToInt, roundingMode, exact );
break;
case F32_ADD:
trueFunction_abz_f32 = f32_add;
goto gen_abz_f32;
case F32_SUB:
trueFunction_abz_f32 = f32_sub;
goto gen_abz_f32;
case F32_MUL:
trueFunction_abz_f32 = f32_mul;
goto gen_abz_f32;
case F32_DIV:
trueFunction_abz_f32 = f32_div;
goto gen_abz_f32;
case F32_REM:
trueFunction_abz_f32 = f32_rem;
gen_abz_f32:
gen_abz_f32( trueFunction_abz_f32 );
break;
case F32_MULADD:
gen_abcz_f32( f32_mulAdd );
break;
case F32_SQRT:
gen_az_f32( f32_sqrt );
break;
case F32_EQ:
trueFunction_ab_f32_z_bool = f32_eq;
goto gen_ab_f32_z_bool;
case F32_LE:
trueFunction_ab_f32_z_bool = f32_le;
goto gen_ab_f32_z_bool;
case F32_LT:
trueFunction_ab_f32_z_bool = f32_lt;
goto gen_ab_f32_z_bool;
case F32_EQ_SIGNALING:
trueFunction_ab_f32_z_bool = f32_eq_signaling;
goto gen_ab_f32_z_bool;
case F32_LE_QUIET:
trueFunction_ab_f32_z_bool = f32_le_quiet;
goto gen_ab_f32_z_bool;
case F32_LT_QUIET:
trueFunction_ab_f32_z_bool = f32_lt_quiet;
gen_ab_f32_z_bool:
gen_ab_f32_z_bool( trueFunction_ab_f32_z_bool );
break;
/*--------------------------------------------------------------------
*--------------------------------------------------------------------*/
case F64_TO_UI32:
gen_a_f64_z_ui32_rx( f64_to_ui32, roundingMode, exact );
break;
case F64_TO_UI64:
gen_a_f64_z_ui64_rx( f64_to_ui64, roundingMode, exact );
break;
case F64_TO_I32:
gen_a_f64_z_i32_rx( f64_to_i32, roundingMode, exact );
break;
case F64_TO_I64:
gen_a_f64_z_i64_rx( f64_to_i64, roundingMode, exact );
break;
case F64_TO_F32:
gen_a_f64_z_f32( f64_to_f32 );
break;
#ifdef EXTFLOAT80
case F64_TO_EXTF80:
gen_a_f64_z_extF80( f64_to_extF80M );
break;
#endif
#ifdef FLOAT128
case F64_TO_F128:
gen_a_f64_z_f128( f64_to_f128M );
break;
#endif
case F64_ROUNDTOINT:
gen_az_f64_rx( f64_roundToInt, roundingMode, exact );
break;
case F64_ADD:
trueFunction_abz_f64 = f64_add;
goto gen_abz_f64;
case F64_SUB:
trueFunction_abz_f64 = f64_sub;
goto gen_abz_f64;
case F64_MUL:
trueFunction_abz_f64 = f64_mul;
goto gen_abz_f64;
case F64_DIV:
trueFunction_abz_f64 = f64_div;
goto gen_abz_f64;
case F64_REM:
trueFunction_abz_f64 = f64_rem;
gen_abz_f64:
gen_abz_f64( trueFunction_abz_f64 );
break;
case F64_MULADD:
gen_abcz_f64( f64_mulAdd );
break;
case F64_SQRT:
gen_az_f64( f64_sqrt );
break;
case F64_EQ:
trueFunction_ab_f64_z_bool = f64_eq;
goto gen_ab_f64_z_bool;
case F64_LE:
trueFunction_ab_f64_z_bool = f64_le;
goto gen_ab_f64_z_bool;
case F64_LT:
trueFunction_ab_f64_z_bool = f64_lt;
goto gen_ab_f64_z_bool;
case F64_EQ_SIGNALING:
trueFunction_ab_f64_z_bool = f64_eq_signaling;
goto gen_ab_f64_z_bool;
case F64_LE_QUIET:
trueFunction_ab_f64_z_bool = f64_le_quiet;
goto gen_ab_f64_z_bool;
case F64_LT_QUIET:
trueFunction_ab_f64_z_bool = f64_lt_quiet;
gen_ab_f64_z_bool:
gen_ab_f64_z_bool( trueFunction_ab_f64_z_bool );
break;
/*--------------------------------------------------------------------
*--------------------------------------------------------------------*/
#ifdef EXTFLOAT80
case EXTF80_TO_UI32:
gen_a_extF80_z_ui32_rx( extF80M_to_ui32, roundingMode, exact );
break;
case EXTF80_TO_UI64:
gen_a_extF80_z_ui64_rx( extF80M_to_ui64, roundingMode, exact );
break;
case EXTF80_TO_I32:
gen_a_extF80_z_i32_rx( extF80M_to_i32, roundingMode, exact );
break;
case EXTF80_TO_I64:
gen_a_extF80_z_i64_rx( extF80M_to_i64, roundingMode, exact );
break;
case EXTF80_TO_F32:
gen_a_extF80_z_f32( extF80M_to_f32 );
break;
case EXTF80_TO_F64:
gen_a_extF80_z_f64( extF80M_to_f64 );
break;
#ifdef FLOAT128
case EXTF80_TO_F128:
gen_a_extF80_z_f128( extF80M_to_f128M );
break;
#endif
case EXTF80_ROUNDTOINT:
gen_az_extF80_rx( extF80M_roundToInt, roundingMode, exact );
break;
case EXTF80_ADD:
trueFunction_abz_extF80 = extF80M_add;
goto gen_abz_extF80;
case EXTF80_SUB:
trueFunction_abz_extF80 = extF80M_sub;
goto gen_abz_extF80;
case EXTF80_MUL:
trueFunction_abz_extF80 = extF80M_mul;
goto gen_abz_extF80;
case EXTF80_DIV:
trueFunction_abz_extF80 = extF80M_div;
goto gen_abz_extF80;
case EXTF80_REM:
trueFunction_abz_extF80 = extF80M_rem;
gen_abz_extF80:
gen_abz_extF80( trueFunction_abz_extF80 );
break;
case EXTF80_SQRT:
gen_az_extF80( extF80M_sqrt );
break;
case EXTF80_EQ:
trueFunction_ab_extF80_z_bool = extF80M_eq;
goto gen_ab_extF80_z_bool;
case EXTF80_LE:
trueFunction_ab_extF80_z_bool = extF80M_le;
goto gen_ab_extF80_z_bool;
case EXTF80_LT:
trueFunction_ab_extF80_z_bool = extF80M_lt;
goto gen_ab_extF80_z_bool;
case EXTF80_EQ_SIGNALING:
trueFunction_ab_extF80_z_bool = extF80M_eq_signaling;
goto gen_ab_extF80_z_bool;
case EXTF80_LE_QUIET:
trueFunction_ab_extF80_z_bool = extF80M_le_quiet;
goto gen_ab_extF80_z_bool;
case EXTF80_LT_QUIET:
trueFunction_ab_extF80_z_bool = extF80M_lt_quiet;
gen_ab_extF80_z_bool:
gen_ab_extF80_z_bool( trueFunction_ab_extF80_z_bool );
break;
#endif
/*--------------------------------------------------------------------
*--------------------------------------------------------------------*/
#ifdef FLOAT128
case F128_TO_UI32:
gen_a_f128_z_ui32_rx( f128M_to_ui32, roundingMode, exact );
break;
case F128_TO_UI64:
gen_a_f128_z_ui64_rx( f128M_to_ui64, roundingMode, exact );
break;
case F128_TO_I32:
gen_a_f128_z_i32_rx( f128M_to_i32, roundingMode, exact );
break;
case F128_TO_I64:
gen_a_f128_z_i64_rx( f128M_to_i64, roundingMode, exact );
break;
case F128_TO_F32:
gen_a_f128_z_f32( f128M_to_f32 );
break;
case F128_TO_F64:
gen_a_f128_z_f64( f128M_to_f64 );
break;
#ifdef EXTFLOAT80
case F128_TO_EXTF80:
gen_a_f128_z_extF80( f128M_to_extF80M );
break;
#endif
case F128_ROUNDTOINT:
gen_az_f128_rx( f128M_roundToInt, roundingMode, exact );
break;
case F128_ADD:
trueFunction_abz_f128 = f128M_add;
goto gen_abz_f128;
case F128_SUB:
trueFunction_abz_f128 = f128M_sub;
goto gen_abz_f128;
case F128_MUL:
trueFunction_abz_f128 = f128M_mul;
goto gen_abz_f128;
case F128_DIV:
trueFunction_abz_f128 = f128M_div;
goto gen_abz_f128;
case F128_REM:
trueFunction_abz_f128 = f128M_rem;
gen_abz_f128:
gen_abz_f128( trueFunction_abz_f128 );
break;
case F128_MULADD:
gen_abcz_f128( f128M_mulAdd );
break;
case F128_SQRT:
gen_az_f128( f128M_sqrt );
break;
case F128_EQ:
trueFunction_ab_f128_z_bool = f128M_eq;
goto gen_ab_f128_z_bool;
case F128_LE:
trueFunction_ab_f128_z_bool = f128M_le;
goto gen_ab_f128_z_bool;
case F128_LT:
trueFunction_ab_f128_z_bool = f128M_lt;
goto gen_ab_f128_z_bool;
case F128_EQ_SIGNALING:
trueFunction_ab_f128_z_bool = f128M_eq_signaling;
goto gen_ab_f128_z_bool;
case F128_LE_QUIET:
trueFunction_ab_f128_z_bool = f128M_le_quiet;
goto gen_ab_f128_z_bool;
case F128_LT_QUIET:
trueFunction_ab_f128_z_bool = f128M_lt_quiet;
gen_ab_f128_z_bool:
gen_ab_f128_z_bool( trueFunction_ab_f128_z_bool );
break;
#endif
}
return EXIT_SUCCESS;
/*------------------------------------------------------------------------
*------------------------------------------------------------------------*/
optionError:
fail( "`%s' option requires numeric argument", *argv );
/*------------------------------------------------------------------------
*------------------------------------------------------------------------*/
invalidArg:
fail( "Invalid argument `%s'", *argv );
}