summaryrefslogtreecommitdiff
path: root/src/libs/softfloat-3e
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2023-02-03 15:23:02 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2023-02-03 15:23:02 +0000
commit759a64ab5f49f7c45471c9a30d7b1e1bcf042b76 (patch)
treee0023b9381351dbeb8cc613758ae33a566b2488a /src/libs/softfloat-3e
parentb9609340af89ba2daf50987fb0fea88587a47ae2 (diff)
downloadVirtualBox-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.c62
-rw-r--r--src/libs/softfloat-3e/source/include/softfloat.h1
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 );