/* Entry points to finite-math-only compiler runs.
   Copyright (C) 2011-2013 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _MATH_H
# error "Never use <bits/math-finite.h> directly; include <math.h> instead."
#endif

/* acos.  */
extern double __REDIRECT_NTH (acos, (double), __acos_finite);
extern float __REDIRECT_NTH (acosf, (float), __acosf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (acosl, (long double), __acos_finite);
# else
extern long double __REDIRECT_NTH (acosl, (long double), __acosl_finite);
# endif
#endif

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
/* acosh.  */
extern double __REDIRECT_NTH (acosh, (double), __acosh_finite);
extern float __REDIRECT_NTH (acoshf, (float), __acoshf_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (acoshl, (long double), __acosh_finite);
#  else
extern long double __REDIRECT_NTH (acoshl, (long double), __acoshl_finite);
#  endif
# endif
#endif

/* asin.  */
extern double __REDIRECT_NTH (asin, (double), __asin_finite);
extern float __REDIRECT_NTH (asinf, (float), __asinf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (asinl, (long double), __asin_finite);
# else
extern long double __REDIRECT_NTH (asinl, (long double), __asinl_finite);
# endif
#endif

/* atan2.  */
extern double __REDIRECT_NTH (atan2, (double, double), __atan2_finite);
extern float __REDIRECT_NTH (atan2f, (float, float), __atan2f_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (atan2l, (long double, long double),
				   __atan2_finite);
# else
extern long double __REDIRECT_NTH (atan2l, (long double, long double),
				   __atan2l_finite);
# endif
#endif

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
/* atanh.  */
extern double __REDIRECT_NTH (atanh, (double), __atanh_finite);
extern float __REDIRECT_NTH (atanhf, (float), __atanhf_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (atanhl, (long double), __atanh_finite);
#  else
extern long double __REDIRECT_NTH (atanhl, (long double), __atanhl_finite);
#  endif
# endif
#endif

/* cosh.  */
extern double __REDIRECT_NTH (cosh, (double), __cosh_finite);
extern float __REDIRECT_NTH (coshf, (float), __coshf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (coshl, (long double), __cosh_finite);
# else
extern long double __REDIRECT_NTH (coshl, (long double), __coshl_finite);
# endif
#endif

/* exp.  */
extern double __REDIRECT_NTH (exp, (double), __exp_finite);
extern float __REDIRECT_NTH (expf, (float), __expf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (expl, (long double), __exp_finite);
# else
extern long double __REDIRECT_NTH (expl, (long double), __expl_finite);
# endif
#endif

#ifdef __USE_GNU
/* exp10.  */
extern double __REDIRECT_NTH (exp10, (double), __exp10_finite);
extern float __REDIRECT_NTH (exp10f, (float), __exp10f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (exp10l, (long double), __exp10_finite);
#  else
extern long double __REDIRECT_NTH (exp10l, (long double), __exp10l_finite);
#  endif
# endif

/* pow10.  */
extern double __REDIRECT_NTH (pow10, (double), __exp10_finite);
extern float __REDIRECT_NTH (pow10f, (float), __exp10f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (pow10l, (long double), __exp10_finite);
#  else
extern long double __REDIRECT_NTH (pow10l, (long double), __exp10l_finite);
#  endif
# endif
#endif

#ifdef __USE_ISOC99
/* exp2.  */
extern double __REDIRECT_NTH (exp2, (double), __exp2_finite);
extern float __REDIRECT_NTH (exp2f, (float), __exp2f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (exp2l, (long double), __exp2_finite);
#  else
extern long double __REDIRECT_NTH (exp2l, (long double), __exp2l_finite);
#  endif
# endif
#endif

/* fmod.  */
extern double __REDIRECT_NTH (fmod, (double, double), __fmod_finite);
extern float __REDIRECT_NTH (fmodf, (float, float), __fmodf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (fmodl, (long double, long double),
				   __fmod_finite);
# else
extern long double __REDIRECT_NTH (fmodl, (long double, long double),
				   __fmodl_finite);
# endif
#endif

#ifdef __USE_ISOC99
/* hypot.  */
extern double __REDIRECT_NTH (hypot, (double, double), __hypot_finite);
extern float __REDIRECT_NTH (hypotf, (float, float), __hypotf_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (hypotl, (long double, long double),
				   __hypot_finite);
#  else
extern long double __REDIRECT_NTH (hypotl, (long double, long double),
				   __hypotl_finite);
#  endif
# endif
#endif

#if defined __USE_MISC || defined __USE_XOPEN
/* j0.  */
extern double __REDIRECT_NTH (j0, (double), __j0_finite);
extern float __REDIRECT_NTH (j0f, (float), __j0f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (j0l, (long double), __j0_finite);
#  else
extern long double __REDIRECT_NTH (j0l, (long double), __j0l_finite);
#  endif
# endif

/* y0.  */
extern double __REDIRECT_NTH (y0, (double), __y0_finite);
extern float __REDIRECT_NTH (y0f, (float), __y0f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (y0l, (long double), __y0_finite);
#  else
extern long double __REDIRECT_NTH (y0l, (long double), __y0l_finite);
#  endif
# endif

/* j1.  */
extern double __REDIRECT_NTH (j1, (double), __j1_finite);
extern float __REDIRECT_NTH (j1f, (float), __j1f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (j1l, (long double), __j1_finite);
#  else
extern long double __REDIRECT_NTH (j1l, (long double), __j1l_finite);
#  endif
# endif

/* y1.  */
extern double __REDIRECT_NTH (y1, (double), __y1_finite);
extern float __REDIRECT_NTH (y1f, (float), __y1f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (y1l, (long double), __y1_finite);
#  else
extern long double __REDIRECT_NTH (y1l, (long double), __y1l_finite);
#  endif
# endif

/* jn.  */
extern double __REDIRECT_NTH (jn, (int, double), __jn_finite);
extern float __REDIRECT_NTH (jnf, (int, float), __jnf_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (jnl, (int, long double), __jn_finite);
#  else
extern long double __REDIRECT_NTH (jnl, (int, long double), __jnl_finite);
#  endif
# endif

/* yn.  */
extern double __REDIRECT_NTH (yn, (int, double), __yn_finite);
extern float __REDIRECT_NTH (ynf, (int, float), __ynf_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (ynl, (int, long double), __yn_finite);
#  else
extern long double __REDIRECT_NTH (ynl, (int, long double), __ynl_finite);
#  endif
# endif
#endif

#ifdef __USE_MISC
/* lgamma_r.  */
extern double __REDIRECT_NTH (lgamma_r, (double, int *), __lgamma_r_finite);
extern float __REDIRECT_NTH (lgammaf_r, (float, int *), __lgammaf_r_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (lgammal_r, (long double, int *),
				   __lgamma_r_finite);
#  else
extern long double __REDIRECT_NTH (lgammal_r, (long double, int *),
				   __lgammal_r_finite);
#  endif
# endif
#endif

#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99
/* lgamma.  */
__extern_always_inline double __NTH (lgamma (double __d))
{
# ifdef __USE_ISOC99
  int __local_signgam = 0;
  return lgamma_r (__d, &__local_signgam);
# else
  return lgamma_r (__d, &signgam);
# endif
}
__extern_always_inline float __NTH (lgammaf (float __d))
{
# ifdef __USE_ISOC99
  int __local_signgam = 0;
  return lgammaf_r (__d, &__local_signgam);
# else
  return lgammaf_r (__d, &signgam);
# endif
}
# ifdef __MATH_DECLARE_LDOUBLE
__extern_always_inline long double __NTH (lgammal (long double __d))
{
# ifdef __USE_ISOC99
  int __local_signgam = 0;
  return lgammal_r (__d, &__local_signgam);
# else
  return lgammal_r (__d, &signgam);
# endif
}
# endif
#endif

#if defined __USE_MISC || defined __USE_XOPEN
/* gamma.  */
__extern_always_inline double __NTH (gamma (double __d))
{
# ifdef __USE_ISOC99
  int __local_signgam = 0;
  return lgamma_r (__d, &__local_signgam);
# else
  return lgamma_r (__d, &signgam);
# endif
}
__extern_always_inline float __NTH (gammaf (float __d))
{
# ifdef __USE_ISOC99
  int __local_signgam = 0;
  return lgammaf_r (__d, &__local_signgam);
# else
  return lgammaf_r (__d, &signgam);
# endif
}
# ifdef __MATH_DECLARE_LDOUBLE
__extern_always_inline long double __NTH (gammal (long double __d))
{
#  ifdef __USE_ISOC99
  int __local_signgam = 0;
  return lgammal_r (__d, &__local_signgam);
#  else
  return lgammal_r (__d, &signgam);
#  endif
}
# endif
#endif

/* log.  */
extern double __REDIRECT_NTH (log, (double), __log_finite);
extern float __REDIRECT_NTH (logf, (float), __logf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (logl, (long double), __log_finite);
# else
extern long double __REDIRECT_NTH (logl, (long double), __logl_finite);
# endif
#endif

/* log10.  */
extern double __REDIRECT_NTH (log10, (double), __log10_finite);
extern float __REDIRECT_NTH (log10f, (float), __log10f_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (log10l, (long double), __log10_finite);
# else
extern long double __REDIRECT_NTH (log10l, (long double), __log10l_finite);
# endif
#endif

#ifdef __USE_ISOC99
/* log2.  */
extern double __REDIRECT_NTH (log2, (double), __log2_finite);
extern float __REDIRECT_NTH (log2f, (float), __log2f_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (log2l, (long double), __log2_finite);
#  else
extern long double __REDIRECT_NTH (log2l, (long double), __log2l_finite);
#  endif
# endif
#endif

/* ldexp.  */
extern double __REDIRECT_NTH (ldexp, (double, int), scalbn);
extern float __REDIRECT_NTH (ldexpf, (float, int), scalbnf);
#ifdef __MATH_DECLARE_LDOUBLE
extern long double __REDIRECT_NTH (ldexpl, (long double, int), scalbnl);
#endif

/* pow.  */
extern double __REDIRECT_NTH (pow, (double, double), __pow_finite);
extern float __REDIRECT_NTH (powf, (float, float), __powf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (powl, (long double, long double),
				   __pow_finite);
# else
extern long double __REDIRECT_NTH (powl, (long double, long double),
				   __powl_finite);
# endif
#endif

/* remainder.  */
extern double __REDIRECT_NTH (remainder, (double, double), __remainder_finite);
extern float __REDIRECT_NTH (remainderf, (float, float), __remainderf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (remainderl, (long double, long double),
				   __remainder_finite);
# else
extern long double __REDIRECT_NTH (remainderl, (long double, long double),
				   __remainderl_finite);
# endif
#endif

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
/* scalb.  */
extern double __REDIRECT_NTH (scalb, (double, double), __scalb_finite);
extern float __REDIRECT_NTH (scalbf, (float, float), __scalbf_finite);
# ifdef __MATH_DECLARE_LDOUBLE
#  ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (scalbl, (long double, long double),
				   __scalb_finite);
#  else
extern long double __REDIRECT_NTH (scalbl, (long double, long double),
				   __scalbl_finite);
#  endif
# endif
#endif

/* sinh.  */
extern double __REDIRECT_NTH (sinh, (double), __sinh_finite);
extern float __REDIRECT_NTH (sinhf, (float), __sinhf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (sinhl, (long double), __sinh_finite);
# else
extern long double __REDIRECT_NTH (sinhl, (long double), __sinhl_finite);
# endif
#endif

/* sqrt.  */
extern double __REDIRECT_NTH (sqrt, (double), __sqrt_finite);
extern float __REDIRECT_NTH (sqrtf, (float), __sqrtf_finite);
#ifdef __MATH_DECLARE_LDOUBLE
# ifdef __NO_LONG_DOUBLE_MATH
extern long double __REDIRECT_NTH (sqrtl, (long double), __sqrt_finite);
# else
extern long double __REDIRECT_NTH (sqrtl, (long double), __sqrtl_finite);
# endif
#endif

#ifdef __USE_ISOC99
/* tgamma.  */
extern double __gamma_r_finite (double, int *);
__extern_always_inline double __NTH (tgamma (double __d))
{
  int __local_signgam = 0;
  double __res = __gamma_r_finite (__d, &__local_signgam);
  return __local_signgam < 0 ? -__res : __res;
}
extern float __gammaf_r_finite (float, int *);
__extern_always_inline float __NTH (tgammaf (float __d))
{
  int __local_signgam = 0;
  float __res = __gammaf_r_finite (__d, &__local_signgam);
  return __local_signgam < 0 ? -__res : __res;
}
# ifdef __MATH_DECLARE_LDOUBLE
extern long double __gammal_r_finite (long double, int *);
__extern_always_inline long double __NTH (tgammal (long double __d))
{
  int __local_signgam = 0;
#  ifdef __NO_LONG_DOUBLE_MATH
  long double __res = __gamma_r_finite (__d, &__local_signgam);
#  else
  long double __res = __gammal_r_finite (__d, &__local_signgam);
#  endif
  return __local_signgam < 0 ? -__res : __res;
}
# endif
#endif
