145 lines · plain
1!===-- module/iso_fortran_env_impl.f90 --=--------------------------------===!2!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-exception6!7!===------------------------------------------------------------------------===!8 9! This MODULE implements part of the ISO_FORTRAN_ENV module file, which10! partially requires linkable symbols for some entities defined11! (e.g., real_kinds).12 13module iso_fortran_env_impl14 implicit none15 private16 17 ! INTEGER types18 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), &25 selectedInt8 >= 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), &33 selectedInt128 >= 0)34 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)46 47 ! UNSIGNED types48 integer, parameter, public :: &49 selectedUInt8 = selected_unsigned_kind(2), &50 selectedUInt16 = selected_unsigned_kind(4), &51 selectedUInt32 = selected_unsigned_kind(9), &52 selectedUInt64 = selected_unsigned_kind(18),&53 selectedUInt128 = selected_unsigned_kind(38), &54 safeUInt8 = merge(selectedUInt8, selected_unsigned_kind(0), &55 selectedUInt8 >= 0), &56 safeUInt16 = merge(selectedUInt16, selected_unsigned_kind(0), &57 selectedUInt16 >= 0), &58 safeUInt32 = merge(selectedUInt32, selected_unsigned_kind(0), &59 selectedUInt32 >= 0), &60 safeUInt64 = merge(selectedUInt64, selected_unsigned_kind(0), &61 selectedUInt64 >= 0), &62 safeUInt128 = merge(selectedUInt128, selected_unsigned_kind(0), &63 selectedUInt128 >= 0)64 65 integer, parameter, public :: &66 uint8 = merge(selectedUInt8, merge(-2, -1, selectedUInt8 >= 0), &67 digits(uint(0,kind=safeUInt8)) == 8), &68 uint16 = merge(selectedUInt16, merge(-2, -1, selectedUInt16 >= 0), &69 digits(uint(0,kind=safeUInt16)) == 16), &70 uint32 = merge(selectedUInt32, merge(-2, -1, selectedUInt32 >= 0), &71 digits(uint(0,kind=safeUInt32)) == 32), &72 uint64 = merge(selectedUInt64, merge(-2, -1, selectedUInt64 >= 0), &73 digits(uint(0,kind=safeUInt64)) == 64), &74 uint128 = merge(selectedUInt128, merge(-2, -1, selectedUInt128 >= 0), &75 digits(uint(0,kind=safeUInt128)) == 128)76 77 integer, parameter, dimension(*), public :: __builtin_integer_kinds = [ &78 selected_int_kind(0), &79 [(pack([selected_int_kind(k)], &80 selected_int_kind(k) >= 0 .and. &81 selected_int_kind(k) /= selected_int_kind(k-1)), &82 integer :: k=1, 39)]]83 84 ! LOGICAL TYPES85 integer, parameter, public :: &86 logical8 = int8, logical16 = int16, logical32 = int32, logical64 = int6487 88 integer, parameter, dimension(*), public :: __builtin_logical_kinds = [ &89 pack([logical8], logical8 >= 0), &90 pack([logical16], logical16 >= 0), &91 pack([logical32], logical32 >= 0), &92 pack([logical64], logical64 >= 0) &93 ]94 95 ! REAL types96 integer, parameter, public :: &97 selectedReal16 = selected_real_kind(3, 4), & ! IEEE half98 selectedBfloat16 = selected_real_kind(2, 37), & ! truncated IEEE single99 selectedReal32 = selected_real_kind(6, 37), & ! IEEE single100 selectedReal64 = selected_real_kind(15, 307), & ! IEEE double101 selectedReal80 = selected_real_kind(18, 4931), & ! 80x87 extended102 selectedReal64x2 = selected_real_kind(31, 307), & ! "double-double"103 selectedReal128 = selected_real_kind(33, 4931), & ! IEEE quad104 safeReal16 = merge(selectedReal16, selected_real_kind(0,0), &105 selectedReal16 >= 0), &106 safeBfloat16 = merge(selectedBfloat16, selected_real_kind(0,0), &107 selectedBfloat16 >= 0), &108 safeReal32 = merge(selectedReal32, selected_real_kind(0,0), &109 selectedReal32 >= 0), &110 safeReal64 = merge(selectedReal64, selected_real_kind(0,0), &111 selectedReal64 >= 0), &112 safeReal80 = merge(selectedReal80, selected_real_kind(0,0), &113 selectedReal80 >= 0), &114 safeReal64x2 = merge(selectedReal64x2, selected_real_kind(0,0), &115 selectedReal64x2 >= 0), &116 safeReal128 = merge(selectedReal128, selected_real_kind(0,0), &117 selectedReal128 >= 0)118 119 integer, parameter, public :: &120 real16 = merge(selectedReal16, merge(-2, -1, selectedReal16 >= 0), &121 digits(real(0,kind=safeReal16)) == 11), &122 bfloat16 = merge(selectedBfloat16, merge(-2, -1, selectedBfloat16 >= 0), &123 digits(real(0,kind=safeBfloat16)) == 8), &124 real32 = merge(selectedReal32, merge(-2, -1, selectedReal32 >= 0), &125 digits(real(0,kind=safeReal32)) == 24), &126 real64 = merge(selectedReal64, merge(-2, -1, selectedReal64 >= 0), &127 digits(real(0,kind=safeReal64)) == 53), &128 real80 = merge(selectedReal80, merge(-2, -1, selectedReal80 >= 0), &129 digits(real(0,kind=safeReal80)) == 64), &130 real64x2 = merge(selectedReal64x2, merge(-2, -1, selectedReal64x2 >= 0), &131 digits(real(0,kind=safeReal64x2)) == 106), &132 real128 = merge(selectedReal128, merge(-2, -1, selectedReal128 >= 0), &133 digits(real(0,kind=safeReal128)) == 113)134 135 integer, parameter, dimension(*), public :: __builtin_real_kinds = [ &136 pack([real16], real16 >= 0), &137 pack([bfloat16], bfloat16 >= 0), &138 pack([real32], real32 >= 0), &139 pack([real64], real64 >= 0), &140 pack([real80], real80 >= 0), &141 pack([real64x2], real64x2 >= 0), &142 pack([real128], real128 >= 0) &143 ]144end module iso_fortran_env_impl145