This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Supporting IEEE 754 [exceptions] (in a front end [gfortran])


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]