2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the w64 mingw-runtime package.
4 * No warranty is given; refer to the file DISCLAIMER within this package.
10 #pragma GCC system_header
17 #pragma pack(push,_CRT_PACKING)
23 #ifndef _EXCEPTION_DEFINED
24 #define _EXCEPTION_DEFINED
34 #ifndef _COMPLEX_DEFINED
35 #define _COMPLEX_DEFINED
55 extern double *_imp___HUGE
;
56 #define _HUGE (*_imp___HUGE)
60 #define HUGE_VAL _HUGE
62 #ifndef _CRT_ABS_DEFINED
63 #define _CRT_ABS_DEFINED
64 int __cdecl
abs(int _X
);
65 long __cdecl
labs(long _X
);
67 double __cdecl
acos(double _X
);
68 double __cdecl
asin(double _X
);
69 double __cdecl
atan(double _X
);
70 double __cdecl
atan2(double _Y
,double _X
);
73 _CRTIMP
double __cdecl
_copysign (double _Number
,double _Sign
);
74 _CRTIMP
double __cdecl
_chgsign (double _X
);
76 double __cdecl
cos(double _X
);
77 double __cdecl
cosh(double _X
);
78 double __cdecl
exp(double _X
);
79 double expm1(double _X
);
80 double __cdecl
fabs(double _X
);
81 double __cdecl
fmod(double _X
,double _Y
);
82 double __cdecl
log(double _X
);
83 double __cdecl
log10(double _X
);
84 double __cdecl
pow(double _X
,double _Y
);
85 double __cdecl
sin(double _X
);
86 double __cdecl
sinh(double _X
);
87 double __cdecl
tan(double _X
);
88 double __cdecl
tanh(double _X
);
89 double __cdecl
sqrt(double _X
);
90 #ifndef _CRT_ATOF_DEFINED
91 #define _CRT_ATOF_DEFINED
92 double __cdecl
atof(const char *_String
);
93 double __cdecl
_atof_l(const char *_String
,_locale_t _Locale
);
96 _CRTIMP
double __cdecl
_cabs(struct _complex _ComplexA
);
97 double __cdecl
ceil(double _X
);
98 double __cdecl
floor(double _X
);
99 double __cdecl
frexp(double _X
,int *_Y
);
100 double __cdecl
_hypot(double _X
,double _Y
);
101 _CRTIMP
double __cdecl
_j0(double _X
);
102 _CRTIMP
double __cdecl
_j1(double _X
);
103 _CRTIMP
double __cdecl
_jn(int _X
,double _Y
);
104 double __cdecl
ldexp(double _X
,int _Y
);
105 #ifndef _CRT_MATHERR_DEFINED
106 #define _CRT_MATHERR_DEFINED
107 int __cdecl
_matherr(struct _exception
*_Except
);
109 double __cdecl
modf(double _X
,double *_Y
);
110 _CRTIMP
double __cdecl
_y0(double _X
);
111 _CRTIMP
double __cdecl
_y1(double _X
);
112 _CRTIMP
double __cdecl
_yn(int _X
,double _Y
);
114 #if(defined(_X86_) && !defined(__x86_64))
115 _CRTIMP
int __cdecl
_set_SSE2_enable(int _Flag
);
116 /* from libmingwex */
117 float __cdecl
_hypotf(float _X
,float _Y
);
120 float frexpf(float _X
,int *_Y
);
121 float __cdecl
ldexpf(float _X
,int _Y
);
122 long double __cdecl
ldexpl(long double _X
,int _Y
);
123 float __cdecl
acosf(float _X
);
124 float __cdecl
asinf(float _X
);
125 float __cdecl
atanf(float _X
);
126 float __cdecl
atan2f(float _X
,float _Y
);
127 float __cdecl
cosf(float _X
);
128 float __cdecl
sinf(float _X
);
129 float __cdecl
tanf(float _X
);
130 float __cdecl
coshf(float _X
);
131 float __cdecl
sinhf(float _X
);
132 float __cdecl
tanhf(float _X
);
133 float __cdecl
expf(float _X
);
134 float expm1f(float _X
);
135 float __cdecl
logf(float _X
);
136 float __cdecl
log10f(float _X
);
137 float __cdecl
modff(float _X
,float *_Y
);
138 float __cdecl
powf(float _X
,float _Y
);
139 float __cdecl
sqrtf(float _X
);
140 float __cdecl
ceilf(float _X
);
141 float __cdecl
floorf(float _X
);
142 float __cdecl
fmodf(float _X
,float _Y
);
143 float __cdecl
_hypotf(float _X
,float _Y
);
144 float __cdecl
fabsf(float _X
);
145 #if !defined(__ia64__)
146 /* from libmingwex */
147 float __cdecl
_copysignf (float _Number
,float _Sign
);
148 float __cdecl
_chgsignf (float _X
);
149 float __cdecl
_logbf(float _X
);
150 float __cdecl
_nextafterf(float _X
,float _Y
);
151 int __cdecl
_finitef(float _X
);
152 int __cdecl
_isnanf(float _X
);
153 int __cdecl
_fpclassf(float _X
);
157 __CRT_INLINE
long double __cdecl
fabsl (long double x
)
160 __asm__ ("fabs;" : "=t" (res
) : "0" (x
));
163 #define _hypotl(x,y) ((long double)_hypot((double)(x),(double)(y)))
164 #define _matherrl _matherr
165 __CRT_INLINE
long double _chgsignl(long double _Number
) { return _chgsign((double)(_Number
)); }
166 __CRT_INLINE
long double _copysignl(long double _Number
,long double _Sign
) { return _copysign((double)(_Number
),(double)(_Sign
)); }
167 __CRT_INLINE
float frexpf(float _X
,int *_Y
) { return ((float)frexp((double)_X
,_Y
)); }
169 #if !defined (__ia64__)
170 __CRT_INLINE
float __cdecl
fabsf (float x
)
173 __asm__ ("fabs;" : "=t" (res
) : "0" (x
));
177 __CRT_INLINE
float __cdecl
ldexpf (float x
, int expn
) { return (float) ldexp (x
, expn
); }
181 __CRT_INLINE
long double __cdecl
fabsl (long double x
)
184 __asm__ ("fabs;" : "=t" (res
) : "0" (x
));
187 __CRT_INLINE
long double modfl(long double _X
,long double *_Y
) {
188 double _Di
,_Df
= modf((double)_X
,&_Di
);
189 *_Y
= (long double)_Di
;
192 __CRT_INLINE
long double _chgsignl(long double _Number
) { return _chgsign(static_cast<double>(_Number
)); }
193 __CRT_INLINE
long double _copysignl(long double _Number
,long double _Sign
) { return _copysign(static_cast<double>(_Number
),static_cast<double>(_Sign
)); }
194 __CRT_INLINE
float frexpf(float _X
,int *_Y
) { return ((float)frexp((double)_X
,_Y
)); }
196 __CRT_INLINE
float __cdecl
fabsf (float x
)
199 __asm__ ("fabs;" : "=t" (res
) : "0" (x
));
202 __CRT_INLINE
float __cdecl
ldexpf (float x
, int expn
) { return (float) ldexp (x
, expn
); }
204 __CRT_INLINE
float acosf(float _X
) { return ((float)acos((double)_X
)); }
205 __CRT_INLINE
float asinf(float _X
) { return ((float)asin((double)_X
)); }
206 __CRT_INLINE
float atanf(float _X
) { return ((float)atan((double)_X
)); }
207 __CRT_INLINE
float atan2f(float _X
,float _Y
) { return ((float)atan2((double)_X
,(double)_Y
)); }
208 __CRT_INLINE
float ceilf(float _X
) { return ((float)ceil((double)_X
)); }
209 __CRT_INLINE
float cosf(float _X
) { return ((float)cos((double)_X
)); }
210 __CRT_INLINE
float coshf(float _X
) { return ((float)cosh((double)_X
)); }
211 __CRT_INLINE
float expf(float _X
) { return ((float)exp((double)_X
)); }
212 __CRT_INLINE
float floorf(float _X
) { return ((float)floor((double)_X
)); }
213 __CRT_INLINE
float fmodf(float _X
,float _Y
) { return ((float)fmod((double)_X
,(double)_Y
)); }
214 __CRT_INLINE
float logf(float _X
) { return ((float)log((double)_X
)); }
215 __CRT_INLINE
float log10f(float _X
) { return ((float)log10((double)_X
)); }
216 __CRT_INLINE
float modff(float _X
,float *_Y
) {
217 double _Di
,_Df
= modf((double)_X
,&_Di
);
221 __CRT_INLINE
float powf(float _X
,float _Y
) { return ((float)pow((double)_X
,(double)_Y
)); }
222 __CRT_INLINE
float sinf(float _X
) { return ((float)sin((double)_X
)); }
223 __CRT_INLINE
float sinhf(float _X
) { return ((float)sinh((double)_X
)); }
224 __CRT_INLINE
float sqrtf(float _X
) { return ((float)sqrt((double)_X
)); }
225 __CRT_INLINE
float tanf(float _X
) { return ((float)tan((double)_X
)); }
226 __CRT_INLINE
float tanhf(float _X
) { return ((float)tanh((double)_X
)); }
232 #define DOMAIN _DOMAIN
234 #define OVERFLOW _OVERFLOW
235 #define UNDERFLOW _UNDERFLOW
238 #define matherr _matherr
241 /* double __cdecl cabs(struct _complex _X); */
242 double __cdecl
hypot(double _X
,double _Y
);
243 _CRTIMP
double __cdecl
j0(double _X
);
244 _CRTIMP
double __cdecl
j1(double _X
);
245 _CRTIMP
double __cdecl
jn(int _X
,double _Y
);
246 _CRTIMP
double __cdecl
y0(double _X
);
247 _CRTIMP
double __cdecl
y1(double _X
);
248 _CRTIMP
double __cdecl
yn(int _X
,double _Y
);
252 #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
253 || !defined __STRICT_ANSI__ || defined __GLIBCPP__
255 #define NAN (0.0F/0.0F)
256 #define HUGE_VALF (1.0F/0.0F)
257 #define HUGE_VALL (1.0L/0.0L)
258 #define INFINITY (1.0F/0.0F)
261 #define FP_NAN 0x0100
262 #define FP_NORMAL 0x0400
263 #define FP_INFINITE (FP_NAN | FP_NORMAL)
264 #define FP_ZERO 0x4000
265 #define FP_SUBNORMAL (FP_NORMAL | FP_ZERO)
266 /* 0x0200 is signbit mask */
270 We can't __CRT_INLINE float or double, because we want to ensure truncation
271 to semantic type before classification.
272 (A normal long double value might become subnormal when
273 converted to double, and zero when converted to float.)
276 extern int __cdecl
__fpclassifyf (float);
277 extern int __cdecl
__fpclassify (double);
279 __CRT_INLINE
int __cdecl
__fpclassifyl (long double x
){
281 __asm__ ("fxam; fstsw %%ax;" : "=a" (sw
): "t" (x
));
282 return sw
& (FP_NAN
| FP_NORMAL
| FP_ZERO
);
285 #define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x) \
286 : sizeof (x) == sizeof (double) ? __fpclassify (x) \
290 #define isfinite(x) ((fpclassify(x) & FP_NAN) == 0)
293 #define isinf(x) (fpclassify(x) == FP_INFINITE)
296 /* We don't need to worry about trucation here:
297 A NaN stays a NaN. */
299 __CRT_INLINE
int __cdecl
__isnan (double _x
)
303 "fstsw %%ax": "=a" (sw
) : "t" (_x
));
304 return (sw
& (FP_NAN
| FP_NORMAL
| FP_INFINITE
| FP_ZERO
| FP_SUBNORMAL
))
308 __CRT_INLINE
int __cdecl
__isnanf (float _x
)
312 "fstsw %%ax": "=a" (sw
) : "t" (_x
));
313 return (sw
& (FP_NAN
| FP_NORMAL
| FP_INFINITE
| FP_ZERO
| FP_SUBNORMAL
))
317 __CRT_INLINE
int __cdecl
__isnanl (long double _x
)
321 "fstsw %%ax": "=a" (sw
) : "t" (_x
));
322 return (sw
& (FP_NAN
| FP_NORMAL
| FP_INFINITE
| FP_ZERO
| FP_SUBNORMAL
))
327 #define isnan(x) (sizeof (x) == sizeof (float) ? __isnanf (x) \
328 : sizeof (x) == sizeof (double) ? __isnan (x) \
332 #define isnormal(x) (fpclassify(x) == FP_NORMAL)
334 /* 7.12.3.6 The signbit macro */
335 __CRT_INLINE
int __cdecl
__signbit (double x
) {
337 __asm__ ( "fxam; fstsw %%ax;": "=a" (stw
) : "t" (x
));
341 __CRT_INLINE
int __cdecl
__signbitf (float x
) {
343 __asm__ ("fxam; fstsw %%ax;": "=a" (stw
) : "t" (x
));
347 __CRT_INLINE
int __cdecl
__signbitl (long double x
) {
349 __asm__ ("fxam; fstsw %%ax;": "=a" (stw
) : "t" (x
));
353 #define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x) \
354 : sizeof (x) == sizeof (double) ? __signbit (x) \
357 extern double __cdecl
exp2(double);
358 extern float __cdecl
exp2f(float);
359 extern long double __cdecl
exp2l(long double);
361 #define FP_ILOGB0 ((int)0x80000000)
362 #define FP_ILOGBNAN ((int)0x80000000)
363 extern int __cdecl
ilogb (double);
364 extern int __cdecl
ilogbf (float);
365 extern int __cdecl
ilogbl (long double);
367 extern double __cdecl
log1p(double);
368 extern float __cdecl
log1pf(float);
369 extern long double __cdecl
log1pl(long double);
371 extern double __cdecl
log2 (double);
372 extern float __cdecl
log2f (float);
373 extern long double __cdecl
log2l (long double);
375 extern double __cdecl
logb (double);
376 extern float __cdecl
logbf (float);
377 extern long double __cdecl
logbl (long double);
379 __CRT_INLINE
double __cdecl
logb (double x
)
382 __asm__ ("fxtract\n\t"
383 "fstp %%st" : "=t" (res
) : "0" (x
));
387 __CRT_INLINE
float __cdecl
logbf (float x
)
390 __asm__ ("fxtract\n\t"
391 "fstp %%st" : "=t" (res
) : "0" (x
));
395 __CRT_INLINE
long double __cdecl
logbl (long double x
)
398 __asm__ ("fxtract\n\t"
399 "fstp %%st" : "=t" (res
) : "0" (x
));
403 extern long double __cdecl
modfl (long double, long double*);
406 extern double __cdecl
scalbn (double, int);
407 extern float __cdecl
scalbnf (float, int);
408 extern long double __cdecl
scalbnl (long double, int);
410 extern double __cdecl
scalbln (double, long);
411 extern float __cdecl
scalblnf (float, long);
412 extern long double __cdecl
scalblnl (long double, long);
415 /* Implementations adapted from Cephes versions */
416 extern double __cdecl
cbrt (double);
417 extern float __cdecl
cbrtf (float);
418 extern long double __cdecl
cbrtl (long double);
420 __CRT_INLINE
float __cdecl
hypotf (float x
, float y
)
421 { return (float) hypot (x
, y
);}
422 extern long double __cdecl
hypotl (long double, long double);
424 extern long double __cdecl
powl (long double, long double);
425 extern long double __cdecl
expl(long double);
426 extern long double expm1l(long double);
427 extern long double __cdecl
coshl(long double);
428 extern long double __cdecl
fabsl (long double);
429 extern long double __cdecl
acosl(long double);
430 extern long double __cdecl
asinl(long double);
431 extern long double __cdecl
atanl(long double);
432 extern long double __cdecl
atan2l(long double,long double);
433 extern long double __cdecl
sinhl(long double);
434 extern long double __cdecl
tanhl(long double);
436 /* 7.12.8.1 The erf functions */
437 extern double __cdecl
erf (double);
438 extern float __cdecl
erff (float);
440 extern long double __cdecl erfl (long double);
443 /* 7.12.8.2 The erfc functions */
444 extern double __cdecl
erfc (double);
445 extern float __cdecl
erfcf (float);
447 extern long double __cdecl erfcl (long double);
450 /* 7.12.8.3 The lgamma functions */
451 extern double __cdecl
lgamma (double);
452 extern float __cdecl
lgammaf (float);
453 extern long double __cdecl
lgammal (long double);
455 /* 7.12.8.4 The tgamma functions */
456 extern double __cdecl
tgamma (double);
457 extern float __cdecl
tgammaf (float);
458 extern long double __cdecl
tgammal (long double);
460 extern long double __cdecl
ceill (long double);
461 extern long double __cdecl
floorl (long double);
462 extern long double __cdecl
frexpl(long double,int *);
463 extern long double __cdecl
log10l(long double);
464 extern long double __cdecl
logl(long double);
465 extern long double __cdecl
cosl(long double);
466 extern long double __cdecl
sinl(long double);
467 extern long double __cdecl
tanl(long double);
468 extern long double sqrtl(long double);
471 extern double __cdecl
nearbyint ( double);
472 extern float __cdecl
nearbyintf (float);
473 extern long double __cdecl
nearbyintl (long double);
476 /* round, using fpu control word settings */
477 __CRT_INLINE
double __cdecl
rint (double x
)
480 __asm__ ("frndint;": "=t" (retval
) : "0" (x
));
484 __CRT_INLINE
float __cdecl
rintf (float x
)
487 __asm__ ("frndint;" : "=t" (retval
) : "0" (x
) );
491 __CRT_INLINE
long double __cdecl
rintl (long double x
)
494 __asm__ ("frndint;" : "=t" (retval
) : "0" (x
) );
499 __CRT_INLINE
long __cdecl
lrint (double x
)
502 __asm__ __volatile__ \
503 ("fistpl %0" : "=m" (retval
) : "t" (x
) : "st"); \
507 __CRT_INLINE
long __cdecl
lrintf (float x
)
510 __asm__ __volatile__ \
511 ("fistpl %0" : "=m" (retval
) : "t" (x
) : "st"); \
515 __CRT_INLINE
long __cdecl
lrintl (long double x
)
518 __asm__ __volatile__ \
519 ("fistpl %0" : "=m" (retval
) : "t" (x
) : "st"); \
523 __CRT_INLINE
long long __cdecl
llrint (double x
)
526 __asm__ __volatile__ \
527 ("fistpll %0" : "=m" (retval
) : "t" (x
) : "st"); \
531 __CRT_INLINE
long long __cdecl
llrintf (float x
)
534 __asm__ __volatile__ \
535 ("fistpll %0" : "=m" (retval
) : "t" (x
) : "st"); \
539 __CRT_INLINE
long long __cdecl
llrintl (long double x
)
542 __asm__ __volatile__ \
543 ("fistpll %0" : "=m" (retval
) : "t" (x
) : "st"); \
548 /* round away from zero, regardless of fpu control word settings */
549 extern double __cdecl
round (double);
550 extern float __cdecl
roundf (float);
551 extern long double __cdecl
roundl (long double);
554 extern long __cdecl
lround (double);
555 extern long __cdecl
lroundf (float);
556 extern long __cdecl
lroundl (long double);
558 extern long long __cdecl
llround (double);
559 extern long long __cdecl
llroundf (float);
560 extern long long __cdecl
llroundl (long double);
563 /* round towards zero, regardless of fpu control word settings */
564 extern double __cdecl
trunc (double);
565 extern float __cdecl
truncf (float);
566 extern long double __cdecl
truncl (long double);
568 extern long double __cdecl
fmodl (long double, long double);
571 extern double __cdecl
remainder (double, double);
572 extern float __cdecl
remainderf (float, float);
573 extern long double __cdecl
remainderl (long double, long double);
576 extern double __cdecl
remquo(double, double, int *);
577 extern float __cdecl
remquof(float, float, int *);
578 extern long double __cdecl
remquol(long double, long double, int *);
581 extern double __cdecl
copysign (double, double); /* in libmoldname.a */
582 extern float __cdecl
copysignf (float, float);
583 extern long double __cdecl
copysignl (long double, long double);
585 /* 7.12.11.2 Return a NaN */
586 extern double __cdecl
nan(const char *tagp
);
587 extern float __cdecl
nanf(const char *tagp
);
588 extern long double __cdecl
nanl(const char *tagp
);
590 #ifndef __STRICT_ANSI__
591 #define _nan() nan("")
592 #define _nanf() nanf("")
593 #define _nanl() nanl("")
597 extern double __cdecl
nextafter (double, double); /* in libmoldname.a */
598 extern float __cdecl
nextafterf (float, float);
599 extern long double __cdecl
nextafterl (long double, long double);
601 /* 7.12.11.4 The nexttoward functions: TODO */
604 /* x > y ? (x - y) : 0.0 */
605 extern double __cdecl
fdim (double x
, double y
);
606 extern float __cdecl
fdimf (float x
, float y
);
607 extern long double __cdecl
fdiml (long double x
, long double y
);
610 NaN arguments are treated as missing data: if one argument is a NaN
611 and the other numeric, then these functions choose the numeric
615 extern double __cdecl
fmax (double, double);
616 extern float __cdecl
fmaxf (float, float);
617 extern long double __cdecl
fmaxl (long double, long double);
620 extern double __cdecl
fmin (double, double);
621 extern float __cdecl
fminf (float, float);
622 extern long double __cdecl
fminl (long double, long double);
625 /* return x * y + z as a ternary op */
626 extern double __cdecl
fma (double, double, double);
627 extern float __cdecl
fmaf (float, float, float);
628 extern long double __cdecl
fmal (long double, long double, long double);
633 * With these functions, comparisons involving quiet NaNs set the FP
634 * condition code to "unordered". The IEEE floating-point spec
635 * dictates that the result of floating-point comparisons should be
636 * false whenever a NaN is involved, with the exception of the != op,
637 * which always returns true: yes, (NaN != NaN) is true).
642 #define isgreater(x, y) __builtin_isgreater(x, y)
643 #define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
644 #define isless(x, y) __builtin_isless(x, y)
645 #define islessequal(x, y) __builtin_islessequal(x, y)
646 #define islessgreater(x, y) __builtin_islessgreater(x, y)
647 #define isunordered(x, y) __builtin_isunordered(x, y)
651 __CRT_INLINE
int __cdecl
652 __fp_unordered_compare (long double x
, long double y
){
653 unsigned short retval
;
654 __asm__ ("fucom %%st(1);"
655 "fnstsw;": "=a" (retval
) : "t" (x
), "u" (y
));
659 #define isgreater(x, y) ((__fp_unordered_compare(x, y) \
661 #define isless(x, y) ((__fp_unordered_compare (y, x) \
663 #define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \
665 #define islessequal(x, y) ((__fp_unordered_compare(y, x) \
667 #define islessgreater(x, y) ((__fp_unordered_compare(x, y) \
668 & FP_SUBNORMAL) == 0)
669 #define isunordered(x, y) ((__fp_unordered_compare(x, y) \
675 #endif /* __STDC_VERSION__ >= 199901L */
676 #endif /* __NO_ISOCEXT */
681 template<class _Ty
> inline _Ty
_Pow_int(_Ty _X
,int _Y
) {
683 if(_Y
>= 0) _N
= (unsigned int)_Y
;
684 else _N
= (unsigned int)(-_Y
);
685 for(_Ty _Z
= _Ty(1);;_X
*= _X
) {
686 if((_N
& 1)!=0) _Z
*= _X
;
687 if((_N
>>= 1)==0) return (_Y
< 0 ? _Ty(1) / _Z
: _Z
);
695 #if !defined(__STRICT_ANSI__) && !defined(_MATH_DEFINES_DEFINED)
696 #define _MATH_DEFINES_DEFINED
698 #define M_E 2.71828182845904523536
699 #define M_LOG2E 1.44269504088896340736
700 #define M_LOG10E 0.434294481903251827651
701 #define M_LN2 0.693147180559945309417
702 #define M_LN10 2.30258509299404568402
703 #define M_PI 3.14159265358979323846
704 #define M_PI_2 1.57079632679489661923
705 #define M_PI_4 0.785398163397448309616
706 #define M_1_PI 0.318309886183790671538
707 #define M_2_PI 0.636619772367581343076
708 #define M_2_SQRTPI 1.12837916709551257390
709 #define M_SQRT2 1.41421356237309504880
710 #define M_SQRT1_2 0.707106781186547524401
713 #ifndef __MINGW_FPCLASS_DEFINED
714 #define __MINGW_FPCLASS_DEFINED 1
715 #define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
716 #define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
717 #define _FPCLASS_NINF 0x0004 /* Negative Infinity */
718 #define _FPCLASS_NN 0x0008 /* Negative Normal */
719 #define _FPCLASS_ND 0x0010 /* Negative Denormal */
720 #define _FPCLASS_NZ 0x0020 /* Negative Zero */
721 #define _FPCLASS_PZ 0x0040 /* Positive Zero */
722 #define _FPCLASS_PD 0x0080 /* Positive Denormal */
723 #define _FPCLASS_PN 0x0100 /* Positive Normal */
724 #define _FPCLASS_PINF 0x0200 /* Positive Infinity */
725 #endif /* __MINGW_FPCLASS_DEFINED */
729 * With these functions, comparisons involving quiet NaNs set the FP
730 * condition code to "unordered". The IEEE floating-point spec
731 * dictates that the result of floating-point comparisons should be
732 * false whenever a NaN is involved, with the exception of the != op,
733 * which always returns true: yes, (NaN != NaN) is true).
738 #define isgreater(x, y) __builtin_isgreater(x, y)
739 #define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
740 #define isless(x, y) __builtin_isless(x, y)
741 #define islessequal(x, y) __builtin_islessequal(x, y)
742 #define islessgreater(x, y) __builtin_islessgreater(x, y)
743 #define isunordered(x, y) __builtin_isunordered(x, y)
747 __CRT_INLINE
int __cdecl
748 __fp_unordered_compare (long double x
, long double y
){
749 unsigned short retval
;
750 __asm__ ("fucom %%st(1);"
751 "fnstsw;": "=a" (retval
) : "t" (x
), "u" (y
));
755 #define isgreater(x, y) ((__fp_unordered_compare(x, y) \
757 #define isless(x, y) ((__fp_unordered_compare (y, x) \
759 #define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \
761 #define islessequal(x, y) ((__fp_unordered_compare(y, x) \
763 #define islessgreater(x, y) ((__fp_unordered_compare(x, y) \
764 & FP_SUBNORMAL) == 0)
765 #define isunordered(x, y) ((__fp_unordered_compare(x, y) \
770 #endif /* End _MATH_H_ */