diff --git a/cmake/lapack.cmake b/cmake/lapack.cmake
index ab98c93648..47289d5744 100644
--- a/cmake/lapack.cmake
+++ b/cmake/lapack.cmake
@@ -1,11 +1,21 @@
# Sources for compiling lapack-netlib. Can't use CMakeLists.txt because lapack-netlib already has its own cmake files.
if (NOT C_LAPACK)
message (STATUS "fortran lapack")
-set(ALLAUX ilaenv.f ilaenv2stage.f ieeeck.f lsamen.f iparmq.f iparam2stage.F
+set(ALLAUX ilaenv.f ilaenv2stage.f lsamen.f iparmq.f iparam2stage.F
ilaprec.f ilatrans.f ilauplo.f iladiag.f chla_transtype.f dlaset.f la_xisnan.F90
../INSTALL/ilaver.f xerbla_array.f
../INSTALL/slamch.f)
+if (${CMAKE_Fortran_COMPILER} MATCHES GFORTRAN)
+if ((${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS 5.0) OR (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS 16.0 AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86|x86_64)"))
+ list (APPEND ALLAUX DEPRECATED/ieeeck.f)
+else()
+ list (APPEND ALLAUX ieeeck.f)
+endif()
+else()
+ list (APPEND ALLAUX ieeeck.f)
+endif()
+
set(SCLAUX
scombssq.f sbdsvdx.f sstevx.f sstein.f
la_constants.f90
diff --git a/lapack-netlib/SRC/DEPRECATED/ieeeck.f b/lapack-netlib/SRC/DEPRECATED/ieeeck.f
new file mode 100644
index 0000000000..f9f6332ecf
--- /dev/null
+++ b/lapack-netlib/SRC/DEPRECATED/ieeeck.f
@@ -0,0 +1,200 @@
+*> \brief \b IEEECK
+*
+* =========== DOCUMENTATION ===========
+*
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
+*
+*> \htmlonly
+*> Download IEEECK + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
+*> [TXT]
+*> \endhtmlonly
+*
+* Definition:
+* ===========
+*
+* INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE )
+*
+* .. Scalar Arguments ..
+* INTEGER ISPEC
+* REAL ONE, ZERO
+* ..
+*
+*
+*> \par Purpose:
+* =============
+*>
+*> \verbatim
+*>
+*> IEEECK is called from the ILAENV to verify that Infinity and
+*> possibly NaN arithmetic is safe (i.e. will not trap).
+*> \endverbatim
+*
+* Arguments:
+* ==========
+*
+*> \param[in] ISPEC
+*> \verbatim
+*> ISPEC is INTEGER
+*> Specifies whether to test just for infinity arithmetic
+*> or whether to test for infinity and NaN arithmetic.
+*> = 0: Verify infinity arithmetic only.
+*> = 1: Verify infinity and NaN arithmetic.
+*> \endverbatim
+*>
+*> \param[in] ZERO
+*> \verbatim
+*> ZERO is REAL
+*> Must contain the value 0.0
+*> This is passed to prevent the compiler from optimizing
+*> away this code.
+*> \endverbatim
+*>
+*> \param[in] ONE
+*> \verbatim
+*> ONE is REAL
+*> Must contain the value 1.0
+*> This is passed to prevent the compiler from optimizing
+*> away this code.
+*>
+*> RETURN VALUE: INTEGER
+*> = 0: Arithmetic failed to produce the correct answers
+*> = 1: Arithmetic produced the correct answers
+*> \endverbatim
+*
+* Authors:
+* ========
+*
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
+*
+*> \ingroup OTHERauxiliary
+*
+* =====================================================================
+ INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE )
+*
+* -- LAPACK auxiliary routine --
+* -- LAPACK is a software package provided by Univ. of Tennessee, --
+* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
+*
+* .. Scalar Arguments ..
+ INTEGER ISPEC
+ REAL ONE, ZERO
+* ..
+*
+* =====================================================================
+*
+* .. Local Scalars ..
+ REAL NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF,
+ $ NEGZRO, NEWZRO, POSINF
+* ..
+* .. Executable Statements ..
+ IEEECK = 1
+*
+ POSINF = ONE / ZERO
+ IF( POSINF.LE.ONE ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ NEGINF = -ONE / ZERO
+ IF( NEGINF.GE.ZERO ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ NEGZRO = ONE / ( NEGINF+ONE )
+ IF( NEGZRO.NE.ZERO ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ NEGINF = ONE / NEGZRO
+ IF( NEGINF.GE.ZERO ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ NEWZRO = NEGZRO + ZERO
+ IF( NEWZRO.NE.ZERO ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ POSINF = ONE / NEWZRO
+ IF( POSINF.LE.ONE ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ NEGINF = NEGINF*POSINF
+ IF( NEGINF.GE.ZERO ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ POSINF = POSINF*POSINF
+ IF( POSINF.LE.ONE ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+*
+*
+*
+* Return if we were only asked to check infinity arithmetic
+*
+ IF( ISPEC.EQ.0 )
+ $ RETURN
+*
+ NAN1 = POSINF + NEGINF
+*
+ NAN2 = POSINF / NEGINF
+*
+ NAN3 = POSINF / POSINF
+*
+ NAN4 = POSINF*ZERO
+*
+ NAN5 = NEGINF*NEGZRO
+*
+ NAN6 = NAN5*ZERO
+*
+ IF( NAN1.EQ.NAN1 ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ IF( NAN2.EQ.NAN2 ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ IF( NAN3.EQ.NAN3 ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ IF( NAN4.EQ.NAN4 ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ IF( NAN5.EQ.NAN5 ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ IF( NAN6.EQ.NAN6 ) THEN
+ IEEECK = 0
+ RETURN
+ END IF
+*
+ RETURN
+ END
diff --git a/lapack-netlib/SRC/Makefile b/lapack-netlib/SRC/Makefile
index 5abcae99f5..7f04542556 100644
--- a/lapack-netlib/SRC/Makefile
+++ b/lapack-netlib/SRC/Makefile
@@ -79,11 +79,37 @@ else
$(CC) $(filter-out -fvisibility=hidden, $(CFLAGS)) -c -o $@ $<
endif
-ALLAUX_O = ilaenv.o ilaenv2stage.o ieeeck.o lsamen.o xerbla.o xerbla_array.o \
+ALLAUX_O = ilaenv.o ilaenv2stage.o lsamen.o xerbla.o xerbla_array.o \
iparmq.o iparam2stage.o \
ilaprec.o ilatrans.o ilauplo.o iladiag.o chla_transtype.o la_xisnan.o \
../INSTALL/ilaver.o ../INSTALL/lsame.o ../INSTALL/slamch.o
+ifneq ($(C_LAPACK), 1)
+ ifeq ($(F_COMPILER), GFORTRAN)
+ FCVERSIONGT4 := $(shell expr `$(FC) -dumpversion | cut -f1 -d.` \> 4)
+ ifneq ($(FCVERSIONGT4), 1)
+ ALLAUX_O += DEPRECATED/ieeeck.o
+ else
+ OLDBSD=0
+ ifeq ($(OSNAME), FreeBSD)
+ OLDBSD=$(shell expr `uname -r | cut -f1 -d.` \<= 15)
+ ifneq ($(ARCH), $(filter $(ARCH),arm arm64 power))
+ OLDBSD=0
+ endif
+ endif
+ ifeq ($(OLDBSD), 1)
+ ALLAUX_O += DEPRECATED/ieeeck.o
+ else
+ ALLAUX_O += ieeeck.o
+ endif
+ endif
+else
+ALLAUX_O += ieeeck.o
+endif
+else
+ALLAUX_O += ieeeck.o
+endif
+
ifneq "$(or $(BUILD_SINGLE),$(BUILD_COMPLEX))" ""
SCLAUX_O = la_constants.o \
sbdsvdx.o sstevx.o sstein.o \
diff --git a/lapack-netlib/SRC/ieeeck.f b/lapack-netlib/SRC/ieeeck.f
index f9f6332ecf..d62415f3c5 100644
--- a/lapack-netlib/SRC/ieeeck.f
+++ b/lapack-netlib/SRC/ieeeck.f
@@ -5,7 +5,6 @@
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
-*> \htmlonly
*> Download IEEECK + dependencies
*>
*> [TGZ]
@@ -13,7 +12,6 @@
*> [ZIP]
*>
*> [TXT]
-*> \endhtmlonly
*
* Definition:
* ===========
@@ -75,10 +73,14 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup OTHERauxiliary
+*> \ingroup ieeeck
*
* =====================================================================
INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE )
+ USE, INTRINSIC :: IEEE_ARITHMETIC, ONLY:
+ & IEEE_SUPPORT_INF,
+ & IEEE_SUPPORT_NAN
+ IMPLICIT NONE
*
* -- LAPACK auxiliary routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -91,57 +93,11 @@ INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE )
*
* =====================================================================
*
-* .. Local Scalars ..
- REAL NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF,
- $ NEGZRO, NEWZRO, POSINF
* ..
* .. Executable Statements ..
IEEECK = 1
*
- POSINF = ONE / ZERO
- IF( POSINF.LE.ONE ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- NEGINF = -ONE / ZERO
- IF( NEGINF.GE.ZERO ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- NEGZRO = ONE / ( NEGINF+ONE )
- IF( NEGZRO.NE.ZERO ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- NEGINF = ONE / NEGZRO
- IF( NEGINF.GE.ZERO ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- NEWZRO = NEGZRO + ZERO
- IF( NEWZRO.NE.ZERO ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- POSINF = ONE / NEWZRO
- IF( POSINF.LE.ONE ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- NEGINF = NEGINF*POSINF
- IF( NEGINF.GE.ZERO ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- POSINF = POSINF*POSINF
- IF( POSINF.LE.ONE ) THEN
+ IF ( .NOT.IEEE_SUPPORT_INF(ONE) ) THEN
IEEECK = 0
RETURN
END IF
@@ -154,44 +110,7 @@ INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE )
IF( ISPEC.EQ.0 )
$ RETURN
*
- NAN1 = POSINF + NEGINF
-*
- NAN2 = POSINF / NEGINF
-*
- NAN3 = POSINF / POSINF
-*
- NAN4 = POSINF*ZERO
-*
- NAN5 = NEGINF*NEGZRO
-*
- NAN6 = NAN5*ZERO
-*
- IF( NAN1.EQ.NAN1 ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- IF( NAN2.EQ.NAN2 ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- IF( NAN3.EQ.NAN3 ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- IF( NAN4.EQ.NAN4 ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- IF( NAN5.EQ.NAN5 ) THEN
- IEEECK = 0
- RETURN
- END IF
-*
- IF( NAN6.EQ.NAN6 ) THEN
+ IF( .NOT.IEEE_SUPPORT_NAN(ONE) ) THEN
IEEECK = 0
RETURN
END IF