FLANG
numeric.h
1//===-- include/flang/Runtime/numeric.h -------------------------*- C++ -*-===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// Defines API between compiled code and the implementations of various numeric
10// intrinsic functions in the runtime library.
11
12#ifndef FORTRAN_RUNTIME_NUMERIC_H_
13#define FORTRAN_RUNTIME_NUMERIC_H_
14
15#include "flang/Common/float128.h"
16#include "flang/Runtime/cpp-type.h"
17#include "flang/Runtime/entry-names.h"
18
19namespace Fortran::runtime {
20extern "C" {
21
22// CEILING
23CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling4_1)(
24 CppTypeFor<TypeCategory::Real, 4>);
25CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling4_2)(
26 CppTypeFor<TypeCategory::Real, 4>);
27CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling4_4)(
28 CppTypeFor<TypeCategory::Real, 4>);
29CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling4_8)(
30 CppTypeFor<TypeCategory::Real, 4>);
31#ifdef __SIZEOF_INT128__
32CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling4_16)(
33 CppTypeFor<TypeCategory::Real, 4>);
34#endif
35CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling8_1)(
36 CppTypeFor<TypeCategory::Real, 8>);
37CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling8_2)(
38 CppTypeFor<TypeCategory::Real, 8>);
39CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling8_4)(
40 CppTypeFor<TypeCategory::Real, 8>);
41CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling8_8)(
42 CppTypeFor<TypeCategory::Real, 8>);
43#ifdef __SIZEOF_INT128__
44CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling8_16)(
45 CppTypeFor<TypeCategory::Real, 8>);
46#endif
47#if HAS_FLOAT80
48CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling10_1)(
49 CppTypeFor<TypeCategory::Real, 10>);
50CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling10_2)(
51 CppTypeFor<TypeCategory::Real, 10>);
52CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling10_4)(
53 CppTypeFor<TypeCategory::Real, 10>);
54CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling10_8)(
55 CppTypeFor<TypeCategory::Real, 10>);
56#ifdef __SIZEOF_INT128__
57CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling10_16)(
58 CppTypeFor<TypeCategory::Real, 10>);
59#endif
60#endif
61#if HAS_LDBL128 || HAS_FLOAT128
62CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling16_1)(
63 CppTypeFor<TypeCategory::Real, 16>);
64CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling16_2)(
65 CppTypeFor<TypeCategory::Real, 16>);
66CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling16_4)(
67 CppTypeFor<TypeCategory::Real, 16>);
68CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling16_8)(
69 CppTypeFor<TypeCategory::Real, 16>);
70#ifdef __SIZEOF_INT128__
71CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling16_16)(
72 CppTypeFor<TypeCategory::Real, 16>);
73#endif
74#endif
75
76// ERFC_SCALED
77CppTypeFor<TypeCategory::Real, 4> RTDECL(ErfcScaled4)(
78 CppTypeFor<TypeCategory::Real, 4>);
79CppTypeFor<TypeCategory::Real, 8> RTDECL(ErfcScaled8)(
80 CppTypeFor<TypeCategory::Real, 8>);
81#if HAS_FLOAT80
82CppTypeFor<TypeCategory::Real, 10> RTDECL(ErfcScaled10)(
83 CppTypeFor<TypeCategory::Real, 10>);
84#endif
85#if HAS_LDBL128 || HAS_FLOAT128
86CppTypeFor<TypeCategory::Real, 16> RTDECL(ErfcScaled16)(
87 CppTypeFor<TypeCategory::Real, 16>);
88#endif
89
90// EXPONENT is defined to return default INTEGER; support INTEGER(4 & 8)
91CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent4_4)(
92 CppTypeFor<TypeCategory::Real, 4>);
93CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent4_8)(
94 CppTypeFor<TypeCategory::Real, 4>);
95CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent8_4)(
96 CppTypeFor<TypeCategory::Real, 8>);
97CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent8_8)(
98 CppTypeFor<TypeCategory::Real, 8>);
99#if HAS_FLOAT80
100CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent10_4)(
101 CppTypeFor<TypeCategory::Real, 10>);
102CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent10_8)(
103 CppTypeFor<TypeCategory::Real, 10>);
104#endif
105#if HAS_LDBL128 || HAS_FLOAT
106CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent16_4)(
107 CppTypeFor<TypeCategory::Real, 16>);
108CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent16_8)(
109 CppTypeFor<TypeCategory::Real, 16>);
110#endif
111
112// FLOOR
113CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor4_1)(
114 CppTypeFor<TypeCategory::Real, 4>);
115CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor4_2)(
116 CppTypeFor<TypeCategory::Real, 4>);
117CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor4_4)(
118 CppTypeFor<TypeCategory::Real, 4>);
119CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor4_8)(
120 CppTypeFor<TypeCategory::Real, 4>);
121#ifdef __SIZEOF_INT128__
122CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor4_16)(
123 CppTypeFor<TypeCategory::Real, 4>);
124#endif
125CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor8_1)(
126 CppTypeFor<TypeCategory::Real, 8>);
127CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor8_2)(
128 CppTypeFor<TypeCategory::Real, 8>);
129CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor8_4)(
130 CppTypeFor<TypeCategory::Real, 8>);
131CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor8_8)(
132 CppTypeFor<TypeCategory::Real, 8>);
133#ifdef __SIZEOF_INT128__
134CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor8_16)(
135 CppTypeFor<TypeCategory::Real, 8>);
136#endif
137#if HAS_FLOAT80
138CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor10_1)(
139 CppTypeFor<TypeCategory::Real, 10>);
140CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor10_2)(
141 CppTypeFor<TypeCategory::Real, 10>);
142CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor10_4)(
143 CppTypeFor<TypeCategory::Real, 10>);
144CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor10_8)(
145 CppTypeFor<TypeCategory::Real, 10>);
146#ifdef __SIZEOF_INT128__
147CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor10_16)(
148 CppTypeFor<TypeCategory::Real, 10>);
149#endif
150#endif
151#if HAS_LDBL128 || HAS_FLOAT128
152CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor16_1)(
153 CppTypeFor<TypeCategory::Real, 16>);
154CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor16_2)(
155 CppTypeFor<TypeCategory::Real, 16>);
156CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor16_4)(
157 CppTypeFor<TypeCategory::Real, 16>);
158CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor16_8)(
159 CppTypeFor<TypeCategory::Real, 16>);
160#ifdef __SIZEOF_INT128__
161CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor16_16)(
162 CppTypeFor<TypeCategory::Real, 16>);
163#endif
164#endif
165
166// FRACTION
167CppTypeFor<TypeCategory::Real, 4> RTDECL(Fraction4)(
168 CppTypeFor<TypeCategory::Real, 4>);
169CppTypeFor<TypeCategory::Real, 8> RTDECL(Fraction8)(
170 CppTypeFor<TypeCategory::Real, 8>);
171#if HAS_FLOAT80
172CppTypeFor<TypeCategory::Real, 10> RTDECL(Fraction10)(
173 CppTypeFor<TypeCategory::Real, 10>);
174#endif
175#if HAS_LDBL128 || HAS_FLOAT128
176CppTypeFor<TypeCategory::Real, 16> RTDECL(Fraction16)(
177 CppTypeFor<TypeCategory::Real, 16>);
178#endif
179
180// ISNAN / IEEE_IS_NAN
181bool RTDECL(IsNaN4)(CppTypeFor<TypeCategory::Real, 4>);
182bool RTDECL(IsNaN8)(CppTypeFor<TypeCategory::Real, 8>);
183#if HAS_FLOAT80
184bool RTDECL(IsNaN10)(CppTypeFor<TypeCategory::Real, 10>);
185#endif
186#if HAS_LDBL128 || HAS_FLOAT128
187bool RTDECL(IsNaN16)(CppTypeFor<TypeCategory::Real, 16>);
188#endif
189
190// MOD & MODULO
191CppTypeFor<TypeCategory::Integer, 1> RTDECL(ModInteger1)(
192 CppTypeFor<TypeCategory::Integer, 1>, CppTypeFor<TypeCategory::Integer, 1>,
193 const char *sourceFile = nullptr, int sourceLine = 0);
194CppTypeFor<TypeCategory::Integer, 2> RTDECL(ModInteger2)(
195 CppTypeFor<TypeCategory::Integer, 2>, CppTypeFor<TypeCategory::Integer, 2>,
196 const char *sourceFile = nullptr, int sourceLine = 0);
197CppTypeFor<TypeCategory::Integer, 4> RTDECL(ModInteger4)(
198 CppTypeFor<TypeCategory::Integer, 4>, CppTypeFor<TypeCategory::Integer, 4>,
199 const char *sourceFile = nullptr, int sourceLine = 0);
200CppTypeFor<TypeCategory::Integer, 8> RTDECL(ModInteger8)(
201 CppTypeFor<TypeCategory::Integer, 8>, CppTypeFor<TypeCategory::Integer, 8>,
202 const char *sourceFile = nullptr, int sourceLine = 0);
203#ifdef __SIZEOF_INT128__
204CppTypeFor<TypeCategory::Integer, 16> RTDECL(ModInteger16)(
205 CppTypeFor<TypeCategory::Integer, 16>,
206 CppTypeFor<TypeCategory::Integer, 16>, const char *sourceFile = nullptr,
207 int sourceLine = 0);
208#endif
209CppTypeFor<TypeCategory::Real, 4> RTDECL(ModReal4)(
210 CppTypeFor<TypeCategory::Real, 4>, CppTypeFor<TypeCategory::Real, 4>,
211 const char *sourceFile = nullptr, int sourceLine = 0);
212CppTypeFor<TypeCategory::Real, 8> RTDECL(ModReal8)(
213 CppTypeFor<TypeCategory::Real, 8>, CppTypeFor<TypeCategory::Real, 8>,
214 const char *sourceFile = nullptr, int sourceLine = 0);
215#if HAS_FLOAT80
216CppTypeFor<TypeCategory::Real, 10> RTDECL(ModReal10)(
217 CppTypeFor<TypeCategory::Real, 10>, CppTypeFor<TypeCategory::Real, 10>,
218 const char *sourceFile = nullptr, int sourceLine = 0);
219#endif
220#if HAS_LDBL128 || HAS_FLOAT128
221CppTypeFor<TypeCategory::Real, 16> RTDECL(ModReal16)(
222 CppTypeFor<TypeCategory::Real, 16>, CppTypeFor<TypeCategory::Real, 16>,
223 const char *sourceFile = nullptr, int sourceLine = 0);
224#endif
225
226CppTypeFor<TypeCategory::Integer, 1> RTDECL(ModuloInteger1)(
227 CppTypeFor<TypeCategory::Integer, 1>, CppTypeFor<TypeCategory::Integer, 1>,
228 const char *sourceFile = nullptr, int sourceLine = 0);
229CppTypeFor<TypeCategory::Integer, 2> RTDECL(ModuloInteger2)(
230 CppTypeFor<TypeCategory::Integer, 2>, CppTypeFor<TypeCategory::Integer, 2>,
231 const char *sourceFile = nullptr, int sourceLine = 0);
232CppTypeFor<TypeCategory::Integer, 4> RTDECL(ModuloInteger4)(
233 CppTypeFor<TypeCategory::Integer, 4>, CppTypeFor<TypeCategory::Integer, 4>,
234 const char *sourceFile = nullptr, int sourceLine = 0);
235CppTypeFor<TypeCategory::Integer, 8> RTDECL(ModuloInteger8)(
236 CppTypeFor<TypeCategory::Integer, 8>, CppTypeFor<TypeCategory::Integer, 8>,
237 const char *sourceFile = nullptr, int sourceLine = 0);
238#ifdef __SIZEOF_INT128__
239CppTypeFor<TypeCategory::Integer, 16> RTDECL(ModuloInteger16)(
240 CppTypeFor<TypeCategory::Integer, 16>,
241 CppTypeFor<TypeCategory::Integer, 16>, const char *sourceFile = nullptr,
242 int sourceLine = 0);
243#endif
244CppTypeFor<TypeCategory::Real, 4> RTDECL(ModuloReal4)(
245 CppTypeFor<TypeCategory::Real, 4>, CppTypeFor<TypeCategory::Real, 4>,
246 const char *sourceFile = nullptr, int sourceLine = 0);
247CppTypeFor<TypeCategory::Real, 8> RTDECL(ModuloReal8)(
248 CppTypeFor<TypeCategory::Real, 8>, CppTypeFor<TypeCategory::Real, 8>,
249 const char *sourceFile = nullptr, int sourceLine = 0);
250#if HAS_FLOAT80
251CppTypeFor<TypeCategory::Real, 10> RTDECL(ModuloReal10)(
252 CppTypeFor<TypeCategory::Real, 10>, CppTypeFor<TypeCategory::Real, 10>,
253 const char *sourceFile = nullptr, int sourceLine = 0);
254#endif
255#if HAS_LDBL128 || HAS_FLOAT128
256CppTypeFor<TypeCategory::Real, 16> RTDECL(ModuloReal16)(
257 CppTypeFor<TypeCategory::Real, 16>, CppTypeFor<TypeCategory::Real, 16>,
258 const char *sourceFile = nullptr, int sourceLine = 0);
259#endif
260
261// NINT
262CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint4_1)(
263 CppTypeFor<TypeCategory::Real, 4>);
264CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint4_2)(
265 CppTypeFor<TypeCategory::Real, 4>);
266CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint4_4)(
267 CppTypeFor<TypeCategory::Real, 4>);
268CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint4_8)(
269 CppTypeFor<TypeCategory::Real, 4>);
270#ifdef __SIZEOF_INT128__
271CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint4_16)(
272 CppTypeFor<TypeCategory::Real, 4>);
273#endif
274CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint8_1)(
275 CppTypeFor<TypeCategory::Real, 8>);
276CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint8_2)(
277 CppTypeFor<TypeCategory::Real, 8>);
278CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint8_4)(
279 CppTypeFor<TypeCategory::Real, 8>);
280CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint8_8)(
281 CppTypeFor<TypeCategory::Real, 8>);
282#ifdef __SIZEOF_INT128__
283CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint8_16)(
284 CppTypeFor<TypeCategory::Real, 8>);
285#endif
286#if HAS_FLOAT80
287CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint10_1)(
288 CppTypeFor<TypeCategory::Real, 10>);
289CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint10_2)(
290 CppTypeFor<TypeCategory::Real, 10>);
291CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint10_4)(
292 CppTypeFor<TypeCategory::Real, 10>);
293CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint10_8)(
294 CppTypeFor<TypeCategory::Real, 10>);
295#ifdef __SIZEOF_INT128__
296CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint10_16)(
297 CppTypeFor<TypeCategory::Real, 10>);
298#endif
299#endif
300#if HAS_LDBL128 || HAS_FLOAT128
301CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint16_1)(
302 CppTypeFor<TypeCategory::Real, 16>);
303CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint16_2)(
304 CppTypeFor<TypeCategory::Real, 16>);
305CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint16_4)(
306 CppTypeFor<TypeCategory::Real, 16>);
307CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint16_8)(
308 CppTypeFor<TypeCategory::Real, 16>);
309#if defined __SIZEOF_INT128__
310CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint16_16)(
311 CppTypeFor<TypeCategory::Real, 16>);
312#endif
313#endif
314
315// NEAREST
316// The second argument to NEAREST is the result of a comparison
317// to zero (i.e., S > 0)
318CppTypeFor<TypeCategory::Real, 4> RTDECL(Nearest4)(
319 CppTypeFor<TypeCategory::Real, 4>, bool positive);
320CppTypeFor<TypeCategory::Real, 8> RTDECL(Nearest8)(
321 CppTypeFor<TypeCategory::Real, 8>, bool positive);
322#if HAS_FLOAT80
323CppTypeFor<TypeCategory::Real, 10> RTDECL(Nearest10)(
324 CppTypeFor<TypeCategory::Real, 10>, bool positive);
325#endif
326#if HAS_LDBL128 || HAS_FLOAT128
327CppTypeFor<TypeCategory::Real, 16> RTDECL(Nearest16)(
328 CppTypeFor<TypeCategory::Real, 16>, bool positive);
329#endif
330
331// RRSPACING
332CppTypeFor<TypeCategory::Real, 4> RTDECL(RRSpacing4)(
333 CppTypeFor<TypeCategory::Real, 4>);
334CppTypeFor<TypeCategory::Real, 8> RTDECL(RRSpacing8)(
335 CppTypeFor<TypeCategory::Real, 8>);
336#if HAS_FLOAT80
337CppTypeFor<TypeCategory::Real, 10> RTDECL(RRSpacing10)(
338 CppTypeFor<TypeCategory::Real, 10>);
339#endif
340#if HAS_LDBL128 || HAS_FLOAT128
341CppTypeFor<TypeCategory::Real, 16> RTDECL(RRSpacing16)(
342 CppTypeFor<TypeCategory::Real, 16>);
343#endif
344
345// SET_EXPONENT's I= argument can be any INTEGER kind; upcast it to 64-bit
346CppTypeFor<TypeCategory::Real, 4> RTDECL(SetExponent4)(
347 CppTypeFor<TypeCategory::Real, 4>, std::int64_t);
348CppTypeFor<TypeCategory::Real, 8> RTDECL(SetExponent8)(
349 CppTypeFor<TypeCategory::Real, 8>, std::int64_t);
350#if HAS_FLOAT80
351CppTypeFor<TypeCategory::Real, 10> RTDECL(SetExponent10)(
352 CppTypeFor<TypeCategory::Real, 10>, std::int64_t);
353#endif
354#if HAS_LDBL128 || HAS_FLOAT128
355CppTypeFor<TypeCategory::Real, 16> RTDECL(SetExponent16)(
356 CppTypeFor<TypeCategory::Real, 16>, std::int64_t);
357#endif
358
359// SCALE
360CppTypeFor<TypeCategory::Real, 4> RTDECL(Scale4)(
361 CppTypeFor<TypeCategory::Real, 4>, std::int64_t);
362CppTypeFor<TypeCategory::Real, 8> RTDECL(Scale8)(
363 CppTypeFor<TypeCategory::Real, 8>, std::int64_t);
364#if HAS_FLOAT80
365CppTypeFor<TypeCategory::Real, 10> RTDECL(Scale10)(
366 CppTypeFor<TypeCategory::Real, 10>, std::int64_t);
367#endif
368#if HAS_LDBL128 || HAS_FLOAT128
369CppTypeFor<TypeCategory::Real, 16> RTDECL(Scale16)(
370 CppTypeFor<TypeCategory::Real, 16>, std::int64_t);
371#endif
372
373// SELECTED_CHAR_KIND
374CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedCharKind)(
375 const char *, int, const char *, std::size_t);
376
377// SELECTED_INT_KIND and SELECTED_UNSIGNED_KIND
378CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedIntKind)(
379 const char *, int, void *, int);
380CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedIntKindMasked)(
381 const char *, int, void *, int, int);
382
383// SELECTED_LOGICAL_KIND
384CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedLogicalKind)(
385 const char *, int, void *, int);
386
387// SELECTED_REAL_KIND
388CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedRealKind)(
389 const char *, int, void *, int, void *, int, void *, int);
390CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedRealKindMasked)(
391 const char *, int, void *, int, void *, int, void *, int, int);
392
393// SPACING
394// The variants Spacing2By4 and Spacing3By4 compute SPACING for REAL(2/3)
395// but accept and return REAL(4) values, for use in environments where
396// std::float16_t or std::bfloat16_t are unavailable.
397#if HAS_FP16
398CppTypeFor<TypeCategory::Real, 2> RTDECL(Spacing2)(
399 CppTypeFor<TypeCategory::Real, 2>);
400#endif
401CppTypeFor<TypeCategory::Real, 4> RTDECL(Spacing2By4)(
402 CppTypeFor<TypeCategory::Real, 4>);
403#if HAS_BF16
404CppTypeFor<TypeCategory::Real, 3> RTDECL(Spacing3)(
405 CppTypeFor<TypeCategory::Real, 3>);
406#endif
407CppTypeFor<TypeCategory::Real, 4> RTDECL(Spacing3By4)(
408 CppTypeFor<TypeCategory::Real, 4>);
409CppTypeFor<TypeCategory::Real, 4> RTDECL(Spacing4)(
410 CppTypeFor<TypeCategory::Real, 4>);
411CppTypeFor<TypeCategory::Real, 8> RTDECL(Spacing8)(
412 CppTypeFor<TypeCategory::Real, 8>);
413#if HAS_FLOAT80
414CppTypeFor<TypeCategory::Real, 10> RTDECL(Spacing10)(
415 CppTypeFor<TypeCategory::Real, 10>);
416#endif
417#if HAS_LDBL128 || HAS_FLOAT128
418CppTypeFor<TypeCategory::Real, 16> RTDECL(Spacing16)(
419 CppTypeFor<TypeCategory::Real, 16>);
420#endif
421
422CppTypeFor<TypeCategory::Real, 4> RTDECL(FPow4i)(
423 CppTypeFor<TypeCategory::Real, 4> b,
424 CppTypeFor<TypeCategory::Integer, 4> e);
425CppTypeFor<TypeCategory::Real, 8> RTDECL(FPow8i)(
426 CppTypeFor<TypeCategory::Real, 8> b,
427 CppTypeFor<TypeCategory::Integer, 4> e);
428#if HAS_FLOAT80
429CppTypeFor<TypeCategory::Real, 10> RTDECL(FPow10i)(
430 CppTypeFor<TypeCategory::Real, 10> b,
431 CppTypeFor<TypeCategory::Integer, 4> e);
432#endif
433#if HAS_LDBL128 || HAS_FLOAT128
434CppTypeFor<TypeCategory::Real, 16> RTDECL(FPow16i)(
435 CppTypeFor<TypeCategory::Real, 16> b,
436 CppTypeFor<TypeCategory::Integer, 4> e);
437#endif
438
439CppTypeFor<TypeCategory::Real, 4> RTDECL(FPow4k)(
440 CppTypeFor<TypeCategory::Real, 4> b,
441 CppTypeFor<TypeCategory::Integer, 8> e);
442CppTypeFor<TypeCategory::Real, 8> RTDECL(FPow8k)(
443 CppTypeFor<TypeCategory::Real, 8> b,
444 CppTypeFor<TypeCategory::Integer, 8> e);
445#if HAS_FLOAT80
446CppTypeFor<TypeCategory::Real, 10> RTDECL(FPow10k)(
447 CppTypeFor<TypeCategory::Real, 10> b,
448 CppTypeFor<TypeCategory::Integer, 8> e);
449#endif
450#if HAS_LDBL128 || HAS_FLOAT128
451CppTypeFor<TypeCategory::Real, 16> RTDECL(FPow16k)(
452 CppTypeFor<TypeCategory::Real, 16> b,
453 CppTypeFor<TypeCategory::Integer, 8> e);
454#endif
455
456} // extern "C"
457} // namespace Fortran::runtime
458#endif // FORTRAN_RUNTIME_NUMERIC_H_