| /* |

| * Floating point arithmetic implementation |

| * |

| * The code in this source file is derived from release 2a of the SoftFloat |

| * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and |

| * some later contributions) are provided under that license, as detailed below. |

| * It has subsequently been modified by contributors to the QEMU Project, |

| * so some portions are provided under: |

| * the SoftFloat-2a license |

| * the BSD license |

| * GPL-v2-or-later |

| * |

| * Any future contributions to this file after December 1st 2014 will be |

| * taken to be licensed under the Softfloat-2a license unless specifically |

| * indicated otherwise. |

| */ |

| |

| static void partsN(add_normal)(FloatPartsN *a, FloatPartsN *b) |

| { |

| int exp_diff = a->exp - b->exp; |

| |

| if (exp_diff > 0) { |

| frac_shrjam(b, exp_diff); |

| } else if (exp_diff < 0) { |

| frac_shrjam(a, -exp_diff); |

| a->exp = b->exp; |

| } |

| |

| if (frac_add(a, a, b)) { |

| frac_shrjam(a, 1); |

| a->frac_hi |= DECOMPOSED_IMPLICIT_BIT; |

| a->exp += 1; |

| } |

| } |

| |

| static bool partsN(sub_normal)(FloatPartsN *a, FloatPartsN *b) |

| { |

| int exp_diff = a->exp - b->exp; |

| int shift; |

| |

| if (exp_diff > 0) { |

| frac_shrjam(b, exp_diff); |

| frac_sub(a, a, b); |

| } else if (exp_diff < 0) { |

| a->exp = b->exp; |

| a->sign ^= 1; |

| frac_shrjam(a, -exp_diff); |

| frac_sub(a, b, a); |

| } else if (frac_sub(a, a, b)) { |

| /* Overflow means that A was less than B. */ |

| frac_neg(a); |

| a->sign ^= 1; |

| } |

| |

| shift = frac_normalize(a); |

| if (likely(shift < N)) { |

| a->exp -= shift; |

| return true; |

| } |

| a->cls = float_class_zero; |

| return false; |

| } |