From 3f71ab80ad071d837e47ec85e6ac03fe118a2812 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 15 Nov 2024 16:36:19 +0200 Subject: [PATCH] [CRT:MATH] Implement _isnan and _isnanf --- dll/win32/ucrtbase/ucrtbase.spec | 2 +- sdk/lib/crt/float/float.cmake | 4 ---- sdk/lib/crt/float/isnan.c | 38 -------------------------------- sdk/lib/crt/math/_isnan.c | 17 ++++++++++++++ sdk/lib/crt/math/_isnanf.c | 17 ++++++++++++++ sdk/lib/crt/math/math.cmake | 2 ++ 6 files changed, 37 insertions(+), 43 deletions(-) delete mode 100644 sdk/lib/crt/float/isnan.c create mode 100644 sdk/lib/crt/math/_isnan.c create mode 100644 sdk/lib/crt/math/_isnanf.c diff --git a/dll/win32/ucrtbase/ucrtbase.spec b/dll/win32/ucrtbase/ucrtbase.spec index cb2d341f209..eba09df8d95 100644 --- a/dll/win32/ucrtbase/ucrtbase.spec +++ b/dll/win32/ucrtbase/ucrtbase.spec @@ -560,7 +560,7 @@ @ cdecl _ismbstrail(ptr ptr) @ cdecl _ismbstrail_l(ptr ptr ptr) @ cdecl _isnan(double) -@ cdecl -stub -arch=x86_64 _isnanf(float) +@ cdecl -arch=x86_64 _isnanf(float) @ cdecl _isprint_l(long ptr) @ cdecl _ispunct_l(long ptr) @ cdecl _isspace_l(long ptr) diff --git a/sdk/lib/crt/float/float.cmake b/sdk/lib/crt/float/float.cmake index 86568dcb7d1..036dfa3e3f9 100644 --- a/sdk/lib/crt/float/float.cmake +++ b/sdk/lib/crt/float/float.cmake @@ -1,8 +1,4 @@ -list(APPEND LIBCNTPR_FLOAT_SOURCE - float/isnan.c -) - list(APPEND CRT_FLOAT_SOURCE ${LIBCNTPR_FLOAT_SOURCE} float/chgsign.c diff --git a/sdk/lib/crt/float/isnan.c b/sdk/lib/crt/float/isnan.c deleted file mode 100644 index 580639f3e76..00000000000 --- a/sdk/lib/crt/float/isnan.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include - -#if defined(_MSC_VER) && defined(_M_ARM) -#pragma function(_isnan) -#endif /* _MSC_VER */ - -/* - * @implemented - */ -int CDECL _isnan(double __x) -{ - union - { - double* __x; - double_s* x; - } x; - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); -} diff --git a/sdk/lib/crt/math/_isnan.c b/sdk/lib/crt/math/_isnan.c new file mode 100644 index 00000000000..ca8ce2a1a12 --- /dev/null +++ b/sdk/lib/crt/math/_isnan.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS CRT + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of _isnan. + * COPYRIGHT: Copyright 2025 Timo Kreuzer + */ + +#include +#include + +int +__cdecl +_isnan(_In_ double _X) +{ + union { double f; uint64_t ui64; } u = { _X }; + return (u.ui64 & ~0x8000000000000000ull) > 0x7FF0000000000000ull; +} diff --git a/sdk/lib/crt/math/_isnanf.c b/sdk/lib/crt/math/_isnanf.c new file mode 100644 index 00000000000..36a36a778a1 --- /dev/null +++ b/sdk/lib/crt/math/_isnanf.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS CRT + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of _isnanf. + * COPYRIGHT: Copyright 2025 Timo Kreuzer + */ + +#include +#include + +int +__cdecl +_isnanf(_In_ float _X) +{ + union { float f; uint32_t ui32; } u = { _X }; + return (u.ui32 & ~0x80000000) > 0x7F800000; +} diff --git a/sdk/lib/crt/math/math.cmake b/sdk/lib/crt/math/math.cmake index d1f8a1fa4a6..30c054eed40 100644 --- a/sdk/lib/crt/math/math.cmake +++ b/sdk/lib/crt/math/math.cmake @@ -7,6 +7,8 @@ list(APPEND LIBCNTPR_MATH_SOURCE math/_fdsign.c math/_finite.c math/_finitef.c + math/_isnan.c + math/_isnanf.c math/_invoke_matherr.c math/abs.c math/div.c