static void testFunction( const struct standardFunctionInfo *standardFunctionInfoPtr, uint_fast8_t roundingPrecisionIn, int roundingCodeIn ) { int functionCode, functionAttribs; bool standardFunctionHasFixedRounding; int roundingCode; bool exact; uint_fast8_t roundingPrecision, roundingMode; functionCode = standardFunctionInfoPtr->functionCode; functionAttribs = functionInfos[functionCode].attribs; standardFunctionHasFixedRounding = false; if ( functionAttribs & FUNC_ARG_ROUNDINGMODE ) { roundingCode = standardFunctionInfoPtr->roundingCode; if ( roundingCode ) { standardFunctionHasFixedRounding = true; roundingCodeIn = roundingCode; } } exact = standardFunctionInfoPtr->exact; verCases_functionNamePtr = standardFunctionInfoPtr->namePtr; roundingPrecision = 32; for (;;) { if ( functionAttribs & FUNC_EFF_ROUNDINGPRECISION ) { if ( roundingPrecisionIn ) roundingPrecision = roundingPrecisionIn; } else { roundingPrecision = 0; } #ifdef EXTFLOAT80 verCases_roundingPrecision = roundingPrecision; if ( roundingPrecision ) { extF80_roundingPrecision = roundingPrecision; subjfloat_setExtF80RoundingPrecision( roundingPrecision ); } #endif for ( roundingCode = 1; roundingCode < NUM_ROUNDINGMODES; ++roundingCode ) { #ifndef SUBJFLOAT_ROUND_NEAR_MAXMAG if ( roundingCode != ROUND_NEAR_MAXMAG ) { #endif if ( functionAttribs & (FUNC_ARG_ROUNDINGMODE | FUNC_EFF_ROUNDINGMODE) ) { if ( roundingCodeIn ) roundingCode = roundingCodeIn; } else { roundingCode = 0; } verCases_roundingCode = standardFunctionHasFixedRounding ? 0 : roundingCode; if ( roundingCode ) { roundingMode = roundingModes[roundingCode]; softfloat_roundingMode = roundingMode; if ( ! standardFunctionHasFixedRounding ) { subjfloat_setRoundingMode( roundingMode ); } } testFunctionInstance( functionCode, roundingMode, exact ); if ( roundingCodeIn || ! roundingCode ) break; #ifndef SUBJFLOAT_ROUND_NEAR_MAXMAG } #endif } if ( roundingPrecisionIn || ! roundingPrecision ) break; if ( roundingPrecision == 80 ) { break; } else if ( roundingPrecision == 64 ) { roundingPrecision = 80; } else if ( roundingPrecision == 32 ) { roundingPrecision = 64; } } }
static void testFunction( int functionCode, uint_fast8_t roundingPrecisionIn, int roundingCodeIn, int tininessCodeIn, int exactCodeIn ) { int functionAttribs; uint_fast8_t roundingPrecision; int roundingCode; uint_fast8_t roundingMode; int exactCode; bool exact; int tininessCode; uint_fast8_t tininessMode; functionAttribs = functionInfos[functionCode].attribs; verCases_functionNamePtr = functionInfos[functionCode].namePtr; roundingPrecision = 32; for (;;) { if ( functionAttribs & FUNC_EFF_ROUNDINGPRECISION ) { if ( roundingPrecisionIn ) roundingPrecision = roundingPrecisionIn; } else { roundingPrecision = 0; } #ifdef EXTFLOAT80 verCases_roundingPrecision = roundingPrecision; if ( roundingPrecision ) { slow_extF80_roundingPrecision = roundingPrecision; extF80_roundingPrecision = roundingPrecision; } #endif for ( roundingCode = 1; roundingCode < NUM_ROUNDINGMODES; ++roundingCode ) { if ( functionAttribs & (FUNC_ARG_ROUNDINGMODE | FUNC_EFF_ROUNDINGMODE) ) { if ( roundingCodeIn ) roundingCode = roundingCodeIn; } else { roundingCode = 0; } verCases_roundingCode = roundingCode; if ( roundingCode ) { roundingMode = roundingModes[roundingCode]; if ( functionAttribs & FUNC_EFF_ROUNDINGMODE ) { slowfloat_roundingMode = roundingMode; softfloat_roundingMode = roundingMode; } } for ( exactCode = EXACT_FALSE; exactCode <= EXACT_TRUE; ++exactCode ) { if ( functionAttribs & FUNC_ARG_EXACT ) { if ( exactCodeIn ) exactCode = exactCodeIn; } else { exactCode = 0; } exact = (exactCode == EXACT_TRUE); verCases_usesExact = (exactCode != 0); verCases_exact = exact; for ( tininessCode = 1; tininessCode < NUM_TININESSMODES; ++tininessCode ) { if ( (functionAttribs & FUNC_EFF_TININESSMODE) || ((functionAttribs & FUNC_EFF_TININESSMODE_REDUCEDPREC) && roundingPrecision && (roundingPrecision < 80)) ) { if ( tininessCodeIn ) tininessCode = tininessCodeIn; } else { tininessCode = 0; } verCases_tininessCode = tininessCode; if ( tininessCode ) { tininessMode = tininessModes[tininessCode]; slowfloat_detectTininess = tininessMode; softfloat_detectTininess = tininessMode; } testFunctionInstance( functionCode, roundingMode, exact ); if ( tininessCodeIn || ! tininessCode ) break; } if ( exactCodeIn || ! exactCode ) break; } if ( roundingCodeIn || ! roundingCode ) break; } if ( roundingPrecisionIn || ! roundingPrecision ) break; if ( roundingPrecision == 80 ) { break; } else if ( roundingPrecision == 64 ) { roundingPrecision = 80; } else if ( roundingPrecision == 32 ) { roundingPrecision = 64; } } }