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