}
/**
- * 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)
{
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);
/*
* 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;
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;
/*
* 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;
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;
}
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
return 0;
}
-/* ** initialization ** */
+/* initialization, build the default modes */
void
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);
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);
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);
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);
* @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.
* 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.
* @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.
* @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 );
/**
* @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 *********** */
/** 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
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);