about summary refs log tree commit diff
path: root/sysdeps/i386
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386')
-rw-r--r--sysdeps/i386/fpu/__math.h69
1 files changed, 50 insertions, 19 deletions
diff --git a/sysdeps/i386/fpu/__math.h b/sysdeps/i386/fpu/__math.h
index 86793babe5..080d0ec220 100644
--- a/sysdeps/i386/fpu/__math.h
+++ b/sysdeps/i386/fpu/__math.h
@@ -96,6 +96,7 @@ fabs (double __x)
   return __value;
 }
 
+/* The argument range of this inline version is limited.  */
 __MATH_INLINE double sin (double __x);
 __MATH_INLINE double
 sin (double __x)
@@ -108,6 +109,7 @@ sin (double __x)
   return __value;
 }
 
+/* The argument range of this inline version is limited.  */
 __MATH_INLINE double cos (double __x);
 __MATH_INLINE double
 cos (double __x)
@@ -371,7 +373,7 @@ ceil (double __x)
 
 
 /* Optimized versions for some non-standardized functions.  */
-#ifdef __USE_MISC
+#if defined __USE_ISOC9X || defined __USE_MISC
 
 __MATH_INLINE double hypot (double __x, double __y);
 __MATH_INLINE double
@@ -424,22 +426,6 @@ atanh (double __x)
   return -0.5 * __log1p (-(__y + __y) / (1.0 + __y)) * __sgn1 (__x);
 }
 
-__MATH_INLINE double coshm1 (double __x);
-__MATH_INLINE double
-coshm1 (double __x)
-{
-  register double __exm1 = __expm1 (fabs (__x));
-
-  return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1;
-}
-
-__MATH_INLINE double acosh1p (double __x);
-__MATH_INLINE double
-acosh1p (double __x)
-{
-  return __log1p (__x + sqrt (__x) * sqrt (__x + 2.0));
-}
-
 __MATH_INLINE double logb (double __x);
 __MATH_INLINE double
 logb (double __x)
@@ -467,13 +453,58 @@ drem (double __x, double __y)
   return __value;
 }
 
+/* This function is used in the `isfinite' macro.  */
+__MATH_INLINE int __finite (double __x);
+__MATH_INLINE int
+__finite (double __x)
+{
+  register int __result;
+  __asm__ __volatile__
+    ("orl	$x0x800fffff, %0\n\t"
+     "incl	%0\n\t"
+     "shrl	$31, %0"
+     : "=q" (__result) : "0" (((int *) &__x)[1]));
+  return __result;
+}
+#endif
+
+#ifdef __USE_MISC
+__MATH_INLINE double coshm1 (double __x);
+__MATH_INLINE double
+coshm1 (double __x)
+{
+  register double __exm1 = __expm1 (fabs (__x));
+
+  return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1;
+}
+
+__MATH_INLINE double acosh1p (double __x);
+__MATH_INLINE double
+acosh1p (double __x)
+{
+  return __log1p (__x + sqrt (__x) * sqrt (__x + 2.0));
+}
+
 __MATH_INLINE void sincos (double __x, double *__sinx, double *__cosx);
 __MATH_INLINE void
 sincos (double __x, double *__sinx, double *__cosx)
 {
   register double __cosr, __sinr;
   __asm __volatile__
-    ("fsincos"
+    ("fsincos\n\t"
+     "fnstsw	%%ax\n\t"
+     "testl	$0x400, %%eax\n\t"
+     "jz	1f\n\t"
+     "fldpi\n\t"
+     "fadd	%%st(0)\n\t"
+     "fxch	%%st(1)\n\t"
+     "2: fprem1\n\t"
+     "fnstsw	%%ax\n\t"
+     "testl	$0x400, %%eax\n\t"
+     "jnz	2b\n\t"
+     "fstp	%%st(1)\n\t"
+     "fsincos\n\t"
+     "1:"
      : "=t" (__cosr), "=u" (__sinr) : "0" (__x));
 
   *__sinx = __sinr;
@@ -484,7 +515,7 @@ __MATH_INLINE double sgn (double __x);
 __MATH_INLINE double
 sgn (double __x)
 {
-  return (__x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0));
+  return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0);
 }
 
 __MATH_INLINE double pow2 (double __x);