68{
74 bool sign;
76 bool roundNear;
77 unsigned int index, lastIndex;
78 bool extra;
82
83
84
87
88
91
92
93 if ( exp < 0x3FFF ) {
98 if ( !sigExtra ) {
100 }
101 if ( !sigExtra && !(ui96 & 0x7FFFFFFF) ) goto ui96;
104 switch ( roundingMode ) {
108 if ( exp == 0x3FFE ) goto mag1;
109 break;
111 if ( sign ) goto mag1;
112 break;
114 if ( !sign ) goto mag1;
115 break;
116#ifdef SOFTFLOAT_ROUND_ODD
118 goto mag1;
119#endif
120 }
122 goto ui96;
123 mag1:
125 goto ui96;
126 }
127
128
129 if ( 0x406F <= exp ) {
130 if (
131 (exp == 0x7FFF)
135 ) {
137 return;
138 }
142 goto ui96;
143 }
144
145
146 bitPos = 0x406F - exp;
147 roundNear =
150 bitPos -= roundNear;
153 extra = 0;
154 for (;;) {
155 wordA = aWPtr[index];
156 if ( bitPos < 32 ) break;
157 if ( wordA ) extra = 1;
158 zWPtr[index] = 0;
160 bitPos -= 32;
161 }
163 if ( roundNear ) {
165 carry = (wordZ < wordA);
167 extrasMask =
bit - 1;
168 if ( exact && (extra || (wordA & extrasMask)) ) {
170 }
171 if (
173 && !extra && !(wordZ & extrasMask)
174 ) {
176 zWPtr[index] = wordZ;
178 wordZ = aWPtr[index] + carry;
179 carry &= !wordZ;
180 zWPtr[index] = wordZ & ~1;
181 goto propagateCarry;
182 }
183 wordZ &= ~bit;
184 }
185 } else {
186 wordZ = wordA;
187 carry = 0;
188 extrasMask =
bit - 1;
189 if ( extra || (wordA & extrasMask) ) {
191 if (
192 roundingMode
195 ) {
197 carry = (wordZ < wordA);
198#ifdef SOFTFLOAT_ROUND_ODD
201#endif
202 }
203 }
204 }
205 wordZ &= ~extrasMask;
206 zWPtr[index] = wordZ;
207 propagateCarry:
208 while ( index != lastIndex ) {
210 wordZ = aWPtr[index] + carry;
211 zWPtr[index] = wordZ;
212 carry &= !wordZ;
213 }
214 return;
215
216
217 ui96:
219
220}
void softfloat_propagateNaNF128M(const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr)
#define fracF128UI96(a96)
#define packToF128UI96(sign, exp, sig96)
#define signF128UI96(a96)
#define indexWordLo(total)
#define indexWord(total, n)
#define indexWordHi(total)
THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags
@ softfloat_round_near_even
@ softfloat_round_near_maxMag