Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Apr 2026 22:40:25 +0000
From:      Robert Clausecker <fuz@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        =?utf-8?Q?Jes=C3=BAs?= =?utf-8?Q?Bl=C3=A1zqu?=ez <jesuscblazquez@gmail.com>
Subject:   git: f6e1f27e9f00 - main - lib/msun: Replace manual checks with isnan() calls
Message-ID:  <69e94e59.3ac96.19bd0063@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by fuz:

URL: https://cgit.FreeBSD.org/src/commit/?id=f6e1f27e9f005447e88a9b37df8a75751b1e0c3a

commit f6e1f27e9f005447e88a9b37df8a75751b1e0c3a
Author:     Jesús Blázquez <jesuscblazquez@gmail.com>
AuthorDate: 2026-04-21 15:23:20 +0000
Commit:     Robert Clausecker <fuz@FreeBSD.org>
CommitDate: 2026-04-22 22:39:51 +0000

    lib/msun: Replace manual checks with isnan() calls
    
    The maximum and minimum functions, as well as nextafter and nexttoward,
    were using manual NaN checks instead of the isnan() macro.
    
    PR:             294692
    Reviewed by:    fuz, kargl
    MFC after:      1 month
---
 lib/msun/src/s_fmax.c          |  4 ++--
 lib/msun/src/s_fmaxf.c         |  4 ++--
 lib/msun/src/s_fmaximum.c      |  3 +--
 lib/msun/src/s_fmaximum_mag.c  |  3 +--
 lib/msun/src/s_fmaximum_magf.c |  3 +--
 lib/msun/src/s_fmaximum_magl.c |  3 +--
 lib/msun/src/s_fmaximum_num.c  |  4 ++--
 lib/msun/src/s_fmaximum_numf.c |  4 ++--
 lib/msun/src/s_fmaximum_numl.c |  4 ++--
 lib/msun/src/s_fmaximumf.c     |  3 +--
 lib/msun/src/s_fmaximuml.c     |  3 +--
 lib/msun/src/s_fmaxl.c         |  4 ++--
 lib/msun/src/s_fmin.c          |  4 ++--
 lib/msun/src/s_fminf.c         |  4 ++--
 lib/msun/src/s_fminimum.c      |  3 +--
 lib/msun/src/s_fminimum_mag.c  |  3 +--
 lib/msun/src/s_fminimum_magf.c |  3 +--
 lib/msun/src/s_fminimum_magl.c |  3 +--
 lib/msun/src/s_fminimum_num.c  |  4 ++--
 lib/msun/src/s_fminimum_numf.c |  4 ++--
 lib/msun/src/s_fminimum_numl.c |  4 ++--
 lib/msun/src/s_fminimumf.c     |  3 +--
 lib/msun/src/s_fminimuml.c     |  3 +--
 lib/msun/src/s_fminl.c         |  4 ++--
 lib/msun/src/s_nextafter.c     |  8 ++++----
 lib/msun/src/s_nextafterf.c    |  8 ++++----
 lib/msun/src/s_nextafterl.c    | 10 ++++------
 lib/msun/src/s_nexttoward.c    |  9 ++++-----
 lib/msun/src/s_nexttowardf.c   |  9 ++++-----
 29 files changed, 56 insertions(+), 72 deletions(-)

diff --git a/lib/msun/src/s_fmax.c b/lib/msun/src/s_fmax.c
index 5d437fcefc9b..c2995cb39948 100644
--- a/lib/msun/src/s_fmax.c
+++ b/lib/msun/src/s_fmax.c
@@ -47,9 +47,9 @@ fmax(double x, double y)
 	u[1].d = y;
 
 	/* Check for NaNs to avoid raising spurious exceptions. */
-	if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0)
+	if (isnan(x))
 		return (y);
-	if (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(y))
 		return (x);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fmaxf.c b/lib/msun/src/s_fmaxf.c
index 1572572e43a6..bc9b7f5e3ff6 100644
--- a/lib/msun/src/s_fmaxf.c
+++ b/lib/msun/src/s_fmaxf.c
@@ -46,9 +46,9 @@ fmaxf(float x, float y)
 	u[1].f = y;
 
 	/* Check for NaNs to avoid raising spurious exceptions. */
-	if (u[0].bits.exp == 255 && u[0].bits.man != 0)
+	if (isnan(x))
 		return (y);
-	if (u[1].bits.exp == 255 && u[1].bits.man != 0)
+	if (isnan(y))
 		return (x);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fmaximum.c b/lib/msun/src/s_fmaximum.c
