git: f6e1f27e9f00 - main - lib/msun: Replace manual checks with isnan() calls
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 22 Apr 2026 22:40:25 UTC
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;