| 2797 | |
| 2798 | #ifndef SOFTFLOAT_68K |
| 2799 | floatx80 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 ); |
no test coverage detected