also allow reference mode in fild
[libfirm] / win32 / math.c
index 0a19dac..9179f43 100644 (file)
@@ -1,11 +1,77 @@
-#include "fltcalc.h"
+#include "ieee754.h"
+#include "config.h"
 
-int isnan(LLDBL v)
+static int __isnan(double d)
 {
+  union ieee754_double f;
+
+  f.d = d;
+  if (f.ieee.exponent == 0x7FF &&
+    (f.ieee.mantissa0 != 0 ||
+     f.ieee.mantissa1 != 0))
+    return 1;
+
+  return 0;
+}
+
+static int __isnanl(long double d)
+{
+  union ieee854_long_double f;
+
+  f.d = d;
+  if (f.ieee_nan.exponent == 0x7FFF &&
+    (f.ieee_nan.quiet_nan ||
+    f.ieee_nan.mantissa1 ||
+    f.ieee_nan.mantissa0))
+    return 1;
   return 0;
 }
 
-int isinf(LLDBL v)
+static int __isinf(double d)
 {
+  union ieee754_double f;
+
+  f.d = d;
+  if (f.ieee.exponent == 0x7FF &&
+    f.ieee.mantissa0 == 0 &&
+    f.ieee.mantissa1 == 0)
+    return 1;
+
   return 0;
 }
+
+static int __isinfl(long double d)
+{
+  union ieee854_long_double f;
+
+  f.d = d;
+  if (f.ieee.exponent == 0x7FFF &&
+      f.ieee_nan.mantissa1 == 0x80000000 &&
+      f.ieee_nan.mantissa0 == 0)
+    return 1;
+
+  return 0;
+}
+
+#ifdef HAVE_LONG_DOUBLE
+int isnan(long double d)
+{
+  return __isnanl(d);
+}
+
+int isinf(long double d)
+{
+  return __isinfl(d);
+}
+
+#else
+int isnan(double d)
+{
+  return __isnan(d);
+}
+
+int isinf(double d)
+{
+  return __isinf(d);
+}
+#endif /* HAVE_LONG_DOUBLE */