fixed config.h include
[libfirm] / ir / ir / irmode.c
index 40d02b8..d1591e3 100644 (file)
@@ -9,16 +9,18 @@
  * Copyright:   (c) 1998-2003 Universität Karlsruhe
  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
-
-
 #ifdef HAVE_CONFIG_H
-# include <config.h>
+# include "config.h"
 #endif
 
+#ifdef HAVE_STDLIB_H
 # include <stdlib.h>
-# include <stddef.h>
+#endif
+#ifdef HAVE_STRING_H
 # include <string.h>
-# include <stdbool.h>
+#endif
+
+# include <stddef.h>
 
 # include "irmode_t.h"
 # include "ident.h"
@@ -59,7 +61,6 @@ INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n)
   if (m->sort         == n->sort &&
       m->arithmetic   == n->arithmetic &&
       m->size         == n->size &&
-      m->align        == n->align &&
       m->sign         == n->sign  &&
       m->modulo_shift == n->modulo_shift &&
       m->vector_elem  == n->vector_elem)
@@ -235,8 +236,9 @@ void (set_modeP_mach)(ir_mode *p) {
 }
 
 /**
- * Registers a new mode if not defined yet, else returns
- * the "equivalent" one.
+ * Registers a new mode.
+ *
+ * @param new_mode  The new mode template.
  */
 static ir_mode *register_mode(const ir_mode* new_mode)
 {
@@ -249,7 +251,7 @@ static ir_mode *register_mode(const ir_mode* new_mode)
   mode = (ir_mode*)obstack_copy(&modes, new_mode, sizeof(ir_mode));
 
   mode->kind = k_ir_mode;
-  if(num_modes>=irm_max) mode->code = num_modes;
+  if (num_modes >= irm_max) mode->code = num_modes;
   num_modes++;
 
   set_mode_values(mode);
@@ -260,7 +262,7 @@ static ir_mode *register_mode(const ir_mode* new_mode)
 /*
  * Creates a new mode.
  */
-ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign,
+ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int sign,
                     mode_arithmetic arithmetic, unsigned int modulo_shift )
 {
   ir_mode mode_tmpl;
@@ -269,7 +271,6 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
   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.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
   mode_tmpl.vector_elem  = 1;
@@ -305,7 +306,7 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
 /*
  * Creates a new vector mode.
  */
-ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsigned num_of_elem, int align, int sign,
+ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsigned num_of_elem, int sign,
                     mode_arithmetic arithmetic, unsigned int modulo_shift )
 {
   ir_mode mode_tmpl;
@@ -314,7 +315,6 @@ ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsi
   mode_tmpl.name         = new_id_from_str(name);
   mode_tmpl.sort         = sort;
   mode_tmpl.size         = bit_size * num_of_elem;
-  mode_tmpl.align        = align;
   mode_tmpl.sign         = sign ? 1 : 0;
   mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
   mode_tmpl.vector_elem  = num_of_elem;
@@ -398,13 +398,6 @@ int
   return __get_mode_size_bytes(mode);
 }
 
-int
-(get_mode_align)(const ir_mode *mode)
-{
-  ANNOUNCE();
-  return __get_mode_align(mode);
-}
-
 int
 (get_mode_sign)(const ir_mode *mode)
 {
@@ -430,7 +423,7 @@ unsigned int
 }
 
 unsigned int
