X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Finterpreter%2Fhacks.h;h=9697ccbad6fec104caaf59b9521f5315c62f5003;hb=01bc7c192306a90cb7acadbb72c937adbac14f66;hp=ae41d0d57b8bcf1f298cbe84fea656414829606f;hpb=a1bbd38c28a8b03e28333c4a7de01de4e1943193;p=mono.git diff --git a/mono/interpreter/hacks.h b/mono/interpreter/hacks.h index ae41d0d57b8..9697ccbad6f 100644 --- a/mono/interpreter/hacks.h +++ b/mono/interpreter/hacks.h @@ -1,3 +1,82 @@ +/* we need some special math function */ +#ifndef _ISOC99_SOURCE +#define _ISOC99_SOURCE +#endif +#include + +/* which are not defined on FreeBSD */ +#ifdef __GNUC__ + +#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 + +#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. @@ -67,7 +146,7 @@ #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