diff options
| author | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2023-02-03 15:23:02 +0000 |
|---|---|---|
| committer | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2023-02-03 15:23:02 +0000 |
| commit | 759a64ab5f49f7c45471c9a30d7b1e1bcf042b76 (patch) | |
| tree | e0023b9381351dbeb8cc613758ae33a566b2488a /src/libs/softfloat-3e | |
| parent | b9609340af89ba2daf50987fb0fea88587a47ae2 (diff) | |
| download | VirtualBox-svn-759a64ab5f49f7c45471c9a30d7b1e1bcf042b76.tar.gz | |
VMM/IEM: Implementation of f32_rsqrt (inverse square root) in Softfloat library, bugref:9898
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@98470 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/libs/softfloat-3e')
| -rw-r--r-- | src/libs/softfloat-3e/source/f32_sqrt.c | 62 | ||||
| -rw-r--r-- | src/libs/softfloat-3e/source/include/softfloat.h | 1 |
2 files changed, 63 insertions, 0 deletions
diff --git a/src/libs/softfloat-3e/source/f32_sqrt.c b/src/libs/softfloat-3e/source/f32_sqrt.c index ff5e169a0c6..e9bbfcceeec 100644 --- a/src/libs/softfloat-3e/source/f32_sqrt.c +++ b/src/libs/softfloat-3e/source/f32_sqrt.c @@ -119,3 +119,65 @@ float32_t f32_sqrt( float32_t a SOFTFLOAT_STATE_DECL_COMMA ) } +float32_t f32_rsqrt( float32_t a SOFTFLOAT_STATE_DECL_COMMA ) +{ + union ui32_f32 uA; + uint_fast32_t uiA; + bool signA; + int_fast16_t expA; + uint_fast32_t sigA, uiZ; + struct exp16_sig32 normExpSig; + int_fast16_t expZ; + uint_fast32_t sigZ; + union ui32_f32 uZ; + + /*------------------------------------------------------------------------ + *------------------------------------------------------------------------*/ + uA.f = a; + uiA = uA.ui; + signA = signF32UI( uiA ); + expA = expF32UI( uiA ); + sigA = fracF32UI( uiA ); + /*------------------------------------------------------------------------ + *------------------------------------------------------------------------*/ + if ( expA == 0xFF ) { + if ( sigA ) { + uiZ = softfloat_propagateNaNF32UI( uiA, 0 SOFTFLOAT_STATE_ARG_COMMA ); + goto uiZ; + } + if ( ! signA ) return a; + goto invalid; + } + /*------------------------------------------------------------------------ + *------------------------------------------------------------------------*/ + if ( signA ) { + if ( ! (expA | sigA) ) return a; + goto invalid; + } + /*------------------------------------------------------------------------ + *------------------------------------------------------------------------*/ + if ( ! expA ) { + if ( ! sigA ) return a; + normExpSig = softfloat_normSubnormalF32Sig( sigA ); + expA = normExpSig.exp; + sigA = normExpSig.sig; + } + /*------------------------------------------------------------------------ + *------------------------------------------------------------------------*/ + expZ = 0x7F - ((expA - 0x7F)>>1) - 2; + expA &= 1; + sigA = (sigA | 0x00800000)<<8; + sigZ = softfloat_approxRecipSqrt32_1( expA, sigA ); + sigZ >>= 1; + + return softfloat_roundPackToF32( 0, expZ, sigZ SOFTFLOAT_STATE_ARG_COMMA); + /*------------------------------------------------------------------------ + *------------------------------------------------------------------------*/ + invalid: + softfloat_raiseFlags( softfloat_flag_invalid SOFTFLOAT_STATE_ARG_COMMA); + uiZ = defaultNaNF32UI; + uiZ: + uZ.ui = uiZ; + return uZ.f; + +} diff --git a/src/libs/softfloat-3e/source/include/softfloat.h b/src/libs/softfloat-3e/source/include/softfloat.h index 9df6177e235..e7c1637520a 100644 --- a/src/libs/softfloat-3e/source/include/softfloat.h +++ b/src/libs/softfloat-3e/source/include/softfloat.h @@ -223,6 +223,7 @@ float32_t f32_mulAdd( float32_t, float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA float32_t f32_div( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA ); float32_t f32_rem( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA ); float32_t f32_sqrt( float32_t SOFTFLOAT_STATE_DECL_COMMA ); +float32_t f32_rsqrt( float32_t SOFTFLOAT_STATE_DECL_COMMA ); bool f32_eq( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA ); bool f32_le( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA ); bool f32_lt( float32_t, float32_t SOFTFLOAT_STATE_DECL_COMMA ); |
