https://git.reactos.org/?p=reactos.git;a=commitdiff;h=199adee3fede28245b1ab7...
commit 199adee3fede28245b1ab75107b327f77a7f2810 Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Fri Apr 9 14:33:27 2021 +0200 Commit: Jérôme Gardou jerome.gardou@reactos.org CommitDate: Fri Apr 9 14:59:07 2021 +0200
[CRT] Add a generic C version of exp2(f) and use it for all architecture --- sdk/lib/crt/math/exp2.c | 13 +++++++++++++ sdk/lib/crt/math/exp2f.c | 13 +++++++++++++ sdk/lib/crt/math/i386/exp2_asm.s | 38 -------------------------------------- sdk/lib/crt/msvcrtex.cmake | 8 ++++++-- 4 files changed, 32 insertions(+), 40 deletions(-)
diff --git a/sdk/lib/crt/math/exp2.c b/sdk/lib/crt/math/exp2.c new file mode 100644 index 00000000000..e843be9fffd --- /dev/null +++ b/sdk/lib/crt/math/exp2.c @@ -0,0 +1,13 @@ + +#include <math.h> + +_Check_return_ +double +__cdecl +exp2( + _In_ double x) +{ + /* This below avoids clang to optimize our pow call to exp2 */ + static const TWO = 2.0; + return pow(TWO, x); +} diff --git a/sdk/lib/crt/math/exp2f.c b/sdk/lib/crt/math/exp2f.c new file mode 100644 index 00000000000..292308ae521 --- /dev/null +++ b/sdk/lib/crt/math/exp2f.c @@ -0,0 +1,13 @@ + +#include <math.h> + +_Check_return_ +float +__cdecl +exp2f( + _In_ float x) +{ + /* This below avoids clang to optimize our pow call to exp2 */ + static const TWO = 2.0f; + return powf(TWO, x); +} diff --git a/sdk/lib/crt/math/i386/exp2_asm.s b/sdk/lib/crt/math/i386/exp2_asm.s deleted file mode 100644 index d2ab14d63b1..00000000000 --- a/sdk/lib/crt/math/i386/exp2_asm.s +++ /dev/null @@ -1,38 +0,0 @@ -#include <asm.inc> - -PUBLIC _exp2 - -/* FUNCTIONS ***************************************************************/ -.code - -_exp2: - push ebp - mov ebp, esp - - fld qword ptr [ebp + 8] - fxam - fstsw ax - fwait - sahf - jnp .not_inf - jnc .not_inf - test ah, 2 - jz .done - fstp st - fldz - jmp .done -.not_inf: - fst st(1) - frndint - fxch st(1) - fsub st, st(1) - f2xm1 - fld1 - faddp st(1), st - fscale - fstp st(1) -.done: - pop ebp - ret - -END diff --git a/sdk/lib/crt/msvcrtex.cmake b/sdk/lib/crt/msvcrtex.cmake index a9ebe297330..d438a841d31 100644 --- a/sdk/lib/crt/msvcrtex.cmake +++ b/sdk/lib/crt/msvcrtex.cmake @@ -43,6 +43,12 @@ else() list(APPEND MSVCRTEX_SOURCE startup/pseudo-reloc.c startup/pseudo-reloc-list.c) + if (CLANG) + # CLang performs some optimisations requiring those funtions + list(APPEND MSVCRTEX_SOURCE + math/exp2.c + math/exp2f.c) + endif() endif()
if(ARCH STREQUAL "i386") @@ -51,10 +57,8 @@ if(ARCH STREQUAL "i386") except/i386/chkstk_ms.s math/i386/alldiv_asm.s) if (GCC AND CLANG) - # CLang performs some optimisations requiring those funtions list(APPEND MSVCRTEX_ASM_SOURCE math/i386/ceilf.S - math/i386/exp2_asm.s math/i386/floorf.S) list(APPEND MSVCRTEX_SOURCE math/i386/sqrtf.c)