1*3cab2bb3Spatrick //===-- int_math.h - internal math inlines --------------------------------===// 2*3cab2bb3Spatrick // 3*3cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*3cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*3cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*3cab2bb3Spatrick // 7*3cab2bb3Spatrick //===----------------------------------------------------------------------===// 8*3cab2bb3Spatrick // 9*3cab2bb3Spatrick // This file is not part of the interface of this library. 10*3cab2bb3Spatrick // 11*3cab2bb3Spatrick // This file defines substitutes for the libm functions used in some of the 12*3cab2bb3Spatrick // compiler-rt implementations, defined in such a way that there is not a direct 13*3cab2bb3Spatrick // dependency on libm or math.h. Instead, we use the compiler builtin versions 14*3cab2bb3Spatrick // where available. This reduces our dependencies on the system SDK by foisting 15*3cab2bb3Spatrick // the responsibility onto the compiler. 16*3cab2bb3Spatrick // 17*3cab2bb3Spatrick //===----------------------------------------------------------------------===// 18*3cab2bb3Spatrick 19*3cab2bb3Spatrick #ifndef INT_MATH_H 20*3cab2bb3Spatrick #define INT_MATH_H 21*3cab2bb3Spatrick 22*3cab2bb3Spatrick #ifndef __has_builtin 23*3cab2bb3Spatrick #define __has_builtin(x) 0 24*3cab2bb3Spatrick #endif 25*3cab2bb3Spatrick 26*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 27*3cab2bb3Spatrick #include <math.h> 28*3cab2bb3Spatrick #include <stdlib.h> 29*3cab2bb3Spatrick #endif 30*3cab2bb3Spatrick 31*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 32*3cab2bb3Spatrick #define CRT_INFINITY INFINITY 33*3cab2bb3Spatrick #else 34*3cab2bb3Spatrick #define CRT_INFINITY __builtin_huge_valf() 35*3cab2bb3Spatrick #endif 36*3cab2bb3Spatrick 37*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 38*3cab2bb3Spatrick #define crt_isfinite(x) _finite((x)) 39*3cab2bb3Spatrick #define crt_isinf(x) !_finite((x)) 40*3cab2bb3Spatrick #define crt_isnan(x) _isnan((x)) 41*3cab2bb3Spatrick #else 42*3cab2bb3Spatrick // Define crt_isfinite in terms of the builtin if available, otherwise provide 43*3cab2bb3Spatrick // an alternate version in terms of our other functions. This supports some 44*3cab2bb3Spatrick // versions of GCC which didn't have __builtin_isfinite. 45*3cab2bb3Spatrick #if __has_builtin(__builtin_isfinite) 46*3cab2bb3Spatrick #define crt_isfinite(x) __builtin_isfinite((x)) 47*3cab2bb3Spatrick #elif defined(__GNUC__) 48*3cab2bb3Spatrick #define crt_isfinite(x) \ 49*3cab2bb3Spatrick __extension__(({ \ 50*3cab2bb3Spatrick __typeof((x)) x_ = (x); \ 51*3cab2bb3Spatrick !crt_isinf(x_) && !crt_isnan(x_); \ 52*3cab2bb3Spatrick })) 53*3cab2bb3Spatrick #else 54*3cab2bb3Spatrick #error "Do not know how to check for infinity" 55*3cab2bb3Spatrick #endif // __has_builtin(__builtin_isfinite) 56*3cab2bb3Spatrick #define crt_isinf(x) __builtin_isinf((x)) 57*3cab2bb3Spatrick #define crt_isnan(x) __builtin_isnan((x)) 58*3cab2bb3Spatrick #endif // _MSC_VER 59*3cab2bb3Spatrick 60*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 61*3cab2bb3Spatrick #define crt_copysign(x, y) copysign((x), (y)) 62*3cab2bb3Spatrick #define crt_copysignf(x, y) copysignf((x), (y)) 63*3cab2bb3Spatrick #define crt_copysignl(x, y) copysignl((x), (y)) 64*3cab2bb3Spatrick #else 65*3cab2bb3Spatrick #define crt_copysign(x, y) __builtin_copysign((x), (y)) 66*3cab2bb3Spatrick #define crt_copysignf(x, y) __builtin_copysignf((x), (y)) 67*3cab2bb3Spatrick #define crt_copysignl(x, y) __builtin_copysignl((x), (y)) 68*3cab2bb3Spatrick #endif 69*3cab2bb3Spatrick 70*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 71*3cab2bb3Spatrick #define crt_fabs(x) fabs((x)) 72*3cab2bb3Spatrick #define crt_fabsf(x) fabsf((x)) 73*3cab2bb3Spatrick #define crt_fabsl(x) fabs((x)) 74*3cab2bb3Spatrick #else 75*3cab2bb3Spatrick #define crt_fabs(x) __builtin_fabs((x)) 76*3cab2bb3Spatrick #define crt_fabsf(x) __builtin_fabsf((x)) 77*3cab2bb3Spatrick #define crt_fabsl(x) __builtin_fabsl((x)) 78*3cab2bb3Spatrick #endif 79*3cab2bb3Spatrick 80*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 81*3cab2bb3Spatrick #define crt_fmaxl(x, y) __max((x), (y)) 82*3cab2bb3Spatrick #else 83*3cab2bb3Spatrick #define crt_fmaxl(x, y) __builtin_fmaxl((x), (y)) 84*3cab2bb3Spatrick #endif 85*3cab2bb3Spatrick 86*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 87*3cab2bb3Spatrick #define crt_logbl(x) logbl((x)) 88*3cab2bb3Spatrick #else 89*3cab2bb3Spatrick #define crt_logbl(x) __builtin_logbl((x)) 90*3cab2bb3Spatrick #endif 91*3cab2bb3Spatrick 92*3cab2bb3Spatrick #if defined(_MSC_VER) && !defined(__clang__) 93*3cab2bb3Spatrick #define crt_scalbnl(x, y) scalbnl((x), (y)) 94*3cab2bb3Spatrick #else 95*3cab2bb3Spatrick #define crt_scalbnl(x, y) __builtin_scalbnl((x), (y)) 96*3cab2bb3Spatrick #endif 97*3cab2bb3Spatrick 98*3cab2bb3Spatrick #endif // INT_MATH_H 99