56{
63 uint32_t rem96[3], sig32A, recipSqrt32, sig32Z, q;
65 uint32_t rem32, term[4], rem[4], extSigZ[3];
66
67
68
71
72
77
78
79 if ( expA == 0x7FFF ) {
80 if ( rem64 &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
82 return;
83 }
84 if ( signUI64 ) goto invalid;
85 rem64 =
UINT64_C( 0x8000000000000000 );
86 goto copyA;
87 }
88
89
90 if ( ! expA ) expA = 1;
91 if ( ! (rem64 &
UINT64_C( 0x8000000000000000 )) ) {
92 if ( ! rem64 ) {
93 uiA64 = signUI64;
94 goto copyA;
95 }
97 }
98 if ( signUI64 ) goto invalid;
99
100
101 expZ = ((expA - 0x3FFF)>>1) + 0x3FFF;
102 expA &= 1;
104 sig32A = rem64>>32;
106 sig32Z = ((
uint64_t) sig32A * recipSqrt32)>>32;
107 if ( expA ) sig32Z >>= 1;
108 rem64 =
113
114
118
119
120
121 for (;;) {
122 x64 = ((
uint64_t) sig32Z<<32) + sig64Z;
128 if ( ! (rem32 & 0x80000000) ) break;
129 --q;
130 sig64Z -= 1<<3;
131 }
133
134
136 if ( rem64>>34 ) q += recipSqrt32;
139 x64 = (sig64Z<<1) + (x64>>32);
142
143
144 if ( (q & 0xFFFFFF) <= 2 ) {
147 x64 = sig64Z + (q>>27);
155 if ( q & 0x80000000 ) {
157 } else {
160 }
161 }
162 }
165 return;
166
167
168 invalid:
170 return;
171
172
173 copyA:
176
177}
void softfloat_propagateNaNExtF80M(const struct extFloat80M *aSPtr, const struct extFloat80M *bSPtr, struct extFloat80M *zSPtr)
#define packToExtF80UI64(sign, exp)
#define expExtF80UI64(a64)
void softfloat_invalidExtF80M(struct extFloat80M *)
void softfloat_roundPackMToExtF80M(bool, int32_t, uint32_t *, uint_fast8_t, struct extFloat80M *)
int softfloat_normExtF80SigM(uint64_t *)
#define indexMultiwordHi(total, n)
#define indexWordLo(total)
#define indexWord(total, n)
#define indexWordHi(total)
#define softfloat_sub1X96M(zPtr)
#define softfloat_remStep128MBy32(remPtr, dist, bPtr, q, zPtr)
#define softfloat_remStep96MBy32(remPtr, dist, bPtr, q, zPtr)
void softfloat_shortShiftLeft64To96M(uint64_t a, uint_fast8_t dist, uint32_t *zPtr)
uint32_t softfloat_approxRecipSqrt32_1(unsigned int oddExpA, uint32_t a)
THREAD_LOCAL uint_fast8_t extF80_roundingPrecision
unsigned __int64 uint64_t