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

Function floatx80_scale

src/softfloat/softfloat.cpp:3222–3271  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3220 *----------------------------------------------------------------------------*/
3221
3222floatx80 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

Callers 1

fp_scaleFunction · 0.85

Calls 10

extractFloatx80FracFunction · 0.85
extractFloatx80ExpFunction · 0.85
extractFloatx80SignFunction · 0.85
propagateFloatx80NaNFunction · 0.85
float_raiseFunction · 0.85
floatx80_default_nanFunction · 0.85
packFloatx80Function · 0.85
roundAndPackFloatx80Function · 0.85

Tested by

no test coverage detected