diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2022-09-09 19:12:31 +0200 |
---|---|---|
committer | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2023-06-10 17:39:29 +0200 |
commit | 17bccd1d2c0fa1f08e0483c8ed841994a95febb0 (patch) | |
tree | a7215e7dc2894fd80f228c607b2959ec6ea3907f /libgfortran/ieee | |
parent | db80262475d28ae074a2cda7a1a6c2ea525791b9 (diff) | |
download | gcc-17bccd1d2c0fa1f08e0483c8ed841994a95febb0.zip gcc-17bccd1d2c0fa1f08e0483c8ed841994a95febb0.tar.gz gcc-17bccd1d2c0fa1f08e0483c8ed841994a95febb0.tar.bz2 |
Fortran: add Fortran 2018 IEEE_{MIN,MAX} functions
libgfortran/
* ieee/ieee_arithmetic.F90: Add IEEE_MIN_NUM, IEEE_MAX_NUM,
IEEE_MIN_NUM_MAG, and IEEE_MAX_NUM_MAG functions.
gcc/fortran/
* f95-lang.cc (gfc_init_builtin_functions): Add fmax() and
fmin() built-ins, and their variants.
* mathbuiltins.def: Add FMAX and FMIN built-ins.
* trans-intrinsic.cc (conv_intrinsic_ieee_minmax): New function.
(gfc_conv_ieee_arithmetic_function): Handle IEEE_MIN_NUM and
IEEE_MAX_NUM functions.
gcc/testsuite/
* gfortran.dg/ieee/minmax_1.f90: New test.
Diffstat (limited to 'libgfortran/ieee')
-rw-r--r-- | libgfortran/ieee/ieee_arithmetic.F90 | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/libgfortran/ieee/ieee_arithmetic.F90 b/libgfortran/ieee/ieee_arithmetic.F90 index 9c0b9f3..d34ece6 100644 --- a/libgfortran/ieee/ieee_arithmetic.F90 +++ b/libgfortran/ieee/ieee_arithmetic.F90 @@ -223,6 +223,132 @@ module IEEE_ARITHMETIC end interface public :: IEEE_IS_NORMAL + ! IEEE_MIN_NUM, IEEE_MAX_NUM, IEEE_MIN_NUM_MAG, IEEE_MAX_NUM_MAG + + interface + elemental real(kind=4) function _gfortran_ieee_max_num_4(X, Y) + real(kind=4), intent(in) :: X, Y + end function + elemental real(kind=8) function _gfortran_ieee_max_num_8(X, Y) + real(kind=8), intent(in) :: X, Y + end function +#ifdef HAVE_GFC_REAL_10 + elemental real(kind=10) function _gfortran_ieee_max_num_10(X, Y) + real(kind=10), intent(in) :: X, Y + end function +#endif +#ifdef HAVE_GFC_REAL_16 + elemental real(kind=16) function _gfortran_ieee_max_num_16(X, Y) + real(kind=16), intent(in) :: X, Y + end function +#endif + end interface + + interface IEEE_MAX_NUM + procedure & +#ifdef HAVE_GFC_REAL_16 + _gfortran_ieee_max_num_16, & +#endif +#ifdef HAVE_GFC_REAL_10 + _gfortran_ieee_max_num_10, & +#endif + _gfortran_ieee_max_num_8, _gfortran_ieee_max_num_4 + end interface + public :: IEEE_MAX_NUM + + interface + elemental real(kind=4) function _gfortran_ieee_max_num_mag_4(X, Y) + real(kind=4), intent(in) :: X, Y + end function + elemental real(kind=8) function _gfortran_ieee_max_num_mag_8(X, Y) + real(kind=8), intent(in) :: X, Y + end function +#ifdef HAVE_GFC_REAL_10 + elemental real(kind=10) function _gfortran_ieee_max_num_mag_10(X, Y) + real(kind=10), intent(in) :: X, Y + end function +#endif +#ifdef HAVE_GFC_REAL_16 + elemental real(kind=16) function _gfortran_ieee_max_num_mag_16(X, Y) + real(kind=16), intent(in) :: X, Y + end function +#endif + end interface + + interface IEEE_MAX_NUM_MAG + procedure & +#ifdef HAVE_GFC_REAL_16 + _gfortran_ieee_max_num_mag_16, & +#endif +#ifdef HAVE_GFC_REAL_10 + _gfortran_ieee_max_num_mag_10, & +#endif + _gfortran_ieee_max_num_mag_8, _gfortran_ieee_max_num_mag_4 + end interface + public :: IEEE_MAX_NUM_MAG + + interface + elemental real(kind=4) function _gfortran_ieee_min_num_4(X, Y) + real(kind=4), intent(in) :: X, Y + end function + elemental real(kind=8) function _gfortran_ieee_min_num_8(X, Y) + real(kind=8), intent(in) :: X, Y + end function +#ifdef HAVE_GFC_REAL_10 + elemental real(kind=10) function _gfortran_ieee_min_num_10(X, Y) + real(kind=10), intent(in) :: X, Y + end function +#endif +#ifdef HAVE_GFC_REAL_16 + elemental real(kind=16) function _gfortran_ieee_min_num_16(X, Y) + real(kind=16), intent(in) :: X, Y + end function +#endif + end interface + + interface IEEE_MIN_NUM + procedure & +#ifdef HAVE_GFC_REAL_16 + _gfortran_ieee_min_num_16, & +#endif +#ifdef HAVE_GFC_REAL_10 + _gfortran_ieee_min_num_10, & +#endif + _gfortran_ieee_min_num_8, _gfortran_ieee_min_num_4 + end interface + public :: IEEE_MIN_NUM + + interface + elemental real(kind=4) function _gfortran_ieee_min_num_mag_4(X, Y) + real(kind=4), intent(in) :: X, Y + end function + elemental real(kind=8) function _gfortran_ieee_min_num_mag_8(X, Y) + real(kind=8), intent(in) :: X, Y + end function +#ifdef HAVE_GFC_REAL_10 + elemental real(kind=10) function _gfortran_ieee_min_num_mag_10(X, Y) + real(kind=10), intent(in) :: X, Y + end function +#endif +#ifdef HAVE_GFC_REAL_16 + elemental real(kind=16) function _gfortran_ieee_min_num_mag_16(X, Y) + real(kind=16), intent(in) :: X, Y + end function +#endif + end interface + + interface IEEE_MIN_NUM_MAG + procedure & +#ifdef HAVE_GFC_REAL_16 + _gfortran_ieee_min_num_mag_16, & +#endif +#ifdef HAVE_GFC_REAL_10 + _gfortran_ieee_min_num_mag_10, & +#endif + _gfortran_ieee_min_num_mag_8, _gfortran_ieee_min_num_mag_4 + end interface + public :: IEEE_MIN_NUM_MAG + ! IEEE_COPY_SIGN #define COPYSIGN_MACRO(A,B) \ |