mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 14:53:54 -06:00
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:
parent
04cbb4acc6
commit
2da7553f2e
1 changed files with 12 additions and 20 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue