diff --git a/configure b/configure index 42c9090c912..e6409e264f9 100755 --- a/configure +++ b/configure @@ -17728,7 +17728,6 @@ for ac_func in \ finitef \ fnmatch \ fork \ - fpclass \ fstatfs \ fstatvfs \ futimens \ diff --git a/configure.ac b/configure.ac index 9103484d597..f70329b41ae 100644 --- a/configure.ac +++ b/configure.ac @@ -2167,7 +2167,6 @@ AC_CHECK_FUNCS(\ finitef \ fnmatch \ fork \ - fpclass \ fstatfs \ fstatvfs \ futimens \ diff --git a/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec b/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec index 579b97fee34..5f0cce6f05d 100644 --- a/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec +++ b/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec @@ -79,7 +79,7 @@ @ cdecl _finite(double) ucrtbase._finite @ cdecl -arch=!i386 _finitef(float) ucrtbase._finitef @ cdecl _fpclass(double) ucrtbase._fpclass -@ stub _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) ucrtbase._fpclassf @ cdecl -arch=i386 -ret64 _ftol() ucrtbase._ftol @ cdecl -arch=win64 _get_FMA3_enable() ucrtbase._get_FMA3_enable @ cdecl _hypot(double double) ucrtbase._hypot diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec index 6fcbab0f108..2a912bba7bf 100644 --- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec +++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec @@ -282,7 +282,7 @@ @ cdecl _o__findnext64i32(long ptr) ucrtbase._o__findnext64i32 @ cdecl _o__flushall() ucrtbase._o__flushall @ cdecl _o__fpclass(double) ucrtbase._o__fpclass -@ stub _o__fpclassf +@ cdecl -arch=!i386 _o__fpclassf(float) ucrtbase._o__fpclassf @ cdecl _o__fputc_nolock(long ptr) ucrtbase._o__fputc_nolock @ cdecl _o__fputchar(long) ucrtbase._o__fputchar @ cdecl _o__fputwc_nolock(long ptr) ucrtbase._o__fputwc_nolock diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 780c86ee715..fc15a97cfd8 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -824,7 +824,7 @@ @ cdecl _flushall() MSVCRT__flushall @ extern _fmode MSVCRT__fmode @ cdecl _fpclass(double) MSVCRT__fpclass -# stub -arch=x86_64 _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() @ stub _fprintf_l diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 54196f63690..ff3b4a4dd0b 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1171,7 +1171,7 @@ @ cdecl _flushall() MSVCRT__flushall @ extern _fmode MSVCRT__fmode @ cdecl _fpclass(double) MSVCRT__fpclass -# stub -arch=x86_64 _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() @ stub _fprintf_l diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index f1e6fe210a7..08c817d8133 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1171,7 +1171,7 @@ @ cdecl _flushall() MSVCRT__flushall @ extern _fmode MSVCRT__fmode @ cdecl _fpclass(double) MSVCRT__fpclass -# stub -arch=x86_64 _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() @ stub _fprintf_l diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 87a55210951..f74140c2311 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1099,7 +1099,7 @@ @ cdecl _flushall() msvcr120._flushall @ extern _fmode msvcr120._fmode @ cdecl _fpclass(double) msvcr120._fpclass -# stub -arch=x86_64 _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) msvcr120._fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) msvcr120._fpieee_flt @ cdecl _fpreset() msvcr120._fpreset @ stub _fprintf_l diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 97e30c5563f..5f68ef2ec9b 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -490,7 +490,7 @@ @ cdecl _flushall() MSVCRT__flushall @ extern _fmode MSVCRT__fmode @ cdecl _fpclass(double) MSVCRT__fpclass -# stub -arch=x86_64 _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() @ stub _fprintf_l diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 5ea0226b3ba..c1cae65c933 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -473,7 +473,7 @@ @ cdecl _flushall() MSVCRT__flushall @ extern _fmode MSVCRT__fmode @ cdecl _fpclass(double) MSVCRT__fpclass -# stub -arch=win64 _fpclassf(float) +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() @ stub _fprintf_l diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index f113943c392..aa0c6f2f3de 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -208,6 +208,28 @@ float CDECL MSVCRT__logbf( float num ) #ifndef __i386__ +/********************************************************************* + * _fpclassf (MSVCRT.@) + */ +int CDECL MSVCRT__fpclassf( float num ) +{ + union { float f; UINT32 i; } u = { num }; + int e = u.i >> 23 & 0xff; + int s = u.i >> 31; + + switch (e) + { + case 0: + if (u.i << 1) return s ? MSVCRT__FPCLASS_ND : MSVCRT__FPCLASS_PD; + return s ? MSVCRT__FPCLASS_NZ : MSVCRT__FPCLASS_PZ; + case 0xff: + if (u.i << 9) return ((u.i >> 22) & 1) ? MSVCRT__FPCLASS_QNAN : MSVCRT__FPCLASS_SNAN; + return s ? MSVCRT__FPCLASS_NINF : MSVCRT__FPCLASS_PINF; + default: + return s ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN; + } +} + /********************************************************************* * _finitef (MSVCRT.@) */ @@ -1391,35 +1413,21 @@ __ASM_GLOBAL_FUNC(MSVCRT__ftol, */ int CDECL MSVCRT__fpclass(double num) { -#if defined(HAVE_FPCLASS) || defined(fpclass) - switch (fpclass( num )) - { - case FP_SNAN: return MSVCRT__FPCLASS_SNAN; - case FP_QNAN: return MSVCRT__FPCLASS_QNAN; - case FP_NINF: return MSVCRT__FPCLASS_NINF; - case FP_PINF: return MSVCRT__FPCLASS_PINF; - case FP_NDENORM: return MSVCRT__FPCLASS_ND; - case FP_PDENORM: return MSVCRT__FPCLASS_PD; - case FP_NZERO: return MSVCRT__FPCLASS_NZ; - case FP_PZERO: return MSVCRT__FPCLASS_PZ; - case FP_NNORM: return MSVCRT__FPCLASS_NN; - case FP_PNORM: return MSVCRT__FPCLASS_PN; - default: return MSVCRT__FPCLASS_PN; - } -#elif defined (fpclassify) - switch (fpclassify( num )) - { - case FP_NAN: return MSVCRT__FPCLASS_QNAN; - case FP_INFINITE: return signbit(num) ? MSVCRT__FPCLASS_NINF : MSVCRT__FPCLASS_PINF; - case FP_SUBNORMAL: return signbit(num) ?MSVCRT__FPCLASS_ND : MSVCRT__FPCLASS_PD; - case FP_ZERO: return signbit(num) ? MSVCRT__FPCLASS_NZ : MSVCRT__FPCLASS_PZ; - } - return signbit(num) ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN; -#else - if (!isfinite(num)) - return MSVCRT__FPCLASS_QNAN; - return num == 0.0 ? MSVCRT__FPCLASS_PZ : (num < 0 ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN); -#endif + union { double f; UINT64 i; } u = { num }; + int e = u.i >> 52 & 0x7ff; + int s = u.i >> 63; + + switch (e) + { + case 0: + if (u.i << 1) return s ? MSVCRT__FPCLASS_ND : MSVCRT__FPCLASS_PD; + return s ? MSVCRT__FPCLASS_NZ : MSVCRT__FPCLASS_PZ; + case 0x7ff: + if (u.i << 12) return ((u.i >> 51) & 1) ? MSVCRT__FPCLASS_QNAN : MSVCRT__FPCLASS_SNAN; + return s ? MSVCRT__FPCLASS_NINF : MSVCRT__FPCLASS_PINF; + default: + return s ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN; + } } /********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index f6eead8a518..cdf8859e1dd 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -456,7 +456,7 @@ @ cdecl _flushall() MSVCRT__flushall @ extern _fmode MSVCRT__fmode @ cdecl _fpclass(double) MSVCRT__fpclass -# stub -arch=win64 _fpclassf(float) +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() # stub _fprintf_l(ptr str ptr) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 5f65b97a981..23e7824fe36 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -324,7 +324,7 @@ @ cdecl -arch=!i386 _finitef(float) MSVCRT__finitef @ cdecl _flushall() MSVCRT__flushall @ cdecl _fpclass(double) MSVCRT__fpclass -@ stub _fpclassf +@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf @ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) @ cdecl _fpreset() @ cdecl _fputc_nolock(long ptr) MSVCRT__fputc_nolock @@ -946,7 +946,7 @@ @ cdecl _o__findnext64i32(long ptr) MSVCRT__findnext64i32 @ cdecl _o__flushall() MSVCRT__flushall @ cdecl _o__fpclass(double) MSVCRT__fpclass -@ stub _o__fpclassf +@ cdecl -arch=!i386 _o__fpclassf(float) MSVCRT__fpclassf @ cdecl _o__fputc_nolock(long ptr) MSVCRT__fputc_nolock @ cdecl _o__fputchar(long) MSVCRT__fputchar @ cdecl _o__fputwc_nolock(long ptr) MSVCRT__fputwc_nolock diff --git a/include/config.h.in b/include/config.h.in index f2dfe2c9fa3..241fa7ede38 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -192,9 +192,6 @@ /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK -/* Define to 1 if you have the `fpclass' function. */ -#undef HAVE_FPCLASS - /* Define if FreeType 2 is installed */ #undef HAVE_FREETYPE