| 2400 | *----------------------------------------------------------------------------*/ |
| 2401 | |
| 2402 | static floatx80 subFloatx80Sigs(floatx80 a, floatx80 b, flag zSign, |
| 2403 | float_status *status) |
| 2404 | { |
| 2405 | int32_t aExp, bExp, zExp; |
| 2406 | uint64_t aSig, bSig, zSig0, zSig1; |
| 2407 | int32_t expDiff; |
| 2408 | |
| 2409 | aSig = extractFloatx80Frac( a ); |
| 2410 | aExp = extractFloatx80Exp( a ); |
| 2411 | bSig = extractFloatx80Frac( b ); |
| 2412 | bExp = extractFloatx80Exp( b ); |
| 2413 | expDiff = aExp - bExp; |
| 2414 | if ( 0 < expDiff ) goto aExpBigger; |
| 2415 | if ( expDiff < 0 ) goto bExpBigger; |
| 2416 | if ( aExp == 0x7FFF ) { |
| 2417 | if ( (uint64_t) ( ( aSig | bSig )<<1 ) ) { |
| 2418 | return propagateFloatx80NaN(a, b, status); |
| 2419 | } |
| 2420 | float_raise(float_flag_invalid, status); |
| 2421 | return floatx80_default_nan(status); |
| 2422 | } |
| 2423 | #ifndef SOFTFLOAT_68K |
| 2424 | if ( aExp == 0 ) { |
| 2425 | aExp = 1; |
| 2426 | bExp = 1; |
| 2427 | } |
| 2428 | #endif |
| 2429 | zSig1 = 0; |
| 2430 | if ( bSig < aSig ) goto aBigger; |
| 2431 | if ( aSig < bSig ) goto bBigger; |
| 2432 | return packFloatx80(status->float_rounding_mode == float_round_down, 0, 0); |
| 2433 | bExpBigger: |
| 2434 | if ( bExp == 0x7FFF ) { |
| 2435 | if ((uint64_t)(bSig << 1)) return propagateFloatx80NaN(a, b, status); |
| 2436 | if (inf_clear_intbit(status)) bSig = 0; |
| 2437 | return packFloatx80(zSign ^ 1, bExp, bSig); |
| 2438 | } |
| 2439 | #ifndef SOFTFLOAT_68K |
| 2440 | if ( aExp == 0 ) ++expDiff; |
| 2441 | #endif |
| 2442 | shift128RightJamming( aSig, 0, - expDiff, &aSig, &zSig1 ); |
| 2443 | bBigger: |
| 2444 | sub128( bSig, 0, aSig, zSig1, &zSig0, &zSig1 ); |
| 2445 | zExp = bExp; |
| 2446 | zSign ^= 1; |
| 2447 | goto normalizeRoundAndPack; |
| 2448 | aExpBigger: |
| 2449 | if ( aExp == 0x7FFF ) { |
| 2450 | if ((uint64_t)(aSig << 1)) return propagateFloatx80NaN(a, b, status); |
| 2451 | return inf_clear_intbit(status) ? packFloatx80(extractFloatx80Sign(a), aExp, 0) : a; |
| 2452 | } |
| 2453 | #ifndef SOFTFLOAT_68K |
| 2454 | if ( bExp == 0 ) --expDiff; |
| 2455 | #endif |
| 2456 | shift128RightJamming( bSig, 0, expDiff, &bSig, &zSig1 ); |
| 2457 | aBigger: |
| 2458 | sub128( aSig, 0, bSig, zSig1, &zSig0, &zSig1 ); |
| 2459 | zExp = aExp; |
no test coverage detected