diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/fpu/e_hypot.S | 13 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_hypot.c | 4 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/e_hypotl.c | 4 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/e_hypotl.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/e_hypotl.c | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/e_hypot.c | 4 |
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 { |