1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /*
- * 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;
- }
|