@@ -1955,6 +1955,13 @@ hypot 0x0.ffffffp-16382 0x0.fp-16383 no-test-inline
hypot 0x0.ffffffp-16382 0x0.fp-16386 no-test-inline
hypot 0 min_subnorm no-test-inline
+hypot 0x1p-127 0x1p-149
+hypot 0x1p-1023 0x1p-1074
+hypot 0x1p-970 0x1p-1074
+hypot 0x1p-16383 0x1p-16445 no-test-inline
+hypot 0x1p-16384 0x1p-16446 no-test-inline
+hypot 0x1p-16383 0x1p-16494 no-test-inline
+
hypot -0x1.fa7deap+0 0x1.a761bab383ac8p+0
j0 -1.0
@@ -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.
@@ -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;
@@ -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)
@@ -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;
}
@@ -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)
@@ -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
{