2008-06-13 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / interpreter / hacks.h
index 8b62bd5a0d3d35f33bd2fbb18558a33d14e198ab..9697ccbad6fec104caaf59b9521f5315c62f5003 100644 (file)
@@ -1,8 +1,12 @@
 /* we need some special math function */
+#ifndef _ISOC99_SOURCE
 #define _ISOC99_SOURCE
+#endif
 #include <math.h>
 
 /* which are not defined on FreeBSD */
+#ifdef __GNUC__
+
 #ifndef isunordered
 #   define isunordered(u, v)                              \
     (__extension__                                        \
         !isunordered(__x, __y) && __x > __y; }))
 #endif
 
+#else
+
+/*  isunordered seems to crash on HPUX when built 64 bits
+    so use generic implementation.
+*/
+#if defined(__hpux) && SIZEOF_VOID_P == 8
+#undef isunordered
+#undef islessgreater
+#undef islessequal
+#undef isless
+#undef isgreater
+#endif
+
+#ifndef isunordered
+#   define isunordered(u, v) (isnan(u) || isnan(v))
+#endif
+
+#ifndef islessgreater
+#   define islessgreater(x, u) (!isunordered (x, y) && (x < y) || (y < x))
+#endif
+
+#ifndef islessequal
+#   define islessequal(x, y) (!isunordered(x, y) && x <= y)
+#endif
+
+#ifndef isless
+#   define isless(x, y) (!isunordered(x, y) && x < y) 
+#endif
+
+#ifndef isgreater
+#   define isgreater(x, y) (!isunordered(x, y) && x > y)
+#endif
+
+#endif
+
 /*
  * Attempt at using the goto label construct of GNU GCC:
  * it turns out this does give some benefit: 5-15% speedup.