MCPcopy Create free account
hub / github.com/BlitterStudio/amiberry / subFloatx80Sigs

Function subFloatx80Sigs

src/softfloat/softfloat.cpp:2402–2463  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2400*----------------------------------------------------------------------------*/
2401
2402static 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;

Callers 2

floatx80_addFunction · 0.85
floatx80_subFunction · 0.85

Calls 11

extractFloatx80FracFunction · 0.85
extractFloatx80ExpFunction · 0.85
propagateFloatx80NaNFunction · 0.85
float_raiseFunction · 0.85
floatx80_default_nanFunction · 0.85
packFloatx80Function · 0.85
inf_clear_intbitFunction · 0.85
shift128RightJammingFunction · 0.85
sub128Function · 0.85
extractFloatx80SignFunction · 0.85

Tested by

no test coverage detected