5 #include "primitives.h"
7 #include "specialize.h"
10 float32_t
f32_sqrt( float32_t a
)
16 uint_fast32_t sigA
, uiZ
;
17 struct exp16_sig32 normExpSig
;
20 uint_fast64_t term
, rem
;
25 signA
= signF32UI( uiA
);
26 expA
= expF32UI( uiA
);
27 sigA
= fracF32UI( uiA
);
30 uiZ
= softfloat_propagateNaNF32UI( uiA
, 0 );
33 if ( ! signA
) return a
;
37 if ( ! ( expA
| sigA
) ) return a
;
41 if ( ! sigA
) return a
;
42 normExpSig
= softfloat_normSubnormalF32Sig( sigA
);
43 expA
= normExpSig
.exp
;
44 sigA
= normExpSig
.sig
;
46 expZ
= ( ( expA
- 0x7F )>>1 ) + 0x7E;
47 sigA
= ( sigA
| 0x00800000 )<<8;
48 sigZ
= softfloat_estimateSqrt32( expA
, sigA
) + 2;
49 if ( ( sigZ
& 0x7F ) <= 5 ) {
55 term
= (uint_fast64_t) sigZ
* sigZ
;
56 rem
= ( (uint_fast64_t) sigA
<<32 ) - term
;
57 while ( UINT64_C( 0x8000000000000000 ) <= rem
) {
59 rem
+= ( (uint_fast64_t) sigZ
<<1 ) | 1;
63 sigZ
= softfloat_shortShift32Right1Jam( sigZ
);
65 return softfloat_roundPackToF32( 0, expZ
, sigZ
);
67 softfloat_raiseFlags( softfloat_flag_invalid
);
68 uiZ
= defaultNaNF32UI
;