1/* 2 * Floating point arithmetic implementation 3 * 4 * The code in this source file is derived from release 2a of the SoftFloat 5 * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and 6 * some later contributions) are provided under that license, as detailed below. 7 * It has subsequently been modified by contributors to the QEMU Project, 8 * so some portions are provided under: 9 * the SoftFloat-2a license 10 * the BSD license 11 * GPL-v2-or-later 12 * 13 * Any future contributions to this file after December 1st 2014 will be 14 * taken to be licensed under the Softfloat-2a license unless specifically 15 * indicated otherwise. 16 */ 17 18static void partsN(add_normal)(FloatPartsN *a, FloatPartsN *b) 19{ 20 int exp_diff = a->exp - b->exp; 21 22 if (exp_diff > 0) { 23 frac_shrjam(b, exp_diff); 24 } else if (exp_diff < 0) { 25 frac_shrjam(a, -exp_diff); 26 a->exp = b->exp; 27 } 28 29 if (frac_add(a, a, b)) { 30 frac_shrjam(a, 1); 31 a->frac_hi |= DECOMPOSED_IMPLICIT_BIT; 32 a->exp += 1; 33 } 34} 35 36static bool partsN(sub_normal)(FloatPartsN *a, FloatPartsN *b) 37{ 38 int exp_diff = a->exp - b->exp; 39 int shift; 40 41 if (exp_diff > 0) { 42 frac_shrjam(b, exp_diff); 43 frac_sub(a, a, b); 44 } else if (exp_diff < 0) { 45 a->exp = b->exp; 46 a->sign ^= 1; 47 frac_shrjam(a, -exp_diff); 48 frac_sub(a, b, a); 49 } else if (frac_sub(a, a, b)) { 50 /* Overflow means that A was less than B. */ 51 frac_neg(a); 52 a->sign ^= 1; 53 } 54 55 shift = frac_normalize(a); 56 if (likely(shift < N)) { 57 a->exp -= shift; 58 return true; 59 } 60 a->cls = float_class_zero; 61 return false; 62} 63