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"
104daa33f6SPeter Klausler #include "terminator.h"
114daa33f6SPeter Klausler #include "flang/Runtime/float128.h"
124daa33f6SPeter Klausler #include <cfloat>
135f6c5c63Speter klausler #include <climits>
145f6c5c63Speter klausler #include <cmath>
155f6c5c63Speter klausler #include <limits>
165f6c5c63Speter klausler 
175f6c5c63Speter klausler namespace Fortran::runtime {
185f6c5c63Speter klausler 
1957e3fa38SPeixin Qiao template <typename RES>
getIntArgValue(const char * source,int line,void * arg,int kind,std::int64_t defaultValue,int resKind)2057e3fa38SPeixin Qiao inline RES getIntArgValue(const char *source, int line, void *arg, int kind,
2157e3fa38SPeixin Qiao     std::int64_t defaultValue, int resKind) {
2257e3fa38SPeixin Qiao   RES res;
2357e3fa38SPeixin Qiao   if (!arg) {
2457e3fa38SPeixin Qiao     res = static_cast<RES>(defaultValue);
2557e3fa38SPeixin Qiao   } else if (kind == 1) {
2657e3fa38SPeixin Qiao     res = static_cast<RES>(
2757e3fa38SPeixin Qiao         *static_cast<CppTypeFor<TypeCategory::Integer, 1> *>(arg));
2857e3fa38SPeixin Qiao   } else if (kind == 2) {
2957e3fa38SPeixin Qiao     res = static_cast<RES>(
3057e3fa38SPeixin Qiao         *static_cast<CppTypeFor<TypeCategory::Integer, 2> *>(arg));
3157e3fa38SPeixin Qiao   } else if (kind == 4) {
3257e3fa38SPeixin Qiao     res = static_cast<RES>(
3357e3fa38SPeixin Qiao         *static_cast<CppTypeFor<TypeCategory::Integer, 4> *>(arg));
3457e3fa38SPeixin Qiao   } else if (kind == 8) {
3557e3fa38SPeixin Qiao     res = static_cast<RES>(
3657e3fa38SPeixin Qiao         *static_cast<CppTypeFor<TypeCategory::Integer, 8> *>(arg));
3757e3fa38SPeixin Qiao #ifdef __SIZEOF_INT128__
3857e3fa38SPeixin Qiao   } else if (kind == 16) {
3957e3fa38SPeixin Qiao     if (resKind != 16) {
4057e3fa38SPeixin Qiao       Terminator{source, line}.Crash("Unexpected integer kind in runtime");
4157e3fa38SPeixin Qiao     }
4257e3fa38SPeixin Qiao     res = static_cast<RES>(
4357e3fa38SPeixin Qiao         *static_cast<CppTypeFor<TypeCategory::Integer, 16> *>(arg));
4457e3fa38SPeixin Qiao #endif
4557e3fa38SPeixin Qiao   } else {
4657e3fa38SPeixin Qiao     Terminator{source, line}.Crash("Unexpected integer kind in runtime");
4757e3fa38SPeixin Qiao   }
4857e3fa38SPeixin Qiao   return res;
4957e3fa38SPeixin Qiao }
5057e3fa38SPeixin Qiao 
513ccd4ce2SPeixin Qiao // NINT (16.9.141)
Nint(ARG x)523ccd4ce2SPeixin Qiao template <typename RESULT, typename ARG> inline RESULT Nint(ARG x) {
535f6c5c63Speter klausler   if (x >= 0) {
545f6c5c63Speter klausler     return std::trunc(x + ARG{0.5});
555f6c5c63Speter klausler   } else {
565f6c5c63Speter klausler     return std::trunc(x - ARG{0.5});
575f6c5c63Speter klausler   }
585f6c5c63Speter klausler }
595f6c5c63Speter klausler 
605f6c5c63Speter klausler // CEILING & FLOOR (16.9.43, .79)
Ceiling(ARG x)615f6c5c63Speter klausler template <typename RESULT, typename ARG> inline RESULT Ceiling(ARG x) {
625f6c5c63Speter klausler   return std::ceil(x);
635f6c5c63Speter klausler }
Floor(ARG x)645f6c5c63Speter klausler template <typename RESULT, typename ARG> inline RESULT Floor(ARG x) {
655f6c5c63Speter klausler   return std::floor(x);
665f6c5c63Speter klausler }
675f6c5c63Speter klausler 
685f6c5c63Speter klausler // EXPONENT (16.9.75)
Exponent(ARG x)695f6c5c63Speter klausler template <typename RESULT, typename ARG> inline RESULT Exponent(ARG x) {
705f6c5c63Speter klausler   if (std::isinf(x) || std::isnan(x)) {
715f6c5c63Speter klausler     return std::numeric_limits<RESULT>::max(); // +/-Inf, NaN -> HUGE(0)
725f6c5c63Speter klausler   } else if (x == 0) {
735f6c5c63Speter klausler     return 0; // 0 -> 0
745f6c5c63Speter klausler   } else {
755f6c5c63Speter klausler     return std::ilogb(x) + 1;
765f6c5c63Speter klausler   }
775f6c5c63Speter klausler }
785f6c5c63Speter klausler 
795f6c5c63Speter klausler // FRACTION (16.9.80)
Fraction(T x)805f6c5c63Speter klausler template <typename T> inline T Fraction(T x) {
815f6c5c63Speter klausler   if (std::isnan(x)) {
825f6c5c63Speter klausler     return x; // NaN -> same NaN
835f6c5c63Speter klausler   } else if (std::isinf(x)) {
845f6c5c63Speter klausler     return std::numeric_limits<T>::quiet_NaN(); // +/-Inf -> NaN
855f6c5c63Speter klausler   } else if (x == 0) {
865f6c5c63Speter klausler     return 0; // 0 -> 0
875f6c5c63Speter klausler   } else {
885f6c5c63Speter klausler     int ignoredExp;
895f6c5c63Speter klausler     return std::frexp(x, &ignoredExp);
905f6c5c63Speter klausler   }
915f6c5c63Speter klausler }
925f6c5c63Speter klausler 
935f6c5c63Speter klausler // MOD & MODULO (16.9.135, .136)
94562fd2c9SPeter Klausler template <bool IS_MODULO, typename T>
IntMod(T x,T p,const char * sourceFile,int sourceLine)95562fd2c9SPeter Klausler inline T IntMod(T x, T p, const char *sourceFile, int sourceLine) {
96562fd2c9SPeter Klausler   if (p == 0) {
97562fd2c9SPeter Klausler     Terminator{sourceFile, sourceLine}.Crash(
98562fd2c9SPeter Klausler         IS_MODULO ? "MODULO with P==0" : "MOD with P==0");
99562fd2c9SPeter Klausler   }
1005f6c5c63Speter klausler   auto mod{x - (x / p) * p};
1015f6c5c63Speter klausler   if (IS_MODULO && (x > 0) != (p > 0)) {
1025f6c5c63Speter klausler     mod += p;
1035f6c5c63Speter klausler   }
1045f6c5c63Speter klausler   return mod;
1055f6c5c63Speter klausler }
106562fd2c9SPeter Klausler template <bool IS_MODULO, typename T>
RealMod(T a,T p,const char * sourceFile,int sourceLine)107715283aaSPeter Klausler inline T RealMod(T a, T p, const char *sourceFile, int sourceLine) {
108562fd2c9SPeter Klausler   if (p == 0) {
109562fd2c9SPeter Klausler     Terminator{sourceFile, sourceLine}.Crash(
110562fd2c9SPeter Klausler         IS_MODULO ? "MODULO with P==0" : "MOD with P==0");
111562fd2c9SPeter Klausler   }
112715283aaSPeter Klausler   T quotient{a / p};
113715283aaSPeter Klausler   if (std::isinf(quotient) && std::isfinite(a) && std::isfinite(p)) {
114715283aaSPeter Klausler     // a/p overflowed -- so it must be an integer, and the result
115715283aaSPeter Klausler     // must be a zero of the same sign as one of the operands.
116715283aaSPeter Klausler     return std::copysign(T{}, IS_MODULO ? p : a);
1175f6c5c63Speter klausler   }
118715283aaSPeter Klausler   T toInt{IS_MODULO ? std::floor(quotient) : std::trunc(quotient)};
119715283aaSPeter Klausler   return a - toInt * p;
1205f6c5c63Speter klausler }
1215f6c5c63Speter klausler 
1225f6c5c63Speter klausler // RRSPACING (16.9.164)
RRSpacing(T x)1235f6c5c63Speter klausler template <int PREC, typename T> inline T RRSpacing(T x) {
1245f6c5c63Speter klausler   if (std::isnan(x)) {
1255f6c5c63Speter klausler     return x; // NaN -> same NaN
1265f6c5c63Speter klausler   } else if (std::isinf(x)) {
1275f6c5c63Speter klausler     return std::numeric_limits<T>::quiet_NaN(); // +/-Inf -> NaN
1285f6c5c63Speter klausler   } else if (x == 0) {
1295f6c5c63Speter klausler     return 0; // 0 -> 0
1305f6c5c63Speter klausler   } else {
1315f6c5c63Speter klausler     return std::ldexp(std::abs(x), PREC - (std::ilogb(x) + 1));
1325f6c5c63Speter klausler   }
1335f6c5c63Speter klausler }
1345f6c5c63Speter klausler 
1355f6c5c63Speter klausler // SCALE (16.9.166)
Scale(T x,std::int64_t p)1365f6c5c63Speter klausler template <typename T> inline T Scale(T x, std::int64_t p) {
1375f6c5c63Speter klausler   auto ip{static_cast<int>(p)};
1385f6c5c63Speter klausler   if (ip != p) {
1395f6c5c63Speter klausler     ip = p < 0 ? std::numeric_limits<int>::min()
1405f6c5c63Speter klausler                : std::numeric_limits<int>::max();
1415f6c5c63Speter klausler   }
1425f6c5c63Speter klausler   return std::ldexp(x, p); // x*2**p
1435f6c5c63Speter klausler }
1445f6c5c63Speter klausler 
145*f532c072SPeixin Qiao // SELECTED_INT_KIND (16.9.169)
146*f532c072SPeixin Qiao template <typename T>
SelectedIntKind(T x)147*f532c072SPeixin Qiao inline CppTypeFor<TypeCategory::Integer, 4> SelectedIntKind(T x) {
148*f532c072SPeixin Qiao   if (x <= 2) {
149*f532c072SPeixin Qiao     return 1;
150*f532c072SPeixin Qiao   } else if (x <= 4) {
151*f532c072SPeixin Qiao     return 2;
152*f532c072SPeixin Qiao   } else if (x <= 9) {
153*f532c072SPeixin Qiao     return 4;
154*f532c072SPeixin Qiao   } else if (x <= 18) {
155*f532c072SPeixin Qiao     return 8;
156*f532c072SPeixin Qiao #ifdef __SIZEOF_INT128__
157*f532c072SPeixin Qiao   } else if (x <= 38) {
158*f532c072SPeixin Qiao     return 16;
159*f532c072SPeixin Qiao #endif
160*f532c072SPeixin Qiao   }
161*f532c072SPeixin Qiao   return -1;
162*f532c072SPeixin Qiao }
163*f532c072SPeixin Qiao 
16457e3fa38SPeixin Qiao // SELECTED_REAL_KIND (16.9.170)
16557e3fa38SPeixin Qiao template <typename P, typename R, typename D>
SelectedRealKind(P p,R r,D d)16657e3fa38SPeixin Qiao inline CppTypeFor<TypeCategory::Integer, 4> SelectedRealKind(P p, R r, D d) {
16757e3fa38SPeixin Qiao   if (d != 2) {
16857e3fa38SPeixin Qiao     return -5;
16957e3fa38SPeixin Qiao   }
17057e3fa38SPeixin Qiao 
17157e3fa38SPeixin Qiao   int error{0};
17257e3fa38SPeixin Qiao   int kind{0};
17357e3fa38SPeixin Qiao   if (p <= 3) {
17457e3fa38SPeixin Qiao     kind = 2;
17557e3fa38SPeixin Qiao   } else if (p <= 6) {
17657e3fa38SPeixin Qiao     kind = 4;
17757e3fa38SPeixin Qiao   } else if (p <= 15) {
17857e3fa38SPeixin Qiao     kind = 8;
17957e3fa38SPeixin Qiao #if LDBL_MANT_DIG == 64
18057e3fa38SPeixin Qiao   } else if (p <= 18) {
18157e3fa38SPeixin Qiao     kind = 10;
18257e3fa38SPeixin Qiao   } else if (p <= 33) {
18357e3fa38SPeixin Qiao     kind = 16;
18457e3fa38SPeixin Qiao #elif LDBL_MANT_DIG == 113
18557e3fa38SPeixin Qiao   } else if (p <= 33) {
18657e3fa38SPeixin Qiao     kind = 16;
18757e3fa38SPeixin Qiao #endif
18857e3fa38SPeixin Qiao   } else {
18957e3fa38SPeixin Qiao     error -= 1;
19057e3fa38SPeixin Qiao   }
19157e3fa38SPeixin Qiao 
19257e3fa38SPeixin Qiao   if (r <= 4) {
19357e3fa38SPeixin Qiao     kind = kind < 2 ? 2 : kind;
19457e3fa38SPeixin Qiao   } else if (r <= 37) {
19557e3fa38SPeixin Qiao     kind = kind < 3 ? (p == 3 ? 4 : 3) : kind;
19657e3fa38SPeixin Qiao   } else if (r <= 307) {
19757e3fa38SPeixin Qiao     kind = kind < 8 ? 8 : kind;
19857e3fa38SPeixin Qiao #if LDBL_MANT_DIG == 64
19957e3fa38SPeixin Qiao   } else if (r <= 4931) {
20057e3fa38SPeixin Qiao     kind = kind < 10 ? 10 : kind;
20157e3fa38SPeixin Qiao #elif LDBL_MANT_DIG == 113
20257e3fa38SPeixin Qiao   } else if (r <= 4931) {
20357e3fa38SPeixin Qiao     kind = kind < 16 ? 16 : kind;
20457e3fa38SPeixin Qiao #endif
20557e3fa38SPeixin Qiao   } else {
20657e3fa38SPeixin Qiao     error -= 2;
20757e3fa38SPeixin Qiao   }
20857e3fa38SPeixin Qiao 
20957e3fa38SPeixin Qiao   return error ? error : kind;
21057e3fa38SPeixin Qiao }
21157e3fa38SPeixin Qiao 
2125f6c5c63Speter klausler // SET_EXPONENT (16.9.171)
SetExponent(T x,std::int64_t p)2135f6c5c63Speter klausler template <typename T> inline T SetExponent(T x, std::int64_t p) {
2145f6c5c63Speter klausler   if (std::isnan(x)) {
2155f6c5c63Speter klausler     return x; // NaN -> same NaN
2165f6c5c63Speter klausler   } else if (std::isinf(x)) {
2175f6c5c63Speter klausler     return std::numeric_limits<T>::quiet_NaN(); // +/-Inf -> NaN
2185f6c5c63Speter klausler   } else if (x == 0) {
2199f9e9d9cSPeter Steinfeld     return x; // return negative zero if x is negative zero
2205f6c5c63Speter klausler   } else {
221a05bae61Speter klausler     int expo{std::ilogb(x) + 1};
2225f6c5c63Speter klausler     auto ip{static_cast<int>(p - expo)};
2235f6c5c63Speter klausler     if (ip != p - expo) {
2245f6c5c63Speter klausler       ip = p < 0 ? std::numeric_limits<int>::min()
2255f6c5c63Speter klausler                  : std::numeric_limits<int>::max();
2265f6c5c63Speter klausler     }
2275f6c5c63Speter klausler     return std::ldexp(x, ip); // x*2**(p-e)
2285f6c5c63Speter klausler   }
2295f6c5c63Speter klausler }
2305f6c5c63Speter klausler 
2315f6c5c63Speter klausler // SPACING (16.9.180)
Spacing(T x)2325f6c5c63Speter klausler template <int PREC, typename T> inline T Spacing(T x) {
2335f6c5c63Speter klausler   if (std::isnan(x)) {
2345f6c5c63Speter klausler     return x; // NaN -> same NaN
2355f6c5c63Speter klausler   } else if (std::isinf(x)) {
2365f6c5c63Speter klausler     return std::numeric_limits<T>::quiet_NaN(); // +/-Inf -> NaN
2375f6c5c63Speter klausler   } else if (x == 0) {
2385f6c5c63Speter klausler     // The standard-mandated behavior seems broken, since TINY() can't be
2395f6c5c63Speter klausler     // subnormal.
2405f6c5c63Speter klausler     return std::numeric_limits<T>::min(); // 0 -> TINY(x)
2415f6c5c63Speter klausler   } else {
2425f6c5c63Speter klausler     return std::ldexp(
2435f6c5c63Speter klausler         static_cast<T>(1.0), std::ilogb(x) + 1 - PREC); // 2**(e-p)
2445f6c5c63Speter klausler   }
2455f6c5c63Speter klausler }
2465f6c5c63Speter klausler 
2475f6c5c63Speter klausler // NEAREST (16.9.139)
Nearest(T x,bool positive)2485f6c5c63Speter klausler template <int PREC, typename T> inline T Nearest(T x, bool positive) {
2495f6c5c63Speter klausler   auto spacing{Spacing<PREC>(x)};
2505f6c5c63Speter klausler   if (x == 0) {
2515f6c5c63Speter klausler     auto least{std::numeric_limits<T>::denorm_min()};
2525f6c5c63Speter klausler     return positive ? least : -least;
2535f6c5c63Speter klausler   } else {
2545f6c5c63Speter klausler     return positive ? x + spacing : x - spacing;
2555f6c5c63Speter klausler   }
2565f6c5c63Speter klausler }
2575f6c5c63Speter klausler 
2585f6c5c63Speter klausler extern "C" {
2595f6c5c63Speter klausler 
RTNAME(Ceiling4_1)2605f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Ceiling4_1)(
2615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2625f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
2635f6c5c63Speter klausler }
RTNAME(Ceiling4_2)2645f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Ceiling4_2)(
2655f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2665f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
2675f6c5c63Speter klausler }
RTNAME(Ceiling4_4)2685f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Ceiling4_4)(
2695f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2705f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
2715f6c5c63Speter klausler }
RTNAME(Ceiling4_8)2725f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling4_8)(
2735f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2745f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
2755f6c5c63Speter klausler }
276c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Ceiling4_16)2775f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling4_16)(
2785f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
2795f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
2805f6c5c63Speter klausler }
281c115c289Speter klausler #endif
RTNAME(Ceiling8_1)2825f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Ceiling8_1)(
2835f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2845f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
2855f6c5c63Speter klausler }
RTNAME(Ceiling8_2)2865f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Ceiling8_2)(
2875f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2885f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
2895f6c5c63Speter klausler }
RTNAME(Ceiling8_4)2905f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Ceiling8_4)(
2915f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2925f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
2935f6c5c63Speter klausler }
RTNAME(Ceiling8_8)2945f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling8_8)(
2955f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
2965f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
2975f6c5c63Speter klausler }
298c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Ceiling8_16)2995f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling8_16)(
3005f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
3015f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
3025f6c5c63Speter klausler }
303c115c289Speter klausler #endif
3044daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Ceiling10_1)3055f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Ceiling10_1)(
3065f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3075f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
3085f6c5c63Speter klausler }
RTNAME(Ceiling10_2)3095f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Ceiling10_2)(
3105f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3115f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
3125f6c5c63Speter klausler }
RTNAME(Ceiling10_4)3135f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Ceiling10_4)(
3145f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3155f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
3165f6c5c63Speter klausler }
RTNAME(Ceiling10_8)3175f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling10_8)(
3185f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3195f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
3205f6c5c63Speter klausler }
321c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Ceiling10_16)3225f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling10_16)(
3235f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3245f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
3255f6c5c63Speter klausler }
326c115c289Speter klausler #endif
3274daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Ceiling16_1)3285f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Ceiling16_1)(
3295f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3305f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x);
3315f6c5c63Speter klausler }
RTNAME(Ceiling16_2)3325f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Ceiling16_2)(
3335f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3345f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x);
3355f6c5c63Speter klausler }
RTNAME(Ceiling16_4)3365f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Ceiling16_4)(
3375f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3385f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x);
3395f6c5c63Speter klausler }
RTNAME(Ceiling16_8)3405f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Ceiling16_8)(
3415f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3425f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x);
3435f6c5c63Speter klausler }
344c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Ceiling16_16)3455f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Ceiling16_16)(
3465f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3475f6c5c63Speter klausler   return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x);
3485f6c5c63Speter klausler }
3495f6c5c63Speter klausler #endif
350c115c289Speter klausler #endif
3515f6c5c63Speter klausler 
RTNAME(Exponent4_4)3525f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Exponent4_4)(
3535f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3545f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3555f6c5c63Speter klausler }
RTNAME(Exponent4_8)3565f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Exponent4_8)(
3575f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3585f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3595f6c5c63Speter klausler }
RTNAME(Exponent8_4)3605f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Exponent8_4)(
3615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
3625f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3635f6c5c63Speter klausler }
RTNAME(Exponent8_8)3645f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Exponent8_8)(
3655f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
3665f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3675f6c5c63Speter klausler }
3684daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Exponent10_4)3695f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Exponent10_4)(
3705f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3715f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3725f6c5c63Speter klausler }
RTNAME(Exponent10_8)3735f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Exponent10_8)(
3745f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
3755f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3765f6c5c63Speter klausler }
3774daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Exponent16_4)3785f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Exponent16_4)(
3795f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3805f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x);
3815f6c5c63Speter klausler }
RTNAME(Exponent16_8)3825f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Exponent16_8)(
3835f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
3845f6c5c63Speter klausler   return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x);
3855f6c5c63Speter klausler }
3865f6c5c63Speter klausler #endif
3875f6c5c63Speter klausler 
RTNAME(Floor4_1)3885f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Floor4_1)(
3895f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3905f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
3915f6c5c63Speter klausler }
RTNAME(Floor4_2)3925f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Floor4_2)(
3935f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3945f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
3955f6c5c63Speter klausler }
RTNAME(Floor4_4)3965f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Floor4_4)(
3975f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
3985f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
3995f6c5c63Speter klausler }
RTNAME(Floor4_8)4005f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor4_8)(
4015f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
4025f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4035f6c5c63Speter klausler }
404c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Floor4_16)4055f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor4_16)(
4065f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
4075f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4085f6c5c63Speter klausler }
409c115c289Speter klausler #endif
RTNAME(Floor8_1)4105f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Floor8_1)(
4115f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4125f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
4135f6c5c63Speter klausler }
RTNAME(Floor8_2)4145f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Floor8_2)(
4155f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4165f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
4175f6c5c63Speter klausler }
RTNAME(Floor8_4)4185f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Floor8_4)(
4195f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4205f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
4215f6c5c63Speter klausler }
RTNAME(Floor8_8)4225f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor8_8)(
4235f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4245f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4255f6c5c63Speter klausler }
426c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Floor8_16)4275f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor8_16)(
4285f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4295f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4305f6c5c63Speter klausler }
431c115c289Speter klausler #endif
4324daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Floor10_1)4335f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Floor10_1)(
4345f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4355f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
4365f6c5c63Speter klausler }
RTNAME(Floor10_2)4375f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Floor10_2)(
4385f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4395f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
4405f6c5c63Speter klausler }
RTNAME(Floor10_4)4415f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Floor10_4)(
4425f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4435f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
4445f6c5c63Speter klausler }
RTNAME(Floor10_8)4455f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor10_8)(
4465f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4475f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4485f6c5c63Speter klausler }
449c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Floor10_16)4505f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor10_16)(
4515f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4525f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4535f6c5c63Speter klausler }
454c115c289Speter klausler #endif
4554daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Floor16_1)4565f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Floor16_1)(
4575f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4585f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x);
4595f6c5c63Speter klausler }
RTNAME(Floor16_2)4605f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Floor16_2)(
4615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4625f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x);
4635f6c5c63Speter klausler }
RTNAME(Floor16_4)4645f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Floor16_4)(
4655f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4665f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x);
4675f6c5c63Speter klausler }
RTNAME(Floor16_8)4685f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Floor16_8)(
4695f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4705f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x);
4715f6c5c63Speter klausler }
472c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Floor16_16)4735f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Floor16_16)(
4745f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4755f6c5c63Speter klausler   return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x);
4765f6c5c63Speter klausler }
4775f6c5c63Speter klausler #endif
478c115c289Speter klausler #endif
4795f6c5c63Speter klausler 
RTNAME(Fraction4)4805f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(Fraction4)(
4815f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
4825f6c5c63Speter klausler   return Fraction(x);
4835f6c5c63Speter klausler }
RTNAME(Fraction8)4845f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(Fraction8)(
4855f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
4865f6c5c63Speter klausler   return Fraction(x);
4875f6c5c63Speter klausler }
4884daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Fraction10)4895f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(Fraction10)(
4905f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
4915f6c5c63Speter klausler   return Fraction(x);
4925f6c5c63Speter klausler }
4934daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Fraction16)4945f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(Fraction16)(
4955f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
4965f6c5c63Speter klausler   return Fraction(x);
4975f6c5c63Speter klausler }
4985f6c5c63Speter klausler #endif
4995f6c5c63Speter klausler 
RTNAME(IsFinite4)50071d868cfSpeter klausler bool RTNAME(IsFinite4)(CppTypeFor<TypeCategory::Real, 4> x) {
50171d868cfSpeter klausler   return std::isfinite(x);
50271d868cfSpeter klausler }
RTNAME(IsFinite8)50371d868cfSpeter klausler bool RTNAME(IsFinite8)(CppTypeFor<TypeCategory::Real, 8> x) {
50471d868cfSpeter klausler   return std::isfinite(x);
50571d868cfSpeter klausler }
5064daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(IsFinite10)50771d868cfSpeter klausler bool RTNAME(IsFinite10)(CppTypeFor<TypeCategory::Real, 10> x) {
50871d868cfSpeter klausler   return std::isfinite(x);
50971d868cfSpeter klausler }
5104daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(IsFinite16)51171d868cfSpeter klausler bool RTNAME(IsFinite16)(CppTypeFor<TypeCategory::Real, 16> x) {
51271d868cfSpeter klausler   return std::isfinite(x);
51371d868cfSpeter klausler }
51471d868cfSpeter klausler #endif
51571d868cfSpeter klausler 
RTNAME(IsNaN4)51671d868cfSpeter klausler bool RTNAME(IsNaN4)(CppTypeFor<TypeCategory::Real, 4> x) {
51771d868cfSpeter klausler   return std::isnan(x);
51871d868cfSpeter klausler }
RTNAME(IsNaN8)51971d868cfSpeter klausler bool RTNAME(IsNaN8)(CppTypeFor<TypeCategory::Real, 8> x) {
52071d868cfSpeter klausler   return std::isnan(x);
52171d868cfSpeter klausler }
5224daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(IsNaN10)52371d868cfSpeter klausler bool RTNAME(IsNaN10)(CppTypeFor<TypeCategory::Real, 10> x) {
52471d868cfSpeter klausler   return std::isnan(x);
52571d868cfSpeter klausler }
5264daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(IsNaN16)52771d868cfSpeter klausler bool RTNAME(IsNaN16)(CppTypeFor<TypeCategory::Real, 16> x) {
52871d868cfSpeter klausler   return std::isnan(x);
52971d868cfSpeter klausler }
53071d868cfSpeter klausler #endif
53171d868cfSpeter klausler 
RTNAME(ModInteger1)5325f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(ModInteger1)(
5335f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 1> x,
534562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 1> p, const char *sourceFile,
535562fd2c9SPeter Klausler     int sourceLine) {
536562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5375f6c5c63Speter klausler }
RTNAME(ModInteger2)5385f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(ModInteger2)(
5395f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 2> x,
540562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 2> p, const char *sourceFile,
541562fd2c9SPeter Klausler     int sourceLine) {
542562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5435f6c5c63Speter klausler }
RTNAME(ModInteger4)5445f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(ModInteger4)(
5455f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 4> x,
546562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 4> p, const char *sourceFile,
547562fd2c9SPeter Klausler     int sourceLine) {
548562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5495f6c5c63Speter klausler }
RTNAME(ModInteger8)5505f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(ModInteger8)(
5515f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 8> x,
552562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 8> p, const char *sourceFile,
553562fd2c9SPeter Klausler     int sourceLine) {
554562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5555f6c5c63Speter klausler }
556c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(ModInteger16)5575f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(ModInteger16)(
5585f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 16> x,
559562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 16> p, const char *sourceFile,
560562fd2c9SPeter Klausler     int sourceLine) {
561562fd2c9SPeter Klausler   return IntMod<false>(x, p, sourceFile, sourceLine);
5625f6c5c63Speter klausler }
563c115c289Speter klausler #endif
RTNAME(ModReal4)5645f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(ModReal4)(
565562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> p,
566562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
567562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5685f6c5c63Speter klausler }
RTNAME(ModReal8)5695f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(ModReal8)(
570562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> p,
571562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
572562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5735f6c5c63Speter klausler }
5744daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(ModReal10)5755f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(ModReal10)(
576562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 10> x, CppTypeFor<TypeCategory::Real, 10> p,
577562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
578562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5795f6c5c63Speter klausler }
5804daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(ModReal16)5815f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(ModReal16)(
582562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 16> x, CppTypeFor<TypeCategory::Real, 16> p,
583562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
584562fd2c9SPeter Klausler   return RealMod<false>(x, p, sourceFile, sourceLine);
5855f6c5c63Speter klausler }
5865f6c5c63Speter klausler #endif
5875f6c5c63Speter klausler 
RTNAME(ModuloInteger1)5885f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(ModuloInteger1)(
5895f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 1> x,
590562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 1> p, const char *sourceFile,
591562fd2c9SPeter Klausler     int sourceLine) {
592562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5935f6c5c63Speter klausler }
RTNAME(ModuloInteger2)5945f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(ModuloInteger2)(
5955f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 2> x,
596562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 2> p, const char *sourceFile,
597562fd2c9SPeter Klausler     int sourceLine) {
598562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
5995f6c5c63Speter klausler }
RTNAME(ModuloInteger4)6005f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(ModuloInteger4)(
6015f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 4> x,
602562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 4> p, const char *sourceFile,
603562fd2c9SPeter Klausler     int sourceLine) {
604562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
6055f6c5c63Speter klausler }
RTNAME(ModuloInteger8)6065f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(ModuloInteger8)(
6075f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 8> x,
608562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 8> p, const char *sourceFile,
609562fd2c9SPeter Klausler     int sourceLine) {
610562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
6115f6c5c63Speter klausler }
612c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(ModuloInteger16)6135f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(ModuloInteger16)(
6145f6c5c63Speter klausler     CppTypeFor<TypeCategory::Integer, 16> x,
615562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Integer, 16> p, const char *sourceFile,
616562fd2c9SPeter Klausler     int sourceLine) {
617562fd2c9SPeter Klausler   return IntMod<true>(x, p, sourceFile, sourceLine);
6185f6c5c63Speter klausler }
619c115c289Speter klausler #endif
RTNAME(ModuloReal4)6205f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(ModuloReal4)(
621562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> p,
622562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
623562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6245f6c5c63Speter klausler }
RTNAME(ModuloReal8)6255f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(ModuloReal8)(
626562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> p,
627562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
628562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6295f6c5c63Speter klausler }
6304daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(ModuloReal10)6315f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(ModuloReal10)(
632562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 10> x, CppTypeFor<TypeCategory::Real, 10> p,
633562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
634562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6355f6c5c63Speter klausler }
6364daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(ModuloReal16)6375f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(ModuloReal16)(
638562fd2c9SPeter Klausler     CppTypeFor<TypeCategory::Real, 16> x, CppTypeFor<TypeCategory::Real, 16> p,
639562fd2c9SPeter Klausler     const char *sourceFile, int sourceLine) {
640562fd2c9SPeter Klausler   return RealMod<true>(x, p, sourceFile, sourceLine);
6415f6c5c63Speter klausler }
6425f6c5c63Speter klausler #endif
6435f6c5c63Speter klausler 
RTNAME(Nearest4)6445f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(Nearest4)(
6455f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x, bool positive) {
6465f6c5c63Speter klausler   return Nearest<24>(x, positive);
6475f6c5c63Speter klausler }
RTNAME(Nearest8)6485f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(Nearest8)(
6495f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x, bool positive) {
6505f6c5c63Speter klausler   return Nearest<53>(x, positive);
6515f6c5c63Speter klausler }
6524daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Nearest10)6535f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(Nearest10)(
6545f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x, bool positive) {
6555f6c5c63Speter klausler   return Nearest<64>(x, positive);
6565f6c5c63Speter klausler }
6574daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Nearest16)6585f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(Nearest16)(
6595f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x, bool positive) {
6605f6c5c63Speter klausler   return Nearest<113>(x, positive);
6615f6c5c63Speter klausler }
6625f6c5c63Speter klausler #endif
6635f6c5c63Speter klausler 
RTNAME(Nint4_1)6645f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Nint4_1)(
6655f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6663ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
6675f6c5c63Speter klausler }
RTNAME(Nint4_2)6685f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Nint4_2)(
6695f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6703ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
6715f6c5c63Speter klausler }
RTNAME(Nint4_4)6725f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Nint4_4)(
6735f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6743ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
6755f6c5c63Speter klausler }
RTNAME(Nint4_8)6765f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint4_8)(
6775f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6783ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
6795f6c5c63Speter klausler }
680c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Nint4_16)6815f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint4_16)(
6825f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
6833ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
6845f6c5c63Speter klausler }
685c115c289Speter klausler #endif
RTNAME(Nint8_1)6865f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Nint8_1)(
6875f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6883ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
6895f6c5c63Speter klausler }
RTNAME(Nint8_2)6905f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Nint8_2)(
6915f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6923ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
6935f6c5c63Speter klausler }
RTNAME(Nint8_4)6945f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Nint8_4)(
6955f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
6963ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
6975f6c5c63Speter klausler }
RTNAME(Nint8_8)6985f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint8_8)(
6995f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
7003ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
7015f6c5c63Speter klausler }
702c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Nint8_16)7035f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint8_16)(
7045f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
7053ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
7065f6c5c63Speter klausler }
707c115c289Speter klausler #endif
7084daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Nint10_1)7095f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Nint10_1)(
7105f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7113ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
7125f6c5c63Speter klausler }
RTNAME(Nint10_2)7135f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Nint10_2)(
7145f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7153ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
7165f6c5c63Speter klausler }
RTNAME(Nint10_4)7175f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Nint10_4)(
7185f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7193ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
7205f6c5c63Speter klausler }
RTNAME(Nint10_8)7215f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint10_8)(
7225f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7233ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
7245f6c5c63Speter klausler }
725c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Nint10_16)7265f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint10_16)(
7275f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7283ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
7295f6c5c63Speter klausler }
730c115c289Speter klausler #endif
7314daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Nint16_1)7325f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 1> RTNAME(Nint16_1)(
7335f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7343ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x);
7355f6c5c63Speter klausler }
RTNAME(Nint16_2)7365f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 2> RTNAME(Nint16_2)(
7375f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7383ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x);
7395f6c5c63Speter klausler }
RTNAME(Nint16_4)7405f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 4> RTNAME(Nint16_4)(
7415f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7423ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x);
7435f6c5c63Speter klausler }
RTNAME(Nint16_8)7445f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 8> RTNAME(Nint16_8)(
7455f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7463ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x);
7475f6c5c63Speter klausler }
748c115c289Speter klausler #ifdef __SIZEOF_INT128__
RTNAME(Nint16_16)7495f6c5c63Speter klausler CppTypeFor<TypeCategory::Integer, 16> RTNAME(Nint16_16)(
7505f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7513ccd4ce2SPeixin Qiao   return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x);
7525f6c5c63Speter klausler }
7535f6c5c63Speter klausler #endif
754c115c289Speter klausler #endif
7555f6c5c63Speter klausler 
RTNAME(RRSpacing4)7565f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(RRSpacing4)(
7575f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
7585f6c5c63Speter klausler   return RRSpacing<24>(x);
7595f6c5c63Speter klausler }
RTNAME(RRSpacing8)7605f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(RRSpacing8)(
7615f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
7625f6c5c63Speter klausler   return RRSpacing<53>(x);
7635f6c5c63Speter klausler }
7644daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(RRSpacing10)7655f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(RRSpacing10)(
7665f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
7675f6c5c63Speter klausler   return RRSpacing<64>(x);
7685f6c5c63Speter klausler }
7694daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(RRSpacing16)7705f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(RRSpacing16)(
7715f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
7725f6c5c63Speter klausler   return RRSpacing<113>(x);
7735f6c5c63Speter klausler }
7745f6c5c63Speter klausler #endif
7755f6c5c63Speter klausler 
RTNAME(SetExponent4)7765f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(SetExponent4)(
7775f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x, std::int64_t p) {
7785f6c5c63Speter klausler   return SetExponent(x, p);
7795f6c5c63Speter klausler }
RTNAME(SetExponent8)7805f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(SetExponent8)(
7815f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x, std::int64_t p) {
7825f6c5c63Speter klausler   return SetExponent(x, p);
7835f6c5c63Speter klausler }
7844daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(SetExponent10)7855f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(SetExponent10)(
7865f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x, std::int64_t p) {
7875f6c5c63Speter klausler   return SetExponent(x, p);
7885f6c5c63Speter klausler }
7894daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(SetExponent16)7905f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(SetExponent16)(
7915f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x, std::int64_t p) {
7925f6c5c63Speter klausler   return SetExponent(x, p);
7935f6c5c63Speter klausler }
7945f6c5c63Speter klausler #endif
7955f6c5c63Speter klausler 
RTNAME(Scale4)7965f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(Scale4)(
7975f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x, std::int64_t p) {
7985f6c5c63Speter klausler   return Scale(x, p);
7995f6c5c63Speter klausler }
RTNAME(Scale8)8005f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(Scale8)(
8015f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x, std::int64_t p) {
8025f6c5c63Speter klausler   return Scale(x, p);
8035f6c5c63Speter klausler }
8044daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Scale10)8055f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(Scale10)(
8065f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x, std::int64_t p) {
8075f6c5c63Speter klausler   return Scale(x, p);
8085f6c5c63Speter klausler }
8094daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Scale16)8105f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(Scale16)(
8115f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x, std::int64_t p) {
8125f6c5c63Speter klausler   return Scale(x, p);
8135f6c5c63Speter klausler }
8145f6c5c63Speter klausler #endif
8155f6c5c63Speter klausler 
816*f532c072SPeixin Qiao // SELECTED_INT_KIND
RTNAME(SelectedIntKind)817*f532c072SPeixin Qiao CppTypeFor<TypeCategory::Integer, 4> RTNAME(SelectedIntKind)(
818*f532c072SPeixin Qiao     const char *source, int line, void *x, int xKind) {
819*f532c072SPeixin Qiao #ifdef __SIZEOF_INT128__
820*f532c072SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> r =
821*f532c072SPeixin Qiao       getIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
822*f532c072SPeixin Qiao           source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 16);
823*f532c072SPeixin Qiao #else
824*f532c072SPeixin Qiao   std::int64_t r = getIntArgValue<std::int64_t>(
825*f532c072SPeixin Qiao       source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 8);
826*f532c072SPeixin Qiao #endif
827*f532c072SPeixin Qiao   return SelectedIntKind(r);
828*f532c072SPeixin Qiao }
829*f532c072SPeixin Qiao 
83057e3fa38SPeixin Qiao // SELECTED_REAL_KIND
RTNAME(SelectedRealKind)83157e3fa38SPeixin Qiao CppTypeFor<TypeCategory::Integer, 4> RTNAME(SelectedRealKind)(
83257e3fa38SPeixin Qiao     const char *source, int line, void *precision, int pKind, void *range,
83357e3fa38SPeixin Qiao     int rKind, void *radix, int dKind) {
83457e3fa38SPeixin Qiao #ifdef __SIZEOF_INT128__
83557e3fa38SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> p =
83657e3fa38SPeixin Qiao       getIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
83757e3fa38SPeixin Qiao           source, line, precision, pKind, /*defaultValue*/ 0, /*resKind*/ 16);
83857e3fa38SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> r =
83957e3fa38SPeixin Qiao       getIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
84057e3fa38SPeixin Qiao           source, line, range, rKind, /*defaultValue*/ 0, /*resKind*/ 16);
84157e3fa38SPeixin Qiao   CppTypeFor<TypeCategory::Integer, 16> d =
84257e3fa38SPeixin Qiao       getIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>(
84357e3fa38SPeixin Qiao           source, line, radix, dKind, /*defaultValue*/ 2, /*resKind*/ 16);
84457e3fa38SPeixin Qiao #else
84557e3fa38SPeixin Qiao   std::int64_t p = getIntArgValue<std::int64_t>(
84657e3fa38SPeixin Qiao       source, line, precision, pKind, /*defaultValue*/ 0, /*resKind*/ 8);
84757e3fa38SPeixin Qiao   std::int64_t r = getIntArgValue<std::int64_t>(
84857e3fa38SPeixin Qiao       source, line, range, rKind, /*defaultValue*/ 0, /*resKind*/ 8);
84957e3fa38SPeixin Qiao   std::int64_t d = getIntArgValue<std::int64_t>(
85057e3fa38SPeixin Qiao       source, line, radix, dKind, /*defaultValue*/ 2, /*resKind*/ 8);
85157e3fa38SPeixin Qiao #endif
85257e3fa38SPeixin Qiao   return SelectedRealKind(p, r, d);
85357e3fa38SPeixin Qiao }
85457e3fa38SPeixin Qiao 
RTNAME(Spacing4)8555f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 4> RTNAME(Spacing4)(
8565f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 4> x) {
8575f6c5c63Speter klausler   return Spacing<24>(x);
8585f6c5c63Speter klausler }
RTNAME(Spacing8)8595f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 8> RTNAME(Spacing8)(
8605f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 8> x) {
8615f6c5c63Speter klausler   return Spacing<53>(x);
8625f6c5c63Speter klausler }
8634daa33f6SPeter Klausler #if LDBL_MANT_DIG == 64
RTNAME(Spacing10)8645f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 10> RTNAME(Spacing10)(
8655f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 10> x) {
8665f6c5c63Speter klausler   return Spacing<64>(x);
8675f6c5c63Speter klausler }
8684daa33f6SPeter Klausler #elif LDBL_MANT_DIG == 113
RTNAME(Spacing16)8695f6c5c63Speter klausler CppTypeFor<TypeCategory::Real, 16> RTNAME(Spacing16)(
8705f6c5c63Speter klausler     CppTypeFor<TypeCategory::Real, 16> x) {
8715f6c5c63Speter klausler   return Spacing<113>(x);
8725f6c5c63Speter klausler }
8735f6c5c63Speter klausler #endif
8745f6c5c63Speter klausler } // extern "C"
8755f6c5c63Speter klausler } // namespace Fortran::runtime
876