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

Function floatx80_div

src/softfloat/softfloat.cpp:2638–2716  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2636*----------------------------------------------------------------------------*/
2637
2638floatx80 floatx80_div(floatx80 a, floatx80 b, float_status *status)
2639{
2640 flag aSign, bSign, zSign;
2641 int32_t aExp, bExp, zExp;
2642 uint64_t aSig, bSig, zSig0, zSig1;
2643 uint64_t rem0, rem1, rem2, term0, term1, term2;
2644
2645 if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) {
2646 float_raise(float_flag_invalid, status);
2647 return floatx80_default_nan(status);
2648 }
2649 aSig = extractFloatx80Frac( a );
2650 aExp = extractFloatx80Exp( a );
2651 aSign = extractFloatx80Sign( a );
2652 bSig = extractFloatx80Frac( b );
2653 bExp = extractFloatx80Exp( b );
2654 bSign = extractFloatx80Sign( b );
2655 zSign = aSign ^ bSign;
2656 if ( aExp == 0x7FFF ) {
2657 if ((uint64_t)(aSig << 1)) {
2658 return propagateFloatx80NaN(a, b, status);
2659 }
2660 if ( bExp == 0x7FFF ) {
2661 if ((uint64_t)(bSig << 1)) {
2662 return propagateFloatx80NaN(a, b, status);
2663 }
2664 goto invalid;
2665 }
2666 if (inf_clear_intbit(status)) aSig = 0;
2667 return packFloatx80(zSign, aExp, aSig);
2668 }
2669 if ( bExp == 0x7FFF ) {
2670 if ((uint64_t)(bSig << 1)) {
2671 return propagateFloatx80NaN(a, b, status);
2672 }
2673 return packFloatx80( zSign, 0, 0 );
2674 }
2675 if ( bExp == 0 ) {
2676 if ( bSig == 0 ) {
2677 if ( ( aExp | aSig ) == 0 ) {
2678 invalid:
2679 float_raise(float_flag_invalid, status);
2680 return floatx80_default_nan(status);
2681 }
2682 float_raise(float_flag_divbyzero, status);
2683 return packFloatx80( zSign, 0x7FFF, floatx80_default_infinity_low );
2684 }
2685 normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
2686 }
2687 if ( aExp == 0 ) {
2688 if ( aSig == 0 ) return packFloatx80( zSign, 0, 0 );
2689 normalizeFloatx80Subnormal( aSig, &aExp, &aSig );
2690 }
2691 zExp = aExp - bExp + 0x3FFE;
2692 rem1 = 0;
2693 if ( bSig <= aSig ) {
2694 shift128Right( aSig, 0, 1, &aSig, &rem1 );
2695 ++zExp;

Callers 12

fpuregchangeFunction · 0.85
fp_divFunction · 0.85
floatx80_acosFunction · 0.85
floatx80_asinFunction · 0.85
floatx80_atanFunction · 0.85
floatx80_atanhFunction · 0.85
floatx80_coshFunction · 0.85
floatx80_lognFunction · 0.85
floatx80_lognp1Function · 0.85
floatx80_sinhFunction · 0.85
floatx80_tanFunction · 0.85
floatx80_tanhFunction · 0.85

Calls 15

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
shift128RightFunction · 0.85
estimateDiv128To64Function · 0.85

Tested by 1

fpuregchangeFunction · 0.68