some fixes for xml dumper / still buggy.
[libfirm] / ir / ir / irmode.c
index de777e0..af65955 100644 (file)
@@ -48,10 +48,10 @@ static int num_modes;
  *
  * TODO: Add other fields
  **/
-inline static int modes_are_equal(const ir_mode *m, const ir_mode *n)
+INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n)
 {
   if (m == n) return 1;
-  if(!bcmp( m + offsetof(ir_mode,sort) , n + offsetof(ir_mode,sort), offsetof(ir_mode,min)-offsetof(ir_mode,min))) return 1;
+  if (0 == memcmp(&m->sort, &n->sort, offsetof(ir_mode,min) - offsetof(ir_mode,sort))) return 1;
 
   return 0;
 }
@@ -88,11 +88,42 @@ static ir_mode *find_mode(const ir_mode *m)
  */
 static void set_mode_values(ir_mode* mode)
 {
-  mode->min = get_tarval_min(mode);
-  mode->max= get_tarval_max(mode);
-  mode->null= get_tarval_null(mode);
-  mode->one= get_tarval_one(mode);
+  switch (get_mode_sort(mode))
+  {
+    case irms_int_number:
+    case irms_float_number:
+      mode->min = get_tarval_min(mode);
+      mode->max = get_tarval_max(mode);
+      mode->null = get_tarval_null(mode);
+      mode->one = get_tarval_one(mode);
+      break;
+
+    case irms_internal_boolean:
+      mode->min = tarval_b_false;
+      mode->max = tarval_b_true;
+      mode->null = tarval_b_false;
+      mode->one = tarval_b_true;
+      break;
+
+    case irms_reference:
+      mode->min = tarval_bad;
+      mode->max = tarval_bad;
+      mode->null = (get_mode_modecode(mode)==irm_P)?tarval_P_void:tarval_bad;
+      mode->one = tarval_bad;
+      break;
+
+    case irms_character:
+    case irms_auxiliary:
+    case irms_memory:
+    case irms_control_flow:
+      mode->min = tarval_bad;
+      mode->max = tarval_bad;
+      mode->null = tarval_bad;
+      mode->one = tarval_bad;
+      break;
+  }
 }
+
 /* * *
  * globals defined in irmode.h
  * * */
@@ -126,6 +157,9 @@ ir_mode *mode_U;
 ir_mode *mode_b;
 ir_mode *mode_P;
 
+/* machine specific modes */
+ir_mode *mode_P_mach;  /* machine specific pointer mode */
+
 /* * *
  * functions defined in irmode.h
  * * */
@@ -153,6 +187,14 @@ INLINE ir_mode *get_modeBB(void) { ANNOUNCE(); return mode_BB; }
 INLINE ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; }
 INLINE ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; }
 
+
+ir_mode *get_modeP_mach(void)  { ANNOUNCE(); return mode_P_mach; }
+void     set_modeP_mach(ir_mode *p) {
+  ANNOUNCE();
+  assert(mode_is_reference(p));
+  mode_P_mach = p;
+ }
+
 /**
  * Registers a new mode if not defined yet, else returns
  * the "equivalent" one.
@@ -164,8 +206,6 @@ static ir_mode *register_mode(const ir_mode* new_mode)
   ANNOUNCE();
   assert(new_mode);
 
-
-
   /* copy mode struct to modes array */
   mode=(ir_mode*) obstack_copy(&modes, new_mode, sizeof(ir_mode));
 
@@ -173,7 +213,7 @@ static ir_mode *register_mode(const ir_mode* new_mode)
   if(num_modes>=irm_max) mode->code = num_modes;
   num_modes++;
 
-  if(mode->sort==irms_int_number || mode->sort==irms_float_number || mode->sort==irms_character) set_mode_values(mode);
+  set_mode_values(mode);
 
   return mode;
 }
@@ -213,6 +253,7 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
   mode_tmpl.align       = align;
   mode_tmpl.sign        = sign ? 1 : 0;
   mode_tmpl.arithmetic  = arithmetic;
+  mode_tmpl.link        = NULL;
   mode_tmpl.tv_priv     = NULL;
 
   /* first check if there already is a matching mode */
@@ -419,6 +460,7 @@ is_mode (void *thing) {
 #  undef mode_is_float
 #  undef mode_is_int
 #  undef mode_is_num
+#  undef mode_is_numP
 #  undef mode_is_data
 #  undef mode_is_datab
 #  undef mode_is_dataM
@@ -469,6 +511,14 @@ mode_is_num (const ir_mode *mode)
   return (mode_is_int(mode) || mode_is_float(mode));
 }
 
+int
+mode_is_numP (const ir_mode *mode)
+{
+  ANNOUNCE();
+  assert(mode);
+  return (mode_is_int(mode) || mode_is_float(mode) || mode_is_reference(mode));
+}
+
 int
 mode_is_data (const ir_mode *mode)
 {
@@ -585,6 +635,7 @@ init_mode (void)
   newmode.size    = 0;
   newmode.align   = 0;
   newmode.sign    = 0;
+  newmode.link    = NULL;
   newmode.tv_priv = NULL;
 
   /* Control Flow Modes*/
@@ -751,7 +802,7 @@ init_mode (void)
 
   mode_Lu = register_mode(&newmode);
 
-  /* Integer Number Modes */
+  /* Character Modes */
   newmode.sort    = irms_character;
   newmode.arithmetic = irma_none;
 
@@ -785,4 +836,7 @@ init_mode (void)
   newmode.size    = 32;
 
   mode_P = register_mode(&newmode);
+
+  /* set the machine specific modes to the predifined ones */
+  mode_P_mach = mode_P;
 }