softfloat: Share code between parts_pick_nan cases

Remember if there was an SNaN, and use that to simplify
float_2nan_prop_s_{ab,ba} to only the snan component.
Then, fall through to the corresponding
float_2nan_prop_{ab,ba} case to handle any remaining
nans, which must be quiet.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20241203203949.483774-10-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Richard Henderson 2024-12-11 15:31:09 +00:00 committed by Peter Maydell
parent 04cbb4acc6
commit 2da7553f2e

View file

@ -39,10 +39,12 @@ static void partsN(return_nan)(FloatPartsN *a, float_status *s)
static FloatPartsN *partsN(pick_nan)(FloatPartsN *a, FloatPartsN *b,
float_status *s)
{
bool have_snan = false;
int cmp, which;
if (is_snan(a->cls) || is_snan(b->cls)) {
float_raise(float_flag_invalid | float_flag_invalid_snan, s);
have_snan = true;
}
if (s->default_nan_mode) {
@ -57,30 +59,20 @@ static FloatPartsN *partsN(pick_nan)(FloatPartsN *a, FloatPartsN *b,
switch (s->float_2nan_prop_rule) {
case float_2nan_prop_s_ab:
if (is_snan(a->cls)) {
which = 0;
} else if (is_snan(b->cls)) {
which = 1;
} else if (is_qnan(a->cls)) {
which = 0;
} else {
which = 1;
if (have_snan) {
which = is_snan(a->cls) ? 0 : 1;
break;
}
break;
case float_2nan_prop_s_ba:
if (is_snan(b->cls)) {
which = 1;
} else if (is_snan(a->cls)) {
which = 0;
} else if (is_qnan(b->cls)) {
which = 1;
} else {
which = 0;
}
break;
/* fall through */
case float_2nan_prop_ab:
which = is_nan(a->cls) ? 0 : 1;
break;
case float_2nan_prop_s_ba:
if (have_snan) {
which = is_snan(b->cls) ? 1 : 0;
break;
}
/* fall through */
case float_2nan_prop_ba:
which = is_nan(b->cls) ? 1 : 0;
break;