annotate libgfortran/intrinsics/f2c_specifics.F90 @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ! Copyright (C) 2002-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
2 ! Contributed by Tobias Schl"uter
kono
parents:
diff changeset
3 !
kono
parents:
diff changeset
4 !This file is part of the GNU Fortran 95 runtime library (libgfortran).
kono
parents:
diff changeset
5 !
kono
parents:
diff changeset
6 !GNU libgfortran is free software; you can redistribute it and/or
kono
parents:
diff changeset
7 !modify it under the terms of the GNU General Public
kono
parents:
diff changeset
8 !License as published by the Free Software Foundation; either
kono
parents:
diff changeset
9 !version 3 of the License, or (at your option) any later version.
kono
parents:
diff changeset
10 !
kono
parents:
diff changeset
11 !GNU libgfortran is distributed in the hope that it will be useful,
kono
parents:
diff changeset
12 !but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
13 !MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
14 !GNU General Public License for more details.
kono
parents:
diff changeset
15 !
kono
parents:
diff changeset
16 !Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
17 !permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
18 !3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
19 !
kono
parents:
diff changeset
20 !You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
21 !a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
22 !see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
23 !<http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 ! Specifics for the intrinsics whose calling conventions change if
kono
parents:
diff changeset
26 ! -ff2c is used.
kono
parents:
diff changeset
27 !
kono
parents:
diff changeset
28 ! There are two annoyances WRT the preprocessor:
kono
parents:
diff changeset
29 ! - we're using -traditional-cpp, so we can't use the ## operator.
kono
parents:
diff changeset
30 ! - macros expand to a single line, and Fortran lines can't be wider
kono
parents:
diff changeset
31 ! than 132 characters, therefore we use two macros to split the lines
kono
parents:
diff changeset
32 !
kono
parents:
diff changeset
33 ! The cases we need to implement are functions returning default REAL
kono
parents:
diff changeset
34 ! or COMPLEX. The former need to return DOUBLE PRECISION instead of REAL,
kono
parents:
diff changeset
35 ! the latter become subroutines returning via a hidden first argument.
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 ! one argument functions
kono
parents:
diff changeset
38 #define REAL_HEAD(NAME) \
kono
parents:
diff changeset
39 elemental function _gfortran_f2c_specific__/**/NAME/**/_r4 (parm) result(res);
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 #define REAL_BODY(NAME) \
kono
parents:
diff changeset
42 REAL, intent (in) :: parm; \
kono
parents:
diff changeset
43 DOUBLE PRECISION :: res; \
kono
parents:
diff changeset
44 res = NAME (parm); \
kono
parents:
diff changeset
45 end function
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 #define COMPLEX_HEAD(NAME) \
kono
parents:
diff changeset
48 subroutine _gfortran_f2c_specific__/**/NAME/**/_c4 (res, parm);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 #define COMPLEX_BODY(NAME) \
kono
parents:
diff changeset
51 COMPLEX, intent (in) :: parm; \
kono
parents:
diff changeset
52 COMPLEX, intent (out) :: res; \
kono
parents:
diff changeset
53 res = NAME (parm); \
kono
parents:
diff changeset
54 end subroutine
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 #define DCOMPLEX_HEAD(NAME) \
kono
parents:
diff changeset
57 subroutine _gfortran_f2c_specific__/**/NAME/**/_c8 (res, parm);
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 #define DCOMPLEX_BODY(NAME) \
kono
parents:
diff changeset
60 DOUBLE COMPLEX, intent (in) :: parm; \
kono
parents:
diff changeset
61 DOUBLE COMPLEX, intent (out) :: res; \
kono
parents:
diff changeset
62 res = NAME (parm); \
kono
parents:
diff changeset
63 end subroutine
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 REAL_HEAD(abs)
kono
parents:
diff changeset
66 REAL_BODY(abs)
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 ! abs is special in that the result is real
kono
parents:
diff changeset
69 elemental function _gfortran_f2c_specific__abs_c4 (parm) result (res)
kono
parents:
diff changeset
70 COMPLEX, intent(in) :: parm
kono
parents:
diff changeset
71 DOUBLE PRECISION :: res
kono
parents:
diff changeset
72 res = abs(parm)
kono
parents:
diff changeset
73 end function
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 ! aimag is special in that the result is real
kono
parents:
diff changeset
77 elemental function _gfortran_f2c_specific__aimag_c4 (parm)
kono
parents:
diff changeset
78 complex(kind=4), intent(in) :: parm
kono
parents:
diff changeset
79 double precision :: _gfortran_f2c_specific__aimag_c4
kono
parents:
diff changeset
80 _gfortran_f2c_specific__aimag_c4 = aimag(parm)
kono
parents:
diff changeset
81 end function
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 elemental function _gfortran_f2c_specific__aimag_c8 (parm)
kono
parents:
diff changeset
84 complex(kind=8), intent(in) :: parm
kono
parents:
diff changeset
85 double precision :: _gfortran_f2c_specific__aimag_c8
kono
parents:
diff changeset
86 _gfortran_f2c_specific__aimag_c8 = aimag(parm)
kono
parents:
diff changeset
87 end function
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 REAL_HEAD(exp)
kono
parents:
diff changeset
91 REAL_BODY(exp)
kono
parents:
diff changeset
92 COMPLEX_HEAD(exp)
kono
parents:
diff changeset
93 COMPLEX_BODY(exp)
kono
parents:
diff changeset
94 DCOMPLEX_HEAD(exp)
kono
parents:
diff changeset
95 DCOMPLEX_BODY(exp)
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 REAL_HEAD(log)
kono
parents:
diff changeset
98 REAL_BODY(log)
kono
parents:
diff changeset
99 COMPLEX_HEAD(log)
kono
parents:
diff changeset
100 COMPLEX_BODY(log)
kono
parents:
diff changeset
101 DCOMPLEX_HEAD(log)
kono
parents:
diff changeset
102 DCOMPLEX_BODY(log)
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 REAL_HEAD(log10)
kono
parents:
diff changeset
105 REAL_BODY(log10)
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 REAL_HEAD(sqrt)
kono
parents:
diff changeset
108 REAL_BODY(sqrt)
kono
parents:
diff changeset
109 COMPLEX_HEAD(sqrt)
kono
parents:
diff changeset
110 COMPLEX_BODY(sqrt)
kono
parents:
diff changeset
111 DCOMPLEX_HEAD(sqrt)
kono
parents:
diff changeset
112 DCOMPLEX_BODY(sqrt)
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 REAL_HEAD(asin)
kono
parents:
diff changeset
115 REAL_BODY(asin)
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 REAL_HEAD(acos)
kono
parents:
diff changeset
118 REAL_BODY(acos)
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 REAL_HEAD(atan)
kono
parents:
diff changeset
121 REAL_BODY(atan)
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 REAL_HEAD(asinh)
kono
parents:
diff changeset
124 REAL_BODY(asinh)
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 REAL_HEAD(acosh)
kono
parents:
diff changeset
127 REAL_BODY(acosh)
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 REAL_HEAD(atanh)
kono
parents:
diff changeset
130 REAL_BODY(atanh)
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 REAL_HEAD(sin)
kono
parents:
diff changeset
133 REAL_BODY(sin)
kono
parents:
diff changeset
134 COMPLEX_HEAD(sin)
kono
parents:
diff changeset
135 COMPLEX_BODY(sin)
kono
parents:
diff changeset
136 DCOMPLEX_HEAD(sin)
kono
parents:
diff changeset
137 DCOMPLEX_BODY(sin)
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 REAL_HEAD(cos)
kono
parents:
diff changeset
140 REAL_BODY(cos)
kono
parents:
diff changeset
141 COMPLEX_HEAD(cos)
kono
parents:
diff changeset
142 COMPLEX_BODY(cos)
kono
parents:
diff changeset
143 DCOMPLEX_HEAD(cos)
kono
parents:
diff changeset
144 DCOMPLEX_BODY(cos)
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 REAL_HEAD(tan)
kono
parents:
diff changeset
147 REAL_BODY(tan)
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 REAL_HEAD(sinh)
kono
parents:
diff changeset
150 REAL_BODY(sinh)
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 REAL_HEAD(cosh)
kono
parents:
diff changeset
153 REAL_BODY(cosh)
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 REAL_HEAD(tanh)
kono
parents:
diff changeset
156 REAL_BODY(tanh)
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 REAL_HEAD(aint)
kono
parents:
diff changeset
159 REAL_BODY(aint)
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 REAL_HEAD(anint)
kono
parents:
diff changeset
162 REAL_BODY(anint)
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 ! two argument functions
kono
parents:
diff changeset
165 #define REAL2_HEAD(NAME) \
kono
parents:
diff changeset
166 elemental function _gfortran_f2c_specific__/**/NAME/**/_r4 (p1, p2) result(res);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 #define REAL2_BODY(NAME) \
kono
parents:
diff changeset
169 REAL, intent (in) :: p1, p2; \
kono
parents:
diff changeset
170 DOUBLE PRECISION :: res; \
kono
parents:
diff changeset
171 res = NAME (p1, p2); \
kono
parents:
diff changeset
172 end function
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 REAL2_HEAD(sign)
kono
parents:
diff changeset
175 REAL2_BODY(sign)
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 REAL2_HEAD(dim)
kono
parents:
diff changeset
178 REAL2_BODY(dim)
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 REAL2_HEAD(atan2)
kono
parents:
diff changeset
181 REAL2_BODY(atan2)
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 REAL2_HEAD(mod)
kono
parents:
diff changeset
184 REAL2_BODY(mod)
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 ! conjg is special-cased because it is not suffixed _c4 but _4
kono
parents:
diff changeset
187 subroutine _gfortran_f2c_specific__conjg_4 (res, parm)
kono
parents:
diff changeset
188 COMPLEX, intent (in) :: parm
kono
parents:
diff changeset
189 COMPLEX, intent (out) :: res
kono
parents:
diff changeset
190 res = conjg (parm)
kono
parents:
diff changeset
191 end subroutine
kono
parents:
diff changeset
192 subroutine _gfortran_f2c_specific__conjg_8 (res, parm)
kono
parents:
diff changeset
193 DOUBLE COMPLEX, intent (in) :: parm
kono
parents:
diff changeset
194 DOUBLE COMPLEX, intent (out) :: res
kono
parents:
diff changeset
195 res = conjg (parm)
kono
parents:
diff changeset
196 end subroutine
kono
parents:
diff changeset
197