| /* |
| * QEMU float support |
| * |
| * 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(return_nan)(FloatPartsN *a, float_status *s) |
| { |
| switch (a->cls) { |
| case float_class_snan: |
| float_raise(float_flag_invalid, s); |
| if (s->default_nan_mode) { |
| parts_default_nan(a, s); |
| } else { |
| parts_silence_nan(a, s); |
| } |
| break; |
| case float_class_qnan: |
| if (s->default_nan_mode) { |
| parts_default_nan(a, s); |
| } |
| break; |
| default: |
| g_assert_not_reached(); |
| } |
| } |
| |
| static FloatPartsN *partsN(pick_nan)(FloatPartsN *a, FloatPartsN *b, |
| float_status *s) |
| { |
| if (is_snan(a->cls) || is_snan(b->cls)) { |
| float_raise(float_flag_invalid, s); |
| } |
| |
| if (s->default_nan_mode) { |
| parts_default_nan(a, s); |
| } else { |
| int cmp = frac_cmp(a, b); |
| if (cmp == 0) { |
| cmp = a->sign < b->sign; |
| } |
| |
| if (pickNaN(a->cls, b->cls, cmp > 0, s)) { |
| a = b; |
| } |
| if (is_snan(a->cls)) { |
| parts_silence_nan(a, s); |
| } |
| } |
| return a; |
| } |