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~