mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-03-21 17:55:13 -05:00
200 lines
5.5 KiB
C
200 lines
5.5 KiB
C
#ifndef _MSL_FENV_H
|
|
#define _MSL_FENV_H
|
|
|
|
#ifndef __FENV__
|
|
#define __FENV__
|
|
|
|
#include <ansi_params.h>
|
|
|
|
#if !_MSL_USING_MW_C_HEADERS
|
|
#if !__MACH__
|
|
#error You must have the non-MSL C header file access path before the MSL access path
|
|
#else
|
|
#include <CarbonCore/fenv.h>
|
|
#endif
|
|
#else
|
|
#if _MSL_C99
|
|
#ifdef __POWERPC__
|
|
|
|
typedef long int fenv_t;
|
|
typedef long int fexcept_t;
|
|
|
|
#define FE_DIVBYZERO 0x04000000
|
|
#define FE_INEXACT 0x02000000
|
|
#define FE_INVALID 0x20000000
|
|
#define FE_OVERFLOW 0x10000000
|
|
#define FE_UNDERFLOW 0x08000000
|
|
|
|
#define FE_DOWNWARD 0x00000003
|
|
#define FE_TONEAREST 0x00000000
|
|
#define FE_TOWARDZERO 0x00000001
|
|
#define FE_UPWARD 0x00000002
|
|
#endif
|
|
|
|
#ifdef __MIPS__
|
|
typedef long int fenv_t;
|
|
typedef long int fexcept_t;
|
|
|
|
#define FE_INEXACT 0x00001000
|
|
#define FE_UNDERFLOW 0x00002000
|
|
#define FE_OVERFLOW 0x00004000
|
|
#define FE_DIVBYZERO 0x00008000
|
|
#define FE_INVALID 0x00010000
|
|
|
|
#define FE_TONEAREST ((short)(-1))
|
|
#define FE_UPWARD ((short)(-2))
|
|
#define FE_DOWNWARD ((short)(-3))
|
|
#define FE_TOWARDZERO ((short)(-4))
|
|
#endif
|
|
|
|
#if defined(__MC68K__) || defined(__COLDFIRE__)
|
|
#if __MC68881__ || __COLDFIRE_HW_FPU__
|
|
|
|
typedef long fexcept_t;
|
|
typedef struct {
|
|
long FPCR;
|
|
long FPSR;
|
|
} fenv_t;
|
|
|
|
#define FE_INEXACT ((long)(8))
|
|
#define FE_DIVBYZERO ((long)(16))
|
|
#define FE_UNDERFLOW ((long)(32))
|
|
#define FE_OVERFLOW ((long)(64))
|
|
#define FE_INVALID ((long)(128))
|
|
#else
|
|
|
|
typedef short fexcept_t;
|
|
typedef short fenv_t;
|
|
|
|
#define FE_INVALID ((short)(1))
|
|
#define FE_UNDERFLOW ((short)(2))
|
|
#define FE_OVERFLOW ((short)(4))
|
|
#define FE_DIVBYZERO ((short)(8))
|
|
#define FE_INEXACT ((short)(16))
|
|
#endif
|
|
|
|
#define FE_TONEAREST ((short)(0))
|
|
#define FE_UPWARD ((short)(1))
|
|
#define FE_DOWNWARD ((short)(2))
|
|
#define FE_TOWARDZERO ((short)(3))
|
|
|
|
#define FE_LDBLPREC ((short)(0))
|
|
#define FE_DBLPREC ((short)(1))
|
|
#define FE_FLTPREC ((short)(2))
|
|
#endif
|
|
|
|
#ifdef __INTEL__
|
|
|
|
typedef short fexcept_t;
|
|
typedef long fenv_t;
|
|
|
|
#define FE_INVALID 0x0001
|
|
#define FE_DIVBYZERO 0x0004
|
|
#define FE_OVERFLOW 0x0008
|
|
#define FE_UNDERFLOW 0x0010
|
|
#define FE_INEXACT 0x0020
|
|
|
|
#define FE_TONEAREST 0x00000000
|
|
#define FE_TOWARDZERO 0x00000C00
|
|
#define FE_UPWARD 0x00000800
|
|
#define FE_DOWNWARD 0x00000400
|
|
|
|
#define FE_LDBLPREC 0x00000300
|
|
#define FE_DBLPREC 0x00000200
|
|
#define FE_FLTPREC 0x00000000
|
|
#endif
|
|
|
|
#ifdef __arm
|
|
|
|
typedef unsigned int __ieee_edata_t;
|
|
|
|
typedef union {
|
|
float f;
|
|
float s;
|
|
double d;
|
|
int i;
|
|
unsigned int ui;
|
|
#if !defined(__STRICT_ANSI__) || (defined(__STDC_VERSION__) && 199901L <= __STDC_VERSION__)
|
|
long long l;
|
|
unsigned long long ul;
|
|
#endif
|
|
struct {int word1, word2;} str;
|
|
} __ieee_value_t;
|
|
|
|
typedef __ieee_value_t (* __ieee_handler_t) (__ieee_value_t, __ieee_value_t, __ieee_edata_t);
|
|
|
|
typedef struct {
|
|
unsigned statusword;
|
|
__ieee_handler_t invalid_handler;
|
|
__ieee_handler_t divbyzero_handler;
|
|
__ieee_handler_t overflow_handler;
|
|
__ieee_handler_t underflow_handler;
|
|
__ieee_handler_t inexact_handler;
|
|
} fenv_t, fexcept_t;
|
|
|
|
#define FE_INVALID ((unsigned long)0x00000001)
|
|
#define FE_DIVBYZERO ((unsigned long)0x00000002)
|
|
#define FE_OVERFLOW ((unsigned long)0x00000004)
|
|
#define FE_UNDERFLOW ((unsigned long)0x00000008)
|
|
#define FE_INEXACT ((unsigned long)0x00000010)
|
|
|
|
#define FE_TONEAREST ((unsigned long)0x00000000)
|
|
#define FE_TOWARDZERO ((unsigned long)0x00C00000)
|
|
#define FE_UPWARD ((unsigned long)0x00400000)
|
|
#define FE_DOWNWARD ((unsigned long)0x00800000)
|
|
#endif
|
|
|
|
#ifdef __MIPS__
|
|
typedef long int fenv_t;
|
|
typedef long int fexcept_t;
|
|
|
|
#define FE_INEXACT 0x00001000
|
|
#define FE_UNDERFLOW 0x00002000
|
|
#define FE_OVERFLOW 0x00004000
|
|
#define FE_DIVBYZERO 0x00008000
|
|
#define FE_INVALID 0x00010000
|
|
#endif
|
|
|
|
#define FE_ALL_EXCEPT (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
|
|
|
|
_MSL_BEGIN_EXTERN_C
|
|
|
|
extern fenv_t _FE_DFL_ENV;
|
|
#define FE_DFL_ENV &_FE_DFL_ENV
|
|
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL feclearexcept(int) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL fegetexceptflag(fexcept_t *, int) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL fesetexceptflag(const fexcept_t *, int) _MSL_CANT_THROW;
|
|
#if (defined(__INTEL__) || defined(__arm))
|
|
#define fegetexcept fegetexceptflag
|
|
#define fesetexcept fesetexceptflag
|
|
#else
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL fegetexcept(fexcept_t *, int) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL fesetexcept(const fexcept_t *, int) _MSL_CANT_THROW;
|
|
#endif
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL feraiseexcept(int) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C int _MSL_MATH_CDECL fetestexcept(int) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C int _MSL_MATH_CDECL fegetround(void) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C int _MSL_MATH_CDECL fesetround(int) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL fegetenv(fenv_t *) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C int _MSL_MATH_CDECL feholdexcept(fenv_t *) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL fesetenv(const fenv_t *) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C void _MSL_MATH_CDECL feupdateenv(const fenv_t *) _MSL_CANT_THROW;
|
|
#if (defined(__MC68K__) || defined(__INTEL__))
|
|
_MSL_IMP_EXP_C int _MSL_MATH_CDECL fegetprec(void) _MSL_CANT_THROW;
|
|
_MSL_IMP_EXP_C int _MSL_MATH_CDECL fesetprec(int) _MSL_CANT_THROW;
|
|
#endif
|
|
|
|
_MSL_END_EXTERN_C
|
|
|
|
#if defined(__INTEL__)
|
|
#include <fenv_x87.h>
|
|
#elif defined(__arm)
|
|
#include <fenv.ARM.h>
|
|
#endif
|
|
|
|
#endif
|
|
#endif
|
|
#endif
|
|
#endif
|