|  | //===-- runtime/pgmath.h.inc -------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // This file defines the interface of libpgmath to be used for folding | 
|  | // and code generation. | 
|  | // Usage: | 
|  | // define PGMATH_DECLARE if you simply want to declare pgmath interface. | 
|  | // Define the PGMATH_USE_S/D/C/Z(intrinsic name, function name) according | 
|  | // to what needs to be done with the runtime declaration. | 
|  | // This intrinsic will be called on all libpgmath function in the | 
|  | // intrinsic alphabetical order. | 
|  | // Define PGMATH_FAST/RELAXED/PRECISE to restrict the PGMATH_USE visit | 
|  | // to the targeted versions. | 
|  | // Define PGMATH_USE_OTHER to visit math functions that are not related to | 
|  | // floating points (e.g. int**int pow). | 
|  |  | 
|  | // Control Macros | 
|  | #ifdef PGMATH_DECLARE | 
|  | #undef PGMATH_DECLARE | 
|  | #define PGMATH_DECLARE(x) extern "C" x; | 
|  | #define PGMATH_FAST | 
|  | #define PGMATH_PRECISE | 
|  | #define PGMATH_RELAXED | 
|  | #else | 
|  | #define PGMATH_DECLARE(x) | 
|  | #endif | 
|  |  | 
|  | #ifdef PGMATH_USE_ALL_TYPES | 
|  | #define PGMATH_USE_S(name, func) PGMATH_USE_ALL_TYPES(name, func) | 
|  | #define PGMATH_USE_D(name, func) PGMATH_USE_ALL_TYPES(name, func) | 
|  | #define PGMATH_USE_OTHER(name, func) PGMATH_USE_ALL_TYPES(name, func) | 
|  | #endif | 
|  |  | 
|  | #ifndef PGMATH_USE_S | 
|  | #define PGMATH_USE_S(name, x) | 
|  | #endif | 
|  |  | 
|  | #ifndef PGMATH_USE_D | 
|  | #define PGMATH_USE_D(name, x) | 
|  | #endif | 
|  |  | 
|  | #ifndef PGMATH_USE_C | 
|  | #define PGMATH_USE_C(name, x) | 
|  | #endif | 
|  |  | 
|  | #ifndef PGMATH_USE_Z | 
|  | #define PGMATH_USE_Z(name, x) | 
|  | #endif | 
|  |  | 
|  | #ifndef PGMATH_USE_OTHER | 
|  | #define PGMATH_USE_OTHER(name, x) | 
|  | #endif | 
|  |  | 
|  | #define PGMATH_REAL_IMPL(impl, func) \ | 
|  | PGMATH_DECLARE(float __##impl##s_##func##_1(float)) \ | 
|  | PGMATH_DECLARE(double __##impl##d_##func##_1(double)) \ | 
|  | PGMATH_USE_S(func, __##impl##s_##func##_1) \ | 
|  | PGMATH_USE_D(func, __##impl##d_##func##_1) | 
|  |  | 
|  | #define PGMATH_ALL_FP_IMPL(impl, func) \ | 
|  | PGMATH_REAL_IMPL(impl, func) \ | 
|  |  | 
|  | #define PGMATH_REAL2_IMPL(impl, func) \ | 
|  | PGMATH_DECLARE(float __##impl##s_##func##_1(float, float)) \ | 
|  | PGMATH_DECLARE(double __##impl##d_##func##_1(double, double)) \ | 
|  | PGMATH_USE_S(func, __##impl##s_##func##_1) \ | 
|  | PGMATH_USE_D(func, __##impl##d_##func##_1) | 
|  |  | 
|  | #define PGMATH_ALL_FP2_IMPL(impl, func) \ | 
|  | PGMATH_REAL2_IMPL(func) \ | 
|  |  | 
|  | #undef PGMATH_FAST_REAL | 
|  | #undef PGMATH_FAST_COMPLEX | 
|  | #undef PGMATH_FAST_ALL_FP | 
|  | #undef PGMATH_FAST_REAL2 | 
|  | #undef PGMATH_FAST_COMPLEX2 | 
|  | #undef PGMATH_FAST_ALL_FP2 | 
|  | #ifdef PGMATH_FAST | 
|  | #define PGMATH_FAST_REAL(func) PGMATH_REAL_IMPL(f, func) | 
|  | #define PGMATH_FAST_ALL_FP(func) PGMATH_ALL_IMPL(f, func) | 
|  | #define PGMATH_FAST_REAL2(func) PGMATH_REAL2_IMPL(f, func) | 
|  | #define PGMATH_FAST_ALL_FP2(func) PGMATH_ALL_FP2_IMPL(f, func) | 
|  | #else | 
|  | #define PGMATH_FAST_REAL(func) | 
|  | #define PGMATH_FAST_COMPLEX(func) | 
|  | #define PGMATH_FAST_ALL_FP(func) | 
|  | #define PGMATH_FAST_REAL2(func) | 
|  | #define PGMATH_FAST_COMPLEX2(func) | 
|  | #define PGMATH_FAST_ALL_FP2(func) | 
|  | #endif | 
|  |  | 
|  | #undef PGMATH_RELAXED_REAL | 
|  | #undef PGMATH_RELAXED_COMPLEX | 
|  | #undef PGMATH_RELAXED_ALL_FP | 
|  | #undef PGMATH_RELAXED_REAL2 | 
|  | #undef PGMATH_RELAXED_COMPLEX2 | 
|  | #undef PGMATH_RELAXED_ALL_FP2 | 
|  | #ifdef PGMATH_RELAXED | 
|  | #define PGMATH_RELAXED_REAL(func) PGMATH_REAL_IMPL(r, func) | 
|  | #define PGMATH_RELAXED_ALL_FP(func) PGMATH_ALL_IMPL(r, func) | 
|  | #define PGMATH_RELAXED_REAL2(func) PGMATH_REAL2_IMPL(r, func) | 
|  | #define PGMATH_RELAXED_ALL_FP2(func) PGMATH_ALL_FP2_IMPL(r, func) | 
|  | #else | 
|  | #define PGMATH_RELAXED_REAL(func) | 
|  | #define PGMATH_RELAXED_COMPLEX(func) | 
|  | #define PGMATH_RELAXED_ALL_FP(func) | 
|  | #define PGMATH_RELAXED_REAL2(func) | 
|  | #define PGMATH_RELAXED_COMPLEX2(func) | 
|  | #define PGMATH_RELAXED_ALL_FP2(func) | 
|  | #endif | 
|  |  | 
|  | #undef PGMATH_PRECISE_REAL | 
|  | #undef PGMATH_PRECISE_COMPLEX | 
|  | #undef PGMATH_PRECISE_ALL_FP | 
|  | #undef PGMATH_PRECISE_REAL2 | 
|  | #undef PGMATH_PRECISE_COMPLEX2 | 
|  | #undef PGMATH_PRECISE_ALL_FP2 | 
|  | #ifdef PGMATH_PRECISE | 
|  | #define PGMATH_PRECISE_REAL(func) PGMATH_REAL_IMPL(p, func) | 
|  | #define PGMATH_PRECISE_ALL_FP(func) PGMATH_ALL_IMPL(p, func) | 
|  | #define PGMATH_PRECISE_REAL2(func) PGMATH_REAL2_IMPL(p, func) | 
|  | #define PGMATH_PRECISE_ALL_FP2(func) PGMATH_ALL_FP2_IMPL(p, func) | 
|  | #else | 
|  | #define PGMATH_PRECISE_REAL(func) | 
|  | #define PGMATH_PRECISE_COMPLEX(func) | 
|  | #define PGMATH_PRECISE_ALL_FP(func) | 
|  | #define PGMATH_PRECISE_REAL2(func) | 
|  | #define PGMATH_PRECISE_COMPLEX2(func) | 
|  | #define PGMATH_PRECISE_ALL_FP2(func) | 
|  | #endif | 
|  |  | 
|  | #define PGMATH_REAL(func) \ | 
|  | PGMATH_FAST_REAL(func) \ | 
|  | PGMATH_PRECISE_REAL(func) \ | 
|  | PGMATH_RELAXED_REAL(func) | 
|  |  | 
|  | #define PGMATH_ALL(func) \ | 
|  | PGMATH_REAL(func) \ | 
|  |  | 
|  | #define PGMATH_REAL2(func) \ | 
|  | PGMATH_FAST_REAL2(func) \ | 
|  | PGMATH_PRECISE_REAL2(func) \ | 
|  | PGMATH_RELAXED_REAL2(func) | 
|  |  | 
|  | #define PGMATH_ALL2(func) \ | 
|  | PGMATH_REAL2(func) \ | 
|  |  | 
|  | // Marcos to declare __mth_i libpgmath variants | 
|  | #define PGMATH_MTH_VERSION_REAL(func) \ | 
|  | PGMATH_DECLARE(float __mth_i_##func(float)) \ | 
|  | PGMATH_DECLARE(double __mth_i_d##func(double)) \ | 
|  | PGMATH_USE_S(func, __mth_i_##func) \ | 
|  | PGMATH_USE_D(func, __mth_i_d##func) | 
|  |  | 
|  | // Actual libpgmath declarations | 
|  | PGMATH_ALL(acos) | 
|  | PGMATH_MTH_VERSION_REAL(acosh) | 
|  | PGMATH_ALL(asin) | 
|  | PGMATH_MTH_VERSION_REAL(asinh) | 
|  | PGMATH_ALL(atan) | 
|  | PGMATH_REAL2(atan2) | 
|  | PGMATH_MTH_VERSION_REAL(atanh) | 
|  | PGMATH_MTH_VERSION_REAL(bessel_j0) | 
|  | PGMATH_MTH_VERSION_REAL(bessel_j1) | 
|  | // bessel_jn and bessel_yn takes an int as first arg | 
|  | PGMATH_DECLARE(float __mth_i_bessel_jn(int, float)) | 
|  | PGMATH_DECLARE(double __mth_i_dbessel_jn(int, double)) | 
|  | PGMATH_USE_S(bessel_jn, __mth_i_bessel_jn) | 
|  | PGMATH_USE_D(bessel_jn, __mth_i_dbessel_jn) | 
|  | PGMATH_MTH_VERSION_REAL(bessel_y0) | 
|  | PGMATH_MTH_VERSION_REAL(bessel_y1) | 
|  | PGMATH_DECLARE(float __mth_i_bessel_yn(int, float)) | 
|  | PGMATH_DECLARE(double __mth_i_dbessel_yn(int, double)) | 
|  | PGMATH_USE_S(bessel_yn, __mth_i_bessel_yn) | 
|  | PGMATH_USE_D(bessel_yn, __mth_i_dbessel_yn) | 
|  |  | 
|  | PGMATH_ALL(cos) | 
|  | PGMATH_ALL(cosh) | 
|  | PGMATH_MTH_VERSION_REAL(erf) | 
|  | PGMATH_MTH_VERSION_REAL(erfc) | 
|  | PGMATH_MTH_VERSION_REAL(erfc_scaled) | 
|  | PGMATH_ALL(exp) | 
|  | PGMATH_MTH_VERSION_REAL(gamma) | 
|  |  | 
|  | PGMATH_DECLARE(float __mth_i_hypot(float, float)) | 
|  | PGMATH_DECLARE(double __mth_i_dhypot(double, double)) | 
|  | PGMATH_USE_S(hypot, __mth_i_hypot) | 
|  | PGMATH_USE_D(hypot, __mth_i_dhypot) | 
|  |  | 
|  | PGMATH_ALL(log) | 
|  | PGMATH_REAL(log10) | 
|  | PGMATH_MTH_VERSION_REAL(log_gamma) | 
|  | // no function for modulo in libpgmath. | 
|  | // fast mod used in all versions. | 
|  | PGMATH_DECLARE(float __fs_mod_1(float, float)) | 
|  | PGMATH_DECLARE(double __fd_mod_1(double, double)) | 
|  | PGMATH_USE_S(mod, __fs_mod_1) | 
|  | PGMATH_USE_D(mod, __fd_mod_1) | 
|  |  | 
|  | PGMATH_ALL2(pow) | 
|  | // Versions of pow with integer exponents | 
|  | #define PGMATH_DELCARE_POW(impl) \ | 
|  | PGMATH_DECLARE(float __##impl##s_powi_1(float, int)) \ | 
|  | PGMATH_DECLARE(double __##impl##d_powi_1(double, int)) \ | 
|  | PGMATH_USE_S(pow, __##impl##s_powi_1) \ | 
|  | PGMATH_USE_D(pow, __##impl##d_powi_1) \ | 
|  | PGMATH_USE_C(pow, __##impl##c_powi_1) \ | 
|  | PGMATH_USE_Z(pow, __##impl##z_powi_1) \ | 
|  | PGMATH_DECLARE(float __##impl##s_powk_1(float, int64_t)) \ | 
|  | PGMATH_DECLARE(double __##impl##d_powk_1(double, int64_t)) \ | 
|  | PGMATH_USE_S(pow, __##impl##s_powk_1) \ | 
|  | PGMATH_USE_D(pow, __##impl##d_powk_1) \ | 
|  | PGMATH_USE_C(pow, __##impl##c_powk_1) \ | 
|  | PGMATH_USE_Z(pow, __##impl##z_powk_1) | 
|  |  | 
|  | #ifdef PGMATH_FAST | 
|  | PGMATH_DELCARE_POW(f) | 
|  | #endif | 
|  | #ifdef PGMATH_RELAXED | 
|  | PGMATH_DELCARE_POW(r) | 
|  | #endif | 
|  | #ifdef PGMATH_PRECISE | 
|  | PGMATH_DELCARE_POW(p) | 
|  | #endif | 
|  |  | 
|  | // integer ** integer versions of pow | 
|  | PGMATH_DECLARE(int __mth_i_ipowi(int, int)) | 
|  | PGMATH_DECLARE(int64_t __mth_i_kpowk(int64_t, int64_t)) | 
|  | PGMATH_USE_OTHER(pow, __mth_i_ipowi) | 
|  | PGMATH_USE_OTHER(pow, __mth_i_kpowk) | 
|  |  | 
|  | PGMATH_ALL(sin) | 
|  | PGMATH_ALL(sinh) | 
|  | PGMATH_MTH_VERSION_REAL(sqrt) | 
|  | PGMATH_ALL(tan) | 
|  | PGMATH_ALL(tanh) | 
|  |  | 
|  | #undef PGMATH_DECLARE | 
|  | #undef PGMATH_FAST | 
|  | #undef PGMATH_PRECISE | 
|  | #undef PGMATH_RELAXED | 
|  | #undef PGMATH_USE_S | 
|  | #undef PGMATH_USE_D | 
|  | #undef PGMATH_USE_C | 
|  | #undef PGMATH_USE_Z | 
|  | #undef PGMATH_USE_OTHER | 
|  | #undef PGMATH_USE_ALL_TYPES |