about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/fpu/e_hypot.S13
-rw-r--r--sysdeps/ieee754/dbl-64/e_hypot.c4
-rw-r--r--sysdeps/ieee754/ldbl-128/e_hypotl.c4
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/e_hypotl.c6
-rw-r--r--sysdeps/ieee754/ldbl-96/e_hypotl.c4
-rw-r--r--sysdeps/powerpc/fpu/e_hypot.c4
6 files changed, 29 insertions, 6 deletions
diff --git a/sysdeps/i386/fpu/e_hypot.S b/sysdeps/i386/fpu/e_hypot.S
index 5323fde01e..e69ea096ab 100644
--- a/sysdeps/i386/fpu/e_hypot.S
+++ b/sysdeps/i386/fpu/e_hypot.S
@@ -20,8 +20,19 @@
 #include <sysdep.h>
 #include <i386-math-asm.h>
 
+DEFINE_DBL_MIN
+
+#ifdef PIC
+# define MO(op) op##@GOTOFF(%edx)
+#else
+# define MO(op) op
+#endif
+
 	.text
 ENTRY(__ieee754_hypot)
+#ifdef  PIC
+	LOAD_PIC_REG (dx)
+#endif
 	fldl	4(%esp)		// x
 	fxam
 	fnstsw
@@ -38,7 +49,7 @@ ENTRY(__ieee754_hypot)
 	fmul	%st(0)		// x * x : y * y
 	faddp			// x * x + y * y
 	fsqrt
-	DBL_NARROW_EVAL
+	DBL_NARROW_EVAL_UFLOW_NONNEG
 2:	ret
 
 	// We have to test whether any of the parameters is Inf.
diff --git a/sysdeps/ieee754/dbl-64/e_hypot.c b/sysdeps/ieee754/dbl-64/e_hypot.c
index 5cbfcbeb48..f142c450a2 100644
--- a/sysdeps/ieee754/dbl-64/e_hypot.c
+++ b/sysdeps/ieee754/dbl-64/e_hypot.c
@@ -149,7 +149,9 @@ __ieee754_hypot (double x, double y)
       t1 = 1.0;
       GET_HIGH_WORD (high, t1);
       SET_HIGH_WORD (t1, high + (k << 20));
-      return t1 * w;
+      w *= t1;
+      math_check_force_underflow_nonneg (w);
+      return w;
     }
   else
     return w;
diff --git a/sysdeps/ieee754/ldbl-128/e_hypotl.c b/sysdeps/ieee754/ldbl-128/e_hypotl.c
index 01444cfb4e..80e5e38c72 100644
--- a/sysdeps/ieee754/ldbl-128/e_hypotl.c
+++ b/sysdeps/ieee754/ldbl-128/e_hypotl.c
@@ -130,7 +130,9 @@ __ieee754_hypotl(long double x, long double y)
 	    t1 = 1.0L;
 	    GET_LDOUBLE_MSW64(high,t1);
 	    SET_LDOUBLE_MSW64(t1,high+(k<<48));
-	    return t1*w;
+	    w *= t1;
+	    math_check_force_underflow_nonneg (w);
+	    return w;
 	} else return w;
 }
 strong_alias (__ieee754_hypotl, __hypotl_finite)
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c b/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c
index 3b07a47b40..c68dac03b0 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c
@@ -125,7 +125,11 @@ __ieee754_hypotl(long double x, long double y)
 	    w  = __ieee754_sqrtl(a1*b1-(w*(-w)-(a1*b2+a2*b)));
 	}
 	if(k!=0)
-	    return w*kld;
+	    {
+		w *= kld;
+		math_check_force_underflow_nonneg (w);
+		return w;
+	    }
 	else
 	    return w;
 }
diff --git a/sysdeps/ieee754/ldbl-96/e_hypotl.c b/sysdeps/ieee754/ldbl-96/e_hypotl.c
index d3152f91e5..ee3a07055b 100644
--- a/sysdeps/ieee754/ldbl-96/e_hypotl.c
+++ b/sysdeps/ieee754/ldbl-96/e_hypotl.c
@@ -132,7 +132,9 @@ long double __ieee754_hypotl(long double x, long double y)
 	    t1 = 1.0;
 	    GET_LDOUBLE_EXP(exp,t1);
 	    SET_LDOUBLE_EXP(t1,exp+k);
-	    return t1*w;
+	    w *= t1;
+	    math_check_force_underflow_nonneg (w);
+	    return w;
 	} else return w;
 }
 strong_alias (__ieee754_hypotl, __hypotl_finite)
diff --git a/sysdeps/powerpc/fpu/e_hypot.c b/sysdeps/powerpc/fpu/e_hypot.c
index 98e4ae635f..a3b9d3d371 100644
--- a/sysdeps/powerpc/fpu/e_hypot.c
+++ b/sysdeps/powerpc/fpu/e_hypot.c
@@ -116,7 +116,9 @@ __ieee754_hypot (double x, double y)
 	{
 	  x *= two1022;
 	  y *= two1022;
-	  return __ieee754_sqrt (x * x + y * y) / two1022;
+	  double ret = __ieee754_sqrt (x * x + y * y) / two1022;
+	  math_check_force_underflow_nonneg (ret);
+	  return ret;
 	}
       else
 	{