summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkargl <kargl@FreeBSD.org>2012-09-22 15:38:29 +0000
committerkargl <kargl@FreeBSD.org>2012-09-22 15:38:29 +0000
commitcbd9f9e6b757476dd38135def619ec640087c5a5 (patch)
tree6780aae6505dbdeb2817cd793fd54112edd58272 /lib
parent33134d25269a4e596a29b362bfd1c2fe6dc0335e (diff)
downloadFreeBSD-src-cbd9f9e6b757476dd38135def619ec640087c5a5.zip
FreeBSD-src-cbd9f9e6b757476dd38135def619ec640087c5a5.tar.gz
* Use ENTERI() and RETURNI() to toggle the rounding precision if
necessary, so that cosl(), sinl() and tanl() work on i386 even for naive callers. Suggested by: bde Reviewed by: bde Approved by: das (mentor)
Diffstat (limited to 'lib')
-rw-r--r--lib/msun/src/s_cosl.c9
-rw-r--r--lib/msun/src/s_sinl.c9
-rw-r--r--lib/msun/src/s_tanl.c9
3 files changed, 21 insertions, 6 deletions
diff --git a/lib/msun/src/s_cosl.c b/lib/msun/src/s_cosl.c
index 8d43626..22e74cf 100644
--- a/lib/msun/src/s_cosl.c
+++ b/lib/msun/src/s_cosl.c
@@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$");
*/
#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
#include "math.h"
#include "math_private.h"
@@ -63,9 +66,11 @@ cosl(long double x)
if (z.bits.exp == 32767)
return ((x - x) / (x - x));
+ ENTERI();
+
/* Optimize the case where x is already within range. */
if (z.e < M_PI_4)
- return (__kernel_cosl(z.e, 0));
+ RETURNI(__kernel_cosl(z.e, 0));
e0 = __ieee754_rem_pio2l(x, y);
hi = y[0];
@@ -86,5 +91,5 @@ cosl(long double x)
break;
}
- return (hi);
+ RETURNI(hi);
}
diff --git a/lib/msun/src/s_sinl.c b/lib/msun/src/s_sinl.c
index 919deb9..f454f8f 100644
--- a/lib/msun/src/s_sinl.c
+++ b/lib/msun/src/s_sinl.c
@@ -28,6 +28,9 @@
__FBSDID("$FreeBSD$");
#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
#include "math.h"
#include "math_private.h"
@@ -59,10 +62,12 @@ sinl(long double x)
if (z.bits.exp == 32767)
return ((x - x) / (x - x));
+ ENTERI();
+
/* Optimize the case where x is already within range. */
if (z.e < M_PI_4) {
hi = __kernel_sinl(z.e, 0, 0);
- return (s ? -hi : hi);
+ RETURNI(s ? -hi : hi);
}
e0 = __ieee754_rem_pio2l(x, y);
@@ -84,5 +89,5 @@ sinl(long double x)
break;
}
- return (hi);
+ RETURNI(hi);
}
diff --git a/lib/msun/src/s_tanl.c b/lib/msun/src/s_tanl.c
index 9562cf8..eadc837 100644
--- a/lib/msun/src/s_tanl.c
+++ b/lib/msun/src/s_tanl.c
@@ -34,6 +34,9 @@ __FBSDID("$FreeBSD$");
*/
#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
#include "math.h"
#include "math_private.h"
@@ -65,10 +68,12 @@ tanl(long double x)
if (z.bits.exp == 32767)
return ((x - x) / (x - x));
+ ENTERI();
+
/* Optimize the case where x is already within range. */
if (z.e < M_PI_4) {
hi = __kernel_tanl(z.e, 0, 0);
- return (s ? -hi : hi);
+ RETURNI(s ? -hi : hi);
}
e0 = __ieee754_rem_pio2l(x, y);
@@ -86,5 +91,5 @@ tanl(long double x)
break;
}
- return (hi);
+ RETURNI(hi);
}
OpenPOWER on IntegriCloud