LibC: Use GCC builtins for math functions
This commit is contained in:
parent
62f6128ba1
commit
65750586b6
|
@ -28,7 +28,7 @@ set(LIBC_SOURCES
|
||||||
termios.cpp
|
termios.cpp
|
||||||
time.cpp
|
time.cpp
|
||||||
unistd.cpp
|
unistd.cpp
|
||||||
math.S
|
math.cpp
|
||||||
icxxabi.cpp
|
icxxabi.cpp
|
||||||
|
|
||||||
../BAN/BAN/Assert.cpp
|
../BAN/BAN/Assert.cpp
|
||||||
|
|
26
libc/math.S
26
libc/math.S
|
@ -1,26 +0,0 @@
|
||||||
|
|
||||||
.global floorl;
|
|
||||||
floorl:
|
|
||||||
fldt 8(%rsp)
|
|
||||||
|
|
||||||
fnstenv -28(%rsp) /* store fpu environment */
|
|
||||||
|
|
||||||
/* We use here %edx although only the low 1 bits are defined.
|
|
||||||
But none of the operations should care and they are faster
|
|
||||||
than the 16 bit operations. */
|
|
||||||
movl $0x400,%edx /* round towards -oo */
|
|
||||||
orl -28(%rsp),%edx
|
|
||||||
andl $0xf7ff,%edx
|
|
||||||
movl %edx,-32(%rsp)
|
|
||||||
fldcw -32(%rsp) /* load modified control word */
|
|
||||||
|
|
||||||
frndint /* round */
|
|
||||||
|
|
||||||
/* Preserve "invalid" exceptions from sNaN input. */
|
|
||||||
fnstsw
|
|
||||||
andl $0x1, %eax
|
|
||||||
orl %eax, -24(%rsp)
|
|
||||||
|
|
||||||
fldenv -28(%rsp) /* restore original environment */
|
|
||||||
|
|
||||||
ret
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define BUILTINS1(func) \
|
||||||
|
float func##f(float a) { return __builtin_##func##f(a); } \
|
||||||
|
double func(double a) { return __builtin_##func(a); } \
|
||||||
|
long double func##l(long double a) { return __builtin_##func##l(a); }
|
||||||
|
|
||||||
|
#define BUILTINS2(func) \
|
||||||
|
float func##f(float a, float b) { return __builtin_##func##f(a, b); } \
|
||||||
|
double func(double a, double b) { return __builtin_##func(a, b); } \
|
||||||
|
long double func##l(long double a, long double b) { return __builtin_##func##l(a, b); } \
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
BUILTINS1(acos)
|
||||||
|
BUILTINS1(acosh)
|
||||||
|
BUILTINS1(asin)
|
||||||
|
BUILTINS1(asinh)
|
||||||
|
BUILTINS1(atan)
|
||||||
|
BUILTINS2(atan2)
|
||||||
|
BUILTINS1(atanh)
|
||||||
|
BUILTINS1(cbrt)
|
||||||
|
BUILTINS1(ceil)
|
||||||
|
BUILTINS2(copysign)
|
||||||
|
BUILTINS1(cos)
|
||||||
|
BUILTINS1(cosh)
|
||||||
|
BUILTINS1(erf)
|
||||||
|
BUILTINS1(erfc)
|
||||||
|
BUILTINS1(exp)
|
||||||
|
BUILTINS1(exp2)
|
||||||
|
BUILTINS1(expm1)
|
||||||
|
BUILTINS1(fabs)
|
||||||
|
BUILTINS2(fdim)
|
||||||
|
BUILTINS1(floor)
|
||||||
|
BUILTINS2(fmax)
|
||||||
|
BUILTINS2(fmin)
|
||||||
|
BUILTINS2(fmod)
|
||||||
|
BUILTINS2(hypot)
|
||||||
|
BUILTINS1(j0)
|
||||||
|
BUILTINS1(j1)
|
||||||
|
BUILTINS1(lgamma)
|
||||||
|
BUILTINS1(log)
|
||||||
|
BUILTINS1(log10)
|
||||||
|
BUILTINS1(log1p)
|
||||||
|
BUILTINS1(log2)
|
||||||
|
BUILTINS1(logb)
|
||||||
|
BUILTINS1(nearbyint)
|
||||||
|
BUILTINS2(nextafter)
|
||||||
|
BUILTINS2(pow)
|
||||||
|
BUILTINS2(remainder)
|
||||||
|
BUILTINS1(rint)
|
||||||
|
BUILTINS1(round)
|
||||||
|
BUILTINS1(sin)
|
||||||
|
BUILTINS1(sinh)
|
||||||
|
BUILTINS1(sqrt)
|
||||||
|
BUILTINS1(tan)
|
||||||
|
BUILTINS1(tanh)
|
||||||
|
BUILTINS1(tgamma)
|
||||||
|
BUILTINS1(trunc)
|
||||||
|
BUILTINS1(y0)
|
||||||
|
BUILTINS1(y1)
|
||||||
|
|
||||||
|
__END_DECLS
|
Loading…
Reference in New Issue