Commit 03cd8aba by Roger Sayle Committed by Roger Sayle

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
parent 4da78214
2003-01-15 Roger Sayle <roger@eyesopen.com>
* 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 <dave.anglin@nrc.gc.ca> 2003-01-15 John David Anglin <dave.anglin@nrc.gc.ca>
* expr.h (emit_conditional_add): Add PARAMS to declaration. * expr.h (emit_conditional_add): Add PARAMS to declaration.
......
/* Expand builtin functions. /* Expand builtin functions.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
1999, 2000, 2001, 2002 Free Software Foundation, Inc. 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -4308,11 +4308,9 @@ fold_builtin (exp) ...@@ -4308,11 +4308,9 @@ fold_builtin (exp)
x = TREE_REAL_CST (arg); x = TREE_REAL_CST (arg);
mode = TYPE_MODE (TREE_TYPE (arg)); mode = TYPE_MODE (TREE_TYPE (arg));
if (!HONOR_SNANS (mode) || !real_isnan (&x)) if (real_sqrt (&r, mode, &x)
{ || (!flag_trapping_math && !flag_errno_math))
real_sqrt (&r, mode, &x);
return build_real (TREE_TYPE (arg), r); return build_real (TREE_TYPE (arg), r);
}
} }
/* Optimize sqrt(exp(x)) = exp(x/2.0). */ /* Optimize sqrt(exp(x)) = exp(x/2.0). */
......
/* real.c - software floating point emulation. /* real.c - software floating point emulation.
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
1999, 2000, 2002 Free Software Foundation, Inc. 2000, 2002, 2003 Free Software Foundation, Inc.
Contributed by Stephen L. Moshier (moshier@world.std.com). Contributed by Stephen L. Moshier (moshier@world.std.com).
Re-written by Richard Henderson <rth@redhat.com> Re-written by Richard Henderson <rth@redhat.com>
...@@ -4401,11 +4401,12 @@ const struct real_format *real_format_for_mode[TFmode - QFmode + 1] = ...@@ -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 /* 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 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. */ 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
void bool
real_sqrt (r, mode, x) real_sqrt (r, mode, x)
REAL_VALUE_TYPE *r; REAL_VALUE_TYPE *r;
enum machine_mode mode; enum machine_mode mode;
...@@ -4421,7 +4422,7 @@ real_sqrt (r, mode, x) ...@@ -4421,7 +4422,7 @@ real_sqrt (r, mode, x)
if (real_isnegzero (x)) if (real_isnegzero (x))
{ {
*r = *x; *r = *x;
return; return false;
} }
/* Negative arguments return NaN. */ /* Negative arguments return NaN. */
...@@ -4429,14 +4430,14 @@ real_sqrt (r, mode, x) ...@@ -4429,14 +4430,14 @@ real_sqrt (r, mode, x)
{ {
/* Mode is ignored for canonical NaN. */ /* Mode is ignored for canonical NaN. */
real_nan (r, "", 1, SFmode); real_nan (r, "", 1, SFmode);
return; return false;
} }
/* Infinity and NaN return themselves. */ /* Infinity and NaN return themselves. */
if (real_isinf (x) || real_isnan (x)) if (real_isinf (x) || real_isnan (x))
{ {
*r = *x; *r = *x;
return; return false;
} }
if (!init) if (!init)
...@@ -4479,5 +4480,6 @@ real_sqrt (r, mode, x) ...@@ -4479,5 +4480,6 @@ real_sqrt (r, mode, x)
/* ??? We need a Tuckerman test to get the last bit. */ /* ??? We need a Tuckerman test to get the last bit. */
real_convert (r, mode, &h); real_convert (r, mode, &h);
return true;
} }
/* Definitions of floating-point access for GNU compiler. /* Definitions of floating-point access for GNU compiler.
Copyright (C) 1989, 1991, 1994, 1996, 1997, 1998, Copyright (C) 1989, 1991, 1994, 1996, 1997, 1998, 1999,
1999, 2000, 2002 Free Software Foundation, Inc. 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -350,7 +350,7 @@ extern bool exact_real_inverse PARAMS ((enum machine_mode, REAL_VALUE_TYPE *)); ...@@ -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)); extern tree build_real PARAMS ((tree, REAL_VALUE_TYPE));
/* Calculate R as the square root of X in the given machine mode. */ /* 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, enum machine_mode,
const REAL_VALUE_TYPE *)); const REAL_VALUE_TYPE *));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment