/*  DO NOT EDIT THIS FILE.

    It has been auto-edited by fixincludes from:

	"fixinc/tests/inc/iso/math_c99.h"

    This had to be done to correct non-standard usages in the
    original, manufacturer supplied header file.  */



#if defined( SOLARIS_MATH_1_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	HUGE_VAL
#define	HUGE_VAL	(__builtin_huge_val())
#undef	HUGE_VALF
#define	HUGE_VALF	(__builtin_huge_valf())
#undef	HUGE_VALL
#define	HUGE_VALL	(__builtin_huge_vall())
#endif  /* SOLARIS_MATH_1_CHECK */


#if defined( SOLARIS_MATH_2_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	INFINITY
#define	INFINITY	(__builtin_inff())
#endif  /* SOLARIS_MATH_2_CHECK */


#if defined( SOLARIS_MATH_3_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	NAN
#define	NAN		(__builtin_nanf(""))
#endif  /* SOLARIS_MATH_3_CHECK */


#if defined( SOLARIS_MATH_4_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	fpclassify
#define	fpclassify(x) \
  __extension__ ({ __typeof(x) __x_fp = (x); \
		   isnan(__x_fp) \
		     ? FP_NAN \
		     : isinf(__x_fp) \
		       ? FP_INFINITE \
		       : isnormal(__x_fp) \
			 ? FP_NORMAL \
			 : __x_fp == 0.0 \
			   ? FP_ZERO \
			   : FP_SUBNORMAL; })
#endif  /* SOLARIS_MATH_4_CHECK */


#if defined( SOLARIS_MATH_5_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	isfinite
#define	isfinite(x) \
  __extension__ ({ __typeof (x) __x_f = (x); \
		   __builtin_expect(!isnan(__x_f - __x_f), 1); })
#endif  /* SOLARIS_MATH_5_CHECK */


#if defined( SOLARIS_MATH_6_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	isinf
#define	isinf(x) \
  __extension__ ({ __typeof (x) __x_i = (x); \
		   __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })
#endif  /* SOLARIS_MATH_6_CHECK */


#if defined( SOLARIS_MATH_7_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	isnormal
#define	isnormal(x) \
  __extension__ ({ __typeof(x) __x_n = (x); \
		   if (__x_n < 0.0) __x_n = -__x_n; \
		   __builtin_expect(isfinite(__x_n) \
				    && (sizeof(__x_n) == sizeof(float) \
					  ? __x_n >= __FLT_MIN__ \
					  : sizeof(__x_n) == sizeof(long double) \
					    ? __x_n >= __LDBL_MIN__ \
					    : __x_n >= __DBL_MIN__), 1); })
#endif  /* SOLARIS_MATH_7_CHECK */


#if defined( SOLARIS_MATH_8_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	signbit
#define	signbit(x)	(sizeof(x) == sizeof(float) \
			   ? __builtin_signbitf(x) \
			   : sizeof(x) == sizeof(long double) \
			     ? __builtin_signbitl(x) \
			     : __builtin_signbit(x))
#endif  /* SOLARIS_MATH_8_CHECK */


#if defined( SOLARIS_MATH_9_CHECK )
#ident	"@(#)math_c99.h	1.9	04/11/01 SMI"
#undef	isgreater
#define	isgreater(x, y)		__builtin_isgreater(x, y)
#undef	isgreaterequal
#define	isgreaterequal(x, y)	__builtin_isgreaterequal(x, y)
#undef	isless
#define	isless(x, y)		__builtin_isless(x, y)
#undef	islessequal
#define	islessequal(x, y)	__builtin_islessequal(x, y)
#undef	islessgreater
#define	islessgreater(x, y)	__builtin_islessgreater(x, y)
#undef	isunordered
#define	isunordered(x, y)	__builtin_isunordered(x, y)
#endif  /* SOLARIS_MATH_9_CHECK */
