[CRT] Add a generic C version of exp2(f) and use it for all architecture

This commit is contained in:
Jérôme Gardou 2021-04-09 14:33:27 +02:00
parent a19ca409ae
commit 199adee3fe
4 changed files with 32 additions and 40 deletions

13
sdk/lib/crt/math/exp2.c Normal file
View file

@ -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);
}

13
sdk/lib/crt/math/exp2f.c Normal file
View file

@ -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);
}

View file

@ -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

View file

@ -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)