1 ! Implementation of the IEEE_ARITHMETIC standard intrinsic module
2 ! Copyright (C) 2013-2021 Free Software Foundation, Inc.
3 ! Contributed by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
5 ! This file is part of the GNU Fortran runtime library (libgfortran).
7 ! Libgfortran is free software; you can redistribute it and/or
8 ! modify it under the terms of the GNU General Public
9 ! License as published by the Free Software Foundation; either
10 ! version 3 of the License, or (at your option) any later version.
12 ! Libgfortran is distributed in the hope that it will be useful,
13 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ! GNU General Public License for more details.
17 ! Under Section 7 of GPL version 3, you are granted additional
18 ! permissions described in the GCC Runtime Library Exception, version
19 ! 3.1, as published by the Free Software Foundation.
21 ! You should have received a copy of the GNU General Public License and
22 ! a copy of the GCC Runtime Library Exception along with this program;
23 ! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 ! <http://www.gnu.org/licenses/>. */
28 #include "c99_protos.inc"
29 #include "fpu-target.inc"
31 module IEEE_ARITHMETIC
37 ! Every public symbol from IEEE_EXCEPTIONS must be made public here
38 public :: IEEE_FLAG_TYPE, IEEE_INVALID, IEEE_OVERFLOW, &
39 IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW, IEEE_INEXACT, IEEE_USUAL, &
40 IEEE_ALL, IEEE_STATUS_TYPE, IEEE_GET_FLAG, IEEE_GET_HALTING_MODE, &
41 IEEE_GET_STATUS, IEEE_SET_FLAG, IEEE_SET_HALTING_MODE, &
42 IEEE_SET_STATUS, IEEE_SUPPORT_FLAG, IEEE_SUPPORT_HALTING
44 ! Derived types and named constants
46 type, public :: IEEE_CLASS_TYPE
51 type(IEEE_CLASS_TYPE), parameter, public :: &
52 IEEE_OTHER_VALUE = IEEE_CLASS_TYPE(0), &
53 IEEE_SIGNALING_NAN = IEEE_CLASS_TYPE(1), &
54 IEEE_QUIET_NAN = IEEE_CLASS_TYPE(2), &
55 IEEE_NEGATIVE_INF = IEEE_CLASS_TYPE(3), &
56 IEEE_NEGATIVE_NORMAL = IEEE_CLASS_TYPE(4), &
57 IEEE_NEGATIVE_DENORMAL = IEEE_CLASS_TYPE(5), &
58 IEEE_NEGATIVE_SUBNORMAL= IEEE_CLASS_TYPE(5), &
59 IEEE_NEGATIVE_ZERO = IEEE_CLASS_TYPE(6), &
60 IEEE_POSITIVE_ZERO = IEEE_CLASS_TYPE(7), &
61 IEEE_POSITIVE_DENORMAL = IEEE_CLASS_TYPE(8), &
62 IEEE_POSITIVE_SUBNORMAL= IEEE_CLASS_TYPE(8), &
63 IEEE_POSITIVE_NORMAL = IEEE_CLASS_TYPE(9), &
64 IEEE_POSITIVE_INF = IEEE_CLASS_TYPE(10)
66 type, public :: IEEE_ROUND_TYPE
71 type(IEEE_ROUND_TYPE), parameter, public :: &
72 IEEE_NEAREST = IEEE_ROUND_TYPE(GFC_FPE_TONEAREST), &
73 IEEE_TO_ZERO = IEEE_ROUND_TYPE(GFC_FPE_TOWARDZERO), &
74 IEEE_UP = IEEE_ROUND_TYPE(GFC_FPE_UPWARD), &
75 IEEE_DOWN = IEEE_ROUND_TYPE(GFC_FPE_DOWNWARD), &
76 IEEE_OTHER = IEEE_ROUND_TYPE(0)
79 ! Equality operators on the derived types
80 interface operator (==)
81 module procedure IEEE_CLASS_TYPE_EQ, IEEE_ROUND_TYPE_EQ
83 public :: operator(==)
85 interface operator (/=)
86 module procedure IEEE_CLASS_TYPE_NE, IEEE_ROUND_TYPE_NE
88 public :: operator (/=)
94 elemental logical function _gfortran_ieee_is_finite_4(X)
95 real(kind=4), intent(in) :: X
97 elemental logical function _gfortran_ieee_is_finite_8(X)
98 real(kind=8), intent(in) :: X
100 #ifdef HAVE_GFC_REAL_10
101 elemental logical function _gfortran_ieee_is_finite_10(X)
102 real(kind=10), intent(in) :: X
105 #ifdef HAVE_GFC_REAL_16
106 elemental logical function _gfortran_ieee_is_finite_16(X)
107 real(kind=16), intent(in) :: X
112 interface IEEE_IS_FINITE
114 #ifdef HAVE_GFC_REAL_16
115 _gfortran_ieee_is_finite_16, &
117 #ifdef HAVE_GFC_REAL_10
118 _gfortran_ieee_is_finite_10, &
120 _gfortran_ieee_is_finite_8, _gfortran_ieee_is_finite_4
122 public :: IEEE_IS_FINITE
127 elemental logical function _gfortran_ieee_is_nan_4(X)
128 real(kind=4), intent(in) :: X
130 elemental logical function _gfortran_ieee_is_nan_8(X)
131 real(kind=8), intent(in) :: X
133 #ifdef HAVE_GFC_REAL_10
134 elemental logical function _gfortran_ieee_is_nan_10(X)
135 real(kind=10), intent(in) :: X
138 #ifdef HAVE_GFC_REAL_16
139 elemental logical function _gfortran_ieee_is_nan_16(X)
140 real(kind=16), intent(in) :: X
145 interface IEEE_IS_NAN
147 #ifdef HAVE_GFC_REAL_16
148 _gfortran_ieee_is_nan_16, &
150 #ifdef HAVE_GFC_REAL_10
151 _gfortran_ieee_is_nan_10, &
153 _gfortran_ieee_is_nan_8, _gfortran_ieee_is_nan_4
155 public :: IEEE_IS_NAN
160 elemental logical function _gfortran_ieee_is_negative_4(X)
161 real(kind=4), intent(in) :: X
163 elemental logical function _gfortran_ieee_is_negative_8(X)
164 real(kind=8), intent(in) :: X
166 #ifdef HAVE_GFC_REAL_10
167 elemental logical function _gfortran_ieee_is_negative_10(X)
168 real(kind=10), intent(in) :: X
171 #ifdef HAVE_GFC_REAL_16
172 elemental logical function _gfortran_ieee_is_negative_16(X)
173 real(kind=16), intent(in) :: X
178 interface IEEE_IS_NEGATIVE
180 #ifdef HAVE_GFC_REAL_16
181 _gfortran_ieee_is_negative_16, &
183 #ifdef HAVE_GFC_REAL_10
184 _gfortran_ieee_is_negative_10, &
186 _gfortran_ieee_is_negative_8, _gfortran_ieee_is_negative_4
188 public :: IEEE_IS_NEGATIVE
193 elemental logical function _gfortran_ieee_is_normal_4(X)
194 real(kind=4), intent(in) :: X
196 elemental logical function _gfortran_ieee_is_normal_8(X)
197 real(kind=8), intent(in) :: X
199 #ifdef HAVE_GFC_REAL_10
200 elemental logical function _gfortran_ieee_is_normal_10(X)
201 real(kind=10), intent(in) :: X
204 #ifdef HAVE_GFC_REAL_16
205 elemental logical function _gfortran_ieee_is_normal_16(X)
206 real(kind=16), intent(in) :: X
211 interface IEEE_IS_NORMAL
213 #ifdef HAVE_GFC_REAL_16
214 _gfortran_ieee_is_normal_16, &
216 #ifdef HAVE_GFC_REAL_10
217 _gfortran_ieee_is_normal_10, &
219 _gfortran_ieee_is_normal_8, _gfortran_ieee_is_normal_4
221 public :: IEEE_IS_NORMAL
225 #define COPYSIGN_MACRO(A,B) \
226 elemental real(kind = A) function \
227 _gfortran_ieee_copy_sign_/**/A/**/_/**/B (X,Y) ; \
228 real(kind = A), intent(in) :: X ; \
229 real(kind = B), intent(in) :: Y ; \
233 #ifdef HAVE_GFC_REAL_16
234 COPYSIGN_MACRO(16,16)
235 #ifdef HAVE_GFC_REAL_10
236 COPYSIGN_MACRO(16,10)
237 COPYSIGN_MACRO(10,16)
244 #ifdef HAVE_GFC_REAL_10
245 COPYSIGN_MACRO(10,10)
257 interface IEEE_COPY_SIGN
259 #ifdef HAVE_GFC_REAL_16
260 _gfortran_ieee_copy_sign_16_16, &
261 #ifdef HAVE_GFC_REAL_10
262 _gfortran_ieee_copy_sign_16_10, &
263 _gfortran_ieee_copy_sign_10_16, &
265 _gfortran_ieee_copy_sign_16_8, &
266 _gfortran_ieee_copy_sign_16_4, &
267 _gfortran_ieee_copy_sign_8_16, &
268 _gfortran_ieee_copy_sign_4_16, &
270 #ifdef HAVE_GFC_REAL_10
271 _gfortran_ieee_copy_sign_10_10, &
272 _gfortran_ieee_copy_sign_10_8, &
273 _gfortran_ieee_copy_sign_10_4, &
274 _gfortran_ieee_copy_sign_8_10, &
275 _gfortran_ieee_copy_sign_4_10, &
277 _gfortran_ieee_copy_sign_8_8, &
278 _gfortran_ieee_copy_sign_8_4, &
279 _gfortran_ieee_copy_sign_4_8, &
280 _gfortran_ieee_copy_sign_4_4
282 public :: IEEE_COPY_SIGN
286 #define UNORDERED_MACRO(A,B) \
287 elemental logical function \
288 _gfortran_ieee_unordered_/**/A/**/_/**/B (X,Y) ; \
289 real(kind = A), intent(in) :: X ; \
290 real(kind = B), intent(in) :: Y ; \
294 #ifdef HAVE_GFC_REAL_16
295 UNORDERED_MACRO(16,16)
296 #ifdef HAVE_GFC_REAL_10
297 UNORDERED_MACRO(16,10)
298 UNORDERED_MACRO(10,16)
300 UNORDERED_MACRO(16,8)
301 UNORDERED_MACRO(16,4)
302 UNORDERED_MACRO(8,16)
303 UNORDERED_MACRO(4,16)
305 #ifdef HAVE_GFC_REAL_10
306 UNORDERED_MACRO(10,10)
307 UNORDERED_MACRO(10,8)
308 UNORDERED_MACRO(10,4)
309 UNORDERED_MACRO(8,10)
310 UNORDERED_MACRO(4,10)
318 interface IEEE_UNORDERED
320 #ifdef HAVE_GFC_REAL_16
321 _gfortran_ieee_unordered_16_16, &
322 #ifdef HAVE_GFC_REAL_10
323 _gfortran_ieee_unordered_16_10, &
324 _gfortran_ieee_unordered_10_16, &
326 _gfortran_ieee_unordered_16_8, &
327 _gfortran_ieee_unordered_16_4, &
328 _gfortran_ieee_unordered_8_16, &
329 _gfortran_ieee_unordered_4_16, &
331 #ifdef HAVE_GFC_REAL_10
332 _gfortran_ieee_unordered_10_10, &
333 _gfortran_ieee_unordered_10_8, &
334 _gfortran_ieee_unordered_10_4, &
335 _gfortran_ieee_unordered_8_10, &
336 _gfortran_ieee_unordered_4_10, &
338 _gfortran_ieee_unordered_8_8, &
339 _gfortran_ieee_unordered_8_4, &
340 _gfortran_ieee_unordered_4_8, &
341 _gfortran_ieee_unordered_4_4
343 public :: IEEE_UNORDERED
348 elemental real(kind=4) function _gfortran_ieee_logb_4 (X)
349 real(kind=4), intent(in) :: X
351 elemental real(kind=8) function _gfortran_ieee_logb_8 (X)
352 real(kind=8), intent(in) :: X
354 #ifdef HAVE_GFC_REAL_10
355 elemental real(kind=10) function _gfortran_ieee_logb_10 (X)
356 real(kind=10), intent(in) :: X
359 #ifdef HAVE_GFC_REAL_16
360 elemental real(kind=16) function _gfortran_ieee_logb_16 (X)
361 real(kind=16), intent(in) :: X
368 #ifdef HAVE_GFC_REAL_16
369 _gfortran_ieee_logb_16, &
371 #ifdef HAVE_GFC_REAL_10
372 _gfortran_ieee_logb_10, &
374 _gfortran_ieee_logb_8, &
375 _gfortran_ieee_logb_4
381 #define NEXT_AFTER_MACRO(A,B) \
382 elemental real(kind = A) function \
383 _gfortran_ieee_next_after_/**/A/**/_/**/B (X,Y) ; \
384 real(kind = A), intent(in) :: X ; \
385 real(kind = B), intent(in) :: Y ; \
389 #ifdef HAVE_GFC_REAL_16
390 NEXT_AFTER_MACRO(16,16)
391 #ifdef HAVE_GFC_REAL_10
392 NEXT_AFTER_MACRO(16,10)
393 NEXT_AFTER_MACRO(10,16)
395 NEXT_AFTER_MACRO(16,8)
396 NEXT_AFTER_MACRO(16,4)
397 NEXT_AFTER_MACRO(8,16)
398 NEXT_AFTER_MACRO(4,16)
400 #ifdef HAVE_GFC_REAL_10
401 NEXT_AFTER_MACRO(10,10)
402 NEXT_AFTER_MACRO(10,8)
403 NEXT_AFTER_MACRO(10,4)
404 NEXT_AFTER_MACRO(8,10)
405 NEXT_AFTER_MACRO(4,10)
407 NEXT_AFTER_MACRO(8,8)
408 NEXT_AFTER_MACRO(8,4)
409 NEXT_AFTER_MACRO(4,8)
410 NEXT_AFTER_MACRO(4,4)
413 interface IEEE_NEXT_AFTER
415 #ifdef HAVE_GFC_REAL_16
416 _gfortran_ieee_next_after_16_16, &
417 #ifdef HAVE_GFC_REAL_10
418 _gfortran_ieee_next_after_16_10, &
419 _gfortran_ieee_next_after_10_16, &
421 _gfortran_ieee_next_after_16_8, &
422 _gfortran_ieee_next_after_16_4, &
423 _gfortran_ieee_next_after_8_16, &
424 _gfortran_ieee_next_after_4_16, &
426 #ifdef HAVE_GFC_REAL_10
427 _gfortran_ieee_next_after_10_10, &
428 _gfortran_ieee_next_after_10_8, &
429 _gfortran_ieee_next_after_10_4, &
430 _gfortran_ieee_next_after_8_10, &
431 _gfortran_ieee_next_after_4_10, &
433 _gfortran_ieee_next_after_8_8, &
434 _gfortran_ieee_next_after_8_4, &
435 _gfortran_ieee_next_after_4_8, &
436 _gfortran_ieee_next_after_4_4
438 public :: IEEE_NEXT_AFTER
442 #define REM_MACRO(RES,A,B) \
443 elemental real(kind = RES) function \
444 _gfortran_ieee_rem_/**/A/**/_/**/B (X,Y) ; \
445 real(kind = A), intent(in) :: X ; \
446 real(kind = B), intent(in) :: Y ; \
450 #ifdef HAVE_GFC_REAL_16
452 #ifdef HAVE_GFC_REAL_10
461 #ifdef HAVE_GFC_REAL_10
476 #ifdef HAVE_GFC_REAL_16
477 _gfortran_ieee_rem_16_16, &
478 #ifdef HAVE_GFC_REAL_10
479 _gfortran_ieee_rem_16_10, &
480 _gfortran_ieee_rem_10_16, &
482 _gfortran_ieee_rem_16_8, &
483 _gfortran_ieee_rem_16_4, &
484 _gfortran_ieee_rem_8_16, &
485 _gfortran_ieee_rem_4_16, &
487 #ifdef HAVE_GFC_REAL_10
488 _gfortran_ieee_rem_10_10, &
489 _gfortran_ieee_rem_10_8, &
490 _gfortran_ieee_rem_10_4, &
491 _gfortran_ieee_rem_8_10, &
492 _gfortran_ieee_rem_4_10, &
494 _gfortran_ieee_rem_8_8, &
495 _gfortran_ieee_rem_8_4, &
496 _gfortran_ieee_rem_4_8, &
497 _gfortran_ieee_rem_4_4
504 elemental real(kind=4) function _gfortran_ieee_rint_4 (X)
505 real(kind=4), intent(in) :: X
507 elemental real(kind=8) function _gfortran_ieee_rint_8 (X)
508 real(kind=8), intent(in) :: X
510 #ifdef HAVE_GFC_REAL_10
511 elemental real(kind=10) function _gfortran_ieee_rint_10 (X)
512 real(kind=10), intent(in) :: X
515 #ifdef HAVE_GFC_REAL_16
516 elemental real(kind=16) function _gfortran_ieee_rint_16 (X)
517 real(kind=16), intent(in) :: X
524 #ifdef HAVE_GFC_REAL_16
525 _gfortran_ieee_rint_16, &
527 #ifdef HAVE_GFC_REAL_10
528 _gfortran_ieee_rint_10, &
530 _gfortran_ieee_rint_8, _gfortran_ieee_rint_4
537 #ifdef HAVE_GFC_INTEGER_16
538 #ifdef HAVE_GFC_REAL_16
539 elemental real(kind=16) function _gfortran_ieee_scalb_16_16 (X, I)
540 real(kind=16), intent(in) :: X
541 integer(kind=16), intent(in) :: I
544 #ifdef HAVE_GFC_REAL_10
545 elemental real(kind=10) function _gfortran_ieee_scalb_10_16 (X, I)
546 real(kind=10), intent(in) :: X
547 integer(kind=16), intent(in) :: I
550 elemental real(kind=8) function _gfortran_ieee_scalb_8_16 (X, I)
551 real(kind=8), intent(in) :: X
552 integer(kind=16), intent(in) :: I
554 elemental real(kind=4) function _gfortran_ieee_scalb_4_16 (X, I)
555 real(kind=4), intent(in) :: X
556 integer(kind=16), intent(in) :: I
560 #ifdef HAVE_GFC_INTEGER_8
561 #ifdef HAVE_GFC_REAL_16
562 elemental real(kind=16) function _gfortran_ieee_scalb_16_8 (X, I)
563 real(kind=16), intent(in) :: X
564 integer(kind=8), intent(in) :: I
567 #ifdef HAVE_GFC_REAL_10
568 elemental real(kind=10) function _gfortran_ieee_scalb_10_8 (X, I)
569 real(kind=10), intent(in) :: X
570 integer(kind=8), intent(in) :: I
573 elemental real(kind=8) function _gfortran_ieee_scalb_8_8 (X, I)
574 real(kind=8), intent(in) :: X
575 integer(kind=8), intent(in) :: I
577 elemental real(kind=4) function _gfortran_ieee_scalb_4_8 (X, I)
578 real(kind=4), intent(in) :: X
579 integer(kind=8), intent(in) :: I
583 #ifdef HAVE_GFC_INTEGER_2
584 #ifdef HAVE_GFC_REAL_16
585 elemental real(kind=16) function _gfortran_ieee_scalb_16_2 (X, I)
586 real(kind=16), intent(in) :: X
587 integer(kind=2), intent(in) :: I
590 #ifdef HAVE_GFC_REAL_10
591 elemental real(kind=10) function _gfortran_ieee_scalb_10_2 (X, I)
592 real(kind=10), intent(in) :: X
593 integer(kind=2), intent(in) :: I
596 elemental real(kind=8) function _gfortran_ieee_scalb_8_2 (X, I)
597 real(kind=8), intent(in) :: X
598 integer(kind=2), intent(in) :: I
600 elemental real(kind=4) function _gfortran_ieee_scalb_4_2 (X, I)
601 real(kind=4), intent(in) :: X
602 integer(kind=2), intent(in) :: I
606 #ifdef HAVE_GFC_INTEGER_1
607 #ifdef HAVE_GFC_REAL_16
608 elemental real(kind=16) function _gfortran_ieee_scalb_16_1 (X, I)
609 real(kind=16), intent(in) :: X
610 integer(kind=1), intent(in) :: I
613 #ifdef HAVE_GFC_REAL_10
614 elemental real(kind=10) function _gfortran_ieee_scalb_10_1 (X, I)
615 real(kind=10), intent(in) :: X
616 integer(kind=1), intent(in) :: I
619 elemental real(kind=8) function _gfortran_ieee_scalb_8_1 (X, I)
620 real(kind=8), intent(in) :: X
621 integer(kind=1), intent(in) :: I
623 elemental real(kind=4) function _gfortran_ieee_scalb_4_1 (X, I)
624 real(kind=4), intent(in) :: X
625 integer(kind=1), intent(in) :: I
629 #ifdef HAVE_GFC_REAL_16
630 elemental real(kind=16) function _gfortran_ieee_scalb_16_4 (X, I)
631 real(kind=16), intent(in) :: X
632 integer, intent(in) :: I
635 #ifdef HAVE_GFC_REAL_10
636 elemental real(kind=10) function _gfortran_ieee_scalb_10_4 (X, I)
637 real(kind=10), intent(in) :: X
638 integer, intent(in) :: I
641 elemental real(kind=8) function _gfortran_ieee_scalb_8_4 (X, I)
642 real(kind=8), intent(in) :: X
643 integer, intent(in) :: I
645 elemental real(kind=4) function _gfortran_ieee_scalb_4_4 (X, I)
646 real(kind=4), intent(in) :: X
647 integer, intent(in) :: I
653 #ifdef HAVE_GFC_INTEGER_16
654 #ifdef HAVE_GFC_REAL_16
655 _gfortran_ieee_scalb_16_16, &
657 #ifdef HAVE_GFC_REAL_10
658 _gfortran_ieee_scalb_10_16, &
660 _gfortran_ieee_scalb_8_16, &
661 _gfortran_ieee_scalb_4_16, &
663 #ifdef HAVE_GFC_INTEGER_8
664 #ifdef HAVE_GFC_REAL_16
665 _gfortran_ieee_scalb_16_8, &
667 #ifdef HAVE_GFC_REAL_10
668 _gfortran_ieee_scalb_10_8, &
670 _gfortran_ieee_scalb_8_8, &
671 _gfortran_ieee_scalb_4_8, &
673 #ifdef HAVE_GFC_INTEGER_2
674 #ifdef HAVE_GFC_REAL_16
675 _gfortran_ieee_scalb_16_2, &
677 #ifdef HAVE_GFC_REAL_10
678 _gfortran_ieee_scalb_10_2, &
680 _gfortran_ieee_scalb_8_2, &
681 _gfortran_ieee_scalb_4_2, &
683 #ifdef HAVE_GFC_INTEGER_1
684 #ifdef HAVE_GFC_REAL_16
685 _gfortran_ieee_scalb_16_1, &
687 #ifdef HAVE_GFC_REAL_10
688 _gfortran_ieee_scalb_10_1, &
690 _gfortran_ieee_scalb_8_1, &
691 _gfortran_ieee_scalb_4_1, &
693 #ifdef HAVE_GFC_REAL_16
694 _gfortran_ieee_scalb_16_4, &
696 #ifdef HAVE_GFC_REAL_10
697 _gfortran_ieee_scalb_10_4, &
699 _gfortran_ieee_scalb_8_4, &
700 _gfortran_ieee_scalb_4_4
708 #ifdef HAVE_GFC_REAL_16
711 #ifdef HAVE_GFC_REAL_10
714 IEEE_VALUE_8, IEEE_VALUE_4
722 #ifdef HAVE_GFC_REAL_16
725 #ifdef HAVE_GFC_REAL_10
728 IEEE_CLASS_8, IEEE_CLASS_4
732 ! Public declarations for contained procedures
733 public :: IEEE_GET_ROUNDING_MODE, IEEE_SET_ROUNDING_MODE
734 public :: IEEE_GET_UNDERFLOW_MODE, IEEE_SET_UNDERFLOW_MODE
735 public :: IEEE_SELECTED_REAL_KIND
737 ! IEEE_SUPPORT_ROUNDING
739 interface IEEE_SUPPORT_ROUNDING
740 module procedure IEEE_SUPPORT_ROUNDING_4, IEEE_SUPPORT_ROUNDING_8, &
741 #ifdef HAVE_GFC_REAL_10
742 IEEE_SUPPORT_ROUNDING_10, &
744 #ifdef HAVE_GFC_REAL_16
745 IEEE_SUPPORT_ROUNDING_16, &
747 IEEE_SUPPORT_ROUNDING_NOARG
749 public :: IEEE_SUPPORT_ROUNDING
751 ! Interface to the FPU-specific function
753 pure integer function support_rounding_helper(flag) &
754 bind(c, name="_gfortrani_support_fpu_rounding_mode")
755 integer, intent(in), value :: flag
759 ! IEEE_SUPPORT_UNDERFLOW_CONTROL
761 interface IEEE_SUPPORT_UNDERFLOW_CONTROL
762 module procedure IEEE_SUPPORT_UNDERFLOW_CONTROL_4, &
763 IEEE_SUPPORT_UNDERFLOW_CONTROL_8, &
764 #ifdef HAVE_GFC_REAL_10
765 IEEE_SUPPORT_UNDERFLOW_CONTROL_10, &
767 #ifdef HAVE_GFC_REAL_16
768 IEEE_SUPPORT_UNDERFLOW_CONTROL_16, &
770 IEEE_SUPPORT_UNDERFLOW_CONTROL_NOARG
772 public :: IEEE_SUPPORT_UNDERFLOW_CONTROL
774 ! Interface to the FPU-specific function
776 pure integer function support_underflow_control_helper(kind) &
777 bind(c, name="_gfortrani_support_fpu_underflow_control")
778 integer, intent(in), value :: kind
782 ! IEEE_SUPPORT_* generic functions
784 #if defined(HAVE_GFC_REAL_10) && defined(HAVE_GFC_REAL_16)
785 # define MACRO1(NAME) NAME/**/_4, NAME/**/_8, NAME/**/_10, NAME/**/_16, NAME/**/_NOARG
786 #elif defined(HAVE_GFC_REAL_10)
787 # define MACRO1(NAME) NAME/**/_4, NAME/**/_8, NAME/**/_10, NAME/**/_NOARG
788 #elif defined(HAVE_GFC_REAL_16)
789 # define MACRO1(NAME) NAME/**/_4, NAME/**/_8, NAME/**/_16, NAME/**/_NOARG
791 # define MACRO1(NAME) NAME/**/_4, NAME/**/_8, NAME/**/_NOARG
794 #define SUPPORTGENERIC(NAME) \
795 interface NAME ; module procedure MACRO1(NAME) ; end interface ; \
798 SUPPORTGENERIC(IEEE_SUPPORT_DATATYPE)
799 SUPPORTGENERIC(IEEE_SUPPORT_DENORMAL)
800 SUPPORTGENERIC(IEEE_SUPPORT_SUBNORMAL)
801 SUPPORTGENERIC(IEEE_SUPPORT_DIVIDE)
802 SUPPORTGENERIC(IEEE_SUPPORT_INF)
803 SUPPORTGENERIC(IEEE_SUPPORT_IO)
804 SUPPORTGENERIC(IEEE_SUPPORT_NAN)
805 SUPPORTGENERIC(IEEE_SUPPORT_SQRT)
806 SUPPORTGENERIC(IEEE_SUPPORT_STANDARD)
810 ! Equality operators for IEEE_CLASS_TYPE and IEEE_ROUNDING_MODE
811 elemental logical function IEEE_CLASS_TYPE_EQ (X, Y) result(res)
813 type(IEEE_CLASS_TYPE), intent(in) :: X, Y
814 res = (X%hidden == Y%hidden)
817 elemental logical function IEEE_CLASS_TYPE_NE (X, Y) result(res)
819 type(IEEE_CLASS_TYPE), intent(in) :: X, Y
820 res = (X%hidden /= Y%hidden)
823 elemental logical function IEEE_ROUND_TYPE_EQ (X, Y) result(res)
825 type(IEEE_ROUND_TYPE), intent(in) :: X, Y
826 res = (X%hidden == Y%hidden)
829 elemental logical function IEEE_ROUND_TYPE_NE (X, Y) result(res)
831 type(IEEE_ROUND_TYPE), intent(in) :: X, Y
832 res = (X%hidden /= Y%hidden)
836 ! IEEE_SELECTED_REAL_KIND
838 integer function IEEE_SELECTED_REAL_KIND (P, R, RADIX) result(res)
840 integer, intent(in), optional :: P, R, RADIX
842 ! Currently, if IEEE is supported and this module is built, it means
843 ! all our floating-point types conform to IEEE. Hence, we simply call
844 ! SELECTED_REAL_KIND.
846 res = SELECTED_REAL_KIND (P, R, RADIX)
853 elemental function IEEE_CLASS_4 (X) result(res)
855 real(kind=4), intent(in) :: X
856 type(IEEE_CLASS_TYPE) :: res
859 pure integer function _gfortrani_ieee_class_helper_4(val)
860 real(kind=4), intent(in) :: val
864 res = IEEE_CLASS_TYPE(_gfortrani_ieee_class_helper_4(X))
867 elemental function IEEE_CLASS_8 (X) result(res)
869 real(kind=8), intent(in) :: X
870 type(IEEE_CLASS_TYPE) :: res
873 pure integer function _gfortrani_ieee_class_helper_8(val)
874 real(kind=8), intent(in) :: val
878 res = IEEE_CLASS_TYPE(_gfortrani_ieee_class_helper_8(X))
881 #ifdef HAVE_GFC_REAL_10
882 elemental function IEEE_CLASS_10 (X) result(res)
884 real(kind=10), intent(in) :: X
885 type(IEEE_CLASS_TYPE) :: res
888 pure integer function _gfortrani_ieee_class_helper_10(val)
889 real(kind=10), intent(in) :: val
893 res = IEEE_CLASS_TYPE(_gfortrani_ieee_class_helper_10(X))
897 #ifdef HAVE_GFC_REAL_16
898 elemental function IEEE_CLASS_16 (X) result(res)
900 real(kind=16), intent(in) :: X
901 type(IEEE_CLASS_TYPE) :: res
904 pure integer function _gfortrani_ieee_class_helper_16(val)
905 real(kind=16), intent(in) :: val
909 res = IEEE_CLASS_TYPE(_gfortrani_ieee_class_helper_16(X))
916 elemental real(kind=4) function IEEE_VALUE_4(X, CLASS) result(res)
918 real(kind=4), intent(in) :: X
919 type(IEEE_CLASS_TYPE), intent(in) :: CLASS
922 select case (CLASS%hidden)
923 case (1) ! IEEE_SIGNALING_NAN
924 if (ieee_support_halting(ieee_invalid)) then
925 call ieee_get_halting_mode(ieee_invalid, flag)
926 call ieee_set_halting_mode(ieee_invalid, .false.)
930 if (ieee_support_halting(ieee_invalid)) then
931 call ieee_set_halting_mode(ieee_invalid, flag)
933 case (2) ! IEEE_QUIET_NAN
934 if (ieee_support_halting(ieee_invalid)) then
935 call ieee_get_halting_mode(ieee_invalid, flag)
936 call ieee_set_halting_mode(ieee_invalid, .false.)
940 if (ieee_support_halting(ieee_invalid)) then
941 call ieee_set_halting_mode(ieee_invalid, flag)
943 case (3) ! IEEE_NEGATIVE_INF
944 if (ieee_support_halting(ieee_overflow)) then
945 call ieee_get_halting_mode(ieee_overflow, flag)
946 call ieee_set_halting_mode(ieee_overflow, .false.)
950 if (ieee_support_halting(ieee_overflow)) then
951 call ieee_set_halting_mode(ieee_overflow, flag)
953 case (4) ! IEEE_NEGATIVE_NORMAL
955 case (5) ! IEEE_NEGATIVE_DENORMAL
958 case (6) ! IEEE_NEGATIVE_ZERO
961 case (7) ! IEEE_POSITIVE_ZERO
963 case (8) ! IEEE_POSITIVE_DENORMAL
966 case (9) ! IEEE_POSITIVE_NORMAL
968 case (10) ! IEEE_POSITIVE_INF
969 if (ieee_support_halting(ieee_overflow)) then
970 call ieee_get_halting_mode(ieee_overflow, flag)
971 call ieee_set_halting_mode(ieee_overflow, .false.)
975 if (ieee_support_halting(ieee_overflow)) then
976 call ieee_set_halting_mode(ieee_overflow, flag)
978 case default ! IEEE_OTHER_VALUE, should not happen
983 elemental real(kind=8) function IEEE_VALUE_8(X, CLASS) result(res)
985 real(kind=8), intent(in) :: X
986 type(IEEE_CLASS_TYPE), intent(in) :: CLASS
989 select case (CLASS%hidden)
990 case (1) ! IEEE_SIGNALING_NAN
991 if (ieee_support_halting(ieee_invalid)) then
992 call ieee_get_halting_mode(ieee_invalid, flag)
993 call ieee_set_halting_mode(ieee_invalid, .false.)
997 if (ieee_support_halting(ieee_invalid)) then
998 call ieee_set_halting_mode(ieee_invalid, flag)
1000 case (2) ! IEEE_QUIET_NAN
1001 if (ieee_support_halting(ieee_invalid)) then
1002 call ieee_get_halting_mode(ieee_invalid, flag)
1003 call ieee_set_halting_mode(ieee_invalid, .false.)
1007 if (ieee_support_halting(ieee_invalid)) then
1008 call ieee_set_halting_mode(ieee_invalid, flag)
1010 case (3) ! IEEE_NEGATIVE_INF
1011 if (ieee_support_halting(ieee_overflow)) then
1012 call ieee_get_halting_mode(ieee_overflow, flag)
1013 call ieee_set_halting_mode(ieee_overflow, .false.)
1017 if (ieee_support_halting(ieee_overflow)) then
1018 call ieee_set_halting_mode(ieee_overflow, flag)
1020 case (4) ! IEEE_NEGATIVE_NORMAL
1022 case (5) ! IEEE_NEGATIVE_DENORMAL
1025 case (6) ! IEEE_NEGATIVE_ZERO
1028 case (7) ! IEEE_POSITIVE_ZERO
1030 case (8) ! IEEE_POSITIVE_DENORMAL
1033 case (9) ! IEEE_POSITIVE_NORMAL
1035 case (10) ! IEEE_POSITIVE_INF
1036 if (ieee_support_halting(ieee_overflow)) then
1037 call ieee_get_halting_mode(ieee_overflow, flag)
1038 call ieee_set_halting_mode(ieee_overflow, .false.)
1042 if (ieee_support_halting(ieee_overflow)) then
1043 call ieee_set_halting_mode(ieee_overflow, flag)
1045 case default ! IEEE_OTHER_VALUE, should not happen
1050 #ifdef HAVE_GFC_REAL_10
1051 elemental real(kind=10) function IEEE_VALUE_10(X, CLASS) result(res)
1053 real(kind=10), intent(in) :: X
1054 type(IEEE_CLASS_TYPE), intent(in) :: CLASS
1057 select case (CLASS%hidden)
1058 case (1) ! IEEE_SIGNALING_NAN
1059 if (ieee_support_halting(ieee_invalid)) then
1060 call ieee_get_halting_mode(ieee_invalid, flag)
1061 call ieee_set_halting_mode(ieee_invalid, .false.)
1065 if (ieee_support_halting(ieee_invalid)) then
1066 call ieee_set_halting_mode(ieee_invalid, flag)
1068 case (2) ! IEEE_QUIET_NAN
1069 if (ieee_support_halting(ieee_invalid)) then
1070 call ieee_get_halting_mode(ieee_invalid, flag)
1071 call ieee_set_halting_mode(ieee_invalid, .false.)
1075 if (ieee_support_halting(ieee_invalid)) then
1076 call ieee_set_halting_mode(ieee_invalid, flag)
1078 case (3) ! IEEE_NEGATIVE_INF
1079 if (ieee_support_halting(ieee_overflow)) then
1080 call ieee_get_halting_mode(ieee_overflow, flag)
1081 call ieee_set_halting_mode(ieee_overflow, .false.)
1085 if (ieee_support_halting(ieee_overflow)) then
1086 call ieee_set_halting_mode(ieee_overflow, flag)
1088 case (4) ! IEEE_NEGATIVE_NORMAL
1090 case (5) ! IEEE_NEGATIVE_DENORMAL
1093 case (6) ! IEEE_NEGATIVE_ZERO
1096 case (7) ! IEEE_POSITIVE_ZERO
1098 case (8) ! IEEE_POSITIVE_DENORMAL
1101 case (9) ! IEEE_POSITIVE_NORMAL
1103 case (10) ! IEEE_POSITIVE_INF
1104 if (ieee_support_halting(ieee_overflow)) then
1105 call ieee_get_halting_mode(ieee_overflow, flag)
1106 call ieee_set_halting_mode(ieee_overflow, .false.)
1110 if (ieee_support_halting(ieee_overflow)) then
1111 call ieee_set_halting_mode(ieee_overflow, flag)
1113 case default ! IEEE_OTHER_VALUE, should not happen
1120 #ifdef HAVE_GFC_REAL_16
1121 elemental real(kind=16) function IEEE_VALUE_16(X, CLASS) result(res)
1123 real(kind=16), intent(in) :: X
1124 type(IEEE_CLASS_TYPE), intent(in) :: CLASS
1127 select case (CLASS%hidden)
1128 case (1) ! IEEE_SIGNALING_NAN
1129 if (ieee_support_halting(ieee_invalid)) then
1130 call ieee_get_halting_mode(ieee_invalid, flag)
1131 call ieee_set_halting_mode(ieee_invalid, .false.)
1135 if (ieee_support_halting(ieee_invalid)) then
1136 call ieee_set_halting_mode(ieee_invalid, flag)
1138 case (2) ! IEEE_QUIET_NAN
1139 if (ieee_support_halting(ieee_invalid)) then
1140 call ieee_get_halting_mode(ieee_invalid, flag)
1141 call ieee_set_halting_mode(ieee_invalid, .false.)
1145 if (ieee_support_halting(ieee_invalid)) then
1146 call ieee_set_halting_mode(ieee_invalid, flag)
1148 case (3) ! IEEE_NEGATIVE_INF
1149 if (ieee_support_halting(ieee_overflow)) then
1150 call ieee_get_halting_mode(ieee_overflow, flag)
1151 call ieee_set_halting_mode(ieee_overflow, .false.)
1155 if (ieee_support_halting(ieee_overflow)) then
1156 call ieee_set_halting_mode(ieee_overflow, flag)
1158 case (4) ! IEEE_NEGATIVE_NORMAL
1160 case (5) ! IEEE_NEGATIVE_DENORMAL
1163 case (6) ! IEEE_NEGATIVE_ZERO
1166 case (7) ! IEEE_POSITIVE_ZERO
1168 case (8) ! IEEE_POSITIVE_DENORMAL
1171 case (9) ! IEEE_POSITIVE_NORMAL
1173 case (10) ! IEEE_POSITIVE_INF
1174 if (ieee_support_halting(ieee_overflow)) then
1175 call ieee_get_halting_mode(ieee_overflow, flag)
1176 call ieee_set_halting_mode(ieee_overflow, .false.)
1180 if (ieee_support_halting(ieee_overflow)) then
1181 call ieee_set_halting_mode(ieee_overflow, flag)
1183 case default ! IEEE_OTHER_VALUE, should not happen
1190 ! IEEE_GET_ROUNDING_MODE
1192 subroutine IEEE_GET_ROUNDING_MODE (ROUND_VALUE)
1194 type(IEEE_ROUND_TYPE), intent(out) :: ROUND_VALUE
1197 integer function helper() &
1198 bind(c, name="_gfortrani_get_fpu_rounding_mode")
1202 ROUND_VALUE = IEEE_ROUND_TYPE(helper())
1206 ! IEEE_SET_ROUNDING_MODE
1208 subroutine IEEE_SET_ROUNDING_MODE (ROUND_VALUE)
1210 type(IEEE_ROUND_TYPE), intent(in) :: ROUND_VALUE
1213 subroutine helper(val) &
1214 bind(c, name="_gfortrani_set_fpu_rounding_mode")
1215 integer, value :: val
1219 call helper(ROUND_VALUE%hidden)
1223 ! IEEE_GET_UNDERFLOW_MODE
1225 subroutine IEEE_GET_UNDERFLOW_MODE (GRADUAL)
1227 logical, intent(out) :: GRADUAL
1230 integer function helper() &
1231 bind(c, name="_gfortrani_get_fpu_underflow_mode")
1235 GRADUAL = (helper() /= 0)
1239 ! IEEE_SET_UNDERFLOW_MODE
1241 subroutine IEEE_SET_UNDERFLOW_MODE (GRADUAL)
1243 logical, intent(in) :: GRADUAL
1246 subroutine helper(val) &
1247 bind(c, name="_gfortrani_set_fpu_underflow_mode")
1248 integer, value :: val
1252 call helper(merge(1, 0, GRADUAL))
1255 ! IEEE_SUPPORT_ROUNDING
1257 pure logical function IEEE_SUPPORT_ROUNDING_4 (ROUND_VALUE, X) result(res)
1259 real(kind=4), intent(in) :: X
1260 type(IEEE_ROUND_TYPE), intent(in) :: ROUND_VALUE
1261 res = (support_rounding_helper(ROUND_VALUE%hidden) /= 0)
1264 pure logical function IEEE_SUPPORT_ROUNDING_8 (ROUND_VALUE, X) result(res)
1266 real(kind=8), intent(in) :: X
1267 type(IEEE_ROUND_TYPE), intent(in) :: ROUND_VALUE
1268 res = (support_rounding_helper(ROUND_VALUE%hidden) /= 0)
1271 #ifdef HAVE_GFC_REAL_10
1272 pure logical function IEEE_SUPPORT_ROUNDING_10 (ROUND_VALUE, X) result(res)
1274 real(kind=10), intent(in) :: X
1275 type(IEEE_ROUND_TYPE), intent(in) :: ROUND_VALUE
1276 res = (support_rounding_helper(ROUND_VALUE%hidden) /= 0)
1280 #ifdef HAVE_GFC_REAL_16
1281 pure logical function IEEE_SUPPORT_ROUNDING_16 (ROUND_VALUE, X) result(res)
1283 real(kind=16), intent(in) :: X
1284 type(IEEE_ROUND_TYPE), intent(in) :: ROUND_VALUE
1285 res = (support_rounding_helper(ROUND_VALUE%hidden) /= 0)
1289 pure logical function IEEE_SUPPORT_ROUNDING_NOARG (ROUND_VALUE) result(res)
1291 type(IEEE_ROUND_TYPE), intent(in) :: ROUND_VALUE
1292 res = (support_rounding_helper(ROUND_VALUE%hidden) /= 0)
1295 ! IEEE_SUPPORT_UNDERFLOW_CONTROL
1297 pure logical function IEEE_SUPPORT_UNDERFLOW_CONTROL_4 (X) result(res)
1299 real(kind=4), intent(in) :: X
1300 res = (support_underflow_control_helper(4) /= 0)
1303 pure logical function IEEE_SUPPORT_UNDERFLOW_CONTROL_8 (X) result(res)
1305 real(kind=8), intent(in) :: X
1306 res = (support_underflow_control_helper(8) /= 0)
1309 #ifdef HAVE_GFC_REAL_10
1310 pure logical function IEEE_SUPPORT_UNDERFLOW_CONTROL_10 (X) result(res)
1312 real(kind=10), intent(in) :: X
1313 res = (support_underflow_control_helper(10) /= 0)
1317 #ifdef HAVE_GFC_REAL_16
1318 pure logical function IEEE_SUPPORT_UNDERFLOW_CONTROL_16 (X) result(res)
1320 real(kind=16), intent(in) :: X
1321 res = (support_underflow_control_helper(16) /= 0)
1325 pure logical function IEEE_SUPPORT_UNDERFLOW_CONTROL_NOARG () result(res)
1327 res = (support_underflow_control_helper(4) /= 0 &
1328 .and. support_underflow_control_helper(8) /= 0 &
1329 #ifdef HAVE_GFC_REAL_10
1330 .and. support_underflow_control_helper(10) /= 0 &
1332 #ifdef HAVE_GFC_REAL_16
1333 .and. support_underflow_control_helper(16) /= 0 &
1338 ! IEEE_SUPPORT_* functions
1340 #define SUPPORTMACRO(NAME, INTKIND, VALUE) \
1341 pure logical function NAME/**/_/**/INTKIND (X) result(res) ; \
1343 real(INTKIND), intent(in) :: X(..) ; \
1347 #define SUPPORTMACRO_NOARG(NAME, VALUE) \
1348 pure logical function NAME/**/_NOARG () result(res) ; \
1353 ! IEEE_SUPPORT_DATATYPE
1355 SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,4,.true.)
1356 SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,8,.true.)
1357 #ifdef HAVE_GFC_REAL_10
1358 SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,10,.true.)
1360 #ifdef HAVE_GFC_REAL_16
1361 SUPPORTMACRO(IEEE_SUPPORT_DATATYPE,16,.true.)
1363 SUPPORTMACRO_NOARG(IEEE_SUPPORT_DATATYPE,.true.)
1365 ! IEEE_SUPPORT_DENORMAL and IEEE_SUPPORT_SUBNORMAL
1367 SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,4,.true.)
1368 SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,8,.true.)
1369 #ifdef HAVE_GFC_REAL_10
1370 SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,10,.true.)
1372 #ifdef HAVE_GFC_REAL_16
1373 SUPPORTMACRO(IEEE_SUPPORT_DENORMAL,16,.true.)
1375 SUPPORTMACRO_NOARG(IEEE_SUPPORT_DENORMAL,.true.)
1377 SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,4,.true.)
1378 SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,8,.true.)
1379 #ifdef HAVE_GFC_REAL_10
1380 SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,10,.true.)
1382 #ifdef HAVE_GFC_REAL_16
1383 SUPPORTMACRO(IEEE_SUPPORT_SUBNORMAL,16,.true.)
1385 SUPPORTMACRO_NOARG(IEEE_SUPPORT_SUBNORMAL,.true.)
1387 ! IEEE_SUPPORT_DIVIDE
1389 SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,4,.true.)
1390 SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,8,.true.)
1391 #ifdef HAVE_GFC_REAL_10
1392 SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,10,.true.)
1394 #ifdef HAVE_GFC_REAL_16
1395 SUPPORTMACRO(IEEE_SUPPORT_DIVIDE,16,.true.)
1397 SUPPORTMACRO_NOARG(IEEE_SUPPORT_DIVIDE,.true.)
1401 SUPPORTMACRO(IEEE_SUPPORT_INF,4,.true.)
1402 SUPPORTMACRO(IEEE_SUPPORT_INF,8,.true.)
1403 #ifdef HAVE_GFC_REAL_10
1404 SUPPORTMACRO(IEEE_SUPPORT_INF,10,.true.)
1406 #ifdef HAVE_GFC_REAL_16
1407 SUPPORTMACRO(IEEE_SUPPORT_INF,16,.true.)
1409 SUPPORTMACRO_NOARG(IEEE_SUPPORT_INF,.true.)
1413 SUPPORTMACRO(IEEE_SUPPORT_IO,4,.true.)
1414 SUPPORTMACRO(IEEE_SUPPORT_IO,8,.true.)
1415 #ifdef HAVE_GFC_REAL_10
1416 SUPPORTMACRO(IEEE_SUPPORT_IO,10,.true.)
1418 #ifdef HAVE_GFC_REAL_16
1419 SUPPORTMACRO(IEEE_SUPPORT_IO,16,.true.)
1421 SUPPORTMACRO_NOARG(IEEE_SUPPORT_IO,.true.)
1425 SUPPORTMACRO(IEEE_SUPPORT_NAN,4,.true.)
1426 SUPPORTMACRO(IEEE_SUPPORT_NAN,8,.true.)
1427 #ifdef HAVE_GFC_REAL_10
1428 SUPPORTMACRO(IEEE_SUPPORT_NAN,10,.true.)
1430 #ifdef HAVE_GFC_REAL_16
1431 SUPPORTMACRO(IEEE_SUPPORT_NAN,16,.true.)
1433 SUPPORTMACRO_NOARG(IEEE_SUPPORT_NAN,.true.)
1437 SUPPORTMACRO(IEEE_SUPPORT_SQRT,4,.true.)
1438 SUPPORTMACRO(IEEE_SUPPORT_SQRT,8,.true.)
1439 #ifdef HAVE_GFC_REAL_10
1440 SUPPORTMACRO(IEEE_SUPPORT_SQRT,10,.true.)
1442 #ifdef HAVE_GFC_REAL_16
1443 SUPPORTMACRO(IEEE_SUPPORT_SQRT,16,.true.)
1445 SUPPORTMACRO_NOARG(IEEE_SUPPORT_SQRT,.true.)
1447 ! IEEE_SUPPORT_STANDARD
1449 SUPPORTMACRO(IEEE_SUPPORT_STANDARD,4,.true.)
1450 SUPPORTMACRO(IEEE_SUPPORT_STANDARD,8,.true.)
1451 #ifdef HAVE_GFC_REAL_10
1452 SUPPORTMACRO(IEEE_SUPPORT_STANDARD,10,.true.)
1454 #ifdef HAVE_GFC_REAL_16
1455 SUPPORTMACRO(IEEE_SUPPORT_STANDARD,16,.true.)
1457 SUPPORTMACRO_NOARG(IEEE_SUPPORT_STANDARD,.true.)
1459 end module IEEE_ARITHMETIC