This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Supporting IEEE 754 [exceptions] (in a front end [gfortran])
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: Tobias Burnus <burnus at net-b dot de>
- Cc: GCC <gcc at gcc dot gnu dot org>, "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>
- Date: Sat, 29 Nov 2008 13:03:48 -0800
- Subject: Re: Supporting IEEE 754 [exceptions] (in a front end [gfortran])
- References: <4931A8FA.4040905@net-b.de>
On Sat, Nov 29, 2008 at 09:41:30PM +0100, Tobias Burnus wrote:
>
> I'm thinking about how to implement Fortran 2003's IEEE support in
> gfortran. The IEEE allow
> a) To set an IEEE value (NaN, INF, etc.)
> b) Check whether a value is NaN, etc.
> c) To query for IEEE capabilities (IEEE_SUPPORT_NAN, IEEE_SUPPORT_SQRT
> (a sqrt() which has IEEE exception support), etc.)
> d) To query/set haltmodes for DIVIDE_BY_ZERO, INVALID etc.
> e) Getting/setting an exception flag, etc.
>
> While (a) and (b) can be easily handled in the front end, I don't see
> how I can handle the rest efficiently. Most parts are provided by
> fenv.h, for which I seemingly have to write a wrapper function (in
> libgfortran) as the typedefs and constants cannot be made available in
> the front end - or have I missed something?
>
> My biggest issue is that I don't see how I can compile-time evaluate the
> following - or how to evaluate it at all:
>
> if (IEEE_SUPPORT_NAN(x)) & ! should be always true (or false) on a
> given system
> x = IEEE_VALUE(IEEE_QUIET_NAN, x) ! x = qNaN (trivial in the front end).
>
> The Fortran standard lists: IEEE_SUPPORT_DENORMAL, _DIVIDE (by zero),
> _INF, _NAN, _SQRT (a sqrt which follows IEEE), _ROUNDING, (and _IO). Is
> there some possibility to query the target whether e.g. NaN is supported?
>
> For querying/setting the halting mode, I would work with the data in
> libgfortran/config/*.h.
>
I suspect we'll need to ping Richard Henderson and Kaveh Ghazi to
answer some these questions (ie., how to query a target). We may
be able to leverage some of builtin.defs. A quick 'grep fenv *'
in gcc/ shows
2007-05-19 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sfp-machine.h (FP_EX_INVALID, FP_EX_DENORM,
FP_EXP_DIVZERO, FP_EX_OVERFLOW, FP_EX_UNDERFLOW, FP_EX_INEXACT):
New constants.
(struct fenv): New structure.
(FP_HANDLE_EXCEPTIONS): New define.
(FP_RND_NEAREST, FP_RND_ZERO, FP_RND_PINF, FP_RND_MINF): New constants.
(_FP_DECL_EXP): New define.
(FP_INIT_ROUNDMODE): New define.
(FP_ROUNDMODE): New define.
Perhaps, Uros might have a pointer.
There is an f) to include in the list. Currently, constant folding
always uses GFC_RND_MODE, which is GMP_RNDN (round-to-nearest).
We'll need to change the define to a static variable variable and set
it to an appropriate GMP_RNDx mode.
--
Steve