The nan test had been down below because it was unlikely.
But if we have to have one anyway because of denormals,
we might as well take care of them right away.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
fpu/softfloat-parts.c.inc | 21 ++++++---------------
1 file changed, 6 insertions(+), 15 deletions(-)
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index dca751fb94..244fdd90d2 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -530,13 +530,16 @@ static FloatPartsN *partsN(addsub)(FloatPartsN *a, FloatPartsN *b,
bool b_sign = b->sign ^ subtract;
int ab_mask = float_cmask(a->cls) | float_cmask(b->cls);
+ if (unlikely(ab_mask & float_cmask_anynan)) {
+ *a = partsN(pick_nan)(a, b, s);
+ return a;
+ }
+
/*
* For addition and subtraction, we will consume an
* input denormal unless the other input is a NaN.
*/
- if (!(ab_mask & float_cmask_anynan)) {
- record_denormals_used(ab_mask, s);
- }
+ record_denormals_used(ab_mask, s);
if (a->sign != b_sign) {
/* Subtraction */
@@ -553,10 +556,6 @@ static FloatPartsN *partsN(addsub)(FloatPartsN *a, FloatPartsN *b,
return a;
}
- if (unlikely(ab_mask & float_cmask_anynan)) {
- goto p_nan;
- }
-
if (ab_mask & float_cmask_inf) {
if (a->cls != float_class_inf) {
/* N - Inf */
@@ -582,10 +581,6 @@ static FloatPartsN *partsN(addsub)(FloatPartsN *a, FloatPartsN *b,
return a;
}
- if (unlikely(ab_mask & float_cmask_anynan)) {
- goto p_nan;
- }
-
if (ab_mask & float_cmask_inf) {
a->cls = float_class_inf;
return a;
@@ -602,10 +597,6 @@ static FloatPartsN *partsN(addsub)(FloatPartsN *a, FloatPartsN *b,
return_b:
b->sign = b_sign;
return b;
-
- p_nan:
- *a = partsN(pick_nan)(a, b, s);
- return a;
}
/*
--
2.43.0