diff options
author | kargl <kargl@FreeBSD.org> | 2012-09-22 15:38:29 +0000 |
---|---|---|
committer | kargl <kargl@FreeBSD.org> | 2012-09-22 15:38:29 +0000 |
commit | cbd9f9e6b757476dd38135def619ec640087c5a5 (patch) | |
tree | 6780aae6505dbdeb2817cd793fd54112edd58272 /lib | |
parent | 33134d25269a4e596a29b362bfd1c2fe6dc0335e (diff) | |
download | FreeBSD-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.c | 9 | ||||
-rw-r--r-- | lib/msun/src/s_sinl.c | 9 | ||||
-rw-r--r-- | lib/msun/src/s_tanl.c | 9 |
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); } |