https://git.reactos.org/?p=reactos.git;a=commitdiff;h=199adee3fede28245b1ab75107b327f77a7f2810

commit 199adee3fede28245b1ab75107b327f77a7f2810
Author:     Jérôme Gardou <[email protected]>
AuthorDate: Fri Apr 9 14:33:27 2021 +0200
Commit:     Jérôme Gardou <[email protected]>
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)

Reply via email to