47{
48 bool signA;
51 bool signB;
54 bool signC;
57 bool signProd;
62 bool signZ;
69
70
71
82
83
84 if ( expA == 0xFF ) {
85 if ( sigA || ((expB == 0xFF) && sigB) ) goto propagateNaN_ABC;
86 magBits = expB | sigB;
87 goto infProdArg;
88 }
89 if ( expB == 0xFF ) {
90 if ( sigB ) goto propagateNaN_ABC;
91 magBits = expA | sigA;
92 goto infProdArg;
93 }
94 if ( expC == 0xFF ) {
95 if ( sigC ) {
96 uiZ = 0;
97 goto propagateNaN_ZC;
98 }
99 uiZ = uiC;
100 goto uiZ;
101 }
102
103
104 if ( ! expA ) {
105 if ( ! sigA ) goto zeroProd;
107 expA = normExpSig.exp;
108 sigA = normExpSig.sig;
109 }
110 if ( ! expB ) {
111 if ( ! sigB ) goto zeroProd;
113 expB = normExpSig.exp;
114 sigB = normExpSig.sig;
115 }
116
117
118 expProd = expA + expB - 0x7E;
119 sigA = (sigA | 0x00800000)<<7;
120 sigB = (sigB | 0x00800000)<<7;
122 if ( sigProd <
UINT64_C( 0x2000000000000000 ) ) {
123 --expProd;
124 sigProd <<= 1;
125 }
126 signZ = signProd;
127 if ( ! expC ) {
128 if ( ! sigC ) {
129 expZ = expProd - 1;
131 goto roundPack;
132 }
134 expC = normExpSig.exp;
135 sigC = normExpSig.sig;
136 }
137 sigC = (sigC | 0x00800000)<<6;
138
139
140 expDiff = expProd - expC;
141 if ( signProd == signC ) {
142
143
144 if ( expDiff <= 0 ) {
145 expZ = expC;
147 } else {
148 expZ = expProd;
149 sig64Z =
150 sigProd
154 }
155 if ( sigZ < 0x40000000 ) {
156 --expZ;
157 sigZ <<= 1;
158 }
159 } else {
160
161
163 if ( expDiff < 0 ) {
164 signZ = signC;
165 expZ = expC;
167 } else if ( ! expDiff ) {
168 expZ = expProd;
169 sig64Z = sigProd - sig64C;
170 if ( ! sig64Z ) goto completeCancellation;
171 if ( sig64Z &
UINT64_C( 0x8000000000000000 ) ) {
172 signZ = ! signZ;
173 sig64Z = -sig64Z;
174 }
175 } else {
176 expZ = expProd;
178 }
180 expZ -= shiftDist;
181 shiftDist -= 32;
182 if ( shiftDist < 0 ) {
184 } else {
186 }
187 }
188 roundPack:
190
191
192 propagateNaN_ABC:
194 goto propagateNaN_ZC;
195
196
197 infProdArg:
198 if ( magBits ) {
200 if ( expC != 0xFF ) goto uiZ;
201 if ( sigC ) goto propagateNaN_ZC;
202 if ( signProd == signC ) goto uiZ;
203 }
206 propagateNaN_ZC:
208 goto uiZ;
209
210
211 zeroProd:
212 uiZ = uiC;
213 if ( ! (expC | sigC) && (signProd != signC) ) {
214 completeCancellation:
215 uiZ =
218 }
219 uiZ:
220 uZ.ui = uiZ;
221 return uZ.f;
222
223}
uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB)
void softfloat_raiseFlags(uint_fast8_t flags)
float32_t softfloat_roundPackToF32(bool, int_fast16_t, uint_fast32_t)
struct exp16_sig32 softfloat_normSubnormalF32Sig(uint_fast32_t)
@ softfloat_mulAdd_subProd
#define packToF32UI(sign, exp, sig)
uint64_t softfloat_shortShiftRightJam64(uint64_t a, uint_fast8_t dist)
uint64_t softfloat_shiftRightJam64(uint64_t a, uint_fast32_t dist)
THREAD_LOCAL uint_fast8_t softfloat_roundingMode
#define softfloat_countLeadingZeros64