diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-01-15 17:40:26 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-01-15 17:40:26 +0000 |
commit | 03cd8aba32349dbbf5f2ccb9bddadd2bccaefd1b (patch) | |
tree | 81f71c4ac11c1ee3a6504b15060bf6ffe8cf4a6d /gcc/real.c | |
parent | 4da782145bc9e183bc091995ab3cd77e2dffd551 (diff) | |
download | gcc-03cd8aba32349dbbf5f2ccb9bddadd2bccaefd1b.zip gcc-03cd8aba32349dbbf5f2ccb9bddadd2bccaefd1b.tar.gz gcc-03cd8aba32349dbbf5f2ccb9bddadd2bccaefd1b.tar.bz2 |
real.c (real_sqrt): Return a bool result indicating whether a floating point exception or trap...
* 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.
From-SVN: r61337
Diffstat (limited to 'gcc/real.c')
-rw-r--r-- | gcc/real.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -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 <rth@redhat.com> @@ -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; } |