index f9e1998a84c2..4fe35feac88d 100644
--- a/lib/msun/src/s_fmaximum.c
+++ b/lib/msun/src/s_fmaximum.c
@@ -48,8 +48,7 @@ fmaximum(double x, double y)
 	u[1].d = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if ((u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0) ||
-	    (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0))
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fmaximum_mag.c b/lib/msun/src/s_fmaximum_mag.c
index 1b1250f4c36e..b509a275c954 100644
--- a/lib/msun/src/s_fmaximum_mag.c
+++ b/lib/msun/src/s_fmaximum_mag.c
@@ -47,8 +47,7 @@ fmaximum_mag(double x, double y)
 	u[1].d = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if ((u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0) ||
-	    (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0))
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	double ax = fabs(x);
diff --git a/lib/msun/src/s_fmaximum_magf.c b/lib/msun/src/s_fmaximum_magf.c
index 6193b9184970..93d7150d76a8 100644
--- a/lib/msun/src/s_fmaximum_magf.c
+++ b/lib/msun/src/s_fmaximum_magf.c
@@ -46,8 +46,7 @@ fmaximum_magf(float x, float y)
 	u[1].f = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if ((u[0].bits.exp == 255 && u[0].bits.man != 0) ||
-	    (u[1].bits.exp == 255 && u[1].bits.man != 0))
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	float ax = fabsf(x);
diff --git a/lib/msun/src/s_fmaximum_magl.c b/lib/msun/src/s_fmaximum_magl.c
index f2426b050d33..197477003bb5 100644
--- a/lib/msun/src/s_fmaximum_magl.c
+++ b/lib/msun/src/s_fmaximum_magl.c
@@ -41,8 +41,7 @@ fmaximum_magl(long double x, long double y)
 	mask_nbit_l(u[1]);
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if ((u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0) ||
-	    (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0))
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	long double ax = fabsl(x);
diff --git a/lib/msun/src/s_fmaximum_num.c b/lib/msun/src/s_fmaximum_num.c
index cf16c76f89b9..c7cfcd26fd70 100644
--- a/lib/msun/src/s_fmaximum_num.c
+++ b/lib/msun/src/s_fmaximum_num.c
@@ -49,8 +49,8 @@ fmaximum_num(double x, double y)
 	u[0].d = x;
 	u[1].d = y;
 
