diff options
| author | Jesús Blázquez <jesuscblazquez@gmail.com> | 2026-04-21 15:23:20 +0000 |
|---|---|---|
| committer | Robert Clausecker <fuz@FreeBSD.org> | 2026-04-22 22:39:51 +0000 |
| commit | f6e1f27e9f005447e88a9b37df8a75751b1e0c3a (patch) | |
| tree | 3b3bf15e2ce1f0cbb2082ff884d424a31c8bd1a7 | |
| parent | af01ffbfb1c0a0104d3a4c7dd1342ed7c81c6c54 (diff) | |
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
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; |
