2001-11-09 Dietmar Maurer <dietmar@ximian.com>
[mono.git] / mono / interpreter / hacks.h
index ae41d0d57b8bcf1f298cbe84fea656414829606f..8b62bd5a0d3d35f33bd2fbb18558a33d14e198ab 100644 (file)
@@ -1,3 +1,43 @@
+/* we need some special math function */
+#define _ISOC99_SOURCE
+#include <math.h>
+
+/* which are not defined on FreeBSD */
+#ifndef isunordered
+#   define isunordered(u, v)                              \
+    (__extension__                                        \
+     ({ __typeof__(u) __u = (u); __typeof__(v) __v = (v); \
+        isnan(__u) || isnan(__v); }))
+#endif
+
+#ifndef islessgreater
+#   define islessgreater(x, u)                                    \
+    (__extension__                                                \
+     ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);         \
+        !isunordered (__x, __y) && (__x < __y) || (__y < __x); }))
+#endif
+
+#ifndef islessequal
+#   define islessequal(x, y)                              \
+    (__extension__                                        \
+     ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
+        !isunordered(__x, __y) && __x <= __y; })) 
+#endif
+
+#ifndef isless
+#   define isless(x, y)                                   \
+    (__extension__                                        \
+     ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
+        !isunordered(__x, __y) && __x < __y; })) 
+#endif
+
+#ifndef isgreater
+#   define isgreater(x, y)                                \
+    (__extension__                                        \
+     ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
+        !isunordered(__x, __y) && __x > __y; }))
+#endif
+
 /*
  * Attempt at using the goto label construct of GNU GCC:
  * it turns out this does give some benefit: 5-15% speedup.
 #define CASE(l)        case l:
 #define DEFAULT        \
                default:        \
-                       g_error ("Unimplemented opcode: %x at 0x%x\n", *ip, ip-(unsigned char*)mh->data.header->code);
+                       g_error ("Unimplemented opcode: %x at 0x%x\n", *ip, ip-header->code);
 #define SUB_SWITCH case 0xFE:
 #define GOTO_LABEL_VARS