Message ID | 20181225223640.GA99122@troutmask.apl.washington.edu |
---|---|
State | New |
Headers | show |
Series | [fortran] Add support for IEEE_SUBNORMAL | expand |
Ping. On Tue, Dec 25, 2018 at 02:36:40PM -0800, Steve Kargl wrote: > Fortran 2018 has added IEEE_SUBNORMAL, IEEE_POSITIVE_SUBNORMAL, and > IEEE_NEGATIVE_SUBNORMAL as counterparts the same features with the > DENORMAL name. The attached patch allows gfortran to recognize > and do the right thing with these featuers. OK to commit? > > 2018-12-25 Steven G. Kargl <kargl@gcc.gnu.org> > > * expr.c (external_spec_function): Add ieee_support_subnormal to list > of IEEE inquiry functions. > > > 2018-12-25 Steven G. Kargl <kargl@gcc.gnu.org> > * gfortran.map: Expose subnormal functions in dynamic > library. > * ieee/ieee_arithmetic.F90: Add support for IEEE_SUBNORMAL, > IEEE_POSITIVE_SUBNORMAL, and IEEE_NEGATIVE_SUBNORMAL. > * ieee/ieee_helper.c: Ditto. > * ieee/ieee_features.F90: Add IEEE_SUBNORMAL. > > -- > Steve > Index: gcc/fortran/expr.c > =================================================================== > --- gcc/fortran/expr.c (revision 267418) > +++ gcc/fortran/expr.c (working copy) > @@ -3061,6 +3061,7 @@ external_spec_function (gfc_expr *e) > || !strcmp (f->name, "ieee_support_halting") > || !strcmp (f->name, "ieee_support_datatype") > || !strcmp (f->name, "ieee_support_denormal") > + || !strcmp (f->name, "ieee_support_subnormal") > || !strcmp (f->name, "ieee_support_divide") > || !strcmp (f->name, "ieee_support_inf") > || !strcmp (f->name, "ieee_support_io") > Index: libgfortran/gfortran.map > =================================================================== > --- libgfortran/gfortran.map (revision 267418) > +++ libgfortran/gfortran.map (working copy) > @@ -1573,4 +1573,9 @@ GFORTRAN_9 { > _gfortran_sfindloc2_s1; > _gfortran_sfindloc2_s4; > _gfortran_st_wait_async; > + __ieee_arithmetic_MOD_ieee_support_subnormal_10; > + __ieee_arithmetic_MOD_ieee_support_subnormal_16; > + __ieee_arithmetic_MOD_ieee_support_subnormal_4; > + __ieee_arithmetic_MOD_ieee_support_subnormal_8; > + __ieee_arithmetic_MOD_ieee_support_subnormal_noarg; > }; > Index: libgfortran/ieee/ieee_arithmetic.F90 > =================================================================== > --- libgfortran/ieee/ieee_arithmetic.F90 (revision 267418) > +++ libgfortran/ieee/ieee_arithmetic.F90 (working copy) > @@ -55,9 +55,11 @@ module IEEE_ARITHMETIC > IEEE_NEGATIVE_INF = IEEE_CLASS_TYPE(3), & > IEEE_NEGATIVE_NORMAL = IEEE_CLASS_TYPE(4), & > IEEE_NEGATIVE_DENORMAL = IEEE_CLASS_TYPE(5), & > + IEEE_NEGATIVE_SUBNORMAL= IEEE_CLASS_TYPE(5), & > IEEE_NEGATIVE_ZERO = IEEE_CLASS_TYPE(6), & > IEEE_POSITIVE_ZERO = IEEE_CLASS_TYPE(7), & > IEEE_POSITIVE_DENORMAL = IEEE_CLASS_TYPE(8), & > + IEEE_POSITIVE_SUBNORMAL= IEEE_CLASS_TYPE(8), & > IEEE_POSITIVE_NORMAL = IEEE_CLASS_TYPE(9), & > IEEE_POSITIVE_INF = IEEE_CLASS_TYPE(10) > > @@ -795,6 +797,7 @@ REM_MACRO(4,4,4) > > SUPPORTGENERIC(IEEE_SUPPORT_DATATYPE) > SUPPORTGENERIC(IEEE_SUPPORT_DENORMAL) > +SUPPORTGENERIC(IEEE_SUPPORT_SUBNORMAL) > SUPPORTGENERIC(IEEE_SUPPORT_DIVIDE) > SUPPORTGENERIC(IEEE_SUPPORT_INF) > SUPPORTGENERIC(IEEE_SUPPORT_IO) > @@ -1243,7 +1362,7 @@ SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,16,.true.) > #endif > SUPPORTMACRO_NOARG(IEEE_SUPPORT_DATATYPE,.true.) > > -! IEEE_SUPPORT_DENORMAL > +! IEEE_SUPPORT_DENORMAL and IEEE_SUPPORT_SUBNORMAL > > SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,4,.true.) > SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,8,.true.) > @@ -1254,6 +1373,16 @@ SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,10,.true.) > SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,16,.true.) > #endif > SUPPORTMACRO_NOARG(IEEE_SUPPORT_DENORMAL,.true.) > + > +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,4,.true.) > +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,8,.true.) > +#ifdef HAVE_GFC_REAL_10 > +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,10,.true.) > +#endif > +#ifdef HAVE_GFC_REAL_16 > +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,16,.true.) > +#endif > +SUPPORTMACRO_NOARG(IEEE_SUPPORT_SUBNORMAL,.true.) > > ! IEEE_SUPPORT_DIVIDE > > Index: libgfortran/ieee/ieee_features.F90 > =================================================================== > --- libgfortran/ieee/ieee_features.F90 (revision 267418) > +++ libgfortran/ieee/ieee_features.F90 (working copy) > @@ -36,6 +36,7 @@ module IEEE_FEATURES > type(IEEE_FEATURES_TYPE), parameter, public :: & > IEEE_DATATYPE = IEEE_FEATURES_TYPE(0), & > IEEE_DENORMAL = IEEE_FEATURES_TYPE(1), & > + IEEE_SUBNORMAL = IEEE_FEATURES_TYPE(1), & > IEEE_DIVIDE = IEEE_FEATURES_TYPE(2), & > IEEE_HALTING = IEEE_FEATURES_TYPE(3), & > IEEE_INEXACT_FLAG = IEEE_FEATURES_TYPE(4), & > Index: libgfortran/ieee/ieee_helper.c > =================================================================== > --- libgfortran/ieee/ieee_helper.c (revision 267418) > +++ libgfortran/ieee/ieee_helper.c (working copy) > @@ -50,7 +50,8 @@ internal_proto(ieee_class_helper_16); > enum { IEEE_OTHER_VALUE = 0, IEEE_SIGNALING_NAN, IEEE_QUIET_NAN, > IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL, > IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL, > - IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF }; > + IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF, IEEE_SUBNORMAL, > + IEEE_NEGATIVE_SUBNORMAL, IEEE_POSITIVE_SUBNORMAL }; > > #define CLASSMACRO(TYPE) \ > int ieee_class_helper_ ## TYPE (GFC_REAL_ ## TYPE *value) \
On 12/28/18 10:44 AM, Steve Kargl wrote: > Ping. OK, thanks. Jerry > > On Tue, Dec 25, 2018 at 02:36:40PM -0800, Steve Kargl wrote: >> Fortran 2018 has added IEEE_SUBNORMAL, IEEE_POSITIVE_SUBNORMAL, and >> IEEE_NEGATIVE_SUBNORMAL as counterparts the same features with the >> DENORMAL name. The attached patch allows gfortran to recognize >> and do the right thing with these featuers. OK to commit? >> >> 2018-12-25 Steven G. Kargl <kargl@gcc.gnu.org> >> >> * expr.c (external_spec_function): Add ieee_support_subnormal to list >> of IEEE inquiry functions. >> >> >> 2018-12-25 Steven G. Kargl <kargl@gcc.gnu.org> >> * gfortran.map: Expose subnormal functions in dynamic >> library. >> * ieee/ieee_arithmetic.F90: Add support for IEEE_SUBNORMAL, >> IEEE_POSITIVE_SUBNORMAL, and IEEE_NEGATIVE_SUBNORMAL. >> * ieee/ieee_helper.c: Ditto. >> * ieee/ieee_features.F90: Add IEEE_SUBNORMAL. >> >> -- >> Steve > >> Index: gcc/fortran/expr.c >> =================================================================== >> --- gcc/fortran/expr.c (revision 267418) >> +++ gcc/fortran/expr.c (working copy) >> @@ -3061,6 +3061,7 @@ external_spec_function (gfc_expr *e) >> || !strcmp (f->name, "ieee_support_halting") >> || !strcmp (f->name, "ieee_support_datatype") >> || !strcmp (f->name, "ieee_support_denormal") >> + || !strcmp (f->name, "ieee_support_subnormal") >> || !strcmp (f->name, "ieee_support_divide") >> || !strcmp (f->name, "ieee_support_inf") >> || !strcmp (f->name, "ieee_support_io") >> Index: libgfortran/gfortran.map >> =================================================================== >> --- libgfortran/gfortran.map (revision 267418) >> +++ libgfortran/gfortran.map (working copy) >> @@ -1573,4 +1573,9 @@ GFORTRAN_9 { >> _gfortran_sfindloc2_s1; >> _gfortran_sfindloc2_s4; >> _gfortran_st_wait_async; >> + __ieee_arithmetic_MOD_ieee_support_subnormal_10; >> + __ieee_arithmetic_MOD_ieee_support_subnormal_16; >> + __ieee_arithmetic_MOD_ieee_support_subnormal_4; >> + __ieee_arithmetic_MOD_ieee_support_subnormal_8; >> + __ieee_arithmetic_MOD_ieee_support_subnormal_noarg; >> }; >> Index: libgfortran/ieee/ieee_arithmetic.F90 >> =================================================================== >> --- libgfortran/ieee/ieee_arithmetic.F90 (revision 267418) >> +++ libgfortran/ieee/ieee_arithmetic.F90 (working copy) >> @@ -55,9 +55,11 @@ module IEEE_ARITHMETIC >> IEEE_NEGATIVE_INF = IEEE_CLASS_TYPE(3), & >> IEEE_NEGATIVE_NORMAL = IEEE_CLASS_TYPE(4), & >> IEEE_NEGATIVE_DENORMAL = IEEE_CLASS_TYPE(5), & >> + IEEE_NEGATIVE_SUBNORMAL= IEEE_CLASS_TYPE(5), & >> IEEE_NEGATIVE_ZERO = IEEE_CLASS_TYPE(6), & >> IEEE_POSITIVE_ZERO = IEEE_CLASS_TYPE(7), & >> IEEE_POSITIVE_DENORMAL = IEEE_CLASS_TYPE(8), & >> + IEEE_POSITIVE_SUBNORMAL= IEEE_CLASS_TYPE(8), & >> IEEE_POSITIVE_NORMAL = IEEE_CLASS_TYPE(9), & >> IEEE_POSITIVE_INF = IEEE_CLASS_TYPE(10) >> >> @@ -795,6 +797,7 @@ REM_MACRO(4,4,4) >> >> SUPPORTGENERIC(IEEE_SUPPORT_DATATYPE) >> SUPPORTGENERIC(IEEE_SUPPORT_DENORMAL) >> +SUPPORTGENERIC(IEEE_SUPPORT_SUBNORMAL) >> SUPPORTGENERIC(IEEE_SUPPORT_DIVIDE) >> SUPPORTGENERIC(IEEE_SUPPORT_INF) >> SUPPORTGENERIC(IEEE_SUPPORT_IO) >> @@ -1243,7 +1362,7 @@ SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,16,.true.) >> #endif >> SUPPORTMACRO_NOARG(IEEE_SUPPORT_DATATYPE,.true.) >> >> -! IEEE_SUPPORT_DENORMAL >> +! IEEE_SUPPORT_DENORMAL and IEEE_SUPPORT_SUBNORMAL >> >> SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,4,.true.) >> SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,8,.true.) >> @@ -1254,6 +1373,16 @@ SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,10,.true.) >> SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,16,.true.) >> #endif >> SUPPORTMACRO_NOARG(IEEE_SUPPORT_DENORMAL,.true.) >> + >> +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,4,.true.) >> +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,8,.true.) >> +#ifdef HAVE_GFC_REAL_10 >> +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,10,.true.) >> +#endif >> +#ifdef HAVE_GFC_REAL_16 >> +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,16,.true.) >> +#endif >> +SUPPORTMACRO_NOARG(IEEE_SUPPORT_SUBNORMAL,.true.) >> >> ! IEEE_SUPPORT_DIVIDE >> >> Index: libgfortran/ieee/ieee_features.F90 >> =================================================================== >> --- libgfortran/ieee/ieee_features.F90 (revision 267418) >> +++ libgfortran/ieee/ieee_features.F90 (working copy) >> @@ -36,6 +36,7 @@ module IEEE_FEATURES >> type(IEEE_FEATURES_TYPE), parameter, public :: & >> IEEE_DATATYPE = IEEE_FEATURES_TYPE(0), & >> IEEE_DENORMAL = IEEE_FEATURES_TYPE(1), & >> + IEEE_SUBNORMAL = IEEE_FEATURES_TYPE(1), & >> IEEE_DIVIDE = IEEE_FEATURES_TYPE(2), & >> IEEE_HALTING = IEEE_FEATURES_TYPE(3), & >> IEEE_INEXACT_FLAG = IEEE_FEATURES_TYPE(4), & >> Index: libgfortran/ieee/ieee_helper.c >> =================================================================== >> --- libgfortran/ieee/ieee_helper.c (revision 267418) >> +++ libgfortran/ieee/ieee_helper.c (working copy) >> @@ -50,7 +50,8 @@ internal_proto(ieee_class_helper_16); >> enum { IEEE_OTHER_VALUE = 0, IEEE_SIGNALING_NAN, IEEE_QUIET_NAN, >> IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL, >> IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL, >> - IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF }; >> + IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF, IEEE_SUBNORMAL, >> + IEEE_NEGATIVE_SUBNORMAL, IEEE_POSITIVE_SUBNORMAL }; >> >> #define CLASSMACRO(TYPE) \ >> int ieee_class_helper_ ## TYPE (GFC_REAL_ ## TYPE *value) \ > >
On Fri, Dec 28, 2018 at 04:40:55PM -0800, Jerry DeLisle wrote: > On 12/28/18 10:44 AM, Steve Kargl wrote: > > Ping. > > OK, thanks. > For the record, here's the patch and ChangeLogs for what I committed. Previous patch did not come with a testscase. 2018-12-29 Steven G. Kargl <kargl@gcc.gnu.org> * expr.c (external_spec_function): Add ieee_support_subnormal to list of IEEE inquiry functions. 2018-12-29 Steven G. Kargl <kargl@gcc.gnu.org> * gfortran.map: Expose subnormal functions in dynamic library. * ieee/ieee_arithmetic.F90: Add support for IEEE_SUBNORMAL, IEEE_POSITIVE_SUBNORMAL, and IEEE_NEGATIVE_SUBNORMAL. * ieee/ieee_helper.c: Ditto. * ieee/ieee_features.F90: Add IEEE_SUBNORMAL. 2018-12-29 Steven G. Kargl <kargl@gcc.gnu.org> * gfortran.dg/ieee/ieee_11.F90: New test.
Index: gcc/fortran/expr.c =================================================================== --- gcc/fortran/expr.c (revision 267418) +++ gcc/fortran/expr.c (working copy) @@ -3061,6 +3061,7 @@ external_spec_function (gfc_expr *e) || !strcmp (f->name, "ieee_support_halting") || !strcmp (f->name, "ieee_support_datatype") || !strcmp (f->name, "ieee_support_denormal") + || !strcmp (f->name, "ieee_support_subnormal") || !strcmp (f->name, "ieee_support_divide") || !strcmp (f->name, "ieee_support_inf") || !strcmp (f->name, "ieee_support_io") Index: libgfortran/gfortran.map =================================================================== --- libgfortran/gfortran.map (revision 267418) +++ libgfortran/gfortran.map (working copy) @@ -1573,4 +1573,9 @@ GFORTRAN_9 { _gfortran_sfindloc2_s1; _gfortran_sfindloc2_s4; _gfortran_st_wait_async; + __ieee_arithmetic_MOD_ieee_support_subnormal_10; + __ieee_arithmetic_MOD_ieee_support_subnormal_16; + __ieee_arithmetic_MOD_ieee_support_subnormal_4; + __ieee_arithmetic_MOD_ieee_support_subnormal_8; + __ieee_arithmetic_MOD_ieee_support_subnormal_noarg; }; Index: libgfortran/ieee/ieee_arithmetic.F90 =================================================================== --- libgfortran/ieee/ieee_arithmetic.F90 (revision 267418) +++ libgfortran/ieee/ieee_arithmetic.F90 (working copy) @@ -55,9 +55,11 @@ module IEEE_ARITHMETIC IEEE_NEGATIVE_INF = IEEE_CLASS_TYPE(3), & IEEE_NEGATIVE_NORMAL = IEEE_CLASS_TYPE(4), & IEEE_NEGATIVE_DENORMAL = IEEE_CLASS_TYPE(5), & + IEEE_NEGATIVE_SUBNORMAL= IEEE_CLASS_TYPE(5), & IEEE_NEGATIVE_ZERO = IEEE_CLASS_TYPE(6), & IEEE_POSITIVE_ZERO = IEEE_CLASS_TYPE(7), & IEEE_POSITIVE_DENORMAL = IEEE_CLASS_TYPE(8), & + IEEE_POSITIVE_SUBNORMAL= IEEE_CLASS_TYPE(8), & IEEE_POSITIVE_NORMAL = IEEE_CLASS_TYPE(9), & IEEE_POSITIVE_INF = IEEE_CLASS_TYPE(10) @@ -795,6 +797,7 @@ REM_MACRO(4,4,4) SUPPORTGENERIC(IEEE_SUPPORT_DATATYPE) SUPPORTGENERIC(IEEE_SUPPORT_DENORMAL) +SUPPORTGENERIC(IEEE_SUPPORT_SUBNORMAL) SUPPORTGENERIC(IEEE_SUPPORT_DIVIDE) SUPPORTGENERIC(IEEE_SUPPORT_INF) SUPPORTGENERIC(IEEE_SUPPORT_IO) @@ -1243,7 +1362,7 @@ SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,16,.true.) #endif SUPPORTMACRO_NOARG(IEEE_SUPPORT_DATATYPE,.true.) -! IEEE_SUPPORT_DENORMAL +! IEEE_SUPPORT_DENORMAL and IEEE_SUPPORT_SUBNORMAL SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,4,.true.) SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,8,.true.) @@ -1254,6 +1373,16 @@ SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,10,.true.) SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,16,.true.) #endif SUPPORTMACRO_NOARG(IEEE_SUPPORT_DENORMAL,.true.) + +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,4,.true.) +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,8,.true.) +#ifdef HAVE_GFC_REAL_10 +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,10,.true.) +#endif +#ifdef HAVE_GFC_REAL_16 +SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,16,.true.) +#endif +SUPPORTMACRO_NOARG(IEEE_SUPPORT_SUBNORMAL,.true.) ! IEEE_SUPPORT_DIVIDE Index: libgfortran/ieee/ieee_features.F90 =================================================================== --- libgfortran/ieee/ieee_features.F90 (revision 267418) +++ libgfortran/ieee/ieee_features.F90 (working copy) @@ -36,6 +36,7 @@ module IEEE_FEATURES type(IEEE_FEATURES_TYPE), parameter, public :: & IEEE_DATATYPE = IEEE_FEATURES_TYPE(0), & IEEE_DENORMAL = IEEE_FEATURES_TYPE(1), & + IEEE_SUBNORMAL = IEEE_FEATURES_TYPE(1), & IEEE_DIVIDE = IEEE_FEATURES_TYPE(2), & IEEE_HALTING = IEEE_FEATURES_TYPE(3), & IEEE_INEXACT_FLAG = IEEE_FEATURES_TYPE(4), & Index: libgfortran/ieee/ieee_helper.c =================================================================== --- libgfortran/ieee/ieee_helper.c (revision 267418) +++ libgfortran/ieee/ieee_helper.c (working copy) @@ -50,7 +50,8 @@ internal_proto(ieee_class_helper_16); enum { IEEE_OTHER_VALUE = 0, IEEE_SIGNALING_NAN, IEEE_QUIET_NAN, IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL, - IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF }; + IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF, IEEE_SUBNORMAL, + IEEE_NEGATIVE_SUBNORMAL, IEEE_POSITIVE_SUBNORMAL }; #define CLASSMACRO(TYPE) \ int ieee_class_helper_ ## TYPE (GFC_REAL_ ## TYPE *value) \