VirtualBox

Ignore:
Timestamp:
Feb 3, 2023 3:23:02 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
155724
Message:

VMM/IEM: Implementation of f32_rsqrt (inverse square root) in Softfloat library, bugref:9898

Location:
trunk/src/libs/softfloat-3e/source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/libs/softfloat-3e/source/f32_sqrt.c

    r94558 r98470  
    120120}
    121121
     122float32_t f32_rsqrt( float32_t a SOFTFLOAT_STATE_DECL_COMMA )
     123{
     124    union ui32_f32 uA;
     125    uint_fast32_t uiA;
     126    bool signA;
     127    int_fast16_t expA;
     128    uint_fast32_t sigA, uiZ;
     129    struct exp16_sig32 normExpSig;
     130    int_fast16_t expZ;
     131    uint_fast32_t sigZ;
     132    union ui32_f32 uZ;
     133
     134    /*------------------------------------------------------------------------
     135    *------------------------------------------------------------------------*/
     136    uA.f = a;
     137    uiA = uA.ui;
     138    signA = signF32UI( uiA );
     139    expA  = expF32UI( uiA );
     140    sigA  = fracF32UI( uiA );
     141    /*------------------------------------------------------------------------
     142    *------------------------------------------------------------------------*/
     143    if ( expA == 0xFF ) {
     144        if ( sigA ) {
     145            uiZ = softfloat_propagateNaNF32UI( uiA, 0 SOFTFLOAT_STATE_ARG_COMMA );
     146            goto uiZ;
     147        }
     148        if ( ! signA ) return a;
     149        goto invalid;
     150    }
     151    /*------------------------------------------------------------------------
     152    *------------------------------------------------------------------------*/
     153    if ( signA ) {
     154        if ( ! (expA | sigA) ) return a;
     155        goto invalid;
     156    }
     157    /*------------------------------------------------------------------------
     158    *------------------------------------------------------------------------*/
     159    if ( ! expA ) {
     160        if ( ! sigA ) return a;
     161        normExpSig = softfloat_normSubnormalF32Sig( sigA );
     162        expA = normExpSig.exp;
     163        sigA = normExpSig.sig;
     164    }
     165    /*------------------------------------------------------------------------
     166    *------------------------------------------------------------------------*/
     167    expZ = 0x7F - ((expA - 0x7F)>>1) - 2;
     168    expA &= 1;
     169    sigA = (sigA | 0x00800000)<<8;
     170    sigZ = softfloat_approxRecipSqrt32_1( expA, sigA );
     171    sigZ >>= 1;
     172
     173    return softfloat_roundPackToF32( 0, expZ, sigZ SOFTFLOAT_STATE_ARG_COMMA);
     174    /*------------------------------------------------------------------------
     175    *------------------------------------------------------------------------*/
     176 invalid:
     177    softfloat_raiseFlags( softfloat_flag_invalid SOFTFLOAT_STATE_ARG_COMMA);
     178    uiZ = defaultNaNF32UI;
     179 uiZ:
     180    uZ.ui = uiZ;
     181    return uZ.f;
     182
     183}
  • trunk/src/libs/softfloat-3e/source/include/softfloat.h

    r97891 r98470  
    224224float32_t f32_rem( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA );
    225225float32_t f32_sqrt( float32_t SOFTFLOAT_STATE_DECL_COMMA );
     226float32_t f32_rsqrt( float32_t SOFTFLOAT_STATE_DECL_COMMA );
    226227bool f32_eq( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA );
    227228bool f32_le( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA );
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette