Changed behaviour of new_ir_mode to accept all predefined modes.
[libfirm] / ir / ir / irmode.c
index af65955..605607c 100644 (file)
@@ -226,6 +226,21 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
   ir_mode mode_tmpl;
   ir_mode *mode;
 
+  mode_tmpl.name        = new_id_from_str(name);
+  mode_tmpl.sort        = sort;
+  mode_tmpl.size        = bit_size;
+  mode_tmpl.align       = align;
+  mode_tmpl.sign        = sign ? 1 : 0;
+  mode_tmpl.arithmetic  = arithmetic;
+  mode_tmpl.link        = NULL;
+  mode_tmpl.tv_priv     = NULL;
+
+  mode = find_mode(&mode_tmpl);
+  if (mode)
+  {
+    return mode;
+  }
+
   /* sanity checks */
   switch (sort)
   {
@@ -235,37 +250,17 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
     case irms_internal_boolean:
       assert(0 && "internal modes cannot be user defined");
       return NULL;
-      break;
 
     case irms_float_number:
       assert(0 && "not yet implemented");
       return NULL;
-      break;
 
     case irms_int_number:
     case irms_reference:
     case irms_character:
-      break;
-  }
-  mode_tmpl.name        = new_id_from_str(name);
-  mode_tmpl.sort        = sort;
-  mode_tmpl.size        = bit_size;
-  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 */
-  mode = find_mode(&mode_tmpl);
-  if (mode)
-  {
-    return mode;
-  }
-  else
-  {
-    return register_mode(&mode_tmpl);
+      return register_mode(&mode_tmpl);
   }
+  return NULL; /* to shut up gcc */
 }
 
 /* Functions for the direct access to all attributes od a ir_mode */