e22a9dce8ce79016b738a4e5ee2c65bf6487534c
4 #include "primitives.h"
6 uint32_t softfloat_estimateSqrt32( unsigned int expA
, uint32_t a
)
8 static const uint16_t sqrtOddAdjustments
[] = {
9 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0,
10 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67
12 static const uint16_t sqrtEvenAdjustments
[] = {
13 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E,
14 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002
18 union { uint32_t ui
; int32_t i
; } u32
;
20 index
= ( a
>>27 ) & 15;
22 z
= 0x4000 + ( a
>>17 ) - sqrtOddAdjustments
[ index
];
23 z
= ( ( a
/ z
)<<14 ) + ( z
<<15 );
26 z
= 0x8000 + ( a
>>17 ) - sqrtEvenAdjustments
[ index
];
28 z
= ( 0x20000 <= z
) ? 0xFFFF8000 : z
<<15;
34 return (uint32_t) ( ( (uint64_t) a
<<31 ) / z
) + ( z
>>1 );