From 5c26ccdb295bc89744c14774a49298a26f1108fc Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 20 Nov 2024 16:24:27 +0200 Subject: [PATCH] [CRT:MATH] Import scalbn/scalbnf from musl --- dll/win32/ucrtbase/ucrtbase.spec | 4 +-- sdk/lib/crt/math/math.cmake | 2 ++ sdk/lib/crt/math/scalbn.c | 43 ++++++++++++++++++++++++++++++++ sdk/lib/crt/math/scalbnf.c | 41 ++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 sdk/lib/crt/math/scalbn.c create mode 100644 sdk/lib/crt/math/scalbnf.c diff --git a/dll/win32/ucrtbase/ucrtbase.spec b/dll/win32/ucrtbase/ucrtbase.spec index eba09df8d95..731b8118f89 100644 --- a/dll/win32/ucrtbase/ucrtbase.spec +++ b/dll/win32/ucrtbase/ucrtbase.spec @@ -2553,8 +2553,8 @@ @ cdecl scalbln(double long) scalbn # double scalbln(double x, long exp); @ cdecl scalblnf(float long) scalbnf # float scalblnf(float x, long exp); @ cdecl scalblnl(double long) scalbn # long double scalblnl(long double x, long exp); -@ cdecl -stub scalbn(double long) # double scalbn(double x, int exp); -@ cdecl -stub scalbnf(float long) # float scalbnf(float x, int exp); +@ cdecl scalbn(double long) # double scalbn(double x, int exp); +@ cdecl scalbnf(float long) # float scalbnf(float x, int exp); @ cdecl scalbnl(double long) scalbn # long double scalbnl(long double x, int exp); @ cdecl set_terminate(ptr) @ cdecl set_unexpected(ptr) diff --git a/sdk/lib/crt/math/math.cmake b/sdk/lib/crt/math/math.cmake index 30c054eed40..5e42eb26d13 100644 --- a/sdk/lib/crt/math/math.cmake +++ b/sdk/lib/crt/math/math.cmake @@ -16,6 +16,8 @@ list(APPEND LIBCNTPR_MATH_SOURCE math/labs.c math/round.c math/roundf.c + math/scalbn.c + math/scalbnf.c math/sincos.c ) diff --git a/sdk/lib/crt/math/scalbn.c b/sdk/lib/crt/math/scalbn.c new file mode 100644 index 00000000000..8d58c668499 --- /dev/null +++ b/sdk/lib/crt/math/scalbn.c @@ -0,0 +1,43 @@ +/* + * PROJECT: ReactOS CRT + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of scalbn. + * COPYRIGHT: Imported from musl libc + * https://git.musl-libc.org/cgit/musl/tree/src/math/scalbn.c + * blob: 182f561068fda7bc8321dfc7991df8b6d58e1b56 + * See https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT + */ + +#include +#include + +double scalbn(double x, int n) +{ + union {double f; uint64_t i;} u; + double_t y = x; + + if (n > 1023) { + y *= 0x1p1023; + n -= 1023; + if (n > 1023) { + y *= 0x1p1023; + n -= 1023; + if (n > 1023) + n = 1023; + } + } else if (n < -1022) { + /* make sure final n < -53 to avoid double + rounding in the subnormal range */ + y *= 0x1p-1022 * 0x1p53; + n += 1022 - 53; + if (n < -1022) { + y *= 0x1p-1022 * 0x1p53; + n += 1022 - 53; + if (n < -1022) + n = -1022; + } + } + u.i = (uint64_t)(0x3ff+n)<<52; + x = y * u.f; + return x; +} diff --git a/sdk/lib/crt/math/scalbnf.c b/sdk/lib/crt/math/scalbnf.c new file mode 100644 index 00000000000..4babc3957fd --- /dev/null +++ b/sdk/lib/crt/math/scalbnf.c @@ -0,0 +1,41 @@ +/* + * PROJECT: ReactOS CRT + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of scalbnf. + * COPYRIGHT: Imported from musl libc + * https://git.musl-libc.org/cgit/musl/tree/src/math/scalbnf.c + * blob: a5ad208b69929f24336fae40e6af37101c99a72f + * See https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT + */ + +#include +#include + +float scalbnf(float x, int n) +{ + union {float f; uint32_t i;} u; + float_t y = x; + + if (n > 127) { + y *= 0x1p127f; + n -= 127; + if (n > 127) { + y *= 0x1p127f; + n -= 127; + if (n > 127) + n = 127; + } + } else if (n < -126) { + y *= 0x1p-126f * 0x1p24f; + n += 126 - 24; + if (n < -126) { + y *= 0x1p-126f * 0x1p24f; + n += 126 - 24; + if (n < -126) + n = -126; + } + } + u.i = (uint32_t)(0x7f+n)<<23; + x = y * u.f; + return x; +}