libm: sync with upstream.
There's potential here to maybe lose some/all of builtins.cpp, but I'll
look at that separately later.
Test: treehugger
Change-Id: I2c2bc1d0753affdd214daeb09fa1ac7cd73db347
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cexp.c b/libm/upstream-freebsd/lib/msun/src/s_cexp.c
index 2ef8ba1..a1f853e 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_cexp.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_cexp.c
@@ -30,6 +30,7 @@
__FBSDID("$FreeBSD$");
#include <complex.h>
+#include <float.h>
#include <math.h>
#include "math_private.h"
@@ -41,7 +42,7 @@
double complex
cexp(double complex z)
{
- double x, y, exp_x;
+ double c, exp_x, s, x, y;
uint32_t hx, hy, lx, ly;
x = creal(z);
@@ -55,8 +56,10 @@
return (CMPLX(exp(x), y));
EXTRACT_WORDS(hx, lx, x);
/* cexp(0 + I y) = cos(y) + I sin(y) */
- if (((hx & 0x7fffffff) | lx) == 0)
- return (CMPLX(cos(y), sin(y)));
+ if (((hx & 0x7fffffff) | lx) == 0) {
+ sincos(y, &s, &c);
+ return (CMPLX(c, s));
+ }
if (hy >= 0x7ff00000) {
if (lx != 0 || (hx & 0x7fffffff) != 0x7ff00000) {
@@ -86,6 +89,11 @@
* - x = NaN (spurious inexact exception from y)
*/
exp_x = exp(x);
- return (CMPLX(exp_x * cos(y), exp_x * sin(y)));
+ sincos(y, &s, &c);
+ return (CMPLX(exp_x * c, exp_x * s));
}
}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(cexp, cexpl);
+#endif