// FCP guest_std (rexglue/UPSTREAM.md, change 140): freestanding replacement, see README.md.
#pragma once
#include <math.h>
#include <type_traits>
namespace std {
inline double sqrt(double x) { return __builtin_sqrt(x); }
inline float sqrt(float x) { return __builtin_sqrtf(x); }
inline double fabs(double x) { return __builtin_fabs(x); }
inline float fabs(float x) { return __builtin_fabsf(x); }
inline double abs(double x) { return __builtin_fabs(x); }
inline float abs(float x) { return __builtin_fabsf(x); }
inline double fma(double a, double b, double c) { return __builtin_fma(a, b, c); }
inline float fma(float a, float b, float c) { return __builtin_fmaf(a, b, c); }
inline double trunc(double x) { return __builtin_trunc(x); }
inline float trunc(float x) { return __builtin_truncf(x); }
inline double floor(double x) { return __builtin_floor(x); }
inline float floor(float x) { return __builtin_floorf(x); }
inline double ceil(double x) { return __builtin_ceil(x); }
inline float ceil(float x) { return __builtin_ceilf(x); }
inline double round(double x) { return __builtin_round(x); }
inline float round(float x) { return __builtin_roundf(x); }
inline double rint(double x) { return __builtin_rint(x); }
inline float rint(float x) { return __builtin_rintf(x); }
inline double nearbyint(double x) { return __builtin_nearbyint(x); }
inline float nearbyint(float x) { return __builtin_nearbyintf(x); }
inline double copysign(double a, double b) { return __builtin_copysign(a, b); }
inline float copysign(float a, float b) { return __builtin_copysignf(a, b); }
inline double nextafter(double a, double b) { return ::nextafter(a, b); }
inline float nextafter(float a, float b) { return ::nextafterf(a, b); }
inline double fmod(double a, double b) { return ::fmod(a, b); }
inline float fmod(float a, float b) { return ::fmodf(a, b); }
inline double ldexp(double a, int e) { return ::ldexp(a, e); }
inline float ldexp(float a, int e) { return ::ldexpf(a, e); }
inline double exp2(double a) { return ::exp2(a); }
inline float exp2(float a) { return ::exp2f(a); }
inline double log2(double a) { return ::log2(a); }
inline float log2(float a) { return ::log2f(a); }
inline double fmin(double a, double b) { return __builtin_fmin(a, b); }
inline float fmin(float a, float b) { return __builtin_fminf(a, b); }
inline double fmax(double a, double b) { return __builtin_fmax(a, b); }
inline float fmax(float a, float b) { return __builtin_fmaxf(a, b); }
inline bool isnan(double x) { return __builtin_isnan(x); }
inline bool isnan(float x) { return __builtin_isnan(x); }
inline bool isinf(double x) { return __builtin_isinf(x); }
inline bool isinf(float x) { return __builtin_isinf(x); }
inline bool isfinite(double x) { return __builtin_isfinite(x); }
inline bool isfinite(float x) { return __builtin_isfinite(x); }
inline bool isnormal(double x) { return __builtin_isnormal(x); }
inline bool isnormal(float x) { return __builtin_isnormal(x); }
inline bool signbit(double x) { return __builtin_signbit(x); }
inline bool signbit(float x) { return __builtin_signbit(x); }
inline int fpclassify(double x) { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x); }
inline int fpclassify(float x) { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x); }
}  // namespace std
