Commit ede9dea5 by Steven G. Kargl

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>

	* 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.

From-SVN: r267468
parent 60084552
2018-12-29 Steven G. Kargl <kargl@gcc.gnu.org> 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>
* cpp.c (gfc_cpp_init): Add pre-defined macros for INTEGER(1) * cpp.c (gfc_cpp_init): Add pre-defined macros for INTEGER(1)
INTEGER(2), INTEGER(8) and INTEGER(16) if supported. Add pre-defined INTEGER(2), INTEGER(8) and INTEGER(16) if supported. Add pre-defined
macros for REAL(10) and REAL(16) if available. macros for REAL(10) and REAL(16) if available.
......
...@@ -3068,6 +3068,7 @@ external_spec_function (gfc_expr *e) ...@@ -3068,6 +3068,7 @@ external_spec_function (gfc_expr *e)
|| !strcmp (f->name, "ieee_support_halting") || !strcmp (f->name, "ieee_support_halting")
|| !strcmp (f->name, "ieee_support_datatype") || !strcmp (f->name, "ieee_support_datatype")
|| !strcmp (f->name, "ieee_support_denormal") || !strcmp (f->name, "ieee_support_denormal")
|| !strcmp (f->name, "ieee_support_subnormal")
|| !strcmp (f->name, "ieee_support_divide") || !strcmp (f->name, "ieee_support_divide")
|| !strcmp (f->name, "ieee_support_inf") || !strcmp (f->name, "ieee_support_inf")
|| !strcmp (f->name, "ieee_support_io") || !strcmp (f->name, "ieee_support_io")
......
2018-12-29 Steven G. Kargl <kargl@gcc.gnu.org>
* gfortran.dg/ieee/ieee_11.F90: New test.
2018-12-29 Jozef Lawrynowicz <jozef.l@mittosystems.com> 2018-12-29 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* gcc.target/msp430/critical-interrupt.c: New test. * gcc.target/msp430/critical-interrupt.c: New test.
......
! { 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
2018-12-29 Steven G. Kargl <kargl@gcc.gnu.org> 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>
PR fortran/88342 PR fortran/88342
* ieee/ieee_arithmetic.F90: Prevent exceptions in IEEE_VALUE if * ieee/ieee_arithmetic.F90: Prevent exceptions in IEEE_VALUE if
......
...@@ -1573,4 +1573,9 @@ GFORTRAN_9 { ...@@ -1573,4 +1573,9 @@ GFORTRAN_9 {
_gfortran_sfindloc2_s1; _gfortran_sfindloc2_s1;
_gfortran_sfindloc2_s4; _gfortran_sfindloc2_s4;
_gfortran_st_wait_async; _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;
}; };
...@@ -55,9 +55,11 @@ module IEEE_ARITHMETIC ...@@ -55,9 +55,11 @@ module IEEE_ARITHMETIC
IEEE_NEGATIVE_INF = IEEE_CLASS_TYPE(3), & IEEE_NEGATIVE_INF = IEEE_CLASS_TYPE(3), &
IEEE_NEGATIVE_NORMAL = IEEE_CLASS_TYPE(4), & IEEE_NEGATIVE_NORMAL = IEEE_CLASS_TYPE(4), &
IEEE_NEGATIVE_DENORMAL = IEEE_CLASS_TYPE(5), & IEEE_NEGATIVE_DENORMAL = IEEE_CLASS_TYPE(5), &
IEEE_NEGATIVE_SUBNORMAL= IEEE_CLASS_TYPE(5), &
IEEE_NEGATIVE_ZERO = IEEE_CLASS_TYPE(6), & IEEE_NEGATIVE_ZERO = IEEE_CLASS_TYPE(6), &
IEEE_POSITIVE_ZERO = IEEE_CLASS_TYPE(7), & IEEE_POSITIVE_ZERO = IEEE_CLASS_TYPE(7), &
IEEE_POSITIVE_DENORMAL = IEEE_CLASS_TYPE(8), & IEEE_POSITIVE_DENORMAL = IEEE_CLASS_TYPE(8), &
IEEE_POSITIVE_SUBNORMAL= IEEE_CLASS_TYPE(8), &
IEEE_POSITIVE_NORMAL = IEEE_CLASS_TYPE(9), & IEEE_POSITIVE_NORMAL = IEEE_CLASS_TYPE(9), &
IEEE_POSITIVE_INF = IEEE_CLASS_TYPE(10) IEEE_POSITIVE_INF = IEEE_CLASS_TYPE(10)
...@@ -795,6 +797,7 @@ REM_MACRO(4,4,4) ...@@ -795,6 +797,7 @@ REM_MACRO(4,4,4)
SUPPORTGENERIC(IEEE_SUPPORT_DATATYPE) SUPPORTGENERIC(IEEE_SUPPORT_DATATYPE)
SUPPORTGENERIC(IEEE_SUPPORT_DENORMAL) SUPPORTGENERIC(IEEE_SUPPORT_DENORMAL)
SUPPORTGENERIC(IEEE_SUPPORT_SUBNORMAL)
SUPPORTGENERIC(IEEE_SUPPORT_DIVIDE) SUPPORTGENERIC(IEEE_SUPPORT_DIVIDE)
SUPPORTGENERIC(IEEE_SUPPORT_INF) SUPPORTGENERIC(IEEE_SUPPORT_INF)
SUPPORTGENERIC(IEEE_SUPPORT_IO) SUPPORTGENERIC(IEEE_SUPPORT_IO)
...@@ -1359,7 +1362,7 @@ SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,16,.true.) ...@@ -1359,7 +1362,7 @@ SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,16,.true.)
#endif #endif
SUPPORTMACRO_NOARG(IEEE_SUPPORT_DATATYPE,.true.) 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,4,.true.)
SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,8,.true.) SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,8,.true.)
...@@ -1371,6 +1374,16 @@ SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,16,.true.) ...@@ -1371,6 +1374,16 @@ SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,16,.true.)
#endif #endif
SUPPORTMACRO_NOARG(IEEE_SUPPORT_DENORMAL,.true.) 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 ! IEEE_SUPPORT_DIVIDE
SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,4,.true.) SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,4,.true.)
......
...@@ -36,6 +36,7 @@ module IEEE_FEATURES ...@@ -36,6 +36,7 @@ module IEEE_FEATURES
type(IEEE_FEATURES_TYPE), parameter, public :: & type(IEEE_FEATURES_TYPE), parameter, public :: &
IEEE_DATATYPE = IEEE_FEATURES_TYPE(0), & IEEE_DATATYPE = IEEE_FEATURES_TYPE(0), &
IEEE_DENORMAL = IEEE_FEATURES_TYPE(1), & IEEE_DENORMAL = IEEE_FEATURES_TYPE(1), &
IEEE_SUBNORMAL = IEEE_FEATURES_TYPE(1), &
IEEE_DIVIDE = IEEE_FEATURES_TYPE(2), & IEEE_DIVIDE = IEEE_FEATURES_TYPE(2), &
IEEE_HALTING = IEEE_FEATURES_TYPE(3), & IEEE_HALTING = IEEE_FEATURES_TYPE(3), &
IEEE_INEXACT_FLAG = IEEE_FEATURES_TYPE(4), & IEEE_INEXACT_FLAG = IEEE_FEATURES_TYPE(4), &
......
...@@ -50,7 +50,8 @@ internal_proto(ieee_class_helper_16); ...@@ -50,7 +50,8 @@ internal_proto(ieee_class_helper_16);
enum { IEEE_OTHER_VALUE = 0, IEEE_SIGNALING_NAN, IEEE_QUIET_NAN, enum { IEEE_OTHER_VALUE = 0, IEEE_SIGNALING_NAN, IEEE_QUIET_NAN,
IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL,
IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_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) \ #define CLASSMACRO(TYPE) \
int ieee_class_helper_ ## TYPE (GFC_REAL_ ## TYPE *value) \ int ieee_class_helper_ ## TYPE (GFC_REAL_ ## TYPE *value) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment