/*
   fastmath.h - header file for the FastMath routines.  These are high
                performance math routines that don't bother checking for
                most error conditions and never call matherr.  They are
                coded for maximum speed and most are written in assembly.

                These functions are never exported from the RTLDLL, which
                means that they always get linked directly into the PE file
                which is being created.

*/

/*
 *      C/C++ Run Time Library - Version 10.0
 *
 *      Copyright (c) 1999, 2000 by Inprise Corporation
 *      All Rights Reserved.
 *
 */

/* $Revision:   9.4  $ */

#ifndef __FASTMATH_H
#define __FASTMATH_H

#include <_defs.h>
#include <math.h>

#ifdef __cplusplus
extern "C" {
#endif

#define _FMAPI _RTLENTRY /* FastMath API */

/* _FMAPI functions are never exported from the RTLDLL, they always get linked
   into the PE file directly.
*/

/* double routines: */

double      _FMAPI _fm_acos    (double __x);
double      _FMAPI _fm_asin    (double __x);
double      _FMAPI _fm_atan    (double __x);
double      _FMAPI _fm_atan2   (double __y, double __x);
double      _FMAPI _fm_cos     (double __x);
double      _FMAPI _fm_cosh    (double __x);
double      _FMAPI _fm_exp     (double __x);
double      _FMAPI _fm_fabs    (double __x);
double      _FMAPI _fm_frexp   (double __x, int * __exponent);
double      _FMAPI _fm_hypot   (double __x, double __y);
double      _FMAPI _fm_ldexp   (double __x, int __exponent);
double      _FMAPI _fm_log     (double __x);
double      _FMAPI _fm_log10   (double __x);
double      _FMAPI _fm_sin     (double __x);
double      _FMAPI _fm_sinh    (double __x);
double      _FMAPI _fm_sqrt    (double __x);
double      _FMAPI _fm_tan     (double __x);
double      _FMAPI _fm_tanh    (double __x);

/* long double routines: */

long double _FMAPI _fm_acosl  (long double __x);
long double _FMAPI _fm_asinl  (long double __x);
long double _FMAPI _fm_atan2l (long double __x, long double __y);
long double _FMAPI _fm_atanl  (long double __x);
long double _FMAPI _fm_coshl  (long double __x);
long double _FMAPI _fm_cosl   (long double __x);
long double _FMAPI _fm_expl   (long double __x);
long double _FMAPI _fm_fabsl  (long double __x);
long double _FMAPI _fm_frexpl (long double __x, int * __exponent);
long double _FMAPI _fm_hypotl (long double __x, long double __y);
long double _FMAPI _fm_ldexpl (long double __x, int __exponent);
long double _FMAPI _fm_log10l (long double __x);
long double _FMAPI _fm_logl   (long double __x);
long double _FMAPI _fm_sinhl  (long double __x);
long double _FMAPI _fm_sinl   (long double __x);
long double _FMAPI _fm_sqrtl  (long double __x);
long double _FMAPI _fm_tanhl  (long double __x);
long double _FMAPI _fm_tanl   (long double __x);

/* Additional fast functions, not directly supported in the regular RTL: */

/* double routines: */
void _FMAPI _fm_sincos(double __a, double *__x, double *__y);

/* long double routines: */
void _FMAPI _fm_sincosl(long double __a, long double *__x, long double *__y);
long double _FMAPI              _fm_atanhl (long double __x);
long double _FMAPI              _fm_acoshl (long double __x);
long double _FMAPI              _fm_asinhl (long double __x);


/* Special inline function that performs an intrinsic FWAIT instruction */
__inline void _fm_fwait(void)
{
    __emit__(0x9B);  /* asm FWAIT */
}

/* _fm_init can be called to mask all fpu exceptions prior to using the
  FastMath routines.
*/
unsigned int _FMAPI _fm_init(void);


/* If you don't want the standard C function names re-mapped to the FastMath
   versions, then define _FM_NO_REMAP.  The FastMath routines can still be
   called with their _fm_xxx names.
*/
#ifndef _FM_NO_REMAP

/* Undefine the standard functions names in preparation for re-mapping */

#undef acos
#undef asin
#undef atan
#undef atan2
#undef cos
#undef cosh
#undef exp
#undef fabs
#undef frexp
#undef hypot
#undef ldexp
#undef log
#undef log10
#undef sin
#undef sinh
#undef sqrt
#undef tan
#undef tanh
#undef sincos

#undef acosl
#undef asinl
#undef atan2l
#undef atanl
#undef coshl
#undef cosl
#undef expl
#undef fabsl
#undef frexpl
#undef hypotl
#undef ldexpl
#undef log10l
#undef logl
#undef sinhl
#undef sinl
#undef sqrtl
#undef tanhl
#undef tanl
#undef sincosl

#undef atanhl
#undef acoshl
#undef asinhl

/* now re-map the standard names to their FastMath equivalents */

#define acos      _fm_acos
#define asin      _fm_asin
#define atan      _fm_atan
#define atan2     _fm_atan2
#define cos       _fm_cos
#define cosh      _fm_cosh
#define exp       _fm_exp
#define fabs      _fm_fabs
#define frexp     _fm_frexp
#define hypot     _fm_hypot
#define ldexp     _fm_ldexp
#define log       _fm_log
#define log10     _fm_log10
#define sin       _fm_sin
#define sinh      _fm_sinh
#define sqrt      _fm_sqrt
#define tan       _fm_tan
#define tanh      _fm_tanh
#define sincos    _fm_sincos

#define acosl     _fm_acosl
#define asinl     _fm_asinl
#define atan2l    _fm_atan2l
#define atanl     _fm_atanl
#define coshl     _fm_coshl
#define cosl      _fm_cosl
#define expl      _fm_expl
#define fabsl     _fm_fabsl
#define frexpl    _fm_frexpl
#define hypotl    _fm_hypotl
#define ldexpl    _fm_ldexpl
#define log10l    _fm_log10l
#define logl      _fm_logl
#define sinhl     _fm_sinhl
#define sinl      _fm_sinl
#define sqrtl     _fm_sqrtl
#define tanhl     _fm_tanhl
#define tanl      _fm_tanl
#define sincosl   _fm_sincosl

#define atanhl    _fm_atanhl
#define acoshl    _fm_acoshl
#define asinhl    _fm_asinhl

#endif /* _FM_NO_REMAP */

#ifdef __cplusplus
} // "C"
#endif

#endif /* __FASTMATH_H */