| 3220 | *----------------------------------------------------------------------------*/ |
| 3221 | |
| 3222 | floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status) |
| 3223 | { |
| 3224 | flag aSign, bSign; |
| 3225 | int32_t aExp, bExp, shiftCount; |
| 3226 | uint64_t aSig, bSig; |
| 3227 | |
| 3228 | aSig = extractFloatx80Frac(a); |
| 3229 | aExp = extractFloatx80Exp(a); |
| 3230 | aSign = extractFloatx80Sign(a); |
| 3231 | bSig = extractFloatx80Frac(b); |
| 3232 | bExp = extractFloatx80Exp(b); |
| 3233 | bSign = extractFloatx80Sign(b); |
| 3234 | |
| 3235 | if ( bExp == 0x7FFF ) { |
| 3236 | if ( (uint64_t) ( bSig<<1 ) || |
| 3237 | ( ( aExp == 0x7FFF ) && (uint64_t) ( aSig<<1 ) ) ) { |
| 3238 | return propagateFloatx80NaN( a, b, status ); |
| 3239 | } |
| 3240 | float_raise( float_flag_invalid, status ); |
| 3241 | return floatx80_default_nan(status); |
| 3242 | } |
| 3243 | if ( aExp == 0x7FFF ) { |
| 3244 | if ( (uint64_t) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b, status ); |
| 3245 | return a; |
| 3246 | } |
| 3247 | if ( aExp == 0 ) { |
| 3248 | if ( aSig == 0 ) return packFloatx80( aSign, 0, 0); |
| 3249 | if (bExp < 0x3FFF) return normalizeRoundAndPackFloatx80(status->floatx80_rounding_precision, aSign, aExp, aSig, 0, status); |
| 3250 | normalizeFloatx80Subnormal( aSig, &aExp, &aSig ); |
| 3251 | } |
| 3252 | |
| 3253 | if (bExp < 0x3FFF) { |
| 3254 | return roundAndPackFloatx80( |
| 3255 | status->floatx80_rounding_precision, aSign, aExp, aSig, 0, status); |
| 3256 | } |
| 3257 | |
| 3258 | if ( 0x400F < bExp ) { |
| 3259 | aExp = bSign ? -0x6001 : 0xE000; |
| 3260 | return roundAndPackFloatx80( |
| 3261 | status->floatx80_rounding_precision, aSign, aExp, aSig, 0, status ); |
| 3262 | } |
| 3263 | |
| 3264 | shiftCount = 0x403E - bExp; |
| 3265 | bSig >>= shiftCount; |
| 3266 | aExp = (int32_t)(bSign ? ( aExp - bSig ) : ( aExp + bSig )); |
| 3267 | |
| 3268 | return roundAndPackFloatx80( |
| 3269 | status->floatx80_rounding_precision, aSign, aExp, aSig, 0, status); |
| 3270 | |
| 3271 | } |
| 3272 | |
| 3273 | /*----------------------------------------------------------------------------- |
| 3274 | | Calculates the absolute value of the extended double-precision floating-point |
no test coverage detected