xref: /llvm-project/flang/runtime/numeric.cpp (revision fc97d2e68b03bc2979395e84b645e5b3ba35aecd)
1651f58bfSDiana Picus //===-- runtime/numeric.cpp -----------------------------------------------===//
25f6c5c63Speter klausler //
35f6c5c63Speter klausler // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f6c5c63Speter klausler // See https://llvm.org/LICENSE.txt for license information.
55f6c5c63Speter klausler // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f6c5c63Speter klausler //
75f6c5c63Speter klausler //===----------------------------------------------------------------------===//
85f6c5c63Speter klausler 
9830c0b90SPeter Klausler #include "flang/Runtime/numeric.h"
100699749cSSlava Zakharin #include "numeric-templates.h"
114daa33f6SPeter Klausler #include "terminator.h"
1282a8c1cfSPeter Klausler #include "tools.h"
13478e0b58SPeter Steinfeld #include "flang/Common/float128.h"
144daa33f6SPeter Klausler #include <cfloat>
155f6c5c63Speter klausler #include <climits>
165f6c5c63Speter klausler #include <cmath>
175f6c5c63Speter klausler #include <limits>
185f6c5c63Speter klausler 
195f6c5c63Speter klausler namespace Fortran::runtime {
205f6c5c63Speter klausler 
2157e3fa38SPeixin Qiao template <typename RES>
2282a8c1cfSPeter Klausler inline RT_API_ATTRS RES GetIntArgValue(const char *source, int line,
2382a8c1cfSPeter Klausler     const void *arg, int kind, std::int64_t defaultValue, int resKind) {
2457e3fa38SPeixin Qiao   RES res;
2557e3fa38SPeixin Qiao   if (!arg) {
2657e3fa38SPeixin Qiao     res = static_cast<RES>(defaultValue);
2757e3fa38SPeixin Qiao   } else if (kind == 1) {
2857e3fa38SPeixin Qiao     res = static_cast<RES>(
2982a8c1cfSPeter Klausler         *static_cast<const CppTypeFor<TypeCategory::Integer, 1> *>(arg));
3057e3fa38SPeixin Qiao   } else if (kind == 2) {
3157e3fa38SPeixin Qiao     res = static_cast<RES>(
3282a8c1cfSPeter Klausler         *static_cast<const CppTypeFor<TypeCategory::Integer, 2> *>(arg));
3357e3fa38SPeixin Qiao   } else if (kind == 4) {
3457e3fa38SPeixin Qiao     res = static_cast<RES>(
3582a8c1cfSPeter Klausler         *static_cast<const CppTypeFor<TypeCategory::Integer, 4> *>(arg));
3657e3fa38SPeixin Qiao   } else if (kind == 8) {
3757e3fa38SPeixin Qiao     res = static_cast<RES>(
3882a8c1cfSPeter Klausler         *static_cast<const CppTypeFor<TypeCategory::Integer, 8> *>(arg));
3957e3fa38SPeixin Qiao #ifdef __SIZEOF_INT128__
4057e3fa38SPeixin Qiao   } else if (kind == 16) {
4157e3fa38SPeixin Qiao     if (resKind != 16) {
4257e3fa38SPeixin Qiao       Terminator{source, line}.Crash("Unexpected integer kind in runtime");
4357e3fa38SPeixin Qiao     }
4457e3fa38SPeixin Qiao     res = static_cast<RES>(
4582a8c1cfSPeter Klausler         *static_cast<const CppTypeFor<TypeCategory::Integer, 16> *>(arg));
4657e3fa38SPeixin Qiao #endif
4757e3fa38SPeixin Qiao   } else {
4857e3fa38SPeixin Qiao     Terminator{source, line}.Crash("Unexpected integer kind in runtime");
4957e3fa38SPeixin Qiao   }
5057e3fa38SPeixin Qiao   return res;
5157e3fa38SPeixin Qiao }
5257e3fa38SPeixin Qiao 
533ccd4ce2SPeixin Qiao // NINT (16.9.141)
54b4b23ff7SSlava Zakharin template <typename RESULT, typename ARG>
55b4b23ff7SSlava Zakharin inline RT_API_ATTRS RESULT Nint(ARG x) {
565f6c5c63Speter klausler   if (x >= 0) {
575f6c5c63Speter klausler     return std::trunc(x + ARG{0.5});
585f6c5c63Speter klausler   } else {
595f6c5c63Speter klausler     return std::trunc(x - ARG{0.5});
605f6c5c63Speter klausler   }
615f6c5c63Speter klausler }
625f6c5c63Speter klausler 
635f6c5c63Speter klausler // CEILING & FLOOR (16.9.43, .79)
64b4b23ff7SSlava Zakharin template <typename RESULT, typename ARG>
65b4b23ff7SSlava Zakharin inline RT_API_ATTRS RESULT Ceiling(ARG x) {
665f6c5c63Speter klausler   return std::ceil(x);
675f6c5c63Speter klausler }
68b4b23ff7SSlava Zakharin template <typename RESULT, typename ARG>
69b4b23ff7SSlava Zakharin inline RT_API_ATTRS RESULT Floor(ARG x) {
705f6c5c63Speter klausler   return std::floor(x);
715f6c5c63Speter klausler }
725f6c5c63Speter klausler 
735f6c5c63Speter klausler // MOD & MODULO (16.9.135, .136)
74562fd2c9SPeter Klausler template <bool IS_MODULO, typename T>
75b4b23ff7SSlava Zakharin inline RT_API_ATTRS T IntMod(T x, T p, const char *sourceFile, int sourceLine) {
76562fd2c9SPeter Klausler   if (p == 0) {
77562fd2c9SPeter Klausler     Terminator{sourceFile, sourceLine}.Crash(
78562fd2c9SPeter Klausler         IS_MODULO ? "MODULO with P==0" : "MOD with P==0");
79562fd2c9SPeter Klausler   }
805f6c5c63Speter klausler   auto mod{x - (x / p) * p};
815f6c5c63Speter klausler   if (IS_MODULO && (x > 0) != (p > 0)) {
825f6c5c63Speter klausler     mod += p;
835f6c5c63Speter klausler   }
845f6c5c63Speter klausler   return mod;
855f6c5c63Speter klausler }
865f6c5c63Speter klausler 
875f6c5c63Speter klausler // SCALE (16.9.166)
88b4b23ff7SSlava Zakharin template <typename T> inline RT_API_ATTRS T Scale(T x, std::int64_t p) {
895f6c5c63Speter klausler   auto ip{static_cast<int>(p)};
905f6c5c63Speter klausler   if (ip != p) {
915f6c5c63Speter klausler     ip = p < 0 ? std::numeric_limits<int>::min()
925f6c5c63Speter klausler                : std::numeric_limits<int>::max();
935f6c5c63Speter klausler   }
940699749cSSlava Zakharin   return std::ldexp(x, ip); // x*2**p
955f6c5c63Speter klausler }
965f6c5c63Speter klausler 
97*fc97d2e6SPeter Klausler // SELECTED_INT_KIND (16.9.169) and SELECTED_UNSIGNED_KIND extension
98f428f5fcSPeter Klausler template <typename X, typename M>
99f428f5fcSPeter Klausler inline RT_API_ATTRS CppTypeFor<TypeCategory::Integer, 4> SelectedIntKind(
100f428f5fcSPeter Klausler     X x, M mask) {
101f428f5fcSPeter Klausler #if !defined __SIZEOF_INT128__ || defined FLANG_RUNTIME_NO_INTEGER_16
102f428f5fcSPeter Klausler   mask &= ~(1 << 16);
103f532c072SPeixin Qiao #endif
104f428f5fcSPeter Klausler   if (x <= 2 && (mask & (1 << 1))) {
105f428f5fcSPeter Klausler     return 1;
106f428f5fcSPeter Klausler   } else if (x <= 4 && (mask & (1 << 2))) {
107f428f5fcSPeter Klausler     return 2;
108f428f5fcSPeter Klausler   } else if (x <= 9 && (mask & (1 << 4))) {
109f428f5fcSPeter Klausler     return 4;
110f428f5fcSPeter Klausler   } else if (x <= 18 && (mask & (1 << 8))) {
111f428f5fcSPeter Klausler     return 8;
112f428f5fcSPeter Klausler   } else if (x <= 38 && (mask & (1 << 16))) {
113f428f5fcSPeter Klausler     return 16;
114f532c072SPeixin Qiao   }
115f532c072SPeixin Qiao   return -1;
116f532c072SPeixin Qiao }
117f532c072SPeixin Qiao 
11882a8c1cfSPeter Klausler // SELECTED_LOGICAL_KIND (F'2023 16.9.182)
11982a8c1cfSPeter Klausler template <typename T>
12082a8c1cfSPeter Klausler inline RT_API_ATTRS CppTypeFor<TypeCategory::Integer, 4> SelectedLogicalKind(
12182a8c1cfSPeter Klausler     T x) {
12279c2a1e4SPeter Klausler   if (x <= 8) {
12382a8c1cfSPeter Klausler     return 1;
12479c2a1e4SPeter Klausler   } else if (x <= 16) {
12582a8c1cfSPeter Klausler     return 2;
12679c2a1e4SPeter Klausler   } else if (x <= 32) {
12782a8c1cfSPeter Klausler     return 4;
12879c2a1e4SPeter Klausler   } else if (x <= 64) {
12982a8c1cfSPeter Klausler     return 8;
13082a8c1cfSPeter Klausler   }
13182a8c1cfSPeter Klausler   return -1;
13282a8c1cfSPeter Klausler }
13382a8c1cfSPeter Klausler 
13457e3fa38SPeixin Qiao // SELECTED_REAL_KIND (16.9.170)
135f428f5fcSPeter Klausler template <typename P, typename R, typename D, typename M>
136b4b23ff7SSlava Zakharin inline RT_API_ATTRS CppTypeFor<TypeCategory::Integer, 4> SelectedRealKind(
137f428f5fcSPeter Klausler     P p, R r, D d, M mask) {
13857e3fa38SPeixin Qiao   if (d != 2) {
13957e3fa38SPeixin Qiao     return -5;
14057e3fa38SPeixin Qiao   }
141f428f5fcSPeter Klausler #ifdef FLANG_RUNTIME_NO_REAL_2
142f428f5fcSPeter Klausler   mask &= ~(1 << 2);
143c557d852SPeter Klausler #endif
144f428f5fcSPeter Klausler #ifdef FLANG_RUNTIME_NO_REAL_3
145f428f5fcSPeter Klausler   mask &= ~(1 << 3);
14657b89fddSPeter Klausler #endif
147104f3c18SSlava Zakharin #if !HAS_FLOAT80 || defined FLANG_RUNTIME_NO_REAL_10
148f428f5fcSPeter Klausler   mask &= ~(1 << 10);
149c557d852SPeter Klausler #endif
150f428f5fcSPeter Klausler #if LDBL_MANT_DIG < 64 || defined FLANG_RUNTIME_NO_REAL_16
151f428f5fcSPeter Klausler   mask &= ~(1 << 16);
152c557d852SPeter Klausler #endif
153c557d852SPeter Klausler 
15457e3fa38SPeixin Qiao   int error{0};
15557e3fa38SPeixin Qiao   int kind{0};
156f428f5fcSPeter Klausler   if (p <= 3 && (mask & (1 << 2))) {
15757e3fa38SPeixin Qiao     kind = 2;
158f428f5fcSPeter Klausler   } else if (p <= 6 && (mask & (1 << 4))) {
15957e3fa38SPeixin Qiao     kind = 4;
160f428f5fcSPeter Klausler   } else if (p <= 15 && (mask & (1 << 8))) {
16157e3fa38SPeixin Qiao     kind = 8;
162f428f5fcSPeter Klausler   } else if (p <= 18 && (mask & (1 << 10))) {
16357e3fa38SPeixin Qiao     kind = 10;
164f428f5fcSPeter Klausler   } else if (p <= 33 && (mask & (1 << 16))) {
16557e3fa38SPeixin Qiao     kind = 16;
16657e3fa38SPeixin Qiao   } else {
16757e3fa38SPeixin Qiao     error -= 1;
16857e3fa38SPeixin Qiao   }
16957e3fa38SPeixin Qiao 
170f428f5fcSPeter Klausler   if (r <= 4 && (mask & (1 << 2))) {
171f428f5fcSPeter Klausler     kind = kind < 2 ? 2 : kind;
172f428f5fcSPeter Klausler   } else if (r <= 37 && p != 3 && (mask & (1 << 3))) {
173f428f5fcSPeter Klausler     kind = kind < 3 ? 3 : kind;
174f428f5fcSPeter Klausler   } else if (r <= 37 && (mask & (1 << 4))) {
175f428f5fcSPeter Klausler     kind = kind < 4 ? 4 : kind;
176f428f5fcSPeter Klausler   } else if (r <= 307 && (mask & (1 << 8))) {
17757e3fa38SPeixin Qiao     kind = kind < 8 ? 8 : kind;
178f428f5fcSPeter Klausler   } else if (r <= 4931 && (mask & (1 << 10))) {
17957e3fa38SPeixin Qiao     kind = kind < 10 ? 10 : kind;
180f428f5fcSPeter Klausler   } else if (r <= 4931 && (mask & (1 << 16))) {
18157e3fa38SPeixin Qiao     kind = kind < 16 ? 16 : kind;
18257e3fa38SPeixin Qiao   } else {
18357e3fa38SPeixin Qiao     error -= 2;
18457e3fa38SPeixin Qiao   }
18557e3fa38SPeixin Qiao 
18657e3fa38SPeixin Qiao   return error ? error : kind;
18757e3fa38SPeixin Qiao }
18857e3fa38SPeixin Qiao 
1895f6c5c63Speter klausler // NEAREST (16.9.139)
190b4b23ff7SSlava Zakharin template <int PREC, typename T>
191b4b23ff7SSlava Zakharin inline RT_API_ATTRS T Nearest(T x, bool positive) {
19239c2f597SPeter Klausler   if (positive) {
19339c2f597SPeter Klausler     return std::nextafter(x, std::numeric_limits<T>::infinity());
1945f6c5c63Speter klausler   } else {
19539c2f597SPeter Klausler     return std::nextafter(x, -std::numeric_limits<T>::infinity());
1965f6c5c63Speter klausler   }
1975f6c5c63Speter klausler }
1985f6c5c63Speter klausler 
1999e8f6772SSlava Zakharin // Exponentiation operator for (Real ** Integer) cases (10.1.5.2.1).
200b4b23ff7SSlava Zakharin template <typename BTy, typename ETy>
201b4b23ff7SSlava Zakharin RT_API_ATTRS BTy FPowI(BTy base, ETy exp) {
2029e8f6772SSlava Zakharin   if (exp == ETy{0})
2039e8f6772SSlava Zakharin     return BTy{1};
2049e8f6772SSlava Zakharin   bool isNegativePower{exp < ETy{0}};
2059e8f6772SSlava Zakharin   bool isMinPower{exp == std::numeric_limits<ETy>::min()};
2069e8f6772SSlava Zakharin   if (isMinPower) {
2079e8f6772SSlava Zakharin     exp = std::numeric_limits<ETy>::max();
2089e8f6772SSlava Zakharin   } else if (isNegativePower) {
2099e8f6772SSlava Zakharin     exp = -exp;
2109e8f6772SSlava Zakharin   }
2119e8f6772SSlava Zakharin   BTy result{1};
2129e8f6772SSlava Zakharin   BTy origBase{base};
2139e8f6772SSlava Zakharin   while (true) {
2149e8f6772SSlava Zakharin     if (exp & ETy{1}) {
2159e8f6772SSlava Zakharin       result *= base;
2169e8f6772SSlava Zakharin     }
2179e8f6772SSlava Zakharin     exp >>= 1;
2189e8f6772SSlava Zakharin     if (exp == ETy{0}) {
2199e8f6772SSlava Zakharin       break;
2209e8f6772SSlava Zakharin     }
2219e8f6772SSlava Zakharin     base *= base;
2229e8f6772SSlava Zakharin   }
2239e8f6772SSlava Zakharin   if (isMinPower) {
2249e8f6772SSlava Zakharin     result *= origBase;
2259e8f6772SSlava Zakharin   }
2269e8f6772SSlava Zakharin   if (isNegativePower) {
2279e8f6772SSlava Zakharin     result = BTy{1} / result;
2289e8f6772SSlava Zakharin   }
2299e8f6772SSlava Zakharin   return result;
2309e8f6772SSlava Zakharin }
2319e8f6772SSlava Zakharin 
2325f6c5c63Speter klausler extern "C" {
23376facde3SSlava Zakharin RT_EXT_API_GROUP_BEGIN
2345f6c5c63Speter klausler 
235b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling4_1)(
2365f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2375f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
2385f6c5c63Speter klausler }
239b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling4_2)(
2405f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2415f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
2425f6c5c63Speter klausler }
243b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling4_4)(
2445f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2455f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
2465f6c5c63Speter klausler }
247b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling4_8)(
2485f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2495f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
2505f6c5c63Speter klausler }
2511c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
252b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling4_16)(
2535f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2545f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
2555f6c5c63Speter klausler }
256c115c289Speter klausler #endif
257b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling8_1)(
2585f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2595f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
2605f6c5c63Speter klausler }
261b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling8_2)(
2625f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2635f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
2645f6c5c63Speter klausler }
265b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling8_4)(
2665f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2675f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
2685f6c5c63Speter klausler }
269b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling8_8)(
2705f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2715f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
2725f6c5c63Speter klausler }
2731c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
274b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling8_16)(
2755f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2765f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
2775f6c5c63Speter klausler }
278c115c289Speter klausler #endif
279104f3c18SSlava Zakharin #if HAS_FLOAT80
280b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling10_1)(
2815f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
2825f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
2835f6c5c63Speter klausler }
284b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling10_2)(
2855f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
2865f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
2875f6c5c63Speter klausler }
288b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling10_4)(
2895f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
2905f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
2915f6c5c63Speter klausler }
292b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling10_8)(
2935f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
2945f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
2955f6c5c63Speter klausler }
2961c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
297b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling10_16)(
2985f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
2995f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
3005f6c5c63Speter klausler }
301c115c289Speter klausler #endif
302fc51c7f0SSlava Zakharin #elif HAS_LDBL128
303b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling16_1)(
3045f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3055f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
3065f6c5c63Speter klausler }
307b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling16_2)(
3085f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3095f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
3105f6c5c63Speter klausler }
311b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling16_4)(
3125f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3135f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
3145f6c5c63Speter klausler }
315b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling16_8)(
3165f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3175f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
3185f6c5c63Speter klausler }
3191c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
320b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling16_16)(
3215f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3225f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
3235f6c5c63Speter klausler }
3245f6c5c63Speter klausler #endif
325c115c289Speter klausler #endif
3265f6c5c63Speter klausler 
327a03e93e1SDavid Parks CppTypeFor<TypeCategory::Real, 4> RTDEF(ErfcScaled4)(
328a03e93e1SDavid Parks     CppTypeFor<TypeCategory::Real, 4> x) {
329a03e93e1SDavid Parks   return ErfcScaled(x);
330a03e93e1SDavid Parks }
331a03e93e1SDavid Parks CppTypeFor<TypeCategory::Real, 8> RTDEF(ErfcScaled8)(
332a03e93e1SDavid Parks     CppTypeFor<TypeCategory::Real, 8> x) {
333a03e93e1SDavid Parks   return ErfcScaled(x);
334a03e93e1SDavid Parks }
335104f3c18SSlava Zakharin #if HAS_FLOAT80
336a03e93e1SDavid Parks CppTypeFor<TypeCategory::Real, 10> RTDEF(ErfcScaled10)(
337a03e93e1SDavid Parks     CppTypeFor<TypeCategory::Real, 10> x) {
338a03e93e1SDavid Parks   return ErfcScaled(x);
339a03e93e1SDavid Parks }
340a03e93e1SDavid Parks #endif
341fc51c7f0SSlava Zakharin #if HAS_LDBL128
342a03e93e1SDavid Parks CppTypeFor<TypeCategory::Real, 16> RTDEF(ErfcScaled16)(
343a03e93e1SDavid Parks     CppTypeFor<TypeCategory::Real, 16> x) {
344a03e93e1SDavid Parks   return ErfcScaled(x);
345a03e93e1SDavid Parks }
346a03e93e1SDavid Parks #endif
347a03e93e1SDavid Parks 
348b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Exponent4_4)(
3495f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3505f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3515f6c5c63Speter klausler }
352b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Exponent4_8)(
3535f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3545f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3555f6c5c63Speter klausler }
356b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Exponent8_4)(
3575f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
3585f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3595f6c5c63Speter klausler }
360b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Exponent8_8)(
3615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
3625f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3635f6c5c63Speter klausler }
364104f3c18SSlava Zakharin #if HAS_FLOAT80
365b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Exponent10_4)(
3665f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3675f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3685f6c5c63Speter klausler }
369b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Exponent10_8)(
3705f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3715f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3725f6c5c63Speter klausler }
3735f6c5c63Speter klausler #endif
3745f6c5c63Speter klausler 
375b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor4_1)(
3765f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3775f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
3785f6c5c63Speter klausler }
379b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor4_2)(
3805f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3815f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
3825f6c5c63Speter klausler }
383b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor4_4)(
3845f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3855f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
3865f6c5c63Speter klausler }
387b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor4_8)(
3885f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3895f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
3905f6c5c63Speter klausler }
3911c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
392b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor4_16)(
3935f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3945f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
3955f6c5c63Speter klausler }
396c115c289Speter klausler #endif
397b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor8_1)(
3985f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
3995f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
4005f6c5c63Speter klausler }
401b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor8_2)(
4025f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4035f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
4045f6c5c63Speter klausler }
405b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor8_4)(
4065f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4075f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
4085f6c5c63Speter klausler }
409b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor8_8)(
4105f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4115f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4125f6c5c63Speter klausler }
4131c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
414b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor8_16)(
4155f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4165f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4175f6c5c63Speter klausler }
418c115c289Speter klausler #endif
419104f3c18SSlava Zakharin #if HAS_FLOAT80
420b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor10_1)(
4215f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4225f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
4235f6c5c63Speter klausler }
424b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor10_2)(
4255f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4265f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
4275f6c5c63Speter klausler }
428b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor10_4)(
4295f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4305f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
4315f6c5c63Speter klausler }
432b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor10_8)(
4335f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4345f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4355f6c5c63Speter klausler }
4361c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
437b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor10_16)(
4385f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4395f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4405f6c5c63Speter klausler }
441c115c289Speter klausler #endif
442fc51c7f0SSlava Zakharin #elif HAS_LDBL128
443b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor16_1)(
4445f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4455f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
4465f6c5c63Speter klausler }
447b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor16_2)(
4485f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4495f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
4505f6c5c63Speter klausler }
451b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor16_4)(
4525f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4535f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
4545f6c5c63Speter klausler }
455b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor16_8)(
4565f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4575f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4585f6c5c63Speter klausler }
4591c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
460b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor16_16)(
4615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4625f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4635f6c5c63Speter klausler }
4645f6c5c63Speter klausler #endif
465c115c289Speter klausler #endif
4665f6c5c63Speter klausler 
467b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(Fraction4)(
4685f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
4695f6c5c63Speter klausler   return Fraction(x);
4705f6c5c63Speter klausler }
471b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(Fraction8)(
4725f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4735f6c5c63Speter klausler   return Fraction(x);
4745f6c5c63Speter klausler }
475104f3c18SSlava Zakharin #if HAS_FLOAT80
476b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(Fraction10)(
4775f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4785f6c5c63Speter klausler   return Fraction(x);
4795f6c5c63Speter klausler }
4805f6c5c63Speter klausler #endif
4815f6c5c63Speter klausler 
482b4b23ff7SSlava Zakharin bool RTDEF(IsFinite4)(CppTypeFor<TypeCategory::Real, 4> x) {
48371d868cfSpeter klausler   return std::isfinite(x);
48471d868cfSpeter klausler }
485b4b23ff7SSlava Zakharin bool RTDEF(IsFinite8)(CppTypeFor<TypeCategory::Real, 8> x) {
48671d868cfSpeter klausler   return std::isfinite(x);
48771d868cfSpeter klausler }
488104f3c18SSlava Zakharin #if HAS_FLOAT80
489b4b23ff7SSlava Zakharin bool RTDEF(IsFinite10)(CppTypeFor<TypeCategory::Real, 10> x) {
49071d868cfSpeter klausler   return std::isfinite(x);
49171d868cfSpeter klausler }
492fc51c7f0SSlava Zakharin #elif HAS_LDBL128
493b4b23ff7SSlava Zakharin bool RTDEF(IsFinite16)(CppTypeFor<TypeCategory::Real, 16> x) {
49471d868cfSpeter klausler   return std::isfinite(x);
49571d868cfSpeter klausler }
49671d868cfSpeter klausler #endif
49771d868cfSpeter klausler 
498b4b23ff7SSlava Zakharin bool RTDEF(IsNaN4)(CppTypeFor<TypeCategory::Real, 4> x) {
49971d868cfSpeter klausler   return std::isnan(x);
50071d868cfSpeter klausler }
501b4b23ff7SSlava Zakharin bool RTDEF(IsNaN8)(CppTypeFor<TypeCategory::Real, 8> x) {
50271d868cfSpeter klausler   return std::isnan(x);
50371d868cfSpeter klausler }
504104f3c18SSlava Zakharin #if HAS_FLOAT80
505b4b23ff7SSlava Zakharin bool RTDEF(IsNaN10)(CppTypeFor<TypeCategory::Real, 10> x) {
50671d868cfSpeter klausler   return std::isnan(x);
50771d868cfSpeter klausler }
508fc51c7f0SSlava Zakharin #elif HAS_LDBL128
509b4b23ff7SSlava Zakharin bool RTDEF(IsNaN16)(CppTypeFor<TypeCategory::Real, 16> x) {
51071d868cfSpeter klausler   return std::isnan(x);
51171d868cfSpeter klausler }
51271d868cfSpeter klausler #endif
51371d868cfSpeter klausler 
514b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(ModInteger1)(
5155f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 1> x,
516562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 1> p, const char *sourceFile,
517562fd2c9SPeter Klausler     int sourceLine) {
518562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5195f6c5c63Speter klausler }
520b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(ModInteger2)(
5215f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 2> x,
522562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 2> p, const char *sourceFile,
523562fd2c9SPeter Klausler     int sourceLine) {
524562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5255f6c5c63Speter klausler }
526b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(ModInteger4)(
5275f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 4> x,
528562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 4> p, const char *sourceFile,
529562fd2c9SPeter Klausler     int sourceLine) {
530562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5315f6c5c63Speter klausler }
532b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(ModInteger8)(
5335f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 8> x,
534562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 8> p, const char *sourceFile,
535562fd2c9SPeter Klausler     int sourceLine) {
536562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5375f6c5c63Speter klausler }
538c115c289Speter klausler #ifdef __SIZEOF_INT128__
539b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(ModInteger16)(
5405f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 16> x,
541562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 16> p, const char *sourceFile,
542562fd2c9SPeter Klausler     int sourceLine) {
543562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5445f6c5c63Speter klausler }
545c115c289Speter klausler #endif
546b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(ModReal4)(
547562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> p,
548562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
549562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5505f6c5c63Speter klausler }
551b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(ModReal8)(
552562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> p,
553562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
554562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5555f6c5c63Speter klausler }
556104f3c18SSlava Zakharin #if HAS_FLOAT80
557b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(ModReal10)(
558562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 10> x, CppTypeFor<TypeCategory::Real, 10> p,
559562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
560562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5615f6c5c63Speter klausler }
5625f6c5c63Speter klausler #endif
5635f6c5c63Speter klausler 
564b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(ModuloInteger1)(
5655f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 1> x,
566562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 1> p, const char *sourceFile,
567562fd2c9SPeter Klausler     int sourceLine) {
568562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5695f6c5c63Speter klausler }
570b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(ModuloInteger2)(
5715f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 2> x,
572562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 2> p, const char *sourceFile,
573562fd2c9SPeter Klausler     int sourceLine) {
574562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5755f6c5c63Speter klausler }
576b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(ModuloInteger4)(
5775f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 4> x,
578562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 4> p, const char *sourceFile,
579562fd2c9SPeter Klausler     int sourceLine) {
580562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5815f6c5c63Speter klausler }
582b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(ModuloInteger8)(
5835f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 8> x,
584562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 8> p, const char *sourceFile,
585562fd2c9SPeter Klausler     int sourceLine) {
586562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5875f6c5c63Speter klausler }
588c115c289Speter klausler #ifdef __SIZEOF_INT128__
589b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(ModuloInteger16)(
5905f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 16> x,
591562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 16> p, const char *sourceFile,
592562fd2c9SPeter Klausler     int sourceLine) {
593562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5945f6c5c63Speter klausler }
595c115c289Speter klausler #endif
596b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(ModuloReal4)(
597562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> p,
598562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
599562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6005f6c5c63Speter klausler }
601b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(ModuloReal8)(
602562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> p,
603562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
604562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6055f6c5c63Speter klausler }
606104f3c18SSlava Zakharin #if HAS_FLOAT80
607b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(ModuloReal10)(
608562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 10> x, CppTypeFor<TypeCategory::Real, 10> p,
609562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
610562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6115f6c5c63Speter klausler }
6125f6c5c63Speter klausler #endif
6135f6c5c63Speter klausler 
614b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(Nearest4)(
6155f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x, bool positive) {
6165f6c5c63Speter klausler   return Nearest<24>(x, positive);
6175f6c5c63Speter klausler }
618b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(Nearest8)(
6195f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x, bool positive) {
6205f6c5c63Speter klausler   return Nearest<53>(x, positive);
6215f6c5c63Speter klausler }
622104f3c18SSlava Zakharin #if HAS_FLOAT80
623b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(Nearest10)(
6245f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x, bool positive) {
6255f6c5c63Speter klausler   return Nearest<64>(x, positive);
6265f6c5c63Speter klausler }
6275f6c5c63Speter klausler #endif
6285f6c5c63Speter klausler 
629b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint4_1)(
6305f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6313ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
6325f6c5c63Speter klausler }
633b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint4_2)(
6345f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6353ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
6365f6c5c63Speter klausler }
637b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint4_4)(
6385f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6393ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
6405f6c5c63Speter klausler }
641b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint4_8)(
6425f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6433ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
6445f6c5c63Speter klausler }
6451c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
646b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint4_16)(
6475f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6483ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
6495f6c5c63Speter klausler }
650c115c289Speter klausler #endif
651b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint8_1)(
6525f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6533ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
6545f6c5c63Speter klausler }
655b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint8_2)(
6565f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6573ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
6585f6c5c63Speter klausler }
659b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint8_4)(
6605f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6613ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
6625f6c5c63Speter klausler }
663b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint8_8)(
6645f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6653ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
6665f6c5c63Speter klausler }
6671c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
668b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint8_16)(
6695f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6703ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
6715f6c5c63Speter klausler }
672c115c289Speter klausler #endif
673104f3c18SSlava Zakharin #if HAS_FLOAT80
674b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint10_1)(
6755f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
6763ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
6775f6c5c63Speter klausler }
678b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint10_2)(
6795f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
6803ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
6815f6c5c63Speter klausler }
682b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint10_4)(
6835f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
6843ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
6855f6c5c63Speter klausler }
686b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint10_8)(
6875f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
6883ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
6895f6c5c63Speter klausler }
6901c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
691b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint10_16)(
6925f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
6933ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
6945f6c5c63Speter klausler }
695c115c289Speter klausler #endif
696fc51c7f0SSlava Zakharin #elif HAS_LDBL128
697b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint16_1)(
6985f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
6993ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
7005f6c5c63Speter klausler }
701b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint16_2)(
7025f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7033ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
7045f6c5c63Speter klausler }
705b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint16_4)(
7065f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7073ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
7085f6c5c63Speter klausler }
709b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint16_8)(
7105f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7113ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
7125f6c5c63Speter klausler }
7131c35c1a7SPeter Klausler #if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T
714b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint16_16)(
7155f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7163ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
7175f6c5c63Speter klausler }
7185f6c5c63Speter klausler #endif
719c115c289Speter klausler #endif
7205f6c5c63Speter klausler 
721b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(RRSpacing4)(
7225f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
7235f6c5c63Speter klausler   return RRSpacing<24>(x);
7245f6c5c63Speter klausler }
725b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(RRSpacing8)(
7265f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
7275f6c5c63Speter klausler   return RRSpacing<53>(x);
7285f6c5c63Speter klausler }
729104f3c18SSlava Zakharin #if HAS_FLOAT80
730b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(RRSpacing10)(
7315f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7325f6c5c63Speter klausler   return RRSpacing<64>(x);
7335f6c5c63Speter klausler }
7345f6c5c63Speter klausler #endif
7355f6c5c63Speter klausler 
736b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(SetExponent4)(
7375f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x, std::int64_t p) {
7385f6c5c63Speter klausler   return SetExponent(x, p);
7395f6c5c63Speter klausler }
740b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(SetExponent8)(
7415f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x, std::int64_t p) {
7425f6c5c63Speter klausler   return SetExponent(x, p);
7435f6c5c63Speter klausler }
744104f3c18SSlava Zakharin #if HAS_FLOAT80
745b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(SetExponent10)(
7465f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x, std::int64_t p) {
7475f6c5c63Speter klausler   return SetExponent(x, p);
7485f6c5c63Speter klausler }
7495f6c5c63Speter klausler #endif
7505f6c5c63Speter klausler 
751b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(Scale4)(
7525f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x, std::int64_t p) {
7535f6c5c63Speter klausler   return Scale(x, p);
7545f6c5c63Speter klausler }
755b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(Scale8)(
7565f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x, std::int64_t p) {
7575f6c5c63Speter klausler   return Scale(x, p);
7585f6c5c63Speter klausler }
759104f3c18SSlava Zakharin #if HAS_FLOAT80
760b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(Scale10)(
7615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x, std::int64_t p) {
7625f6c5c63Speter klausler   return Scale(x, p);
7635f6c5c63Speter klausler }
7645f6c5c63Speter klausler #endif
7655f6c5c63Speter klausler 
76682a8c1cfSPeter Klausler // SELECTED_CHAR_KIND
76782a8c1cfSPeter Klausler CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedCharKind)(
76882a8c1cfSPeter Klausler     const char *source, int line, const char *x, std::size_t length) {
76982a8c1cfSPeter Klausler   static const char *keywords[]{
77082a8c1cfSPeter Klausler       "ASCII", "DEFAULT", "UCS-2", "ISO_10646", "UCS-4", nullptr};
77182a8c1cfSPeter Klausler   switch (IdentifyValue(x, length, keywords)) {
77282a8c1cfSPeter Klausler   case 0: // ASCII
77382a8c1cfSPeter Klausler   case 1: // DEFAULT
77482a8c1cfSPeter Klausler     return 1;
77582a8c1cfSPeter Klausler   case 2: // UCS-2
77682a8c1cfSPeter Klausler     return 2;
77782a8c1cfSPeter Klausler   case 3: // ISO_10646
77882a8c1cfSPeter Klausler   case 4: // UCS-4
77982a8c1cfSPeter Klausler     return 4;
78082a8c1cfSPeter Klausler   default:
78182a8c1cfSPeter Klausler     return -1;
78282a8c1cfSPeter Klausler   }
78382a8c1cfSPeter Klausler }
784*fc97d2e6SPeter Klausler // SELECTED_INT_KIND and SELECTED_UNSIGNED_KIND extension
785b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedIntKind)(
786f532c072SPeixin Qiao     const char *source, int line, void *x, int xKind) {
787f428f5fcSPeter Klausler   return RTNAME(SelectedIntKindMasked)(source, line, x, xKind,
788f428f5fcSPeter Klausler       (1 << 1) | (1 << 2) | (1 << 4) | (1 << 8) | (1 << 16));
789f428f5fcSPeter Klausler }
790f428f5fcSPeter Klausler 
791f428f5fcSPeter Klausler CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedIntKindMasked)(
792f428f5fcSPeter Klausler     const char *source, int line, void *x, int xKind, int mask) {
793f532c072SPeixin Qiao #ifdef __SIZEOF_INT128__
794f532c072SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> r =
79582a8c1cfSPeter Klausler       GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
796f532c072SPeixin Qiao           source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 16);
797f532c072SPeixin Qiao #else
79882a8c1cfSPeter Klausler   std::int64_t r = GetIntArgValue<std::int64_t>(
799f532c072SPeixin Qiao       source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 8);
800f532c072SPeixin Qiao #endif
801f428f5fcSPeter Klausler   return SelectedIntKind(r, mask);
802f532c072SPeixin Qiao }
803f532c072SPeixin Qiao 
80482a8c1cfSPeter Klausler // SELECTED_LOGICAL_KIND
80582a8c1cfSPeter Klausler CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedLogicalKind)(
80682a8c1cfSPeter Klausler     const char *source, int line, void *x, int xKind) {
80782a8c1cfSPeter Klausler #ifdef __SIZEOF_INT128__
80882a8c1cfSPeter Klausler   CppTypeFor<TypeCategory::Integer, 16> r =
80982a8c1cfSPeter Klausler       GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
81082a8c1cfSPeter Klausler           source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 16);
81182a8c1cfSPeter Klausler #else
81282a8c1cfSPeter Klausler   std::int64_t r = GetIntArgValue<std::int64_t>(
81382a8c1cfSPeter Klausler       source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 8);
81482a8c1cfSPeter Klausler #endif
81582a8c1cfSPeter Klausler   return SelectedLogicalKind(r);
81682a8c1cfSPeter Klausler }
81782a8c1cfSPeter Klausler 
81857e3fa38SPeixin Qiao // SELECTED_REAL_KIND
819b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedRealKind)(const char *source,
820b4b23ff7SSlava Zakharin     int line, void *precision, int pKind, void *range, int rKind, void *radix,
821b4b23ff7SSlava Zakharin     int dKind) {
822f428f5fcSPeter Klausler   return RTNAME(SelectedRealKindMasked)(source, line, precision, pKind, range,
823f428f5fcSPeter Klausler       rKind, radix, dKind,
824f428f5fcSPeter Klausler       (1 << 2) | (1 << 3) | (1 << 4) | (1 << 8) | (1 << 10) | (1 << 16));
825f428f5fcSPeter Klausler }
826f428f5fcSPeter Klausler 
827f428f5fcSPeter Klausler CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedRealKindMasked)(
828f428f5fcSPeter Klausler     const char *source, int line, void *precision, int pKind, void *range,
829f428f5fcSPeter Klausler     int rKind, void *radix, int dKind, int mask) {
83057e3fa38SPeixin Qiao #ifdef __SIZEOF_INT128__
83157e3fa38SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> p =
83282a8c1cfSPeter Klausler       GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
83357e3fa38SPeixin Qiao           source, line, precision, pKind, /*defaultValue*/ 0, /*resKind*/ 16);
83457e3fa38SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> r =
83582a8c1cfSPeter Klausler       GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
83657e3fa38SPeixin Qiao           source, line, range, rKind, /*defaultValue*/ 0, /*resKind*/ 16);
83757e3fa38SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> d =
83882a8c1cfSPeter Klausler       GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
83957e3fa38SPeixin Qiao           source, line, radix, dKind, /*defaultValue*/ 2, /*resKind*/ 16);
84057e3fa38SPeixin Qiao #else
84182a8c1cfSPeter Klausler   std::int64_t p = GetIntArgValue<std::int64_t>(
84257e3fa38SPeixin Qiao       source, line, precision, pKind, /*defaultValue*/ 0, /*resKind*/ 8);
84382a8c1cfSPeter Klausler   std::int64_t r = GetIntArgValue<std::int64_t>(
84457e3fa38SPeixin Qiao       source, line, range, rKind, /*defaultValue*/ 0, /*resKind*/ 8);
84582a8c1cfSPeter Klausler   std::int64_t d = GetIntArgValue<std::int64_t>(
84657e3fa38SPeixin Qiao       source, line, radix, dKind, /*defaultValue*/ 2, /*resKind*/ 8);
84757e3fa38SPeixin Qiao #endif
848f428f5fcSPeter Klausler   return SelectedRealKind(p, r, d, mask);
84957e3fa38SPeixin Qiao }
85057e3fa38SPeixin Qiao 
851500f6cc2SPeter Klausler #if HAS_FP16
852500f6cc2SPeter Klausler CppTypeFor<TypeCategory::Real, 2> RTDEF(Spacing2)(
853500f6cc2SPeter Klausler     CppTypeFor<TypeCategory::Real, 2> x) {
854500f6cc2SPeter Klausler   return Spacing<11>(x);
855500f6cc2SPeter Klausler }
856500f6cc2SPeter Klausler #endif
857500f6cc2SPeter Klausler CppTypeFor<TypeCategory::Real, 4> RTDEF(Spacing2By4)(
858500f6cc2SPeter Klausler     CppTypeFor<TypeCategory::Real, 4> x) {
859500f6cc2SPeter Klausler   return Spacing<11>(x);
860500f6cc2SPeter Klausler }
861500f6cc2SPeter Klausler #if HAS_BF16
862500f6cc2SPeter Klausler CppTypeFor<TypeCategory::Real, 3> RTDEF(Spacing3)(
863500f6cc2SPeter Klausler     CppTypeFor<TypeCategory::Real, 3> x) {
864500f6cc2SPeter Klausler   return Spacing<8>(x);
865500f6cc2SPeter Klausler }
866500f6cc2SPeter Klausler #endif
867500f6cc2SPeter Klausler CppTypeFor<TypeCategory::Real, 4> RTDEF(Spacing3By4)(
868500f6cc2SPeter Klausler     CppTypeFor<TypeCategory::Real, 4> x) {
869500f6cc2SPeter Klausler   return Spacing<8>(x);
870500f6cc2SPeter Klausler }
871b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(Spacing4)(
8725f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
8735f6c5c63Speter klausler   return Spacing<24>(x);
8745f6c5c63Speter klausler }
875b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(Spacing8)(
8765f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
8775f6c5c63Speter klausler   return Spacing<53>(x);
8785f6c5c63Speter klausler }
879104f3c18SSlava Zakharin #if HAS_FLOAT80
880b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(Spacing10)(
8815f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
8825f6c5c63Speter klausler   return Spacing<64>(x);
8835f6c5c63Speter klausler }
8845f6c5c63Speter klausler #endif
8859e8f6772SSlava Zakharin 
886b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(FPow4i)(
8879e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 4> b,
8889e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 4> e) {
8899e8f6772SSlava Zakharin   return FPowI(b, e);
8909e8f6772SSlava Zakharin }
891b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(FPow8i)(
8929e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 8> b,
8939e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 4> e) {
8949e8f6772SSlava Zakharin   return FPowI(b, e);
8959e8f6772SSlava Zakharin }
896104f3c18SSlava Zakharin #if HAS_FLOAT80
897b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(FPow10i)(
8989e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 10> b,
8999e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 4> e) {
9009e8f6772SSlava Zakharin   return FPowI(b, e);
9019e8f6772SSlava Zakharin }
9029e8f6772SSlava Zakharin #endif
903fc51c7f0SSlava Zakharin #if HAS_LDBL128 || HAS_FLOAT128
904b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 16> RTDEF(FPow16i)(
9059e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 16> b,
9069e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 4> e) {
9079e8f6772SSlava Zakharin   return FPowI(b, e);
9089e8f6772SSlava Zakharin }
9099e8f6772SSlava Zakharin #endif
9109e8f6772SSlava Zakharin 
911b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 4> RTDEF(FPow4k)(
9129e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 4> b,
9139e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 8> e) {
9149e8f6772SSlava Zakharin   return FPowI(b, e);
9159e8f6772SSlava Zakharin }
916b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 8> RTDEF(FPow8k)(
9179e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 8> b,
9189e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 8> e) {
9199e8f6772SSlava Zakharin   return FPowI(b, e);
9209e8f6772SSlava Zakharin }
921104f3c18SSlava Zakharin #if HAS_FLOAT80
922b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 10> RTDEF(FPow10k)(
9239e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 10> b,
9249e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 8> e) {
9259e8f6772SSlava Zakharin   return FPowI(b, e);
9269e8f6772SSlava Zakharin }
9279e8f6772SSlava Zakharin #endif
928fc51c7f0SSlava Zakharin #if HAS_LDBL128 || HAS_FLOAT128
929b4b23ff7SSlava Zakharin CppTypeFor<TypeCategory::Real, 16> RTDEF(FPow16k)(
9309e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Real, 16> b,
9319e8f6772SSlava Zakharin     CppTypeFor<TypeCategory::Integer, 8> e) {
9329e8f6772SSlava Zakharin   return FPowI(b, e);
9339e8f6772SSlava Zakharin }
9349e8f6772SSlava Zakharin #endif
93576facde3SSlava Zakharin 
93676facde3SSlava Zakharin RT_EXT_API_GROUP_END
9375f6c5c63Speter klausler } // extern "C"
9385f6c5c63Speter klausler } // namespace Fortran::runtime
939