|
1 /* |
|
2 * float.h |
|
3 * This file has no copyright assigned and is placed in the Public Domain. |
|
4 * This file is a part of the mingw-runtime package. |
|
5 * No warranty is given; refer to the file DISCLAIMER within the package. |
|
6 * |
|
7 * Constants related to floating point arithmetic. |
|
8 * |
|
9 * Also included here are some non-ANSI bits for accessing the floating |
|
10 * point controller. |
|
11 * |
|
12 * NOTE: GCC provides float.h, but it doesn't include the non-standard |
|
13 * stuff for accessing the fp controller. We include_next the |
|
14 * GCC-supplied header and just define the MS-specific extensions |
|
15 * here. |
|
16 * |
|
17 */ |
|
18 |
|
19 #include_next<float.h> |
|
20 |
|
21 #ifndef _MINGW_FLOAT_H_ |
|
22 #define _MINGW_FLOAT_H_ |
|
23 |
|
24 /* All the headers include this file. */ |
|
25 #include <_mingw.h> |
|
26 |
|
27 /* |
|
28 * Functions and definitions for controlling the FPU. |
|
29 */ |
|
30 #ifndef __STRICT_ANSI__ |
|
31 |
|
32 /* TODO: These constants are only valid for x86 machines */ |
|
33 |
|
34 /* Control word masks for unMask */ |
|
35 #define _MCW_EM 0x0008001F /* Error masks */ |
|
36 #define _MCW_IC 0x00040000 /* Infinity */ |
|
37 #define _MCW_RC 0x00000300 /* Rounding */ |
|
38 #define _MCW_PC 0x00030000 /* Precision */ |
|
39 |
|
40 /* Control word values for unNew (use with related unMask above) */ |
|
41 #define _EM_INVALID 0x00000010 |
|
42 #define _EM_DENORMAL 0x00080000 |
|
43 #define _EM_ZERODIVIDE 0x00000008 |
|
44 #define _EM_OVERFLOW 0x00000004 |
|
45 #define _EM_UNDERFLOW 0x00000002 |
|
46 #define _EM_INEXACT 0x00000001 |
|
47 #define _IC_AFFINE 0x00040000 |
|
48 #define _IC_PROJECTIVE 0x00000000 |
|
49 #define _RC_CHOP 0x00000300 |
|
50 #define _RC_UP 0x00000200 |
|
51 #define _RC_DOWN 0x00000100 |
|
52 #define _RC_NEAR 0x00000000 |
|
53 #define _PC_24 0x00020000 |
|
54 #define _PC_53 0x00010000 |
|
55 #define _PC_64 0x00000000 |
|
56 |
|
57 /* These are also defined in Mingw math.h, needed to work around |
|
58 GCC build issues. */ |
|
59 /* Return values for fpclass. */ |
|
60 #ifndef __MINGW_FPCLASS_DEFINED |
|
61 #define __MINGW_FPCLASS_DEFINED 1 |
|
62 #define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */ |
|
63 #define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */ |
|
64 #define _FPCLASS_NINF 0x0004 /* Negative Infinity */ |
|
65 #define _FPCLASS_NN 0x0008 /* Negative Normal */ |
|
66 #define _FPCLASS_ND 0x0010 /* Negative Denormal */ |
|
67 #define _FPCLASS_NZ 0x0020 /* Negative Zero */ |
|
68 #define _FPCLASS_PZ 0x0040 /* Positive Zero */ |
|
69 #define _FPCLASS_PD 0x0080 /* Positive Denormal */ |
|
70 #define _FPCLASS_PN 0x0100 /* Positive Normal */ |
|
71 #define _FPCLASS_PINF 0x0200 /* Positive Infinity */ |
|
72 #endif /* __MINGW_FPCLASS_DEFINED */ |
|
73 |
|
74 /* invalid subconditions (_SW_INVALID also set) */ |
|
75 #define _SW_UNEMULATED 0x0040 /* unemulated instruction */ |
|
76 #define _SW_SQRTNEG 0x0080 /* square root of a neg number */ |
|
77 #define _SW_STACKOVERFLOW 0x0200 /* FP stack overflow */ |
|
78 #define _SW_STACKUNDERFLOW 0x0400 /* FP stack underflow */ |
|
79 |
|
80 /* Floating point error signals and return codes */ |
|
81 #define _FPE_INVALID 0x81 |
|
82 #define _FPE_DENORMAL 0x82 |
|
83 #define _FPE_ZERODIVIDE 0x83 |
|
84 #define _FPE_OVERFLOW 0x84 |
|
85 #define _FPE_UNDERFLOW 0x85 |
|
86 #define _FPE_INEXACT 0x86 |
|
87 #define _FPE_UNEMULATED 0x87 |
|
88 #define _FPE_SQRTNEG 0x88 |
|
89 #define _FPE_STACKOVERFLOW 0x8a |
|
90 #define _FPE_STACKUNDERFLOW 0x8b |
|
91 #define _FPE_EXPLICITGEN 0x8c /* raise( SIGFPE ); */ |
|
92 |
|
93 #ifndef RC_INVOKED |
|
94 |
|
95 #ifdef __cplusplus |
|
96 extern "C" { |
|
97 #endif |
|
98 |
|
99 /* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask), |
|
100 * i.e. change the bits in unMask to have the values they have in unNew, |
|
101 * leaving other bits unchanged. */ |
|
102 _CRTIMP unsigned int __cdecl __MINGW_NOTHROW _controlfp (unsigned int unNew, unsigned int unMask); |
|
103 _CRTIMP unsigned int __cdecl __MINGW_NOTHROW _control87 (unsigned int unNew, unsigned int unMask); |
|
104 |
|
105 |
|
106 _CRTIMP unsigned int __cdecl __MINGW_NOTHROW _clearfp (void); /* Clear the FPU status word */ |
|
107 _CRTIMP unsigned int __cdecl __MINGW_NOTHROW _statusfp (void); /* Report the FPU status word */ |
|
108 #define _clear87 _clearfp |
|
109 #define _status87 _statusfp |
|
110 |
|
111 |
|
112 /* |
|
113 MSVCRT.dll _fpreset initializes the control register to 0x27f, |
|
114 the status register to zero and the tag word to 0FFFFh. |
|
115 This differs from asm instruction finit/fninit which set control |
|
116 word to 0x37f (64 bit mantissa precison rather than 53 bit). |
|
117 By default, the mingw version of _fpreset sets fp control as |
|
118 per fninit. To use the MSVCRT.dll _fpreset, include CRT_fp8.o when |
|
119 building your application. |
|
120 */ |
|
121 void __cdecl __MINGW_NOTHROW _fpreset (void); |
|
122 void __cdecl __MINGW_NOTHROW fpreset (void); |
|
123 |
|
124 /* Global 'variable' for the current floating point error code. */ |
|
125 _CRTIMP int * __cdecl __MINGW_NOTHROW __fpecode(void); |
|
126 #define _fpecode (*(__fpecode())) |
|
127 |
|
128 /* |
|
129 * IEEE recommended functions. MS puts them in float.h |
|
130 * but they really belong in math.h. |
|
131 */ |
|
132 |
|
133 _CRTIMP double __cdecl __MINGW_NOTHROW _chgsign (double); |
|
134 _CRTIMP double __cdecl __MINGW_NOTHROW _copysign (double, double); |
|
135 _CRTIMP double __cdecl __MINGW_NOTHROW _logb (double); |
|
136 _CRTIMP double __cdecl __MINGW_NOTHROW _nextafter (double, double); |
|
137 _CRTIMP double __cdecl __MINGW_NOTHROW _scalb (double, long); |
|
138 |
|
139 _CRTIMP int __cdecl __MINGW_NOTHROW _finite (double); |
|
140 _CRTIMP int __cdecl __MINGW_NOTHROW _fpclass (double); |
|
141 _CRTIMP int __cdecl __MINGW_NOTHROW _isnan (double); |
|
142 |
|
143 #ifdef __cplusplus |
|
144 } |
|
145 #endif |
|
146 |
|
147 #endif /* Not RC_INVOKED */ |
|
148 |
|
149 #endif /* Not __STRICT_ANSI__ */ |
|
150 |
|
151 #endif /* _FLOAT_H_ */ |
|
152 |