| 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 | |
| 18 | static void partsN(add_normal)(FloatPartsN *a, FloatPartsN *b) |
| 19 | { |
| 20 | int exp_diff = a->exp - b->exp; |
| 21 | |
| 22 | if (exp_diff > 0) { |
| 23 | fracN(shrjam)(b, exp_diff); |
| 24 | } else if (exp_diff < 0) { |
| 25 | fracN(shrjam)(a, -exp_diff); |
| 26 | a->exp = b->exp; |
| 27 | } |
| 28 | |
| 29 | if (fracN(add)(a, a, b)) { |
| 30 | fracN(shrjam)(a, 1); |
| 31 | a->frac_hi |= DECOMPOSED_IMPLICIT_BIT; |
| 32 | a->exp += 1; |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | static 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 | fracN(shrjam)(b, exp_diff); |
| 43 | fracN(sub)(a, a, b); |
| 44 | } else if (exp_diff < 0) { |
| 45 | a->exp = b->exp; |
| 46 | a->sign ^= 1; |
| 47 | fracN(shrjam)(a, -exp_diff); |
| 48 | fracN(sub)(a, b, a); |
| 49 | } else if (fracN(sub)(a, a, b)) { |
| 50 | /* Overflow means that A was less than B. */ |
| 51 | fracN(neg)(a); |
| 52 | a->sign ^= 1; |
| 53 | } |
| 54 | |
| 55 | shift = fracN(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 | } |