Lines Matching full:a

11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * You should have received a copy of the GNU General Public License
93 static Int128 int128_sub_borrow(Int128 a, Int128 b, int borrow) in int128_sub_borrow() argument
95 Int128 ret = int128_sub(a, b); in int128_sub_borrow()
121 static Accum accum_norm_left(Accum a) in accum_norm_left() argument
123 a.exp--; in accum_norm_left()
124 a.mant = int128_lshift(a.mant, 1); in accum_norm_left()
125 a.mant = int128_or(a.mant, int128_make64(a.guard)); in accum_norm_left()
126 a.guard = a.round; in accum_norm_left()
127 a.round = a.sticky; in accum_norm_left()
128 return a; in accum_norm_left()
132 static inline Accum accum_norm_right(Accum a, int amt) in accum_norm_right() argument
135 a.sticky |= in accum_norm_right()
136 a.round | a.guard | int128_nz(a.mant); in accum_norm_right()
137 a.guard = a.round = 0; in accum_norm_right()
138 a.mant = int128_zero(); in accum_norm_right()
139 a.exp += amt; in accum_norm_right()
140 return a; in accum_norm_right()
144 a.sticky |= a.round | a.guard | (int128_getlo(a.mant) != 0); in accum_norm_right()
145 a.guard = (int128_getlo(a.mant) >> 63) & 1; in accum_norm_right()
146 a.round = (int128_getlo(a.mant) >> 62) & 1; in accum_norm_right()
147 a.mant = int128_make64(int128_gethi(a.mant)); in accum_norm_right()
148 a.exp += 64; in accum_norm_right()
152 a.exp++; in accum_norm_right()
153 a.sticky |= a.round; in accum_norm_right()
154 a.round = a.guard; in accum_norm_right()
155 a.guard = int128_getlo(a.mant) & 1; in accum_norm_right()
156 a.mant = int128_rshift(a.mant, 1); in accum_norm_right()
159 return a; in accum_norm_right()
163 * On the add/sub, we need to be able to shift out lots of bits, but need a
166 static Accum accum_add(Accum a, Accum b);
168 static Accum accum_sub(Accum a, Accum b, int negate) in accum_sub() argument
174 if (a.sign != b.sign) { in accum_sub()
176 return accum_add(a, b); in accum_sub()
178 if (b.exp > a.exp) { in accum_sub()
180 return accum_sub(b, a, !negate); in accum_sub()
182 if ((b.exp == a.exp) && (int128_gt(b.mant, a.mant))) { in accum_sub()
184 return accum_sub(b, a, !negate); in accum_sub()
187 while (a.exp > b.exp) { in accum_sub()
188 /* Try to normalize exponents: shrink a exponent and grow mantissa */ in accum_sub()
189 if (int128_gethi(a.mant) & (1ULL << 62)) { in accum_sub()
190 /* Can't grow a any more */ in accum_sub()
193 a = accum_norm_left(a); in accum_sub()
197 while (a.exp > b.exp) { in accum_sub()
200 b = accum_norm_right(b, a.exp - b.exp); in accum_sub()
203 if ((int128_gt(b.mant, a.mant))) { in accum_sub()
204 return accum_sub(b, a, !negate); in accum_sub()
208 ret.sign = a.sign; in accum_sub()
209 ret.exp = a.exp; in accum_sub()
210 assert(!int128_gt(b.mant, a.mant)); in accum_sub()
212 ret.mant = int128_sub_borrow(a.mant, b.mant, (borrow != 0)); in accum_sub()
223 static Accum accum_add(Accum a, Accum b) in accum_add() argument
227 if (a.sign != b.sign) { in accum_add()
229 return accum_sub(a, b, 0); in accum_add()
231 if (b.exp > a.exp) { in accum_add()
233 return accum_add(b, a); in accum_add()
235 if ((b.exp == a.exp) && int128_gt(b.mant, a.mant)) { in accum_add()
237 return accum_add(b, a); in accum_add()
240 while (a.exp > b.exp) { in accum_add()
241 /* Try to normalize exponents: shrink a exponent and grow mantissa */ in accum_add()
242 if (int128_gethi(a.mant) & (1ULL << 62)) { in accum_add()
243 /* Can't grow a any more */ in accum_add()
246 a = accum_norm_left(a); in accum_add()
250 while (a.exp > b.exp) { in accum_add()
253 b = accum_norm_right(b, a.exp - b.exp); in accum_add()
257 if (int128_gt(b.mant, a.mant)) { in accum_add()
258 return accum_add(b, a); in accum_add()
260 ret.sign = a.sign; in accum_add()
261 ret.exp = a.exp; in accum_add()
262 assert(!int128_gt(b.mant, a.mant)); in accum_add()
263 ret.mant = int128_add(a.mant, b.mant); in accum_add()
280 /* Return a maximum finite value with requested sign */
290 /* Return a zero value with requested sign */
310 /* Return a maximum finite value with the requested sign */
311 static float64 accum_round_float64(Accum a, float_status *fp_status) in accum_round_float64() argument
315 if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0) in accum_round_float64()
316 && ((a.guard | a.round | a.sticky) == 0)) { in accum_round_float64()
332 while ((int128_gethi(a.mant) != 0) || in accum_round_float64()
333 ((int128_getlo(a.mant) >> (DF_MANTBITS + 1)) != 0)) { in accum_round_float64()
334 a = accum_norm_right(a, 1); in accum_round_float64()
338 * We want to normalize left until we have a leading one in bit 24 in accum_round_float64()
339 * Theoretically, we only need to shift a maximum of one to the left if we in accum_round_float64()
343 while ((int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) == 0) { in accum_round_float64()
344 a = accum_norm_left(a); in accum_round_float64()
351 while (a.exp <= 0) { in accum_round_float64()
352 a = accum_norm_right(a, 1 - a.exp); in accum_round_float64()
356 * in a denormal. in accum_round_float64()
358 if (a.guard || a.round || a.sticky) { in accum_round_float64()
363 if (a.guard || a.round || a.sticky) { in accum_round_float64()
370 if (a.sign == 0) { in accum_round_float64()
371 a.mant = int128_add(a.mant, int128_one()); in accum_round_float64()
375 if (a.sign != 0) { in accum_round_float64()
376 a.mant = int128_add(a.mant, int128_one()); in accum_round_float64()
380 if (a.round || a.sticky) { in accum_round_float64()
382 a.mant = int128_add(a.mant, int128_make64(a.guard)); in accum_round_float64()
383 } else if (a.guard) { in accum_round_float64()
385 a.mant = int128_add(a.mant, int128_and(a.mant, int128_one())); in accum_round_float64()
394 * got a carry out... in accum_round_float64()
396 if ((int128_getlo(a.mant) >> (DF_MANTBITS + 1)) != 0) { in accum_round_float64()
397 a = accum_norm_right(a, 1); in accum_round_float64()
400 if (a.exp >= DF_INF_EXP) { in accum_round_float64()
406 return maxfinite_float64(a.sign); in accum_round_float64()
408 if (a.sign == 0) { in accum_round_float64()
409 return infinite_float64(a.sign); in accum_round_float64()
411 return maxfinite_float64(a.sign); in accum_round_float64()
414 if (a.sign != 0) { in accum_round_float64()
415 return infinite_float64(a.sign); in accum_round_float64()
417 return maxfinite_float64(a.sign); in accum_round_float64()
420 return infinite_float64(a.sign); in accum_round_float64()
424 ret = int128_getlo(a.mant); in accum_round_float64()
427 ret = deposit64(ret, 52, 11, a.exp); in accum_round_float64()
429 assert(a.exp == 1); in accum_round_float64()
432 ret = deposit64(ret, 63, 1, a.sign); in accum_round_float64()
436 float64 internal_mpyhh(float64 a, float64 b, in internal_mpyhh() argument
448 if (float64_is_zero(a) || in internal_mpyhh()
449 float64_is_any_nan(a) || in internal_mpyhh()
450 float64_is_infinity(a)) { in internal_mpyhh()
451 return float64_mul(a, b, fp_status); in internal_mpyhh()
456 return float64_mul(a, b, fp_status); in internal_mpyhh()
460 prod = fGETUWORD(1, float64_getmant(a)) * fGETUWORD(1, float64_getmant(b)); in internal_mpyhh()
462 x.exp = float64_getexp(a) + float64_getexp(b) - DF_BIAS - 20; in internal_mpyhh()
463 if (!float64_is_normal(a) || !float64_is_normal(b)) { in internal_mpyhh()
468 a_sign = float64_is_neg(a); in internal_mpyhh()