aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/ieee
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2022-09-09 19:12:31 +0200
committerFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2023-06-10 17:39:29 +0200
commit17bccd1d2c0fa1f08e0483c8ed841994a95febb0 (patch)
treea7215e7dc2894fd80f228c607b2959ec6ea3907f /libgfortran/ieee
parentdb80262475d28ae074a2cda7a1a6c2ea525791b9 (diff)
downloadgcc-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.F90126
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) \