Alignment of modes is now specifyed in bits
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 29 Jun 2004 09:12:48 +0000 (09:12 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 29 Jun 2004 09:12:48 +0000 (09:12 +0000)
[r3229]

ir/ir/irmode.c
ir/ir/irmode.h
ir/ir/irmode_t.h

index 40d02b8..78bfd3d 100644 (file)
@@ -235,8 +235,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 +250,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 +261,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 bit_align, int sign,
                     mode_arithmetic arithmetic, unsigned int modulo_shift )
 {
   ir_mode mode_tmpl;
@@ -269,7 +270,7 @@ 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.align        = bit_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 bit_align, int sign,
                     mode_arithmetic arithmetic, unsigned int modulo_shift )
 {
   ir_mode mode_tmpl;
@@ -314,7 +315,7 @@ 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.align        = bit_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;
@@ -399,10 +400,17 @@ int
 }
 
 int
-(get_mode_align)(const ir_mode *mode)
+(get_mode_align_bits)(const ir_mode *mode)
 {
   ANNOUNCE();
-  return __get_mode_align(mode);
+  return __get_mode_align_bits(mode);
+}
+
+int
+(get_mode_align_bytes)(const ir_mode *mode)
+{
+  ANNOUNCE();
+  return __get_mode_align_bytes(mode);
 }
 
 int
@@ -670,7 +678,7 @@ smaller_mode(const ir_mode *sm, const ir_mode *lm)
   return 0;
 }
 
-/* ** initialization ** */
+/* initialization, build the default modes */
 void
 init_mode (void)
 {
@@ -751,14 +759,14 @@ 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.code    = irm_F;
   newmode.sign    = 1;
-  newmode.align   = 4;
+  newmode.align   = 32;
   newmode.size    = 32;
 
   mode_F = register_mode(&newmode);
@@ -767,7 +775,7 @@ init_mode (void)
   newmode.name    = id_from_str("D", 1);
   newmode.code    = irm_D;
   newmode.sign    = 1;
-  newmode.align   = 4;
+  newmode.align   = 64;
   newmode.size    = 64;
 
   mode_D = register_mode(&newmode);
@@ -776,116 +784,116 @@ init_mode (void)
   newmode.name    = id_from_str("E", 1);
   newmode.code    = irm_E;
   newmode.sign    = 1;
-  newmode.align   = 4;
+  newmode.align   = 128;
   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         = id_from_str("Bs", 2);
+  newmode.code         = irm_Bs;
+  newmode.sign         = 1;
+  newmode.align        = 8;
+  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         = id_from_str("Bu", 2);
+  newmode.code         = irm_Bu;
+  newmode.arithmetic   = irma_twos_complement;
+  newmode.sign         = 0;
+  newmode.align        = 8;
+  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         = id_from_str("Hs", 2);
+  newmode.code         = irm_Hs;
+  newmode.sign         = 1;
+  newmode.align        = 16;
+  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         = id_from_str("Hu", 2);
+  newmode.code         = irm_Hu;
+  newmode.sign         = 0;
+  newmode.align        = 16;
+  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         = id_from_str("Is", 2);
+  newmode.code         = irm_Is;
+  newmode.sign         = 1;
+  newmode.align        = 32;
+  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         = id_from_str("Iu", 2);
+  newmode.code         = irm_Iu;
+  newmode.sign         = 0;
+  newmode.align        = 32;
+  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         = id_from_str("Ls", 2);
+  newmode.code         = irm_Ls;
+  newmode.sign         = 1;
+  newmode.align        = 32;
+  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         = id_from_str("Lu", 2);
+  newmode.code         = irm_Lu;
+  newmode.sign         = 0;
+  newmode.align        = 32;
+  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         = id_from_str("C", 1);
+  newmode.code         = irm_C;
+  newmode.sign         = 0;
+  newmode.align        = 8;
+  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         = id_from_str("U", 1);
+  newmode.code         = irm_U;
+  newmode.sign         = 0;
+  newmode.align        = 16;
+  newmode.size         = 16;
   newmode.modulo_shift = 32;
 
   mode_U = register_mode(&newmode);
@@ -895,11 +903,11 @@ 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         = id_from_str("P", 1);
+  newmode.code         = irm_P;
+  newmode.sign         = 0;
+  newmode.align        = 32;
+  newmode.size         = 32;
   newmode.modulo_shift = 0;
 
   mode_P = register_mode(&newmode);
index 0a24a05..a022be8 100644 (file)
@@ -140,7 +140,7 @@ typedef enum {
  * @param name         the name of the mode to be created
  * @param sort         the mode_sort of the mode to be created
  * @param bit_size     number of bits this mode allocate
- * @param align                the byte alignment for an entity of this mode (in bits)
+ * @param bit_align    the alignment for an entity of this mode in bits
  * @param sign         non-zero if this is a signed mode
  * @param arithmetic    arithmetic operations possible with a mode
  * @param modulo_shift  Is ignored for modes other than integer.
@@ -159,7 +159,7 @@ typedef enum {
  *     It is allowed to construct the default modes. So, a call
  *     new_ir_mode("Is", irms_int_number, 32, 4, 1, irma_twos_complement, 32) will return mode_Is.
  */
-ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic, unsigned int modulo_shift);
+ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int bit_align, int sign, mode_arithmetic arithmetic, unsigned int modulo_shift);
 
 /**
  * Creates a new vector mode.
@@ -168,7 +168,7 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
  * @param sort         the mode_sort of the mode to be created
  * @param bit_size     number of bits for one element of this mode
  * @param num_of_elem   number of elements in this vector mode
- * @param align                the byte alignment for an entity of this mode (in bits)
+ * @param bit_align    the alignment for an entity of this mode in bits
  * @param sign         non-zero if this is a signed mode
  * @param arithmetic    arithmetic operations possible with a mode
  * @param modulo_shift  Is ignored for modes other than integer.
@@ -182,7 +182,7 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
  * @return
  *     The new mode or NULL on error.
  */
-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 bit_align, int sign,
                     mode_arithmetic arithmetic, unsigned int modulo_shift );
 
 /**
@@ -193,7 +193,7 @@ ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsi
  *   @return
  *       true if the thing is a mode, else false
  */
