On 01/24/2018 05:13 AM, Alex Bennée wrote: > +static FloatParts round_to_int(FloatParts a, int rounding_mode, float_status > *s) > +{ > + > + switch (a.cls) { > + case float_class_snan: > + a.cls = s->default_nan_mode ? float_class_dnan : float_class_msnan; > + s->float_exception_flags |= float_flag_invalid; > + break; > + case float_class_zero: > + case float_class_inf: > + case float_class_qnan: > + /* already "integral" */ > + break;
This mishandles float_class_qnan + default_nan_mode. Consider how this would pass though pick_nan_parts(a, a, s). I suspect a single-argument version of pick_nan_parts would be helpful: static FloatParts return_nan(FloatParts a, float_status *s) { switch (a.cls) { case float_class_snan: s->float_exception_flags |= float_flag_invalid; a.cls = float_class_msnan; /* FALLTHRU */ case float_class_qnan: if (s->default_nan_mode) { a.cls = float_class_dnan; } break; default: g_assert_not_reached(); } } and use this in round_to_int, scalbn, and sqrt. r~