1 !===-- module/iso_fortran_env_impl.f90 --=--------------------------------===!
3 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 ! See https://llvm.org/LICENSE.txt for license information.
5 ! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 !===------------------------------------------------------------------------===!
9 ! This MODULE implements part of the ISO_FORTRAN_ENV module file, which
10 ! partially requires linkable symbols for some entities defined
13 module iso_fortran_env_impl
18 integer, parameter, public
:: &
19 selectedInt8
= selected_int_kind(2), &
20 selectedInt16
= selected_int_kind(4), &
21 selectedInt32
= selected_int_kind(9), &
22 selectedInt64
= selected_int_kind(18),&
23 selectedInt128
= selected_int_kind(38), &
24 safeInt8
= merge(selectedInt8
, selected_int_kind(0), &
26 safeInt16
= merge(selectedInt16
, selected_int_kind(0), &
27 selectedInt16
>= 0), &
28 safeInt32
= merge(selectedInt32
, selected_int_kind(0), &
29 selectedInt32
>= 0), &
30 safeInt64
= merge(selectedInt64
, selected_int_kind(0), &
31 selectedInt64
>= 0), &
32 safeInt128
= merge(selectedInt128
, selected_int_kind(0), &
35 integer, parameter, public
:: &
36 int8
= merge(selectedInt8
, merge(-2, -1, selectedInt8
>= 0), &
37 digits(int(0,kind
=safeInt8
)) == 7), &
38 int16
= merge(selectedInt16
, merge(-2, -1, selectedInt16
>= 0), &
39 digits(int(0,kind
=safeInt16
)) == 15), &
40 int32
= merge(selectedInt32
, merge(-2, -1, selectedInt32
>= 0), &
41 digits(int(0,kind
=safeInt32
)) == 31), &
42 int64
= merge(selectedInt64
, merge(-2, -1, selectedInt64
>= 0), &
43 digits(int(0,kind
=safeInt64
)) == 63), &
44 int128
= merge(selectedInt128
, merge(-2, -1, selectedInt128
>= 0), &
45 digits(int(0,kind
=safeInt128
)) == 127)
47 integer, parameter, dimension(*), public
:: __builtin_integer_kinds
= [ &
48 selected_int_kind(0), &
49 [(pack([selected_int_kind(k
)], &
50 selected_int_kind(k
) >= 0 .and
. &
51 selected_int_kind(k
) /= selected_int_kind(k
-1)), &
55 integer, parameter, public
:: &
56 logical8
= int8
, logical16
= int16
, logical32
= int32
, logical64
= int64
58 integer, parameter, dimension(*), public
:: __builtin_logical_kinds
= [ &
59 pack([logical8
], logical8
>= 0), &
60 pack([logical16
], logical16
>= 0), &
61 pack([logical32
], logical32
>= 0), &
62 pack([logical64
], logical64
>= 0) &
66 integer, parameter, public
:: &
67 selectedReal16
= selected_real_kind(3, 4), & ! IEEE half
68 selectedBfloat16
= selected_real_kind(2, 37), & ! truncated IEEE single
69 selectedReal32
= selected_real_kind(6, 37), & ! IEEE single
70 selectedReal64
= selected_real_kind(15, 307), & ! IEEE double
71 selectedReal80
= selected_real_kind(18, 4931), & ! 80x87 extended
72 selectedReal64x2
= selected_real_kind(31, 307), & ! "double-double"
73 selectedReal128
= selected_real_kind(33, 4931), & ! IEEE quad
74 safeReal16
= merge(selectedReal16
, selected_real_kind(0,0), &
75 selectedReal16
>= 0), &
76 safeBfloat16
= merge(selectedBfloat16
, selected_real_kind(0,0), &
77 selectedBfloat16
>= 0), &
78 safeReal32
= merge(selectedReal32
, selected_real_kind(0,0), &
79 selectedReal32
>= 0), &
80 safeReal64
= merge(selectedReal64
, selected_real_kind(0,0), &
81 selectedReal64
>= 0), &
82 safeReal80
= merge(selectedReal80
, selected_real_kind(0,0), &
83 selectedReal80
>= 0), &
84 safeReal64x2
= merge(selectedReal64x2
, selected_real_kind(0,0), &
85 selectedReal64x2
>= 0), &
86 safeReal128
= merge(selectedReal128
, selected_real_kind(0,0), &
89 integer, parameter, public
:: &
90 real16
= merge(selectedReal16
, merge(-2, -1, selectedReal16
>= 0), &
91 digits(real(0,kind
=safeReal16
)) == 11), &
92 bfloat16
= merge(selectedBfloat16
, merge(-2, -1, selectedBfloat16
>= 0), &
93 digits(real(0,kind
=safeBfloat16
)) == 8), &
94 real32
= merge(selectedReal32
, merge(-2, -1, selectedReal32
>= 0), &
95 digits(real(0,kind
=safeReal32
)) == 24), &
96 real64
= merge(selectedReal64
, merge(-2, -1, selectedReal64
>= 0), &
97 digits(real(0,kind
=safeReal64
)) == 53), &
98 real80
= merge(selectedReal80
, merge(-2, -1, selectedReal80
>= 0), &
99 digits(real(0,kind
=safeReal80
)) == 64), &
100 real64x2
= merge(selectedReal64x2
, merge(-2, -1, selectedReal64x2
>= 0), &
101 digits(real(0,kind
=safeReal64x2
)) == 106), &
102 real128
= merge(selectedReal128
, merge(-2, -1, selectedReal128
>= 0), &
103 digits(real(0,kind
=safeReal128
)) == 113)
105 integer, parameter, dimension(*), public
:: __builtin_real_kinds
= [ &
106 pack([real16
], real16
>= 0), &
107 pack([bfloat16
], bfloat16
>= 0), &
108 pack([real32
], real32
>= 0), &
109 pack([real64
], real64
>= 0), &
110 pack([real80
], real80
>= 0), &
111 pack([real64x2
], real64x2
>= 0), &
112 pack([real128
], real128
>= 0) &
114 end module iso_fortran_env_impl