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

Function floatx80_mul

src/softfloat/softfloat.cpp:2521–2575  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2519*----------------------------------------------------------------------------*/
2520
2521floatx80 floatx80_mul(floatx80 a, floatx80 b, float_status *status)
2522{
2523 flag aSign, bSign, zSign;
2524 int32_t aExp, bExp, zExp;
2525 uint64_t aSig, bSig, zSig0, zSig1;
2526
2527 if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) {
2528 float_raise(float_flag_invalid, status);
2529 return floatx80_default_nan(status);
2530 }
2531 aSig = extractFloatx80Frac( a );
2532 aExp = extractFloatx80Exp( a );
2533 aSign = extractFloatx80Sign( a );
2534 bSig = extractFloatx80Frac( b );
2535 bExp = extractFloatx80Exp( b );
2536 bSign = extractFloatx80Sign( b );
2537 zSign = aSign ^ bSign;
2538 if ( aExp == 0x7FFF ) {
2539 if ( (uint64_t) ( aSig<<1 )
2540 || ( ( bExp == 0x7FFF ) && (uint64_t) ( bSig<<1 ) ) ) {
2541 return propagateFloatx80NaN(a, b, status);
2542 }
2543 if ( ( bExp | bSig ) == 0 ) goto invalid;
2544 if (inf_clear_intbit(status)) aSig = 0;
2545 return packFloatx80(zSign, aExp, aSig);
2546 }
2547 if ( bExp == 0x7FFF ) {
2548 if ((uint64_t)(bSig << 1)) {
2549 return propagateFloatx80NaN(a, b, status);
2550 }
2551 if ( ( aExp | aSig ) == 0 ) {
2552 invalid:
2553 float_raise(float_flag_invalid, status);
2554 return floatx80_default_nan(status);
2555 }
2556 if (inf_clear_intbit(status)) bSig = 0;
2557 return packFloatx80(zSign, bExp, bSig);
2558 }
2559 if ( aExp == 0 ) {
2560 if ( aSig == 0 ) return packFloatx80( zSign, 0, 0 );
2561 normalizeFloatx80Subnormal( aSig, &aExp, &aSig );
2562 }
2563 if ( bExp == 0 ) {
2564 if ( bSig == 0 ) return packFloatx80( zSign, 0, 0 );
2565 normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
2566 }
2567 zExp = aExp + bExp - 0x3FFE;
2568 mul64To128( aSig, bSig, &zSig0, &zSig1 );
2569 if ( 0 < (int64_t) zSig0 ) {
2570 shortShift128Left( zSig0, zSig1, 1, &zSig0, &zSig1 );
2571 --zExp;
2572 }
2573 return roundAndPackFloatx80(status->floatx80_rounding_precision,
2574 zSign, zExp, zSig0, zSig1, status);
2575}
2576
2577#ifdef SOFTFLOAT_68K // 21-01-2017: Added for Previous
2578floatx80 floatx80_sglmul( floatx80 a, floatx80 b, float_status *status )

Callers 15

fp_mulFunction · 0.85
floatx80_asinFunction · 0.85
floatx80_atanFunction · 0.85
floatx80_atanhFunction · 0.85
floatx80_cosFunction · 0.85
floatx80_coshFunction · 0.85
floatx80_etoxFunction · 0.85
floatx80_etoxm1Function · 0.85
floatx80_log10Function · 0.85
floatx80_log2Function · 0.85
floatx80_lognFunction · 0.85
floatx80_lognp1Function · 0.85

Calls 13

float_raiseFunction · 0.85
floatx80_default_nanFunction · 0.85
extractFloatx80FracFunction · 0.85
extractFloatx80ExpFunction · 0.85
extractFloatx80SignFunction · 0.85
propagateFloatx80NaNFunction · 0.85
inf_clear_intbitFunction · 0.85
packFloatx80Function · 0.85
mul64To128Function · 0.85
shortShift128LeftFunction · 0.85

Tested by

no test coverage detected