From 59c55e003e706ec9ccd7df80dcdc2b96eb0e3226 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 15 Nov 2024 16:53:39 +0200 Subject: [PATCH] [UCRT:MATH] Implement _dclass, _fdclass --- sdk/lib/ucrt/math/_dclass.c | 48 ++++++++++++++++++++++++++++++++++++ sdk/lib/ucrt/math/_fdclass.c | 48 ++++++++++++++++++++++++++++++++++++ sdk/lib/ucrt/math/math.cmake | 2 ++ 3 files changed, 98 insertions(+) create mode 100644 sdk/lib/ucrt/math/_dclass.c create mode 100644 sdk/lib/ucrt/math/_fdclass.c diff --git a/sdk/lib/ucrt/math/_dclass.c b/sdk/lib/ucrt/math/_dclass.c new file mode 100644 index 00000000000..aeeff8ccde0 --- /dev/null +++ b/sdk/lib/ucrt/math/_dclass.c @@ -0,0 +1,48 @@ +// +// _dclass.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Implementation of _dclass. +// +// SPDX-License-Identifier: MIT +// + +#include +#include + +#ifdef _MSC_VER +#pragma function(_dclass) +#endif + +// +// Returns the floating-point classification of _X. +// +// FP_NAN - A quiet, signaling, or indeterminate NaN +// FP_INFINITE - A positive or negative infinity +// FP_NORMAL - A positive or negative normalized non-zero value +// FP_SUBNORMAL - A positive or negative subnormal (denormalized) value +// FP_ZERO - A positive or negative zero value +// +_Check_return_ +short +__cdecl +_dclass(_In_ double _X) +{ + union { double f; uint64_t ui64; } u = { _X }; + uint64_t e = u.ui64 & 0x7FF0000000000000ull; + uint64_t m = u.ui64 & 0x000FFFFFFFFFFFFFull; + + if (e == 0x7FF0000000000000ull) + { + return m ? FP_NAN : FP_INFINITE; + } + else if (e == 0) + { + return m ? FP_SUBNORMAL : FP_ZERO; + } + else + { + return FP_NORMAL; + } +} diff --git a/sdk/lib/ucrt/math/_fdclass.c b/sdk/lib/ucrt/math/_fdclass.c new file mode 100644 index 00000000000..4714a9d6664 --- /dev/null +++ b/sdk/lib/ucrt/math/_fdclass.c @@ -0,0 +1,48 @@ +// +// _fdclass.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Implementation of _fdclass. +// +// SPDX-License-Identifier: MIT +// + +#include +#include + +#ifdef _MSC_VER +#pragma function(_fdclass) +#endif + +// +// Returns the floating-point classification of _X. +// +// FP_NAN - A quiet, signaling, or indeterminate NaN +// FP_INFINITE - A positive or negative infinity +// FP_NORMAL - A positive or negative normalized non-zero value +// FP_SUBNORMAL - A positive or negative subnormal (denormalized) value +// FP_ZERO - A positive or negative zero value +// +_Check_return_ +short +__cdecl +_fdclass(_In_ float _X) +{ + union { float f; uint32_t ui32; } u = { _X }; + uint32_t e = u.ui32 & 0x7F800000u; + uint32_t m = u.ui32 & 0x007FFFFFu; + + if (e == 0x7F800000u) + { + return m ? FP_NAN : FP_INFINITE; + } + else if (e == 0) + { + return m ? FP_SUBNORMAL : FP_ZERO; + } + else + { + return FP_NORMAL; + } +} diff --git a/sdk/lib/ucrt/math/math.cmake b/sdk/lib/ucrt/math/math.cmake index 4eadd9f107d..69f213e743f 100644 --- a/sdk/lib/ucrt/math/math.cmake +++ b/sdk/lib/ucrt/math/math.cmake @@ -1,4 +1,6 @@ list(APPEND UCRT_MATH_SOURCES + math/_dclass.c + math/_fdclass.c math/matherr.cpp )