brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · 5408e7d Raw
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