-	nan_x = u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0;
-	nan_y = u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0;
+	nan_x = isnan(x);
+	nan_y = isnan(y);
 
 	if (nan_x || nan_y) {
 		/* These ternary conditionals force (x+y), so that sNaN's raise exceptions */
diff --git a/lib/msun/src/s_fmaximum_numf.c b/lib/msun/src/s_fmaximum_numf.c
index c30179e47f9e..60a7ccae343e 100644
--- a/lib/msun/src/s_fmaximum_numf.c
+++ b/lib/msun/src/s_fmaximum_numf.c
@@ -48,8 +48,8 @@ fmaximum_numf(float x, float y)
 	u[0].f = x;
 	u[1].f = y;
 
-	nan_x = u[0].bits.exp == 255 && u[0].bits.man != 0;
-	nan_y = u[1].bits.exp == 255 && u[1].bits.man != 0;
+	nan_x = isnan(x);
+	nan_y = isnan(y);
 
 	if (nan_x || nan_y) {
 		/* These ternary conditionals force (x+y), so that sNaN's raise exceptions */
diff --git a/lib/msun/src/s_fmaximum_numl.c b/lib/msun/src/s_fmaximum_numl.c
index 2291d01ca4f4..a2a5383ab85a 100644
--- a/lib/msun/src/s_fmaximum_numl.c
+++ b/lib/msun/src/s_fmaximum_numl.c
@@ -43,8 +43,8 @@ fmaximum_numl(long double x, long double y)
 	u[1].e = y;
 	mask_nbit_l(u[1]);
 
-	nan_x = u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0;
-	nan_y = u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0;
+	nan_x = isnan(x);
+	nan_y = isnan(y);
 
 	if (nan_x || nan_y) {
 		/* These ternary conditionals force (x+y), so that sNaN's raise exceptions */
diff --git a/lib/msun/src/s_fmaximumf.c b/lib/msun/src/s_fmaximumf.c
index db4b96c14749..928a75a601d1 100644
--- a/lib/msun/src/s_fmaximumf.c
+++ b/lib/msun/src/s_fmaximumf.c
@@ -47,8 +47,7 @@ fmaximumf(float x, float y)
 	u[1].f = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if ((u[0].bits.exp == 255 && u[0].bits.man != 0) ||
-	    (u[1].bits.exp == 255 && u[1].bits.man != 0))
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fmaximuml.c b/lib/msun/src/s_fmaximuml.c
index c849478cf05a..4a94dc5dad36 100644
--- a/lib/msun/src/s_fmaximuml.c
+++ b/lib/msun/src/s_fmaximuml.c
@@ -42,8 +42,7 @@ fmaximuml(long double x, long double y)
 	mask_nbit_l(u[1]);
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if ((u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0) ||
-	    (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0))
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fmaxl.c b/lib/msun/src/s_fmaxl.c
index 73e2a4bb19fd..1019612696c1 100644
--- a/lib/msun/src/s_fmaxl.c
+++ b/lib/msun/src/s_fmaxl.c
@@ -41,9 +41,9 @@ fmaxl(long double x, long double y)
 	mask_nbit_l(u[1]);
 
 	/* Check for NaNs to avoid raising spurious exceptions. */
-	if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+	if (isnan(x))
 		return (y);
-	if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(y))
 		return (x);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fmin.c b/lib/msun/src/s_fmin.c
index a349e5ddaf0e..feefdb6f6fe4 100644
--- a/lib/msun/src/s_fmin.c
+++ b/lib/msun/src/s_fmin.c
@@ -47,9 +47,9 @@ fmin(double x, double y)
 	u[1].d = y;
 
 	/* Check for NaNs to avoid raising spurious exceptions. */
-	if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0)
+	if (isnan(x))
 		return (y);
-	if (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(y))
 		return (x);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fminf.c b/lib/msun/src/s_fminf.c
index 5c2537e32d25..561efd3568d1 100644
--- a/lib/msun/src/s_fminf.c
+++ b/lib/msun/src/s_fminf.c
@@ -46,9 +46,9 @@ fminf(float x, float y)
 	u[1].f = y;
 
 	/* Check for NaNs to avoid raising spurious exceptions. */
-	if (u[0].bits.exp == 255 && u[0].bits.man != 0)
+	if (isnan(x))
 		return (y);
-	if (u[1].bits.exp == 255 && u[1].bits.man != 0)
+	if (isnan(y))
 		return (x);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fminimum.c b/lib/msun/src/s_fminimum.c
index fa3fd17fe241..3767db01d473 100644
--- a/lib/msun/src/s_fminimum.c
+++ b/lib/msun/src/s_fminimum.c
@@ -48,8 +48,7 @@ fminimum(double x, double y)
 	u[1].d = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0 || 
-	    u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fminimum_mag.c b/lib/msun/src/s_fminimum_mag.c
index cd21fb948a8e..311216d3cc56 100644
--- a/lib/msun/src/s_fminimum_mag.c
+++ b/lib/msun/src/s_fminimum_mag.c
@@ -47,8 +47,7 @@ fminimum_mag(double x, double y)
 	u[1].d = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0 ||
-	    u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	double ax = fabs(x);
diff --git a/lib/msun/src/s_fminimum_magf.c b/lib/msun/src/s_fminimum_magf.c
index 9c04859184ea..f2181115d358 100644
--- a/lib/msun/src/s_fminimum_magf.c
+++ b/lib/msun/src/s_fminimum_magf.c
@@ -46,8 +46,7 @@ fminimum_magf(float x, float y)
 	u[1].f = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if (u[0].bits.exp == 255 && u[0].bits.man != 0 ||
-	    u[1].bits.exp == 255 && u[1].bits.man != 0)
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	float ax = fabsf(x);
diff --git a/lib/msun/src/s_fminimum_magl.c b/lib/msun/src/s_fminimum_magl.c
index e6ab22afe7f0..cd0b366d376f 100644
--- a/lib/msun/src/s_fminimum_magl.c
+++ b/lib/msun/src/s_fminimum_magl.c
@@ -41,8 +41,7 @@ fminimum_magl(long double x, long double y)
 	mask_nbit_l(u[1]);
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0 ||
-	    u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	long double ax = fabsl(x);
diff --git a/lib/msun/src/s_fminimum_num.c b/lib/msun/src/s_fminimum_num.c
index 71b5f072c32d..a5fd657955c5 100644
--- a/lib/msun/src/s_fminimum_num.c
+++ b/lib/msun/src/s_fminimum_num.c
@@ -49,8 +49,8 @@ fminimum_num(double x, double y)
 	u[0].d = x;
 	u[1].d = y;
 
-	nan_x = u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0;
-	nan_y = u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0;
+	nan_x = isnan(x);
+	nan_y = isnan(y);
 
 	if (nan_x || nan_y) {
 		/* These ternary conditionals force (x+y), so that sNaN's raise exceptions */
diff --git a/lib/msun/src/s_fminimum_numf.c b/lib/msun/src/s_fminimum_numf.c
index d5bab31ce403..d5e8f0812bdb 100644
--- a/lib/msun/src/s_fminimum_numf.c
+++ b/lib/msun/src/s_fminimum_numf.c
@@ -48,8 +48,8 @@ fminimum_numf(float x, float y)
 	u[0].f = x;
 	u[1].f = y;
 
-	nan_x = u[0].bits.exp == 255 && u[0].bits.man != 0;
-	nan_y = u[1].bits.exp == 255 && u[1].bits.man != 0;
+	nan_x = isnan(x);
+	nan_y = isnan(y);
 
 	if (nan_x || nan_y) {
 		/* These ternary conditionals force (x+y), so that sNaN's raise exceptions */
diff --git a/lib/msun/src/s_fminimum_numl.c b/lib/msun/src/s_fminimum_numl.c
index 6b26d2218d42..dc0884002499 100644
--- a/lib/msun/src/s_fminimum_numl.c
+++ b/lib/msun/src/s_fminimum_numl.c
@@ -43,8 +43,8 @@ fminimum_numl(long double x, long double y)
 	u[1].e = y;
 	mask_nbit_l(u[1]);
 
-	nan_x = u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0;
-	nan_y = u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0;
+	nan_x = isnan(x);
+	nan_y = isnan(y);
 
 	if (nan_x || nan_y) {
 		/* These ternary conditionals force (x+y), so that sNaN's raise exceptions */
diff --git a/lib/msun/src/s_fminimumf.c b/lib/msun/src/s_fminimumf.c
index 08ac3ca4c158..072607f88166 100644
--- a/lib/msun/src/s_fminimumf.c
+++ b/lib/msun/src/s_fminimumf.c
@@ -47,8 +47,7 @@ fminimumf(float x, float y)
 	u[1].f = y;
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if (u[0].bits.exp == 255 && u[0].bits.man != 0 || 
-	    u[1].bits.exp == 255 && u[1].bits.man != 0)
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fminimuml.c b/lib/msun/src/s_fminimuml.c
index 1ef9078ee674..d002907a7dd7 100644
--- a/lib/msun/src/s_fminimuml.c
+++ b/lib/msun/src/s_fminimuml.c
@@ -42,8 +42,7 @@ fminimuml(long double x, long double y)
 	mask_nbit_l(u[1]);
 
 	/* Handle NaN according to ISO/IEC 60559. NaN argument -> NaN return */
-	if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0 || 
-	    u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(x) || isnan(y))
 		return (NAN);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_fminl.c b/lib/msun/src/s_fminl.c
index 7ac17e313440..5af3bf45087a 100644
--- a/lib/msun/src/s_fminl.c
+++ b/lib/msun/src/s_fminl.c
@@ -41,9 +41,9 @@ fminl(long double x, long double y)
 	mask_nbit_l(u[1]);
 
 	/* Check for NaNs to avoid raising spurious exceptions. */
-	if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+	if (isnan(x))
 		return (y);
-	if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+	if (isnan(y))
 		return (x);
 
 	/* Handle comparisons of signed zeroes. */
diff --git a/lib/msun/src/s_nextafter.c b/lib/msun/src/s_nextafter.c
index 1b394e5109c2..8ac5b9550946 100644
--- a/lib/msun/src/s_nextafter.c
+++ b/lib/msun/src/s_nextafter.c
@@ -28,15 +28,15 @@ nextafter(double x, double y)
 	int32_t hx,hy,ix,iy;
 	u_int32_t lx,ly;
 
+	if(isnan(x) || isnan(y))     /* x or y is nan */
+	   return x+y;
+	if(x==y) return y;		/* x=y, return y */
+
 	EXTRACT_WORDS(hx,lx,x);
 	EXTRACT_WORDS(hy,ly,y);
 	ix = hx&0x7fffffff;		/* |x| */
 	iy = hy&0x7fffffff;		/* |y| */
 
-	if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||   /* x is nan */
-	   ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0))     /* y is nan */
-	   return x+y;
-	if(x==y) return y;		/* x=y, return y */
 	if((ix|lx)==0) {			/* x == 0 */
 	    INSERT_WORDS(x,hy&0x80000000,1);	/* return +-minsubnormal */
 	    t = x*x;
diff --git a/lib/msun/src/s_nextafterf.c b/lib/msun/src/s_nextafterf.c
index 418b126a27ab..e8527e989190 100644
--- a/lib/msun/src/s_nextafterf.c
+++ b/lib/msun/src/s_nextafterf.c
@@ -22,15 +22,15 @@ nextafterf(float x, float y)
 	volatile float t;
 	int32_t hx,hy,ix,iy;
 
+	if(isnan(x) || isnan(y))     /* x or y is nan */
+	   return x+y;
+	if(x==y) return y;		/* x=y, return y */
+
 	GET_FLOAT_WORD(hx,x);
 	GET_FLOAT_WORD(hy,y);
 	ix = hx&0x7fffffff;		/* |x| */
 	iy = hy&0x7fffffff;		/* |y| */
 
-	if((ix>0x7f800000) ||   /* x is nan */
-	   (iy>0x7f800000))     /* y is nan */
-	   return x+y;
-	if(x==y) return y;		/* x=y, return y */
 	if(ix==0) {				/* x == 0 */
 	    SET_FLOAT_WORD(x,(hy&0x80000000)|1);/* return +-minsubnormal */
 	    t = x*x;
diff --git a/lib/msun/src/s_nextafterl.c b/lib/msun/src/s_nextafterl.c
index fe5a010e89f5..a73aabc9b6e1 100644
--- a/lib/msun/src/s_nextafterl.c
+++ b/lib/msun/src/s_nextafterl.c
@@ -32,15 +32,13 @@ nextafterl(long double x, long double y)
 	volatile long double t;
 	union IEEEl2bits ux, uy;
 
+	if (isnan(x) || isnan(y))
+	   return x+y;	/* x or y is nan */
+	if(x==y) return y;		/* x=y, return y */
+
 	ux.e = x;
 	uy.e = y;
 
-	if ((ux.bits.exp == 0x7fff &&
-	     ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl) != 0) ||
-	    (uy.bits.exp == 0x7fff &&
-	     ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
-	   return x+y;	/* x or y is nan */
-	if(x==y) return y;		/* x=y, return y */
 	if(x==0.0) {
 	    ux.bits.manh = 0;			/* return +-minsubnormal */
 	    ux.bits.manl = 1;
diff --git a/lib/msun/src/s_nexttoward.c b/lib/msun/src/s_nexttoward.c
index 5482dc21606d..d8e04b107e25 100644
--- a/lib/msun/src/s_nexttoward.c
+++ b/lib/msun/src/s_nexttoward.c
@@ -33,15 +33,14 @@ nexttoward(double x, long double y)
 	int32_t hx,ix;
 	u_int32_t lx;
 
+	if(isnan(x) || isnan(y))
+	   return x+y;	/* x or y is nan */
+	if(x==y) return (double)y;		/* x=y, return y */
+
 	EXTRACT_WORDS(hx,lx,x);
 	ix = hx&0x7fffffff;		/* |x| */
 	uy.e = y;
 
-	if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||
-	    (uy.bits.exp == 0x7fff &&
-	     ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
-	   return x+y;	/* x or y is nan */
-	if(x==y) return (double)y;		/* x=y, return y */
 	if(x==0.0) {
 	    INSERT_WORDS(x,uy.bits.sign<<31,1);	/* return +-minsubnormal */
 	    t = x*x;
diff --git a/lib/msun/src/s_nexttowardf.c b/lib/msun/src/s_nexttowardf.c
index 05c89f4554ec..53ca3b9806af 100644
--- a/lib/msun/src/s_nexttowardf.c
+++ b/lib/msun/src/s_nexttowardf.c
@@ -24,15 +24,14 @@ nexttowardf(float x, long double y)
 	volatile float t;
 	int32_t hx,ix;
 
+	if(isnan(x) || isnan(y))
+	   return x+y;	/* x or y is nan */
+	if(x==y) return (float)y;		/* x=y, return y */
+
 	GET_FLOAT_WORD(hx,x);
 	ix = hx&0x7fffffff;		/* |x| */
 	uy.e = y;
 
-	if((ix>0x7f800000) ||
-	   (uy.bits.exp == LDBL_INFNAN_EXP &&
-	    ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
-	   return x+y;	/* x or y is nan */
-	if(x==y) return (float)y;		/* x=y, return y */
 	if(ix==0) {				/* x == 0 */
 	    SET_FLOAT_WORD(x,(uy.bits.sign<<31)|1);/* return +-minsubnormal */
 	    t = x*x;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69e94e59.3ac96.19bd0063>