[xcc] minor performance tweaks
[riscv-isa-sim.git] / softfloat / s_estimateSqrt32.c
1
2 #include <stdint.h>
3 #include "platform.h"
4 #include "primitives.h"
5
6 uint32_t softfloat_estimateSqrt32( unsigned int expA, uint32_t a )
7 {
8 static const uint16_t sqrtOddAdjustments[] = {
9 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0,
10 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67
11 };
12 static const uint16_t sqrtEvenAdjustments[] = {
13 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E,
14 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002
15 };
16 int index;
17 uint32_t z;
18 union { uint32_t ui; int32_t i; } u32;
19
20 index = ( a>>27 ) & 15;
21 if ( expA & 1 ) {
22 z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ index ];
23 z = ( ( a / z )<<14 ) + ( z<<15 );
24 a >>= 1;
25 } else {
26 z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ index ];
27 z = a / z + z;
28 z = ( 0x20000 <= z ) ? 0xFFFF8000 : z<<15;
29 if ( z <= a ) {
30 u32.ui = a;
31 return u32.i>>1;
32 }
33 }
34 return (uint32_t) ( ( (uint64_t) a<<31 ) / z ) + ( z>>1 );
35
36 }
37