diff options
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/include/ieeefp.h | 20 | ||||
-rw-r--r-- | newlib/libc/include/machine/ieeefp.h | 21 | ||||
-rw-r--r-- | newlib/libc/include/math.h | 8 |
3 files changed, 42 insertions, 7 deletions
diff --git a/newlib/libc/include/ieeefp.h b/newlib/libc/include/ieeefp.h index e08fd0885..0b06fb786 100644 --- a/newlib/libc/include/ieeefp.h +++ b/newlib/libc/include/ieeefp.h @@ -213,14 +213,22 @@ int _EXFUN(finitef, (float)); #define __IEEE_DBL_NAN_EXP 0x7ff #define __IEEE_FLT_NAN_EXP 0xff +#ifndef __ieeefp_isnanf +#define __ieeefp_isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \ + ((*(long *)&(x) & 0x007fffffL)!=0000000000L)) +#endif +#define isnanf(x) __ieeefp_isnanf(x) -#define isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \ - ((*(long *)&(x) & 0x007fffffL)!=0000000000L)) - -#define isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \ - ((*(long *)&(x) & 0x007fffffL)==0000000000L)) +#ifndef __ieeefp_isinff +#define __ieeefp_isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \ + ((*(long *)&(x) & 0x007fffffL)==0000000000L)) +#endif +#define isinff(x) __ieeefp_isinff(x) -#define finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L)) +#ifndef __ieeefp_finitef +#define __ieeefp_finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L)) +#endif +#define finitef(x) __ieeefp_finitef(x) #ifdef _DOUBLE_IS_32BITS #undef __IEEE_DBL_EXPBIAS diff --git a/newlib/libc/include/machine/ieeefp.h b/newlib/libc/include/machine/ieeefp.h index 9e5b5aee0..b3e77945e 100644 --- a/newlib/libc/include/machine/ieeefp.h +++ b/newlib/libc/include/machine/ieeefp.h @@ -75,8 +75,27 @@ #ifdef __SPU__ #define __IEEE_BIG_ENDIAN -#endif +#define isfinite(y) \ + (__extension__ ({__typeof__(y) __y = (y); \ + (sizeof (__y) == sizeof (float)) ? (1) : \ + fpclassify(__y) != FP_INFINITE && fpclassify(__y) != FP_NAN;})) +#define isinf(x) \ + (__extension__ ({__typeof__(x) __x = (x); \ + (sizeof (__x) == sizeof (float)) ? (0) : __isinfd(__x);})) +#define isnan(x) \ + (__extension__ ({__typeof__(x) __x = (x); \ + (sizeof (__x) == sizeof (float)) ? (0) : __isnand(__x);})) + +/* + * Macros for use in ieeefp.h. We can't just define the real ones here + * (like those above) as we have name space issues when this is *not* + * included via generic the ieeefp.h. + */ +#define __ieeefp_isnanf(x) 0 +#define __ieeefp_isinff(x) 0 +#define __ieeefp_finitef(x) 1 +#endif #ifdef __sparc__ #ifdef __LITTLE_ENDIAN_DATA__ diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h index 3e96757c8..63cc99286 100644 --- a/newlib/libc/include/math.h +++ b/newlib/libc/include/math.h @@ -131,21 +131,29 @@ extern int __signbitd (double x); (__extension__ ({__typeof__(x) __x = (x); \ (sizeof (__x) == sizeof (float)) ? __fpclassifyf(__x) : __fpclassifyd(__x);})) +#ifndef isfinite #define isfinite(y) \ (__extension__ ({__typeof__(y) __y = (y); \ fpclassify(__y) != FP_INFINITE && fpclassify(__y) != FP_NAN;})) +#endif /* Note: isinf and isnan were once functions in newlib that took double * arguments. C99 specifies that these names are reserved for macros * supporting multiple floating point types. Thus, they are * now defined as macros. Implementations of the old functions * taking double arguments still exist for compatibility purposes. */ +#ifndef isinf #define isinf(x) \ (__extension__ ({__typeof__(x) __x = (x); \ (sizeof (__x) == sizeof (float)) ? __isinff(__x) : __isinfd(__x);})) +#endif + +#ifndef isnan #define isnan(x) \ (__extension__ ({__typeof__(x) __x = (x); \ (sizeof (__x) == sizeof (float)) ? __isnanf(__x) : __isnand(__x);})) +#endif + #define isnormal(y) (fpclassify(y) == FP_NORMAL) #define signbit(x) \ (__extension__ ({__typeof__(x) __x = (x); \ |