intrinsic.c
1 //! @file intrinsic.c
2 //! @author J. Marcel van der Veer
3 //
4 //! @section Copyright
5 //
6 // This file is part of VIF - vintage FORTRAN compiler.
7 // Copyright 2020-2025 J. Marcel van der Veer <algol68g@xs4all.nl>.
8 //
9 //! @section License
10 //
11 // This program is free software; you can redistribute it and/or modify it
12 // under the terms of the GNU General Public License as published by the
13 // Free Software Foundation; either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful, but
17 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 // more details. You should have received a copy of the GNU General Public
20 // License along with this program. If not, see <http://www.gnu.org/licenses/>.
21
22 //! @section Synopsis
23 //!
24 //! Compile inline intrinsic functions.
25
26 #include <vif.h>
27
28 // VIF intrinsic function definitions.
29
30 #define INTR(_ffun, _spec, _bfun, _cfun, _rtyp, _rlen, _anum, _atyp, _alen, _f1, _f2, _f3) \
31 {.ffun = (_ffun), .spec = (_spec), .bfun = _bfun, .cfun = (_cfun), .rtyp = (_rtyp), \
32 .rlen = (_rlen), .anum = (_anum), .atyp = (_atyp), .alen = (_alen), \
33 .f1 = (_f1), .f2 = (_f2), .f3 = (_f3)}
34
35 static INTRINS fun[] = {
36 // CHARACTER
37 INTR ("achar", FALSE, NO_TEXT, "_char", CHARACTER, 1, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
38 INTR ("iachar", FALSE, NO_TEXT, "_ichar", INTEGER, 4, 1, CHARACTER, 0, NO_FUN, NO_FUN, NO_FUN),
39 INTR ("char", FALSE, NO_TEXT, "_char", CHARACTER, 1, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
40 INTR ("ichar", FALSE, NO_TEXT, "_ichar", INTEGER, 4, 1, CHARACTER, 0, NO_FUN, NO_FUN, NO_FUN),
41 INTR ("len", TRUE, NO_TEXT, "(int_4) strlen", INTEGER, 4, 1, CHARACTER, 0, NO_FUN, NO_FUN, NO_FUN),
42 // INTEGER generic
43 INTR ("abs", FALSE, NO_TEXT, "_abs", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
44 INTR ("abs", FALSE, NO_TEXT, "_abs", INTEGER, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
45 INTR ("abs", FALSE, NO_TEXT, "_abs", INTEGER, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
46 INTR ("amax0", FALSE, "(real_4)", "_max", REAL, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
47 INTR ("amin0", FALSE, "(real_4)", "_min", REAL, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
48 INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
49 INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
50 INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
51 INTR ("dfloat", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
52 INTR ("dfloat", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
53 INTR ("dfloat", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
54 INTR ("dim", FALSE, NO_TEXT, "_dim_", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
55 INTR ("dim", FALSE, NO_TEXT, "_dim_", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
56 INTR ("dim", FALSE, NO_TEXT, "_dim_", INTEGER, 8, 2, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
57 INTR ("float", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
58 INTR ("float", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
59 INTR ("float", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
60 INTR ("idnint", FALSE, NO_TEXT, "_nintd", INTEGER, 4, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
61 INTR ("int", FALSE, "(int_4)", "_aintd", INTEGER, 4, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
62 INTR ("int", FALSE, "(int_4)", "_aintf", INTEGER, 4, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
63 INTR ("int", FALSE, "(int_4)", "_aintq", INTEGER, 4, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
64 INTR ("int", FALSE, NO_TEXT, "", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
65 INTR ("int", FALSE, NO_TEXT, "", INTEGER, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
66 INTR ("int", FALSE, NO_TEXT, "", INTEGER, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
67 INTR ("int", FALSE, NO_TEXT, "_xint4", INTEGER, 4, 1, REAL, 32, _aintx, NO_FUN, NO_FUN),
68 INTR ("max0", FALSE, NO_TEXT, "_max", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
69 INTR ("max", FALSE, NO_TEXT, "_max", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
70 INTR ("max", FALSE, NO_TEXT, "_max", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
71 INTR ("max", FALSE, NO_TEXT, "_max", INTEGER, 8, 0, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
72 INTR ("min0", FALSE, NO_TEXT, "_min", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
73 INTR ("min", FALSE, NO_TEXT, "_min", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
74 INTR ("min", FALSE, NO_TEXT, "_min", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
75 INTR ("min", FALSE, NO_TEXT, "_min", INTEGER, 8, 0, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
76 INTR ("mod", FALSE, NO_TEXT, "_imod", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
77 INTR ("mod", FALSE, NO_TEXT, "_imod", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
78 INTR ("mod", FALSE, NO_TEXT, "_imod", INTEGER, 8, 2, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
79 INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 2, _xI, NO_FUN, NO_FUN),
80 INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
81 INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
82 INTR ("qfloat", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
83 INTR ("qfloat", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
84 INTR ("qfloat", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
85 INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 2, _xI, NO_FUN, NO_FUN),
86 INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
87 INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
88 INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 2, _xI, NO_FUN, NO_FUN),
89 INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
90 INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
91 INTR ("sign", FALSE, NO_TEXT, "_sign", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
92 INTR ("sign", FALSE, NO_TEXT, "_sign", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
93 INTR ("sign", FALSE, NO_TEXT, "_sign", INTEGER, 8, 2, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
94 INTR ("xext", FALSE, "inttox", "(int_4)", REAL, 32, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
95 INTR ("xext", FALSE, NO_TEXT, "inttox", REAL, 32, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
96 INTR ("xext", FALSE, "quadtox", "(real_16)", REAL, 32, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
97 INTR ("xfloat", FALSE, "inttox", "(int_4)", REAL, 32, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
98 INTR ("xfloat", FALSE, NO_TEXT, "inttox", REAL, 32, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
99 INTR ("xfloat", FALSE, "quadtox", "(real_16)", REAL, 32, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
100 // INTEGER specific
101 INTR ("dfloat", TRUE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
102 INTR ("habs", TRUE, "(int_2)", "_abs", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
103 INTR ("hdim", TRUE, "(int_2)", "_dim_", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
104 INTR ("hdint", TRUE, "(int_2)", "_aintf", INTEGER, 2, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
105 INTR ("hfix", TRUE, "(int_2)", "_aintf", INTEGER, 2, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
106 INTR ("hint", TRUE, NO_TEXT, "(int_2)", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
107 INTR ("hmax", TRUE, "(int_2)", "_max", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
108 INTR ("hmin", TRUE, "(int_2)", "_min", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
109 INTR ("hmod", TRUE, "(int_2)", "_mod", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
110 INTR ("hsign", TRUE, "(int_2)", "_sign", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
111 INTR ("iabs", TRUE, "(int_4)", "_abs", INTEGER, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
112 INTR ("idim", TRUE, "(int_4)", "_dim_", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
113 INTR ("idint", TRUE, "(int_4)", "_aintf", INTEGER, 4, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
114 INTR ("ifix", TRUE, "(int_4)", "_aintf", INTEGER, 4, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
115 INTR ("imax", TRUE, "(int_4)", "_max", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
116 INTR ("imin", TRUE, "(int_4)", "_min", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
117 INTR ("imod", TRUE, "(int_4)", "_mod", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
118 INTR ("iqint", TRUE, "(int_4)", "_aintq", INTEGER, 4, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
119 INTR ("isign", TRUE, "(int_4)", "_sign", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
120 INTR ("ixint", TRUE, NO_TEXT, "_xint4", INTEGER, 4, 1, REAL, 32, _aintx, NO_FUN, NO_FUN),
121 INTR ("max1", TRUE, "(int_4)", "_max", INTEGER, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
122 INTR ("min1", TRUE, "(int_4)", "_min", INTEGER, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
123 // REAL generic
124 INTR ("abs", FALSE, NO_TEXT, "_abs", REAL, 4, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
125 INTR ("abs", FALSE, NO_TEXT, "_abs", REAL, 8, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
126 INTR ("abs", FALSE, NO_TEXT, "_abs", REAL, 16, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
127 INTR ("abs", FALSE, NO_TEXT, "xabs", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
128 INTR ("acos", FALSE, NO_TEXT, "acosf", REAL, 4, 1, REAL, 4, xacos, NO_FUN, NO_FUN),
129 INTR ("acos", FALSE, NO_TEXT, "acos", REAL, 8, 1, REAL, 8, xacos, NO_FUN, NO_FUN),
130 INTR ("acos", FALSE, NO_TEXT, "acosq", REAL, 16, 1, REAL, 16, xacos, NO_FUN, NO_FUN),
131 INTR ("acos", FALSE, NO_TEXT, "xacos", REAL, 32, 1, REAL, 32, xacos, NO_FUN, NO_FUN),
132 INTR ("acosh", FALSE, NO_TEXT, "acoshf", REAL, 4, 1, REAL, 4, xacosh, NO_FUN, NO_FUN),
133 INTR ("acosh", FALSE, NO_TEXT, "acosh", REAL, 8, 1, REAL, 8, xacosh, NO_FUN, NO_FUN),
134 INTR ("acosh", FALSE, NO_TEXT, "acoshq", REAL, 16, 1, REAL, 16, xacosh, NO_FUN, NO_FUN),
135 INTR ("acosh", FALSE, NO_TEXT, "xacosh", REAL, 32, 1, REAL, 32, xacosh, NO_FUN, NO_FUN),
136 INTR ("acotan", FALSE, NO_TEXT, "acotanf", REAL, 4, 1, REAL, 4, xacotan, NO_FUN, NO_FUN),
137 INTR ("acotan", FALSE, NO_TEXT, "acotan", REAL, 8, 1, REAL, 8, xacotan, NO_FUN, NO_FUN),
138 INTR ("acotan", FALSE, NO_TEXT, "acotanq", REAL, 16, 1, REAL, 16, xacotan, NO_FUN, NO_FUN),
139 INTR ("acotan", FALSE, NO_TEXT, "xacotan", REAL, 32, 1, REAL, 32, xacotan, NO_FUN, NO_FUN),
140 INTR ("aint", FALSE, NO_TEXT, "_aintd", REAL, 8, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
141 INTR ("aint", FALSE, NO_TEXT, "_aintf", REAL, 4, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
142 INTR ("aint", FALSE, NO_TEXT, "_aintd", REAL, 16, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
143 INTR ("aint", FALSE, NO_TEXT, "_aintx", REAL, 32, 1, REAL, 32, _aintx, NO_FUN, NO_FUN),
144 INTR ("anint", FALSE, NO_TEXT, "_anintd", REAL, 8, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
145 INTR ("anint", FALSE, NO_TEXT, "_anintf", REAL, 4, 1, REAL, 4, _anintx, NO_FUN, NO_FUN),
146 INTR ("anint", FALSE, NO_TEXT, "_anintq", REAL, 16, 1, REAL, 16, _anintx, NO_FUN, NO_FUN),
147 INTR ("anint", FALSE, NO_TEXT, "_anintx", REAL, 32, 1, REAL, 32, _anintx, NO_FUN, NO_FUN),
148 INTR ("asin", FALSE, NO_TEXT, "asinf", REAL, 4, 1, REAL, 4, xasin, NO_FUN, NO_FUN),
149 INTR ("asin", FALSE, NO_TEXT, "asin", REAL, 8, 1, REAL, 8, xasin, NO_FUN, NO_FUN),
150 INTR ("asin", FALSE, NO_TEXT, "asinq", REAL, 16, 1, REAL, 16, xasin, NO_FUN, NO_FUN),
151 INTR ("asin", FALSE, NO_TEXT, "xasin", REAL, 32, 1, REAL, 32, xasin, NO_FUN, NO_FUN),
152 INTR ("asinh", FALSE, NO_TEXT, "asinhf", REAL, 4, 1, REAL, 4, xasinh, NO_FUN, NO_FUN),
153 INTR ("asinh", FALSE, NO_TEXT, "asinh", REAL, 8, 1, REAL, 8, xasinh, NO_FUN, NO_FUN),
154 INTR ("asinh", FALSE, NO_TEXT, "asinhq", REAL, 16, 1, REAL, 16, xasinh, NO_FUN, NO_FUN),
155 INTR ("asinh", FALSE, NO_TEXT, "xasinh", REAL, 32, 1, REAL, 32, xasinh, NO_FUN, NO_FUN),
156 INTR ("atan2", FALSE, NO_TEXT, "atan2f", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
157 INTR ("atan2", FALSE, NO_TEXT, "atan2", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
158 INTR ("atan2", FALSE, NO_TEXT, "atan2q", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
159 INTR ("atan2", FALSE, NO_TEXT, "xatan2", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
160 INTR ("atan", FALSE, NO_TEXT, "atanf", REAL, 4, 1, REAL, 4, xatan, NO_FUN, NO_FUN),
161 INTR ("atan", FALSE, NO_TEXT, "atan", REAL, 8, 1, REAL, 8, xatan, NO_FUN, NO_FUN),
162 INTR ("atan", FALSE, NO_TEXT, "atanq", REAL, 16, 1, REAL, 16, xatan, NO_FUN, NO_FUN),
163 INTR ("atan", FALSE, NO_TEXT, "xatan", REAL, 32, 1, REAL, 32, xatan, NO_FUN, NO_FUN),
164 INTR ("atanh", FALSE, NO_TEXT, "atanhf", REAL, 4, 1, REAL, 4, xatanh, NO_FUN, NO_FUN),
165 INTR ("atanh", FALSE, NO_TEXT, "atanh", REAL, 8, 1, REAL, 8, xatanh, NO_FUN, NO_FUN),
166 INTR ("atanh", FALSE, NO_TEXT, "atanhq", REAL, 16, 1, REAL, 16, xatanh, NO_FUN, NO_FUN),
167 INTR ("atanh", FALSE, NO_TEXT, "xatanh", REAL, 32, 1, REAL, 32, xatanh, NO_FUN, NO_FUN),
168 INTR ("cos", FALSE, NO_TEXT, "cosf", REAL, 4, 1, REAL, 4, xcos, NO_FUN, NO_FUN),
169 INTR ("cos", FALSE, NO_TEXT, "cos", REAL, 8, 1, REAL, 8, xcos, NO_FUN, NO_FUN),
170 INTR ("cos", FALSE, NO_TEXT, "cosq", REAL, 16, 1, REAL, 16, xcos, NO_FUN, NO_FUN),
171 INTR ("cos", FALSE, NO_TEXT, "xcos", REAL, 32, 1, REAL, 32, xcos, NO_FUN, NO_FUN),
172 INTR ("cosh", FALSE, NO_TEXT, "coshf", REAL, 4, 1, REAL, 4, xcosh, NO_FUN, NO_FUN),
173 INTR ("cosh", FALSE, NO_TEXT, "cosh", REAL, 8, 1, REAL, 8, xcosh, NO_FUN, NO_FUN),
174 INTR ("cosh", FALSE, NO_TEXT, "coshq", REAL, 16, 1, REAL, 16, xcosh, NO_FUN, NO_FUN),
175 INTR ("cosh", FALSE, NO_TEXT, "xcosh", REAL, 32, 1, REAL, 32, xcosh, NO_FUN, NO_FUN),
176 INTR ("cotan", FALSE, NO_TEXT, "cotanf", REAL, 4, 1, REAL, 4, xcotan, NO_FUN, NO_FUN),
177 INTR ("cotan", FALSE, NO_TEXT, "cotan", REAL, 8, 1, REAL, 8, xcotan, NO_FUN, NO_FUN),
178 INTR ("cotan", FALSE, NO_TEXT, "cotanq", REAL, 16, 1, REAL, 16, xcotan, NO_FUN, NO_FUN),
179 INTR ("cotan", FALSE, NO_TEXT, "xcotan", REAL, 32, 1, REAL, 32, xcotan, NO_FUN, NO_FUN),
180 INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
181 INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
182 INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
183 INTR ("dble", FALSE, NO_TEXT, "xtodbl", REAL, 8, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
184 INTR ("dim", FALSE, NO_TEXT, "_dim_", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
185 INTR ("dim", FALSE, NO_TEXT, "_dim_", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
186 INTR ("dim", FALSE, NO_TEXT, "_dim_", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
187 INTR ("dim", FALSE, NO_TEXT, "_xdimx", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
188 INTR ("exp", FALSE, NO_TEXT, "expf", REAL, 4, 1, REAL, 4, xexp, NO_FUN, NO_FUN),
189 INTR ("exp", FALSE, NO_TEXT, "exp", REAL, 8, 1, REAL, 8, xexp, NO_FUN, NO_FUN),
190 INTR ("exp", FALSE, NO_TEXT, "expq", REAL, 16, 1, REAL, 16, xexp, NO_FUN, NO_FUN),
191 INTR ("exp", FALSE, NO_TEXT, "xexp", REAL, 32, 1, REAL, 32, xexp, NO_FUN, NO_FUN),
192 INTR ("log10", FALSE, NO_TEXT, "log10f", REAL, 4, 1, REAL, 4, xlog10, NO_FUN, NO_FUN),
193 INTR ("log10", FALSE, NO_TEXT, "log10", REAL, 8, 1, REAL, 8, xlog10, NO_FUN, NO_FUN),
194 INTR ("log10", FALSE, NO_TEXT, "log10q", REAL, 16, 1, REAL, 16, xlog10, NO_FUN, NO_FUN),
195 INTR ("log10", FALSE, NO_TEXT, "xlog10", REAL, 32, 1, REAL, 32, xlog10, NO_FUN, NO_FUN),
196 INTR ("log", FALSE, NO_TEXT, "logf", REAL, 4, 1, REAL, 4, xlog, NO_FUN, NO_FUN),
197 INTR ("log", FALSE, NO_TEXT, "log", REAL, 8, 1, REAL, 8, xlog, NO_FUN, NO_FUN),
198 INTR ("log", FALSE, NO_TEXT, "logq", REAL, 16, 1, REAL, 16, xlog, NO_FUN, NO_FUN),
199 INTR ("log", FALSE, NO_TEXT, "xlog", REAL, 32, 1, REAL, 32, xlog, NO_FUN, NO_FUN),
200 INTR ("max", FALSE, NO_TEXT, "_max", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
201 INTR ("max", FALSE, NO_TEXT, "_max", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
202 INTR ("max", FALSE, NO_TEXT, "_max", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
203 INTR ("max", FALSE, NO_TEXT, "_xmax", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
204 INTR ("min", FALSE, NO_TEXT, "_min", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
205 INTR ("min", FALSE, NO_TEXT, "_min", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
206 INTR ("min", FALSE, NO_TEXT, "_min", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
207 INTR ("min", FALSE, NO_TEXT, "_xmin", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
208 INTR ("mod", FALSE, NO_TEXT, "fmodf", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
209 INTR ("mod", FALSE, NO_TEXT, "fmod", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
210 INTR ("mod", FALSE, NO_TEXT, "fmodq", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
211 INTR ("mod", FALSE, NO_TEXT, "_xmod", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
212 INTR ("nint", FALSE, NO_TEXT, "_nintf", INTEGER, 4, 1, REAL, 4, _anintx, NO_FUN, NO_FUN),
213 INTR ("nint", FALSE, NO_TEXT, "_nintd", INTEGER, 4, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
214 INTR ("nint", FALSE, NO_TEXT, "_nintq", INTEGER, 4, 1, REAL, 16, _anintx, NO_FUN, NO_FUN),
215 INTR ("nint", FALSE, NO_TEXT, "_xnint4", INTEGER, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
216 INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
217 INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
218 INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
219 INTR ("qext", FALSE, NO_TEXT, "xtoquad", REAL, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
220 INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
221 INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
222 INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
223 INTR ("qreal", FALSE, NO_TEXT, "xtoquad", REAL, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
224 INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
225 INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
226 INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
227 INTR ("real", FALSE, NO_TEXT, "xtoflt", REAL, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
228 INTR ("sngl", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
229 INTR ("snglq", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
230 INTR ("snglx", FALSE, NO_TEXT, "xtoflt", REAL, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
231 INTR ("sign", FALSE, NO_TEXT, "_sign", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
232 INTR ("sign", FALSE, NO_TEXT, "_sign", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
233 INTR ("sign", FALSE, NO_TEXT, "_sign", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
234 INTR ("sign", FALSE, NO_TEXT, "_xsgn", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
235 INTR ("sin", FALSE, NO_TEXT, "sinf", REAL, 4, 1, REAL, 4, xsin, NO_FUN, NO_FUN),
236 INTR ("sin", FALSE, NO_TEXT, "sin", REAL, 8, 1, REAL, 8, xsin, NO_FUN, NO_FUN),
237 INTR ("sin", FALSE, NO_TEXT, "sinq", REAL, 16, 1, REAL, 16, xsin, NO_FUN, NO_FUN),
238 INTR ("sin", FALSE, NO_TEXT, "xsin", REAL, 32, 1, REAL, 32, xsin, NO_FUN, NO_FUN),
239 INTR ("sinh", FALSE, NO_TEXT, "sinhf", REAL, 4, 1, REAL, 4, xsinh, NO_FUN, NO_FUN),
240 INTR ("sinh", FALSE, NO_TEXT, "sinh", REAL, 8, 1, REAL, 8, xsinh, NO_FUN, NO_FUN),
241 INTR ("sinh", FALSE, NO_TEXT, "sinhq", REAL, 16, 1, REAL, 16, xsinh, NO_FUN, NO_FUN),
242 INTR ("sinh", FALSE, NO_TEXT, "xsinh", REAL, 32, 1, REAL, 32, xsinh, NO_FUN, NO_FUN),
243 INTR ("sqrt", FALSE, NO_TEXT, "sqrtf", REAL, 4, 1, REAL, 4, xsqrt, NO_FUN, NO_FUN),
244 INTR ("sqrt", FALSE, NO_TEXT, "sqrt", REAL, 8, 1, REAL, 8, xsqrt, NO_FUN, NO_FUN),
245 INTR ("sqrt", FALSE, NO_TEXT, "sqrtq", REAL, 16, 1, REAL, 16, xsqrt, NO_FUN, NO_FUN),
246 INTR ("sqrt", FALSE, NO_TEXT, "xsqrt", REAL, 32, 1, REAL, 32, xsqrt, NO_FUN, NO_FUN),
247 INTR ("tan", FALSE, NO_TEXT, "tanf", REAL, 4, 1, REAL, 4, xtan, NO_FUN, NO_FUN),
248 INTR ("tan", FALSE, NO_TEXT, "tan", REAL, 8, 1, REAL, 8, xtan, NO_FUN, NO_FUN),
249 INTR ("tan", FALSE, NO_TEXT, "tanq", REAL, 16, 1, REAL, 16, xtan, NO_FUN, NO_FUN),
250 INTR ("tan", FALSE, NO_TEXT, "xtan", REAL, 32, 1, REAL, 32, xtan, NO_FUN, NO_FUN),
251 INTR ("tanh", FALSE, NO_TEXT, "tanhf", REAL, 4, 1, REAL, 4, xtanh, NO_FUN, NO_FUN),
252 INTR ("tanh", FALSE, NO_TEXT, "tanh", REAL, 8, 1, REAL, 8, xtanh, NO_FUN, NO_FUN),
253 INTR ("tanh", FALSE, NO_TEXT, "tanhq", REAL, 16, 1, REAL, 16, xtanh, NO_FUN, NO_FUN),
254 INTR ("tanh", FALSE, NO_TEXT, "xtanh", REAL, 32, 1, REAL, 32, xtanh, NO_FUN, NO_FUN),
255 INTR ("xext", FALSE, NO_TEXT, "dbltox", REAL, 32, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
256 INTR ("xext", FALSE, NO_TEXT, "dbltox", REAL, 32, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
257 INTR ("xext", FALSE, NO_TEXT, "quadtox", REAL, 32, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
258 INTR ("xext", FALSE, NO_TEXT, "", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
259 // REAL*4 specific
260 INTR ("acosf", TRUE, NO_TEXT, "acosf", REAL, 4, 1, REAL, 4, xacos, NO_FUN, NO_FUN),
261 INTR ("acoshf", TRUE, NO_TEXT, "acoshf", REAL, 4, 1, REAL, 4, xacosh, NO_FUN, NO_FUN),
262 INTR ("acotanf", TRUE, NO_TEXT, "acotanf", REAL, 4, 1, REAL, 4, xacotan, NO_FUN, NO_FUN),
263 INTR ("atan2f", TRUE, NO_TEXT, "atan2f", REAL, 4, 2, REAL, 4, NO_FUN, xatan2, NO_FUN),
264 INTR ("atanf", TRUE, NO_TEXT, "atanf", REAL, 4, 1, REAL, 4, xatan, NO_FUN, NO_FUN),
265 INTR ("atanhf", TRUE, NO_TEXT, "atanhf", REAL, 4, 1, REAL, 4, xatanh, NO_FUN, NO_FUN),
266 INTR ("asinf", TRUE, NO_TEXT, "asinf", REAL, 4, 1, REAL, 4, xasin, NO_FUN, NO_FUN),
267 INTR ("asinhf", FALSE, NO_TEXT, "asinhf", REAL, 4, 1, REAL, 4, xasinh, NO_FUN, NO_FUN),
268 INTR ("cosf", TRUE, NO_TEXT, "cosf", REAL, 4, 1, REAL, 4, xcos, NO_FUN, NO_FUN),
269 INTR ("coshf", TRUE, NO_TEXT, "coshf", REAL, 4, 1, REAL, 4, xcosh, NO_FUN, NO_FUN),
270 INTR ("cotanf", TRUE, NO_TEXT, "cotanf", REAL, 4, 1, REAL, 4, xcotan, NO_FUN, NO_FUN),
271 INTR ("expf", TRUE, NO_TEXT, "expf", REAL, 4, 1, REAL, 4, xexp, NO_FUN, NO_FUN),
272 INTR ("log10f", TRUE, NO_TEXT, "log10f", REAL, 4, 1, REAL, 4, xlog10, NO_FUN, NO_FUN),
273 INTR ("logf", TRUE, NO_TEXT, "logf", REAL, 4, 1, REAL, 4, xlog, NO_FUN, NO_FUN),
274 INTR ("sinf", TRUE, NO_TEXT, "sinf", REAL, 4, 1, REAL, 4, xsin, NO_FUN, NO_FUN),
275 INTR ("sinhf", TRUE, NO_TEXT, "sinhf", REAL, 4, 1, REAL, 4, xsinh, NO_FUN, NO_FUN),
276 INTR ("sqrtf", TRUE, NO_TEXT, "sqrtf", REAL, 4, 1, REAL, 4, xsqrt, NO_FUN, NO_FUN),
277 INTR ("tanf", TRUE, NO_TEXT, "tanf", REAL, 4, 1, REAL, 4, xtan, NO_FUN, NO_FUN),
278 INTR ("tanhf", TRUE, NO_TEXT, "tanhf", REAL, 4, 1, REAL, 4, xtanh, NO_FUN, NO_FUN),
279 // REAL specific
280 INTR ("alog10", TRUE, NO_TEXT, "log10f", REAL, 4, 1, REAL, 4, xlog10, NO_FUN, NO_FUN),
281 INTR ("alog", TRUE, NO_TEXT, "logf", REAL, 4, 1, REAL, 4, xlog, NO_FUN, NO_FUN),
282 INTR ("amax1", TRUE, NO_TEXT, "_max", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
283 INTR ("amin1", TRUE, NO_TEXT, "_min", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
284 INTR ("amod", TRUE, NO_TEXT, "fmodf", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
285 INTR ("dabs", TRUE, NO_TEXT, "_abs", REAL, 8, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
286 INTR ("dacosh", TRUE, NO_TEXT, "acosh", REAL, 8, 1, REAL, 8, xacosh, NO_FUN, NO_FUN),
287 INTR ("dacos", TRUE, NO_TEXT, "acos", REAL, 8, 1, REAL, 8, xacos, NO_FUN, NO_FUN),
288 INTR ("dacotan", TRUE, NO_TEXT, "dacotan", REAL, 8, 1, REAL, 8, xacotan, NO_FUN, NO_FUN),
289 INTR ("dasinh", TRUE, NO_TEXT, "asinh", REAL, 8, 1, REAL, 8, xasinh, NO_FUN, NO_FUN),
290 INTR ("dasin", TRUE, NO_TEXT, "asin", REAL, 8, 1, REAL, 8, xasin, NO_FUN, NO_FUN),
291 INTR ("datan2", TRUE, NO_TEXT, "atan2", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
292 INTR ("datanh", TRUE, NO_TEXT, "atanh", REAL, 8, 1, REAL, 8, xatanh, NO_FUN, NO_FUN),
293 INTR ("datan", TRUE, NO_TEXT, "atan", REAL, 8, 1, REAL, 8, xatan, NO_FUN, NO_FUN),
294 INTR ("dbleq", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
295 INTR ("dcosh", TRUE, NO_TEXT, "cosh", REAL, 8, 1, REAL, 8, xcosh, NO_FUN, NO_FUN),
296 INTR ("dcos", TRUE, NO_TEXT, "cos", REAL, 8, 1, REAL, 8, xcos, NO_FUN, NO_FUN),
297 INTR ("dcotan", TRUE, NO_TEXT, "cotan", REAL, 8, 1, REAL, 8, xcotan, NO_FUN, NO_FUN),
298 INTR ("ddim", TRUE, NO_TEXT, "_dim_", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
299 INTR ("dexp", TRUE, NO_TEXT, "exp", REAL, 8, 1, REAL, 8, xexp, NO_FUN, NO_FUN),
300 INTR ("dint", TRUE, NO_TEXT, "_aintd", REAL, 8, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
301 INTR ("dlog10", TRUE, NO_TEXT, "log10", REAL, 8, 1, REAL, 8, xlog10, NO_FUN, NO_FUN),
302 INTR ("dlog", TRUE, NO_TEXT, "log", REAL, 8, 1, REAL, 8, xlog, NO_FUN, NO_FUN),
303 INTR ("dmax1", TRUE, NO_TEXT, "_max", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
304 INTR ("dmax", TRUE, NO_TEXT, "_max", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
305 INTR ("dmin", TRUE, NO_TEXT, "_min", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
306 INTR ("dmod", TRUE, NO_TEXT, "fmod", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
307 INTR ("dnint", TRUE, NO_TEXT, "_anintd", REAL, 8, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
308 INTR ("dreal", TRUE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
309 INTR ("dsign", TRUE, NO_TEXT, "_sign", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
310 INTR ("dsinh", TRUE, NO_TEXT, "sinh", REAL, 8, 1, REAL, 8, xsinh, NO_FUN, NO_FUN),
311 INTR ("dsin", TRUE, NO_TEXT, "sin", REAL, 8, 1, REAL, 8, xsin, NO_FUN, NO_FUN),
312 INTR ("dsqrt", TRUE, NO_TEXT, "sqrt", REAL, 8, 1, REAL, 8, xsqrt, NO_FUN, NO_FUN),
313 INTR ("dtanh", TRUE, NO_TEXT, "tanh", REAL, 8, 1, REAL, 8, xtanh, NO_FUN, NO_FUN),
314 INTR ("dtan", TRUE, NO_TEXT, "tan", REAL, 8, 1, REAL, 8, xtan, NO_FUN, NO_FUN),
315 INTR ("qabs", TRUE, NO_TEXT, "_abs", REAL, 16, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
316 INTR ("qacosh", TRUE, NO_TEXT, "acoshq", REAL, 16, 1, REAL, 16, xacosh, NO_FUN, NO_FUN),
317 INTR ("qacos", TRUE, NO_TEXT, "acosq", REAL, 16, 1, REAL, 16, xacos, NO_FUN, NO_FUN),
318 INTR ("qacotan", TRUE, NO_TEXT, "cotanq", REAL, 16, 1, REAL, 16, xacotan, NO_FUN, NO_FUN),
319 INTR ("qasinh", TRUE, NO_TEXT, "asinhq", REAL, 16, 1, REAL, 16, xasinh, NO_FUN, NO_FUN),
320 INTR ("qasin", TRUE, NO_TEXT, "asinq", REAL, 16, 1, REAL, 16, xasin, NO_FUN, NO_FUN),
321 INTR ("qatan2", TRUE, NO_TEXT, "atan2q", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
322 INTR ("qatanh", TRUE, NO_TEXT, "atanhq", REAL, 16, 1, REAL, 16, xatanh, NO_FUN, NO_FUN),
323 INTR ("qatan", TRUE, NO_TEXT, "atanq", REAL, 16, 1, REAL, 16, xatan, NO_FUN, NO_FUN),
324 INTR ("qcosh", TRUE, NO_TEXT, "coshq", REAL, 16, 1, REAL, 16, xcosh, NO_FUN, NO_FUN),
325 INTR ("qcos", TRUE, NO_TEXT, "cosq", REAL, 16, 1, REAL, 16, xcos, NO_FUN, NO_FUN),
326 INTR ("qcotan", TRUE, NO_TEXT, "cotanq", REAL, 16, 1, REAL, 16, xcotan, NO_FUN, NO_FUN),
327 INTR ("qdim", TRUE, NO_TEXT, "_dim_", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
328 INTR ("qexp", TRUE, NO_TEXT, "expq", REAL, 16, 1, REAL, 16, xexp, NO_FUN, NO_FUN),
329 INTR ("qextd", TRUE, NO_TEXT, "_qext", REAL, 16, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
330 INTR ("qextx", TRUE, NO_TEXT, "xtoquad", REAL, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
331 INTR ("qint", TRUE, NO_TEXT, "_aintq", REAL, 16, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
332 INTR ("qlog10", TRUE, NO_TEXT, "log10q", REAL, 16, 1, REAL, 16, xlog10, NO_FUN, NO_FUN),
333 INTR ("qlog", TRUE, NO_TEXT, "logq", REAL, 16, 1, REAL, 16, xlog, NO_FUN, NO_FUN),
334 INTR ("qmax1", TRUE, NO_TEXT, "_max", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
335 INTR ("qmax", TRUE, NO_TEXT, "_max", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
336 INTR ("qmin1", TRUE, NO_TEXT, "_min", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
337 INTR ("qmin", TRUE, NO_TEXT, "_min", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
338 INTR ("qmod", TRUE, NO_TEXT, "fmodq", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
339 INTR ("qmod", TRUE, NO_TEXT, "_qmod", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
340 INTR ("qnint", TRUE, NO_TEXT, "_anintq", REAL, 16, 1, REAL, 16, _anintx, NO_FUN, NO_FUN),
341 INTR ("qsign", TRUE, NO_TEXT, "_sign", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
342 INTR ("qsinh", TRUE, NO_TEXT, "sinhq", REAL, 16, 1, REAL, 16, xsinh, NO_FUN, NO_FUN),
343 INTR ("qsin", TRUE, NO_TEXT, "sinq", REAL, 16, 1, REAL, 16, xsin, NO_FUN, NO_FUN),
344 INTR ("qsqrt", TRUE, NO_TEXT, "sqrtq", REAL, 16, 1, REAL, 16, xsqrt, NO_FUN, NO_FUN),
345 INTR ("qtanh", TRUE, NO_TEXT, "tanhq", REAL, 16, 1, REAL, 16, xtanh, NO_FUN, NO_FUN),
346 INTR ("qtan", TRUE, NO_TEXT, "tanq", REAL, 16, 1, REAL, 16, xtan, NO_FUN, NO_FUN),
347 INTR ("snglq", TRUE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
348 INTR ("sngl", TRUE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
349 INTR ("snglx", TRUE, NO_TEXT, "xtoflt", REAL, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
350 INTR ("xabs", TRUE, NO_TEXT, "xabs", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
351 INTR ("xacosh", TRUE, NO_TEXT, "xacosh", REAL, 32, 1, REAL, 32, xacosh, NO_FUN, NO_FUN),
352 INTR ("xacos", TRUE, NO_TEXT, "xacos", REAL, 32, 1, REAL, 32, xacos, NO_FUN, NO_FUN),
353 INTR ("xacotan", TRUE, NO_TEXT, "xacotan", REAL, 32, 1, REAL, 32, xacotan, NO_FUN, NO_FUN),
354 INTR ("xasinh", TRUE, NO_TEXT, "xasinh", REAL, 32, 1, REAL, 32, xasinh, NO_FUN, NO_FUN),
355 INTR ("xasin", TRUE, NO_TEXT, "xasin", REAL, 32, 1, REAL, 32, xasin, NO_FUN, NO_FUN),
356 INTR ("xatan2", TRUE, NO_TEXT, "xatan2", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
357 INTR ("xatanh", TRUE, NO_TEXT, "xatanh", REAL, 32, 1, REAL, 32, xatanh, NO_FUN, NO_FUN),
358 INTR ("xatan", TRUE, NO_TEXT, "xatan", REAL, 32, 1, REAL, 32, xatan, NO_FUN, NO_FUN),
359 INTR ("xcosh", TRUE, NO_TEXT, "xcosh", REAL, 32, 1, REAL, 32, xcosh, NO_FUN, NO_FUN),
360 INTR ("xcos", TRUE, NO_TEXT, "xcos", REAL, 32, 1, REAL, 32, xcos, NO_FUN, NO_FUN),
361 INTR ("xcotan", TRUE, NO_TEXT, "xcotan", REAL, 32, 1, REAL, 32, xcotan, NO_FUN, NO_FUN),
362 INTR ("xdble", TRUE, NO_TEXT, "xtodbl", REAL, 8, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
363 INTR ("xdim", TRUE, NO_TEXT, "_xdimx", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
364 INTR ("xexp", TRUE, NO_TEXT, "xexp", REAL, 32, 1, REAL, 32, xexp, NO_FUN, NO_FUN),
365 INTR ("xint", TRUE, NO_TEXT, "_aintx", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
366 INTR ("xlog10", TRUE, NO_TEXT, "xlog10", REAL, 32, 1, REAL, 32, xlog10, NO_FUN, NO_FUN),
367 INTR ("xlog", TRUE, NO_TEXT, "xlog", REAL, 32, 1, REAL, 32, xlog, NO_FUN, NO_FUN),
368 INTR ("xmax1", TRUE, NO_TEXT, "_xmax", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
369 INTR ("xmax", TRUE, NO_TEXT, "_xmax", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
370 INTR ("xmin1", TRUE, NO_TEXT, "_xmin", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
371 INTR ("xmin", TRUE, NO_TEXT, "_xmin", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
372 INTR ("xmod", TRUE, NO_TEXT, "_xmod", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
373 INTR ("xmod", TRUE, NO_TEXT, "_xmod", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
374 INTR ("xnint", TRUE, NO_TEXT, "_anintx", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
375 INTR ("xsign", TRUE, NO_TEXT, "_xsgn", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
376 INTR ("xsinh", TRUE, NO_TEXT, "xsinh", REAL, 32, 1, REAL, 32, xsinh, NO_FUN, NO_FUN),
377 INTR ("xsin", TRUE, NO_TEXT, "xsin", REAL, 32, 1, REAL, 32, xsin, NO_FUN, NO_FUN),
378 INTR ("xsqrt", TRUE, NO_TEXT, "xsqrt", REAL, 32, 1, REAL, 32, xsqrt, NO_FUN, NO_FUN),
379 INTR ("xtanh", TRUE, NO_TEXT, "xtanh", REAL, 32, 1, REAL, 32, xtanh, NO_FUN, NO_FUN),
380 INTR ("xtan", TRUE, NO_TEXT, "xtan", REAL, 32, 1, REAL, 32, xtan, NO_FUN, NO_FUN),
381 // COMPLEX generic
382 INTR ("abs", FALSE, NO_TEXT, "cabsf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
383 INTR ("abs", FALSE, NO_TEXT, "cabs", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
384 INTR ("abs", FALSE, NO_TEXT, "cabsq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
385 INTR ("abs", FALSE, NO_TEXT, "cxabs", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
386 INTR ("aimag", FALSE, NO_TEXT, "cimagf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
387 INTR ("aimag", FALSE, "(real_4)", "cimagq", REAL, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
388 INTR ("aimag", FALSE, "(real_4)", "cimag", REAL, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
389 INTR ("aimag", FALSE, "xtoflt", "cximag", REAL, 4, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
390 INTR ("cabs", FALSE, NO_TEXT, "cabsf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
391 INTR ("cabs", FALSE, NO_TEXT, "cabs", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
392 INTR ("cabs", FALSE, NO_TEXT, "cabsq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
393 INTR ("cabs", FALSE, NO_TEXT, "cxabs", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
394 INTR ("ccos", FALSE, NO_TEXT, "ccosf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxcos),
395 INTR ("ccos", FALSE, NO_TEXT, "ccos", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxcos),
396 INTR ("ccos", FALSE, NO_TEXT, "ccosq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxcos),
397 INTR ("ccos", FALSE, NO_TEXT, "cxcos", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
398 INTR ("cexp", FALSE, NO_TEXT, "cexpf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxexp),
399 INTR ("cexp", FALSE, NO_TEXT, "cexp", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxexp),
400 INTR ("cexp", FALSE, NO_TEXT, "cexpq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxexp),
401 INTR ("cexp", FALSE, NO_TEXT, "cxexp", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
402 INTR ("cint", FALSE, "(int_4)", "crealf", INTEGER, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
403 INTR ("cint", FALSE, "(int_4)", "creal", INTEGER, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
404 INTR ("cint", FALSE, "(int_4)", "crealq", INTEGER, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
405 INTR ("clog", FALSE, NO_TEXT, "clogf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxlog),
406 INTR ("clog", FALSE, NO_TEXT, "clog", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxlog),
407 INTR ("clog", FALSE, NO_TEXT, "clogq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxlog),
408 INTR ("clog", FALSE, NO_TEXT, "cxlog", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
409 INTR ("cmplx", FALSE, NO_TEXT, "CMPLXF", COMPLEX, 8, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
410 INTR ("cmplx", FALSE, NO_TEXT, "CMPLX", COMPLEX, 16, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
411 INTR ("cmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
412 INTR ("cmplx", FALSE, NO_TEXT, "CMPLXX", COMPLEX, 64, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
413 INTR ("cmplx", FALSE, NO_TEXT, "(complex_8)", COMPLEX, 8, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
414 INTR ("cmplx", FALSE, NO_TEXT, "(complex_16)", COMPLEX, 16, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
415 INTR ("cmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
416 INTR ("cmplx", FALSE, NO_TEXT, "cxconv", COMPLEX, 64, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
417 INTR ("conjg", FALSE, NO_TEXT, "conjf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
418 INTR ("conjg", FALSE, NO_TEXT, "conj", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
419 INTR ("conjg", FALSE, NO_TEXT, "conjq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
420 INTR ("conjg", FALSE, NO_TEXT, "cxconj", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
421 INTR ("cos", FALSE, NO_TEXT, "ccosf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxcos),
422 INTR ("cos", FALSE, NO_TEXT, "ccos", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxcos),
423 INTR ("cos", FALSE, NO_TEXT, "ccosq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxcos),
424 INTR ("cos", FALSE, NO_TEXT, "cxcos", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
425 INTR ("csin", FALSE, NO_TEXT, "csinf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsin),
426 INTR ("csin", FALSE, NO_TEXT, "csin", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsin),
427 INTR ("csin", FALSE, NO_TEXT, "cxsin", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
428 INTR ("csin", FALSE, NO_TEXT, "csinq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsin),
429 INTR ("csqrt", FALSE, NO_TEXT, "csqrtf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsqrt),
430 INTR ("csqrt", FALSE, NO_TEXT, "csqrt", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsqrt),
431 INTR ("csqrt", FALSE, NO_TEXT, "csqrtq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsqrt),
432 INTR ("csqrt", FALSE, NO_TEXT, "cxsqrt", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
433 INTR ("ctan", FALSE, NO_TEXT, "ctanf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxtan),
434 INTR ("ctan", FALSE, NO_TEXT, "ctan", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxtan),
435 INTR ("ctan", FALSE, NO_TEXT, "ctanq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxtan),
436 INTR ("ctan", FALSE, NO_TEXT, "cxtan", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
437 INTR ("dble", FALSE, "(real_8)", "crealf", REAL, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
438 INTR ("dble", FALSE, "(real_8)", "creal", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
439 INTR ("dble", FALSE, "(real_8)", "crealq", REAL, 8, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
440 INTR ("dble", FALSE, "(real_8)", "cxrealq", REAL, 8, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
441 INTR ("dcmplx", FALSE, "(complex_16)", "CMPLXF", COMPLEX, 16, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
442 INTR ("dcmplx", FALSE, NO_TEXT, "CMPLX", COMPLEX, 16, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
443 INTR ("dcmplx", FALSE, "(complex_16)", "CMPLXQ", COMPLEX, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
444 INTR ("dcmplx", FALSE, "(complex_16)", "qxcmplx", COMPLEX, 16, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
445 INTR ("dcmplx", FALSE, "(complex_16)", "(real_8)", COMPLEX, 16, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
446 INTR ("dcmplx", FALSE, NO_TEXT, "(complex_16)", COMPLEX, 16, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
447 INTR ("dcmplx", FALSE, "(complex_16)", "(real_8)", COMPLEX, 16, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
448 INTR ("dcmplx", FALSE, "(complex_16)", "qxcmplx", COMPLEX, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
449 INTR ("dimag", FALSE, "(real_8)", "cimagf", REAL, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
450 INTR ("dimag", FALSE, NO_TEXT, "cimag", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
451 INTR ("dimag", FALSE, "(real_8)", "cimagq", REAL, 8, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
452 INTR ("dimag", FALSE, "xtodbl", "cximag", REAL, 8, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
453 INTR ("exp", FALSE, NO_TEXT, "cexpf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxexp),
454 INTR ("exp", FALSE, NO_TEXT, "cexp", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxexp),
455 INTR ("exp", FALSE, NO_TEXT, "cexpq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxexp),
456 INTR ("exp", FALSE, NO_TEXT, "cxexp", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
457 INTR ("imag", FALSE, NO_TEXT, "cimagf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
458 INTR ("imag", FALSE, NO_TEXT, "cimag", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
459 INTR ("imag", FALSE, NO_TEXT, "cimagq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
460 INTR ("imag", FALSE, NO_TEXT, "cximag", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
461 INTR ("int", FALSE, "(int_4)", "crealf", INTEGER, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
462 INTR ("int", FALSE, "(int_4)", "creal", INTEGER, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
463 INTR ("int", FALSE, "(int_4)", "crealq", INTEGER, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
464 INTR ("int", FALSE, "(int_4)", "cxreal", INTEGER, 4, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
465 INTR ("log", FALSE, NO_TEXT, "clogf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxlog),
466 INTR ("log", FALSE, NO_TEXT, "clog", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxlog),
467 INTR ("log", FALSE, NO_TEXT, "clogq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxlog),
468 INTR ("log", FALSE, NO_TEXT, "cxlog", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
469 INTR ("qcmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
470 INTR ("qcmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
471 INTR ("qcmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
472 INTR ("qcmplx", FALSE, NO_TEXT, "qxcmplx", COMPLEX, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
473 INTR ("qcmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
474 INTR ("qcmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
475 INTR ("qcmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
476 INTR ("qcmplx", FALSE, "(complex_32)", "xtoquad", COMPLEX, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
477 INTR ("qimag", FALSE, "(real_16)", "cimagf", REAL, 16, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
478 INTR ("qimag", FALSE, "(real_16)", "cimag", REAL, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
479 INTR ("qimag", FALSE, NO_TEXT, "cimagq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
480 INTR ("qimag", FALSE, NO_TEXT, "cximagq", REAL, 16, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
481 INTR ("real", FALSE, "(real_4)", "crealf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
482 INTR ("real", FALSE, "(real_4)", "creal", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
483 INTR ("real", FALSE, "(real_4)", "crealq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
484 INTR ("real", FALSE, "(real_4)", "cxrealq", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
485 INTR ("sin", FALSE, NO_TEXT, "csinf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsin),
486 INTR ("sin", FALSE, NO_TEXT, "csin", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsin),
487 INTR ("sin", FALSE, NO_TEXT, "csinq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsin),
488 INTR ("sin", FALSE, NO_TEXT, "cxsin", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
489 INTR ("sqrt", FALSE, NO_TEXT, "csqrtf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsqrt),
490 INTR ("sqrt", FALSE, NO_TEXT, "csqrt", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsqrt),
491 INTR ("sqrt", FALSE, NO_TEXT, "csqrtq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsqrt),
492 INTR ("sqrt", FALSE, NO_TEXT, "cxsqrt", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
493 INTR ("tan", FALSE, NO_TEXT, "ctanf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxtan),
494 INTR ("tan", FALSE, NO_TEXT, "ctan", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxtan),
495 INTR ("tan", FALSE, NO_TEXT, "ctanq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxtan),
496 INTR ("tan", FALSE, NO_TEXT, "cxtan", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
497 INTR ("xcmplx", FALSE, NO_TEXT, "cxflt", COMPLEX, 64, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
498 INTR ("xcmplx", FALSE, NO_TEXT, "cxdbl", COMPLEX, 64, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
499 INTR ("xcmplx", FALSE, NO_TEXT, "cxquad", COMPLEX, 64, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
500 INTR ("xcmplx", FALSE, NO_TEXT, "CMPLXX", COMPLEX, 64, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
501 INTR ("xcmplx", FALSE, "cxconv", "flttox", COMPLEX, 64, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
502 INTR ("xcmplx", FALSE, "cxconv", "dbltox", COMPLEX, 64, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
503 INTR ("xcmplx", FALSE, "cxconv", "quadtox", COMPLEX, 64, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
504 INTR ("xcmplx", FALSE, NO_TEXT, "cxconv", COMPLEX, 64, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
505 INTR ("ximag", FALSE, "flttox", "cimagf", REAL, 32, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
506 INTR ("ximag", FALSE, "dbltox", "cimag", REAL, 32, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
507 INTR ("ximag", FALSE, NO_TEXT, "cximag", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
508 INTR ("ximag", FALSE, "quadtox", "cimagq", REAL, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
509 // COMPLEX*8 specific
510 INTR ("cabs", TRUE, NO_TEXT, "_zabs_16", REAL, 8, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
511 INTR ("ccosf", TRUE, NO_TEXT, "ccosf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxcos),
512 INTR ("cexpf", TRUE, NO_TEXT, "cexpf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxexp),
513 INTR ("clogf", TRUE, NO_TEXT, "clogf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxlog),
514 INTR ("csinf", TRUE, NO_TEXT, "csinf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsin),
515 INTR ("csqrtf", TRUE, NO_TEXT, "csqrtf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsqrt),
516 INTR ("ctanf", TRUE, NO_TEXT, "ctanf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxtan),
517 // COMPLEX specific
518 INTR ("cdabs", TRUE, NO_TEXT, "cabs", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
519 INTR ("cdcos", TRUE, NO_TEXT, "ccos", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxcos),
520 INTR ("cdexp", TRUE, NO_TEXT, "cexp", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxexp),
521 INTR ("cdint", TRUE, "(int_4)", "creal", INTEGER, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
522 INTR ("cdlog", TRUE, NO_TEXT, "clog", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxlog),
523 INTR ("cdsin", TRUE, NO_TEXT, "csin", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsin),
524 INTR ("cdsqrt", TRUE, NO_TEXT, "csqrt", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsqrt),
525 INTR ("cdtan", TRUE, NO_TEXT, "ctan", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxtan),
526 INTR ("cqabs", TRUE, NO_TEXT, "cabsq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
527 INTR ("cqcos", TRUE, NO_TEXT, "ccosq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxcos),
528 INTR ("cqexp", TRUE, NO_TEXT, "cexpq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxexp),
529 INTR ("cqint", TRUE, "(int_4)", "crealq", INTEGER, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
530 INTR ("cqlog", TRUE, NO_TEXT, "clogq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxlog),
531 INTR ("cqsin", TRUE, NO_TEXT, "csinq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsin),
532 INTR ("cqsqrt", TRUE, NO_TEXT, "csqrtq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsqrt),
533 INTR ("cqtan", TRUE, NO_TEXT, "ctanq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxtan),
534 INTR ("cxabs", TRUE, NO_TEXT, "cxabs", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
535 INTR ("cxcos", TRUE, NO_TEXT, "cxcos", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
536 INTR ("cxexp", TRUE, NO_TEXT, "cxexp", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
537 INTR ("cxlog", TRUE, NO_TEXT, "cxlog", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
538 INTR ("cxsin", TRUE, NO_TEXT, "cxsin", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
539 INTR ("cxsqrt", TRUE, NO_TEXT, "cxsqrt", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
540 INTR ("cxtan", TRUE, NO_TEXT, "cxtan", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
541 INTR ("dconjg", TRUE, NO_TEXT, "conj", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
542 INTR ("dimag", TRUE, NO_TEXT, "cimag", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
543 INTR ("dreal", TRUE, NO_TEXT, "creal", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
544 INTR ("qconjg", TRUE, NO_TEXT, "conjq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
545 INTR ("qimag", TRUE, NO_TEXT, "cimagq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
546 INTR ("qreal", TRUE, NO_TEXT, "crealq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
547 INTR ("xconjg", TRUE, NO_TEXT, "cxconj", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
548 INTR ("ximag", TRUE, NO_TEXT, "cximag", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
549 INTR ("xreal", TRUE, NO_TEXT, "cxreal", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
550 // End of list
551 INTR (NO_TEXT, FALSE, NO_TEXT, NO_TEXT, NOTYPE, 0, 0, NOTYPE, 0, NO_FUN, NO_FUN, NO_FUN)
552 };
553
554 logical_4 is_intrins (char *name, MODE *result)
555 {
556 for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
557 if (EQUAL (name, fun[k].ffun)) {
558 if (result != NO_MODE) {
559 result->type = fun[k].rtyp;
560 result->len = fun[k].rlen;
561 }
562 return TRUE;
563 }
564 }
565 return FALSE;
566 }
567
568 logical_4 is_specific (char *name)
569 {
570 // Match name for table to approve for INTRINSIC statement.
571 for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
572 if (EQUAL (name, fun[k].ffun)) {
573 return fun[k].spec;
574 }
575 }
576 return FALSE;
577 }
578
579 logical_4 intrinsic_call (char *name, EXPR * loc)
580 {
581 EXPR lhs, rhs;
582 // If 'name' is not an intrinsic function, stop here.
583 if (! is_intrins (name, NO_MODE)) {
584 return FALSE;
585 }
586 //
587 memset (loc, 0, sizeof (EXPR));
588 (void) scan (EXPECT_NONE);
589 if (! TOKEN ("(")) {
590 UNSCAN;
591 return FALSE;
592 }
593 (void) scan (EXPECT_NONE);
594 express (&lhs, NOTYPE, 0);
595 if (!valid_expr (&lhs)) {
596 return FALSE;
597 }
598 (void) scan (EXPECT_NONE);
599 if (!TOKEN (",") && (lhs.mode.type == CHARACTER)) {
600 // 1 operand, CHARACTER, length independent.
601 UNSCAN;
602 for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
603 INTRINS *F = &fun[k];
604 if (EQUAL (name, F->ffun) && (lhs.mode.type == F->atyp)) {
605 _srecordf (loc->str, "%s (%s)", F->cfun, lhs.str);
606 loc->mode = (MODE) { .type = F->rtyp,.len = F->rlen,.dim = 0};
607 (void) scan (")");
608 return TRUE;
609 }
610 }
611 NEW_RECORD (str);
612 _srecordf (str, "%s (%s)", name, qtype (&(lhs.mode)));
613 ERROR (2201, "undefined", str);
614 (void) scan (")");
615 return FALSE;
616 } else if (!TOKEN (",")) {
617 // 1 operand.
618 UNSCAN;
619 for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
620 INTRINS *F = &fun[k];
621 if (EQUAL (name, F->ffun) && F->anum == 1 && accept_mode (lhs.mode.type, lhs.mode.len, F->atyp, F->alen)) {
622 if (fold_intrinsic (F, &lhs, NO_EXPR)) {
623 _srecordf (loc->str, "%s", lhs.str);
624 loc->variant = EXPR_CONST;
625 loc->mode = (MODE) { .type = F->rtyp, .len = _max (F->rlen, lhs.mode.len), .dim = 0};
626 } else if (F->bfun != NO_TEXT) {
627 _srecordf (loc->str, "%s (%s (%s))", F->bfun, F->cfun, lhs.str);
628 loc->mode = (MODE) { .type = F->rtyp, .len = F->rlen, .dim = 0};
629 } else {
630 _srecordf (loc->str, "%s (%s)", F->cfun, lhs.str);
631 loc->mode = (MODE) { .type = F->rtyp, .len = F->rlen, .dim = 0};
632 }
633 (void) scan (")");
634 return TRUE;
635 }
636 }
637 NEW_RECORD (str);
638 _srecordf (str, "%s (%s)", name, qtype (&(lhs.mode)));
639 ERROR (2202, "undefined", str);
640 (void) scan (")");
641 return FALSE;
642 } else {
643 // >= 2 operands
644 (void) scan (EXPECT_NONE);
645 express (&rhs, NOTYPE, 0);
646 if (!valid_expr (&rhs)) {
647 return FALSE;
648 }
649 int_4 llen = lhs.mode.len, rlen = rhs.mode.len;
650 if ((lhs.variant == EXPR_CONST || rhs.variant == EXPR_CONST)) {
651 // Cross terms involving constants - adapt to non-constant.
652 if (lhs.variant != EXPR_CONST) {
653 rlen = llen;
654 } else if (rhs.variant != EXPR_CONST) {
655 llen = rlen;
656 } else {
657 llen = rlen = _max (llen, rlen);
658 }
659 } else {
660 llen = rlen = _max (llen, rlen);
661 }
662 for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
663 INTRINS *F = &fun[k];
664 if (EQUAL (name, F->ffun) && F->anum != 1 && accept_mode (lhs.mode.type, lhs.mode.len, F->atyp, F->alen) && accept_mode (rhs.mode.type, rhs.mode.len, F->atyp, F->alen)) {
665 loc->mode = (MODE) {.type = F->rtyp, .len = F->rlen, .dim = 0};
666 (void) scan (EXPECT_NONE);
667 if (TOKEN (")") && (F->anum == 2 || F->anum == 0)) {
668 // 2 operands
669 if (fold_intrinsic (F, &lhs, &rhs)) {
670 _srecordf (loc->str, "%s", lhs.str);
671 loc->variant = EXPR_CONST;
672 loc->mode = (MODE) { .type = F->rtyp, .len = _max (lhs.mode.len, rhs.mode.len) , .dim = 0};
673 } else if (F->bfun != NO_TEXT) {
674 _srecordf (loc->str, "%s (%s (%s, %s))", F->bfun, F->cfun, lhs.str, rhs.str);
675 } else {
676 _srecordf (loc->str, "%s (%s, %s)", F->cfun, lhs.str, rhs.str);
677 }
678 return TRUE;
679 } else if (TOKEN (",") && F->anum == 0) {
680 // > 2 operands
681 NEW_RECORD (idf); NEW_RECORD (str); NEW_RECORD (tmp);
682 _srecordf (idf, "%s", edit_tmp (nloctmps++));
683 add_local (idf, loc->mode.type, loc->mode.len, UNIQ, NOPATCH, NOARG, LOCAL, TEMP);
684 str[0] = '\0';
685 _srecordf (str, "%s = %s (%s, %s)", idf, F->cfun, lhs.str, rhs.str);
686 while (TOKEN (",")) {
687 (void) scan (EXPECT_NONE);
688 express (&rhs, NOTYPE, 0);
689 (void) scan (EXPECT_NONE);
690 if (TOKEN (",")) {
691 _srecordf (tmp, ", %s = %s (%s, %s)", idf, F->cfun, idf, rhs.str);
692 } else if (TOKEN (")")) {
693 _srecordf (tmp, ", %s (%s, %s)", F->cfun, idf, rhs.str);
694 } else {
695 EXPECT (2203, ", or )");
696 }
697 bufcat (str, tmp, RECLN);
698 }
699 _srecordf (loc->str, "(%s)", str);
700 return TRUE;
701 } else {
702 SYNTAX (2204, "number of operands");
703 }
704 }
705 }
706 NEW_RECORD (str);
707 _srecordf (str, "%s (%s, %s)", name, qtype (&(lhs.mode)), qtype (&(rhs.mode)));
708 ERROR (2205, "undefined", str);
709 (void) scan (")");
710 return FALSE;
711 }
712 }
713
714 void compile_nested_intrinsic (char *name)
715 {
716 // Compile a nested function for an INTRINSIC declared function.
717 INTRINS *F = NO_INTRINS;
718 NEW_STATIC_RECORD (f);
719 for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
720 if (EQUAL (fun[k].ffun, name)) {
721 F = &fun[k];
722 break;
723 }
724 }
725 if (F == NO_INTRINS) {
726 ERROR (2206, "not an intrinsic fuction", name);
727 return;
728 }
729 if (!F->spec || F->anum == 0) {
730 // Silently return.
731 return;
732 }
733 MODE res = (MODE) {.type = F->rtyp, .len = F->rlen};
734 MODE arg = (MODE) {.type = F->atyp, .len = F->alen};
735 IDENT *idf = add_local (name, NOTYPE, NOLEN, UNIQ, NOPATCH, NOARG, LOCAL, TEMP);
736 if (idf->external) {
737 ERROR (2207, "redefining external function", C_NAME (idf));
738 } else if (idf->intrinsic) {
739 ERROR (2208, "redefining intrinsic function", C_NAME (idf));
740 }
741 if (F->anum == 1) {
742 if (F->bfun != NO_TEXT) {
743 _srecordf (f, "%s %s (%s __x__) {return %s (%s (%s));}\n",
744 wtype (&res, NOARG, NOFUN),
745 edit_i (name),
746 wtype (&arg, ARG, NOFUN),
747 F->bfun,
748 F->cfun,
749 (F->atyp == CHARACTER ? "__x__" : "*__x__")
750 );
751 } else {
752 _srecordf (f, "%s %s (%s __x__) {return %s (%s);}\n",
753 wtype (&res, NOARG, NOFUN),
754 edit_i (name),
755 wtype (&arg, ARG, NOFUN),
756 F->cfun,
757 (F->atyp == CHARACTER ? "__x__" : "*__x__")
758 );
759 }
760 } else {
761 if (F->bfun != NO_TEXT) {
762 _srecordf (f, "%s %s (%s __x__, %s __y__) {return %s (%s (%s, %s));}\n",
763 wtype (&res, NOARG, NOFUN),
764 edit_i (name),
765 wtype (&arg, ARG, NOFUN),
766 wtype (&arg, ARG, NOFUN),
767 F->bfun,
768 F->cfun,
769 (F->atyp == CHARACTER ? "__x__" : "*__x__"),
770 (F->atyp == CHARACTER ? "__y__" : "*__y__")
771 );
772 } else {
773 _srecordf (f, "%s %s (%s __x__, %s __y__) {return %s (%s, %s);}\n",
774 wtype (&res, NOARG, NOFUN),
775 edit_i (name),
776 wtype (&arg, ARG, NOFUN),
777 wtype (&arg, ARG, NOFUN),
778 F->cfun,
779 (F->atyp == CHARACTER ? "__x__" : "*__x__"),
780 (F->atyp == CHARACTER ? "__y__" : "*__y__")
781 );
782 }
783 }
784 code (nprocs, NESTED, f);
785 idf->mode = res;
786 idf->intrinsic = TRUE;
787 return;
788 }
© 2002-2025 J.M. van der Veer (jmvdveer@xs4all.nl)
|