diff mbox series

[fortran] Add support for IEEE_SUBNORMAL

Message ID 20181225223640.GA99122@troutmask.apl.washington.edu
State New
Headers show
Series [fortran] Add support for IEEE_SUBNORMAL | expand

Commit Message

Steve Kargl Dec. 25, 2018, 10:36 p.m. UTC
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.

Comments

Steve Kargl Dec. 28, 2018, 6:44 p.m. UTC | #1
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) \
Jerry DeLisle Dec. 29, 2018, 12:40 a.m. UTC | #2
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) \
> 
>
Steve Kargl Dec. 29, 2018, 7:16 p.m. UTC | #3
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.
diff mbox series

Patch

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) \