diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d82871b602..503ad571ad7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2003-01-15 Roger Sayle + + * real.c (real_sqrt): Return a bool result indicating whether + a floating point exception or trap should be raised. + * real.h (real_sqrt): Update function prototype. + * builtins.c (fold_builtin): Only fold non-trapping square + roots unless we're ignoring errno and trapping math. + 2003-01-15 John David Anglin * expr.h (emit_conditional_add): Add PARAMS to declaration. diff --git a/gcc/builtins.c b/gcc/builtins.c index 7c9d999979e..ffa09f9453e 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1,6 +1,6 @@ /* Expand builtin functions. - Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -4308,11 +4308,9 @@ fold_builtin (exp) x = TREE_REAL_CST (arg); mode = TYPE_MODE (TREE_TYPE (arg)); - if (!HONOR_SNANS (mode) || !real_isnan (&x)) - { - real_sqrt (&r, mode, &x); + if (real_sqrt (&r, mode, &x) + || (!flag_trapping_math && !flag_errno_math)) return build_real (TREE_TYPE (arg), r); - } } /* Optimize sqrt(exp(x)) = exp(x/2.0). */ diff --git a/gcc/real.c b/gcc/real.c index 7d7b4bb1637..f1e10b33ac5 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -1,6 +1,6 @@ /* real.c - software floating point emulation. - Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2002, 2003 Free Software Foundation, Inc. Contributed by Stephen L. Moshier (moshier@world.std.com). Re-written by Richard Henderson @@ -4401,11 +4401,12 @@ const struct real_format *real_format_for_mode[TFmode - QFmode + 1] = /* Calculate the square root of X in mode MODE, and store the result - in R. For details see "High Precision Division and Square Root", + in R. Return TRUE if the operation does not raise an exception. + For details see "High Precision Division and Square Root", Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */ -void +bool real_sqrt (r, mode, x) REAL_VALUE_TYPE *r; enum machine_mode mode; @@ -4421,7 +4422,7 @@ real_sqrt (r, mode, x) if (real_isnegzero (x)) { *r = *x; - return; + return false; } /* Negative arguments return NaN. */ @@ -4429,14 +4430,14 @@ real_sqrt (r, mode, x) { /* Mode is ignored for canonical NaN. */ real_nan (r, "", 1, SFmode); - return; + return false; } /* Infinity and NaN return themselves. */ if (real_isinf (x) || real_isnan (x)) { *r = *x; - return; + return false; } if (!init) @@ -4479,5 +4480,6 @@ real_sqrt (r, mode, x) /* ??? We need a Tuckerman test to get the last bit. */ real_convert (r, mode, &h); + return true; } diff --git a/gcc/real.h b/gcc/real.h index 163c283c171..00551065555 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -1,6 +1,6 @@ /* Definitions of floating-point access for GNU compiler. - Copyright (C) 1989, 1991, 1994, 1996, 1997, 1998, - 1999, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1989, 1991, 1994, 1996, 1997, 1998, 1999, + 2000, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -350,7 +350,7 @@ extern bool exact_real_inverse PARAMS ((enum machine_mode, REAL_VALUE_TYPE *)); extern tree build_real PARAMS ((tree, REAL_VALUE_TYPE)); /* Calculate R as the square root of X in the given machine mode. */ -extern void real_sqrt PARAMS ((REAL_VALUE_TYPE *, +extern bool real_sqrt PARAMS ((REAL_VALUE_TYPE *, enum machine_mode, const REAL_VALUE_TYPE *));