irop_flag_highlevel flag added to Confirm and Cast
[libfirm] / ir / tv / tv.c
index cb6f12f..dbbbe13 100644 (file)
@@ -28,7 +28,9 @@
 
 #include <assert.h>         /* assertions */
 #include <stdlib.h>         /* atoi() */
-#include <string.h>         /* nice things for strings */
+#ifdef HAVE_STRING_H
+# include <string.h>         /* nice things for strings */
+#endif
 #ifdef HAVE_STRINGS_H
 #include <strings.h>        /* strings.h also includes bsd only function strcasecmp */
 #endif
@@ -46,7 +48,6 @@
 #include "entity_t.h"       /* needed to store pointers to entities */
 #include "irmode_t.h"
 #include "irnode.h"         /* defines boolean return values (pnc_number)*/
-#include "host.h"
 #include "strcalc.h"
 #include "fltcalc.h"
 
@@ -643,7 +644,7 @@ tarval *get_tarval_nan(ir_mode *mode)
   }
 }
 
-tarval *get_tarval_inf(ir_mode *mode)
+tarval *get_tarval_plus_inf(ir_mode *mode)
 {
   ANNOUNCE();
   assert(mode);
@@ -674,6 +675,37 @@ tarval *get_tarval_inf(ir_mode *mode)
   }
 }
 
+tarval *get_tarval_minus_inf(ir_mode *mode)
+{
+  ANNOUNCE();
+  assert(mode);
+
+  if (get_mode_n_vector_elems(mode) > 1) {
+    /* vector arithmetic not implemented yet */
+    return tarval_bad;
+  }
+
+  if (get_mode_sort(mode) == irms_float_number) {
+    switch(get_mode_size_bits(mode))
+    {
+    case 32:
+      fc_get_minusinf(8, 23, NULL);
+      break;
+    case 64:
+      fc_get_minusinf(11, 52, NULL);
+      break;
+    case 80:
+      fc_get_minusinf(15, 64, NULL);
+      break;
+    }
+    return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+  }
+  else {
+    assert(0 && "tarval is not floating point");
+    return tarval_bad;
+  }
+}
+
 /*
  * Arithmethic operations on tarvals ========================================
  */
@@ -731,16 +763,16 @@ int tarval_is_one(tarval *a)
 /*
  * comparison
  */
-pnc_number tarval_cmp(tarval *a, tarval *b)
+pn_Cmp tarval_cmp(tarval *a, tarval *b)
 {
   ANNOUNCE();
   assert(a);
   assert(b);
 
   if (a == tarval_bad || b == tarval_bad) assert(0 && "Comparison with tarval_bad");
-  if (a == tarval_undefined || b == tarval_undefined) return False;
-  if (a == b) return Eq;
-  if (a->mode != b->mode) return False;
+  if (a == tarval_undefined || b == tarval_undefined) return pn_Cmp_False;
+  if (a == b) return pn_Cmp_Eq;
+  if (a->mode != b->mode) return pn_Cmp_False;
 
   if (get_mode_n_vector_elems(a->mode) > 1) {
     /* vector arithmetic not implemented yet */
@@ -754,24 +786,24 @@ pnc_number tarval_cmp(tarval *a, tarval *b)
     case irms_memory:
     case irms_auxiliary:
     case irms_reference:
-      return False;
+      return pn_Cmp_False;
 
     case irms_float_number:
       switch (fc_comp(a->value, b->value)) {
-        case -1: return Lt;
-        case  0: assert(0 && "different tarvals compare equal"); return Eq;
-        case  1: return Gt;
-        case  2: return Uo;
-        default: return False;
+        case -1: return pn_Cmp_Lt;
+        case  0: assert(0 && "different tarvals compare equal"); return pn_Cmp_Eq;
+        case  1: return pn_Cmp_Gt;
+        case  2: return pn_Cmp_Uo;
+        default: return pn_Cmp_False;
       }
     case irms_int_number:
     case irms_character:
-      return (sc_comp(a->value, b->value)==1)?(Gt):(Lt);
+      return sc_comp(a->value, b->value) == 1 ? pn_Cmp_Gt : pn_Cmp_Lt;
 
     case irms_internal_boolean:
-      return (a == tarval_b_true)?(Gt):(Lt);
+      return a == tarval_b_true ? pn_Cmp_Gt : pn_Cmp_Lt;
   }
-  return False;
+  return pn_Cmp_False;
 }
 
 /*