Hi all,

I'm working on implementing a correct Fortran rounding (rounding to
nearest-integer, with half integer values rounded to the integer of
maximum absolute value) in the Fortran front-end, following
ada/trans.c (convert_with_check) and
http://gcc.gnu.org/ml/fortran/2005-04/msg00139.html

The code Ada uses to do it has the following comments:

     /* The following calculations depend on proper rounding to even
        of each arithmetic operation. In order to prevent excess
        precision from spoiling this property, use the widest hardware
        floating-point type.

        FIXME: For maximum efficiency, this should only be done for machines
        and types where intermediates may have extra precision.  */

     calc_type = longest_float_type_node;
     /* FIXME: Should not have padding in the first place */
     if (TREE_CODE (calc_type) == RECORD_TYPE
             && TYPE_IS_PADDING_P (calc_type))
       calc_type = TREE_TYPE (TYPE_FIELDS (calc_type));

I have the three following questions, probably best directed to
middle-end experts and Ada maintainers:

 * How can I know the longest float type? My first patch uses the
long_double_type_node unconditionally, but it surely isn't a generic
solution

 * How can I determine if a given type may have extra precision?

 * What is this padding code doing, and is it necessary?

Thanks,
FX

Reply via email to