From ede9dea5c4af7ca2c4c557e9f9174c94acc0b1fe Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Sat, 29 Dec 2018 19:14:32 +0000 Subject: [PATCH] expr.c (external_spec_function): Add ieee_support_subnormal to list of IEEE inquiry functions. 2018-12-29 Steven G. Kargl * expr.c (external_spec_function): Add ieee_support_subnormal to list of IEEE inquiry functions. 2018-12-29 Steven G. Kargl * 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 * gfortran.dg/ieee/ieee_11.F90: New test. From-SVN: r267468 --- gcc/fortran/ChangeLog | 5 ++ gcc/fortran/expr.c | 1 + gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gfortran.dg/ieee/ieee_11.F90 | 74 ++++++++++++++++++++++ libgfortran/ChangeLog | 8 +++ libgfortran/gfortran.map | 5 ++ libgfortran/ieee/ieee_arithmetic.F90 | 15 ++++- libgfortran/ieee/ieee_features.F90 | 1 + libgfortran/ieee/ieee_helper.c | 3 +- 9 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/ieee/ieee_11.F90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e2600283363..30a7c0f3b0a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2018-12-29 Steven G. Kargl + + * expr.c (external_spec_function): Add ieee_support_subnormal to list + of IEEE inquiry functions. + 2018-12-29 Steven G. Kargl * cpp.c (gfc_cpp_init): Add pre-defined macros for INTEGER(1) diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 638b38d141b..aad1496689f 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3068,6 +3068,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") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cdfc940b45f..5e9bd887c41 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-12-29 Steven G. Kargl + + * gfortran.dg/ieee/ieee_11.F90: New test. + 2018-12-29 Jozef Lawrynowicz * gcc.target/msp430/critical-interrupt.c: New test. diff --git a/gcc/testsuite/gfortran.dg/ieee/ieee_11.F90 b/gcc/testsuite/gfortran.dg/ieee/ieee_11.F90 new file mode 100644 index 00000000000..9f62e7087a2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ieee/ieee_11.F90 @@ -0,0 +1,74 @@ +! { dg-do run } +program foo + + use ieee_arithmetic + + implicit none + + call test04 + call test08 + call test10 + call test16 + + contains + + subroutine test04 + real(4) x, y + if (ieee_support_subnormal(x)) then + x = ieee_value(x, ieee_positive_subnormal) + y = ieee_value(y, ieee_positive_denormal) + if (x /= y) stop 1 + x = ieee_value(x, ieee_negative_subnormal) + y = ieee_value(y, ieee_negative_denormal) + if (x /= y) stop 2 + end if + end subroutine test04 + + subroutine test08 + real(8) x, y + if (ieee_support_subnormal(x)) then + x = ieee_value(x, ieee_positive_subnormal) + y = ieee_value(y, ieee_positive_denormal) + if (x /= y) stop 1 + x = ieee_value(x, ieee_negative_subnormal) + y = ieee_value(y, ieee_negative_denormal) + if (x /= y) stop 2 + end if + end subroutine test08 + +#ifdef __GFC_REAL_10__ + subroutine test10 + real(10) x, y + if (ieee_support_subnormal(x)) then + x = ieee_value(x, ieee_positive_subnormal) + y = ieee_value(y, ieee_positive_denormal) + if (x /= y) stop 1 + x = ieee_value(x, ieee_negative_subnormal) + y = ieee_value(y, ieee_negative_denormal) + if (x /= y) stop 2 + end if + end subroutine test10 +#else + subroutine test10 + end subroutine test10 +#endif + +#ifdef __GFC_REAL_16__ + subroutine test16 + real(16) x, y + if (ieee_support_subnormal(x)) then + x = ieee_value(x, ieee_positive_subnormal) + y = ieee_value(y, ieee_positive_denormal) + if (x /= y) stop 1 + x = ieee_value(x, ieee_negative_subnormal) + y = ieee_value(y, ieee_negative_denormal) + if (x /= y) stop 2 + end if + end subroutine test16 +#else + subroutine test16 + end subroutine test16 +#endif + + +end program foo diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 6eace449440..ab0dd2115ff 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2018-12-29 Steven G. Kargl + + * 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 PR fortran/88342 diff --git a/libgfortran/gfortran.map b/libgfortran/gfortran.map index 8dcb3295b20..ce4fe201b1e 100644 --- a/libgfortran/gfortran.map +++ b/libgfortran/gfortran.map @@ -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; }; diff --git a/libgfortran/ieee/ieee_arithmetic.F90 b/libgfortran/ieee/ieee_arithmetic.F90 index 1cda1c7458b..ac6334cba70 100644 --- a/libgfortran/ieee/ieee_arithmetic.F90 +++ b/libgfortran/ieee/ieee_arithmetic.F90 @@ -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) @@ -1359,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.) @@ -1371,6 +1374,16 @@ 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 SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,4,.true.) diff --git a/libgfortran/ieee/ieee_features.F90 b/libgfortran/ieee/ieee_features.F90 index d5aec3bca1e..af8185e8277 100644 --- a/libgfortran/ieee/ieee_features.F90 +++ b/libgfortran/ieee/ieee_features.F90 @@ -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), & diff --git a/libgfortran/ieee/ieee_helper.c b/libgfortran/ieee/ieee_helper.c index 5071efa4f82..35231274a1a 100644 --- a/libgfortran/ieee/ieee_helper.c +++ b/libgfortran/ieee/ieee_helper.c @@ -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) \ -- 2.30.2