Home | History | Annotate | Line # | Download | only in intrinsics
      1  1.1.1.3  mrg !   Copyright (C) 2003-2022 Free Software Foundation, Inc.
      2      1.1  mrg !   Contributed by Kejia Zhao <kejia_zh@yahoo.com.cn>
      3      1.1  mrg !
      4      1.1  mrg !This file is part of the GNU Fortran runtime library (libgfortran).
      5      1.1  mrg !
      6      1.1  mrg !Libgfortran is free software; you can redistribute it and/or
      7      1.1  mrg !modify it under the terms of the GNU General Public
      8      1.1  mrg !License as published by the Free Software Foundation; either
      9      1.1  mrg !version 3 of the License, or (at your option) any later version.
     10      1.1  mrg !
     11      1.1  mrg !Libgfortran is distributed in the hope that it will be useful,
     12      1.1  mrg !but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  mrg !MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  mrg !GNU General Public License for more details.
     15      1.1  mrg !
     16      1.1  mrg !Under Section 7 of GPL version 3, you are granted additional
     17      1.1  mrg !permissions described in the GCC Runtime Library Exception, version
     18      1.1  mrg !3.1, as published by the Free Software Foundation.
     19      1.1  mrg !
     20      1.1  mrg !You should have received a copy of the GNU General Public License and
     21      1.1  mrg !a copy of the GCC Runtime Library Exception along with this program;
     22      1.1  mrg !see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23      1.1  mrg !.
     24      1.1  mrg 
     25      1.1  mrg function _gfortran_selected_real_kind2008 (p, r, rdx)
     26      1.1  mrg   implicit none
     27      1.1  mrg   integer, optional, intent (in) :: p, r, rdx
     28      1.1  mrg   integer :: _gfortran_selected_real_kind2008
     29      1.1  mrg   integer :: i, p2, r2, radix2
     30      1.1  mrg   logical :: found_p, found_r, found_radix
     31      1.1  mrg   ! Real kind_precision_range table
     32      1.1  mrg   type :: real_info
     33      1.1  mrg     integer :: kind
     34      1.1  mrg     integer :: precision
     35      1.1  mrg     integer :: range
     36      1.1  mrg     integer :: radix
     37      1.1  mrg   end type real_info
     38      1.1  mrg 
     39      1.1  mrg   include "selected_real_kind.inc"
     40      1.1  mrg 
     41      1.1  mrg   _gfortran_selected_real_kind2008 = 0
     42      1.1  mrg   p2 = 0
     43      1.1  mrg   r2 = 0
     44      1.1  mrg   radix2 = 0
     45      1.1  mrg   found_p = .false.
     46      1.1  mrg   found_r = .false.
     47      1.1  mrg   found_radix = .false.
     48      1.1  mrg 
     49      1.1  mrg   if (present (p)) p2 = p
     50      1.1  mrg   if (present (r)) r2 = r
     51      1.1  mrg   if (present (rdx)) radix2 = rdx
     52      1.1  mrg 
     53      1.1  mrg   ! Assumes each type has a greater precision and range than previous one.
     54      1.1  mrg 
     55      1.1  mrg   do i = 1, c
     56      1.1  mrg     if (p2 <= real_infos (i) % precision) found_p = .true.
     57      1.1  mrg     if (r2 <= real_infos (i) % range) found_r = .true.
     58      1.1  mrg     if (radix2 <= real_infos (i) % radix) found_radix = .true.
     59      1.1  mrg 
     60      1.1  mrg     if (p2 <= real_infos (i) % precision   &
     61      1.1  mrg         .and. r2 <= real_infos (i) % range &
     62      1.1  mrg         .and. radix2 <= real_infos (i) % radix) then
     63      1.1  mrg       _gfortran_selected_real_kind2008 = real_infos (i) % kind
     64      1.1  mrg       return
     65      1.1  mrg     end if
     66      1.1  mrg   end do
     67      1.1  mrg 
     68      1.1  mrg   if (found_radix .and. found_r .and. .not. found_p) then
     69      1.1  mrg     _gfortran_selected_real_kind2008 = -1
     70      1.1  mrg   elseif (found_radix .and. found_p .and. .not. found_r) then
     71      1.1  mrg     _gfortran_selected_real_kind2008 = -2
     72      1.1  mrg   elseif (found_radix .and. .not. found_p .and. .not. found_r) then
     73      1.1  mrg     _gfortran_selected_real_kind2008 = -3
     74      1.1  mrg   elseif (found_radix) then
     75      1.1  mrg     _gfortran_selected_real_kind2008 = -4
     76      1.1  mrg   else
     77      1.1  mrg     _gfortran_selected_real_kind2008 = -5
     78      1.1  mrg   end if
     79      1.1  mrg end function _gfortran_selected_real_kind2008
     80      1.1  mrg 
     81      1.1  mrg function _gfortran_selected_real_kind (p, r)
     82      1.1  mrg   implicit none
     83      1.1  mrg   integer, optional, intent (in) :: p, r
     84      1.1  mrg   integer :: _gfortran_selected_real_kind
     85      1.1  mrg 
     86      1.1  mrg   interface
     87      1.1  mrg     function _gfortran_selected_real_kind2008 (p, r, rdx)
     88      1.1  mrg       implicit none
     89      1.1  mrg       integer, optional, intent (in) :: p, r, rdx
     90      1.1  mrg       integer :: _gfortran_selected_real_kind2008
     91      1.1  mrg     end function _gfortran_selected_real_kind2008
     92      1.1  mrg   end interface
     93      1.1  mrg 
     94      1.1  mrg   _gfortran_selected_real_kind = _gfortran_selected_real_kind2008 (p, r)
     95      1.1  mrg end function
     96