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

Function floatx80_rem

src/softfloat/softfloat.cpp:2799–2890  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2797
2798#ifndef SOFTFLOAT_68K
2799floatx80 floatx80_rem(floatx80 a, floatx80 b, float_status *status)
2800{
2801 flag aSign, zSign;
2802 int32_t aExp, bExp, expDiff;
2803 uint64_t aSig0, aSig1, bSig;
2804 uint64_t q, term0, term1, alternateASig0, alternateASig1;
2805
2806 if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) {
2807 float_raise(float_flag_invalid, status);
2808 return floatx80_default_nan(status);
2809 }
2810 aSig0 = extractFloatx80Frac( a );
2811 aExp = extractFloatx80Exp( a );
2812 aSign = extractFloatx80Sign( a );
2813 bSig = extractFloatx80Frac( b );
2814 bExp = extractFloatx80Exp( b );
2815 if ( aExp == 0x7FFF ) {
2816 if ( (uint64_t) ( aSig0<<1 )
2817 || ( ( bExp == 0x7FFF ) && (uint64_t) ( bSig<<1 ) ) ) {
2818 return propagateFloatx80NaN(a, b, status);
2819 }
2820 goto invalid;
2821 }
2822 if ( bExp == 0x7FFF ) {
2823 if ((uint64_t)(bSig << 1)) {
2824 return propagateFloatx80NaN(a, b, status);
2825 }
2826 return a;
2827 }
2828 if ( bExp == 0 ) {
2829 if ( bSig == 0 ) {
2830 invalid:
2831 float_raise(float_flag_invalid, status);
2832 return floatx80_default_nan(status);
2833 }
2834 normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
2835 }
2836 if ( aExp == 0 ) {
2837 if ( (uint64_t) ( aSig0<<1 ) == 0 ) return a;
2838 normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 );
2839 }
2840 bSig |= LIT64( 0x8000000000000000 );
2841 zSign = aSign;
2842 expDiff = aExp - bExp;
2843 aSig1 = 0;
2844 if ( expDiff < 0 ) {
2845 if ( expDiff < -1 ) return a;
2846 shift128Right( aSig0, 0, 1, &aSig0, &aSig1 );
2847 expDiff = 0;
2848 }
2849 q = ( bSig <= aSig0 );
2850 if ( q ) aSig0 -= bSig;
2851 expDiff -= 64;
2852 while ( 0 < expDiff ) {
2853 q = estimateDiv128To64( aSig0, aSig1, bSig );
2854 q = ( 2 < q ) ? q - 2 : 0;
2855 mul64To128( bSig, q, &term0, &term1 );
2856 sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 );

Callers 1

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

Tested by

no test coverage detected