-(get_mode_vector_elems)(const ir_mode *mode) {
+(get_mode_n_vector_elems)(const ir_mode *mode) {
   return __get_mode_vector_elems(mode);
 }
 
@@ -515,7 +508,6 @@ get_mode_NAN(ir_mode *mode)
 
 int
 is_mode (void *thing) {
-  assert(thing);
   if (get_kind(thing) == k_ir_mode)
     return 1;
   else
@@ -670,7 +662,7 @@ smaller_mode(const ir_mode *sm, const ir_mode *lm)
   return 0;
 }
 
-/* ** initialization ** */
+/* initialization, build the default modes */
 void
 init_mode (void)
 {
@@ -686,7 +678,6 @@ init_mode (void)
   /* Internal Modes */
   newmode.arithmetic   = irma_none;
   newmode.size         = 0;
-  newmode.align        = 0;
   newmode.sign         = 0;
   newmode.modulo_shift = 0;
   newmode.vector_elem  = 0;
@@ -697,13 +688,13 @@ init_mode (void)
   newmode.sort    = irms_control_flow;
 
   /* Basic Block */
-  newmode.name    = id_from_str("BB", 2);
+  newmode.name    = new_id_from_chars("BB", 2);
   newmode.code    = irm_BB;
 
   mode_BB = register_mode(&newmode);
 
 /* eXecution */
-  newmode.name    = id_from_str("X", 1);
+  newmode.name    = new_id_from_chars("X", 1);
   newmode.code    = irm_X;
 
   mode_X = register_mode(&newmode);
@@ -712,7 +703,7 @@ init_mode (void)
   newmode.sort    = irms_memory;
 
   /* Memory */
-  newmode.name    = id_from_str("M", 1);
+  newmode.name    = new_id_from_chars("M", 1);
   newmode.code    = irm_M;
 
   mode_M = register_mode(&newmode);
@@ -721,19 +712,19 @@ init_mode (void)
   newmode.sort    = irms_auxiliary,
 
   /* Tuple */
-  newmode.name    = id_from_str("T", 1);
+  newmode.name    = new_id_from_chars("T", 1);
   newmode.code    = irm_T;
 
   mode_T = register_mode(&newmode);
 
   /* ANY */
-  newmode.name    = id_from_str("ANY", 3);
+  newmode.name    = new_id_from_chars("ANY", 3);
   newmode.code    = irm_ANY;
 
   mode_ANY = register_mode(&newmode);
 
   /* BAD */
-  newmode.name    = id_from_str("BAD", 3);
+  newmode.name    = new_id_from_chars("BAD", 3);
   newmode.code    = irm_BAD;
 
   mode_BAD = register_mode(&newmode);
@@ -742,7 +733,7 @@ init_mode (void)
   newmode.sort    = irms_internal_boolean;
 
   /* boolean */
-  newmode.name    = id_from_str("b", 1);
+  newmode.name    = new_id_from_chars("b", 1);
   newmode.code    = irm_b;
 
   mode_b = register_mode(&newmode);
@@ -751,141 +742,128 @@ init_mode (void)
   newmode.vector_elem = 1;
 
   /* Float Number Modes */
-  newmode.sort    = irms_float_number;
+  newmode.sort       = irms_float_number;
   newmode.arithmetic = irma_ieee754;
 
   /* float */
-  newmode.name    = id_from_str("F", 1);
+  newmode.name    = new_id_from_chars("F", 1);
   newmode.code    = irm_F;
   newmode.sign    = 1;
-  newmode.align   = 4;
   newmode.size    = 32;
 
   mode_F = register_mode(&newmode);
 
   /* double */
-  newmode.name    = id_from_str("D", 1);
+  newmode.name    = new_id_from_chars("D", 1);
   newmode.code    = irm_D;
   newmode.sign    = 1;
-  newmode.align   = 4;
   newmode.size    = 64;
 
   mode_D = register_mode(&newmode);
 
   /* extended */
-  newmode.name    = id_from_str("E", 1);
+  newmode.name    = new_id_from_chars("E", 1);
   newmode.code    = irm_E;
   newmode.sign    = 1;
-  newmode.align   = 4;
   newmode.size    = 80;
 
   mode_E = register_mode(&newmode);
 
   /* Integer Number Modes */
-  newmode.sort    = irms_int_number;
-  newmode.arithmetic = irma_twos_complement;
+  newmode.sort         = irms_int_number;
+  newmode.arithmetic   = irma_twos_complement;
 
   /* signed byte */
-  newmode.name    = id_from_str("Bs", 2);
-  newmode.code    = irm_Bs;
-  newmode.sign    = 1;
-  newmode.align   = 1;
-  newmode.size    = 8;
+  newmode.name         = new_id_from_chars("Bs", 2);
+  newmode.code         = irm_Bs;
+  newmode.sign         = 1;
+  newmode.size         = 8;
   newmode.modulo_shift = 32;
 
   mode_Bs = register_mode(&newmode);
 
   /* unsigned byte */
-  newmode.name    = id_from_str("Bu", 2);
-  newmode.code    = irm_Bu;
-  newmode.arithmetic = irma_twos_complement;
-  newmode.sign    = 0;
-  newmode.align   = 1;
-  newmode.size    = 8;
+  newmode.name         = new_id_from_chars("Bu", 2);
+  newmode.code         = irm_Bu;
+  newmode.arithmetic   = irma_twos_complement;
+  newmode.sign         = 0;
+  newmode.size         = 8;
   newmode.modulo_shift = 32;
 
   mode_Bu = register_mode(&newmode);
 
   /* signed short integer */
-  newmode.name    = id_from_str("Hs", 2);
-  newmode.code    = irm_Hs;
-  newmode.sign    = 1;
-  newmode.align   = 2;
-  newmode.size    = 16;
+  newmode.name         = new_id_from_chars("Hs", 2);
+  newmode.code         = irm_Hs;
+  newmode.sign         = 1;
+  newmode.size         = 16;
   newmode.modulo_shift = 32;
 
   mode_Hs = register_mode(&newmode);
 
   /* unsigned short integer */
-  newmode.name    = id_from_str("Hu", 2);
-  newmode.code    = irm_Hu;
-  newmode.sign    = 0;
-  newmode.align   = 2;
-  newmode.size    = 16;
+  newmode.name         = new_id_from_chars("Hu", 2);
+  newmode.code         = irm_Hu;
+  newmode.sign         = 0;
+  newmode.size         = 16;
   newmode.modulo_shift = 32;
 
   mode_Hu = register_mode(&newmode);
 
   /* signed integer */
-  newmode.name    = id_from_str("Is", 2);
-  newmode.code    = irm_Is;
-  newmode.sign    = 1;
-  newmode.align   = 4;
-  newmode.size    = 32;
+  newmode.name         = new_id_from_chars("Is", 2);
+  newmode.code         = irm_Is;
+  newmode.sign         = 1;
+  newmode.size         = 32;
   newmode.modulo_shift = 32;
 
   mode_Is = register_mode(&newmode);
 
   /* unsigned integer */
-  newmode.name    = id_from_str("Iu", 2);
-  newmode.code    = irm_Iu;
-  newmode.sign    = 0;
-  newmode.align   = 4;
-  newmode.size    = 32;
+  newmode.name         = new_id_from_chars("Iu", 2);
+  newmode.code         = irm_Iu;
+  newmode.sign         = 0;
+  newmode.size         = 32;
   newmode.modulo_shift = 32;
 
   mode_Iu = register_mode(&newmode);
 
   /* signed long integer */
-  newmode.name    = id_from_str("Ls", 2);
-  newmode.code    = irm_Ls;
-  newmode.sign    = 1;
-  newmode.align   = 4;
-  newmode.size    = 64;
+  newmode.name         = new_id_from_chars("Ls", 2);
+  newmode.code         = irm_Ls;
+  newmode.sign         = 1;
+  newmode.size         = 64;
   newmode.modulo_shift = 64;
 
   mode_Ls = register_mode(&newmode);
 
   /* unsigned long integer */
-  newmode.name    = id_from_str("Lu", 2);
-  newmode.code    = irm_Lu;
-  newmode.sign    = 0;
-  newmode.align   = 4;
-  newmode.size    = 64;
+  newmode.name         = new_id_from_chars("Lu", 2);
+  newmode.code         = irm_Lu;
+  newmode.sign         = 0;
+  newmode.size         = 64;
   newmode.modulo_shift = 64;
 
   mode_Lu = register_mode(&newmode);
 
   /* Character Modes */
-  newmode.sort    = irms_character;
-  newmode.arithmetic = irma_none;
+  newmode.sort         = irms_character;
+  newmode.arithmetic   = irma_none;
 
   /* Character */
-  newmode.name    = id_from_str("C", 1);
-  newmode.code    = irm_C;
-  newmode.sign    = 0;
-  newmode.align   = 1;
-  newmode.size    = 8;
+  newmode.name         = new_id_from_chars("C", 1);
+  newmode.code         = irm_C;
+  newmode.sign         = 0;
+  newmode.size         = 8;
   newmode.modulo_shift = 32;
 
   mode_C = register_mode(&newmode);
 
   /* Unicode character */
-  newmode.name    = id_from_str("U", 1);
-  newmode.code    = irm_U;
-  newmode.sign    = 0;
-  newmode.align   = 2;
-  newmode.size    = 16;
+  newmode.name         = new_id_from_chars("U", 1);
+  newmode.code         = irm_U;
+  newmode.sign         = 0;
+  newmode.size         = 16;
   newmode.modulo_shift = 32;
 
   mode_U = register_mode(&newmode);
@@ -895,11 +873,10 @@ init_mode (void)
   newmode.arithmetic = irma_twos_complement;
 
   /* pointer */
-  newmode.name    = id_from_str("P", 1);
-  newmode.code    = irm_P;
-  newmode.sign    = 0;
-  newmode.align   = 4;
-  newmode.size    = 32;
+  newmode.name         = new_id_from_chars("P", 1);
+  newmode.code         = irm_P;
+  newmode.sign         = 0;
+  newmode.size         = 32;
   newmode.modulo_shift = 0;
 
   mode_P = register_mode(&newmode);
@@ -908,6 +885,33 @@ init_mode (void)
   mode_P_mach = mode_P;
 }
 
+/* find a signed mode for an unsigned integer mode */
+ir_mode *find_unsigned_mode(const ir_mode *mode) {
+  ir_mode n = *mode;
+
+  if (mode->sort != irms_int_number);
+  n.sign = 0;
+  return find_mode(&n);
+}
+
+/* find an unsigned mode for a signed integer mode */
+ir_mode *find_signed_mode(const ir_mode *mode) {
+  ir_mode n = *mode;
+
+  assert(mode->sort == irms_int_number);
+  n.sign = 1;
+  return find_mode(&n);
+}
+
+/* finds a integer mode with 2*n bits for an integer mode with n bits. */
+ir_mode *find_double_bits_int_mode(const ir_mode *mode) {
+  ir_mode n = *mode;
+
+  assert(mode->sort == irms_int_number && mode->arithmetic == irma_twos_complement);
+
+  n.size = 2*mode->size;
+  return find_mode(&n);
+}
 
 void finish_mode(void) {
   obstack_free(&modes, 0);