-int is_mode (void *thing);
+int is_mode(void *thing);
 
 /* ********** Access methods to read mode information *********** */
 
@@ -212,20 +212,24 @@ mode_sort get_mode_sort(const ir_mode *mode);
 /** Returns the size of values of the mode in bits. */
 int get_mode_size_bits(const ir_mode *mode);
 
-/** Returns the size of values of the mode in bytes.  If the size is not
   dividable by 8 returns -1. */
+/** Returns the size of values of the mode in bytes.
*  If the size is not dividable by 8 returns -1. */
 int get_mode_size_bytes(const ir_mode *mode);
 
-/** Returns the alignment of values of the mode in bytes. */
-int get_mode_align(const ir_mode *mode);
+/** Returns the alignment of values of the mode in bits. */
+int get_mode_align_bits(const ir_mode *mode);
+
+/** Returns the alignment of values of the mode in bytes.
+ *  If the alignment is not dividable by 8 returns -1. */
+int get_mode_align_bytes(const ir_mode *mode);
 
 /** Returns the signess of a mode.
  *
  * Returns the signess of a mode: 1 if mode is signed. */
-int get_mode_sign (const ir_mode *mode);
+int get_mode_sign(const ir_mode *mode);
 
 /** Returns the arithmetic of a mode */
-int get_mode_arithmetic (const ir_mode *mode);
+int get_mode_arithmetic(const ir_mode *mode);
 
 /** Attribute modulo shift specifies for modes of kind irms_int_number
  *  whether shift applies modulo to value of bits to shift.  Zero for
@@ -418,7 +422,7 @@ int mode_is_int_vector (const ir_mode *mode);
 int smaller_mode(const ir_mode *sm, const ir_mode *lm);
 
 /** mode module initialization, call once before use of any other function **/
-void init_mode (void);
+void init_mode(void);
 
 /** mode module finalization. frees all memory.  */
 void finish_mode(void);
index bbbf74d..b259a84 100644 (file)
@@ -34,7 +34,7 @@ struct ir_mode {
                                      (see irmode.h) */
   mode_arithmetic   arithmetic;    /**< different arithmetic operations possible with a mode */
   int               size;          /**< size of the mode in Bits. */
-  int               align;         /**< byte alignment */
+  int               align;         /**< mode alignment in Bits. */
   unsigned          sign:1;        /**< signedness of this mode */
   unsigned int      modulo_shift;  /**< number of bits a valus of this mode will be shifted */
   unsigned          vector_elem;   /**< if this is not equal 1, this is a vector mode with
@@ -84,7 +84,14 @@ __get_mode_size_bytes(const ir_mode *mode) {
 }
 
 static INLINE int
-__get_mode_align(const ir_mode *mode) { return mode->align; }
+__get_mode_align_bits(const ir_mode *mode) { return mode->align; }
+
+static INLINE int
+__get_mode_align_bytes(const ir_mode *mode) {
+  int align = __get_mode_align_bits(mode);
+  if ((align & 7) != 0) return -1;
+  return align >> 3;
+}
 
 static INLINE int
 __get_mode_sign(const ir_mode *mode) { return mode->sign; }