Revision 9ee6e8bb fpu/softfloat.c

b/fpu/softfloat.c
5377 5377

  
5378 5378
COMPARE(32, 0xff)
5379 5379
COMPARE(64, 0x7ff)
5380

  
5381
/* Multiply A by 2 raised to the power N.  */
5382
float32 float32_scalbn( float32 a, int n STATUS_PARAM )
5383
{
5384
    flag aSign;
5385
    int16 aExp;
5386
    bits32 aSig;
5387

  
5388
    aSig = extractFloat32Frac( a );
5389
    aExp = extractFloat32Exp( a );
5390
    aSign = extractFloat32Sign( a );
5391

  
5392
    if ( aExp == 0xFF ) {
5393
        return a;
5394
    }
5395
    aExp += n;
5396
    return roundAndPackFloat32( aSign, aExp, aSig STATUS_VAR );
5397
}
5398

  
5399
float64 float64_scalbn( float64 a, int n STATUS_PARAM )
5400
{
5401
    flag aSign;
5402
    int16 aExp;
5403
    bits64 aSig;
5404

  
5405
    aSig = extractFloat64Frac( a );
5406
    aExp = extractFloat64Exp( a );
5407
    aSign = extractFloat64Sign( a );
5408

  
5409
    if ( aExp == 0x7FF ) {
5410
        return a;
5411
    }
5412
    aExp += n;
5413
    return roundAndPackFloat64( aSign, aExp, aSig STATUS_VAR );
5414
}
5415

  
5416
#ifdef FLOATX80
5417
floatx80 floatx80_scalbn( floatx80 a, int n STATUS_PARAM )
5418
{
5419
    flag aSign;
5420
    int16 aExp;
5421
    bits64 aSig;
5422

  
5423
    aSig = extractFloatx80Frac( a );
5424
    aExp = extractFloatx80Exp( a );
5425
    aSign = extractFloatx80Sign( a );
5426

  
5427
    if ( aExp == 0x7FF ) {
5428
        return a;
5429
    }
5430
    aExp += n;
5431
    return roundAndPackFloatx80( STATUS(floatx80_rounding_precision),
5432
                                 aSign, aExp, aSig, 0 STATUS_VAR );
5433
}
5434
#endif
5435

  
5436
#ifdef FLOAT128
5437
float128 float128_scalbn( float128 a, int n STATUS_PARAM )
5438
{
5439
    flag aSign;
5440
    int32 aExp;
5441
    bits64 aSig0, aSig1;
5442

  
5443
    aSig1 = extractFloat128Frac1( a );
5444
    aSig0 = extractFloat128Frac0( a );
5445
    aExp = extractFloat128Exp( a );
5446
    aSign = extractFloat128Sign( a );
5447
    if ( aExp == 0x7FFF ) {
5448
        return a;
5449
    }
5450
    aExp += n;
5451
    return roundAndPackFloat128( aSign, aExp, aSig0, aSig1, 0 STATUS_VAR );
5452

  
5453
}
5454
#endif

Also available in: Unified diff