# include "array.h"
#if 0
+static long long count = 0;
# define ANNOUNCE() printf(__FILE__": call no. %lld (%s)\n", count++, __FUNCTION__)
#else
# define ANNOUNCE() ((void)0)
* local values
* * */
-static long long count = 0;
-/* dynamic array to hold all modes */
+/** dynamic array to hold all modes */
static ir_mode * modes;
/* dynamic arrays to hold special modes' values */
static tarval** modes_min;
static tarval** modes_null;
static tarval** modes_one;
-/* number of defined modes */
+/** number of defined modes */
static int num_modes;
/* * *
* local functions
* * */
-/* compare modes that don't need to have their code field
- * correctly set */
+/**
+ * Compare modes that don't need to have their code field
+ * correctly set
+ */
static int modes_are_equal(ir_mode *m, ir_mode *n)
{
if (m == n) return 1;
if ( (m->sort == n->sort) && (m->size == n->size) &&
- (m->align == n->align) && (m->sign == n->sign) &&
- (m->name == n->name) )
+ (m->align == n->align) && (m->sign == n->sign)
+ )
return 1;
return 0;
}
-/* searches the modes array for the given mode and returns
+/**
+ * searches the modes array for the given mode and returns
* a pointer on an equal mode already in the array, NULL if
- * none found */
+ * none found
+ */
static ir_mode *find_mode(ir_mode *m)
{
int i;
return NULL;
}
-/* sets special values of modes */
+/**
+ * sets special values of modes
+ */
static void set_mode_values(ir_mode* mode)
{
modes_min[get_mode_modecode(mode)] = get_tarval_min(mode);
* globals defined in irmode.h
* * */
-/** Predefined modes **/
+/* --- Predefined modes --- */
/* FIRM internal modes: */
ir_mode *mode_T;
INLINE ir_mode *get_modeM() { ANNOUNCE(); return mode_M; }
INLINE ir_mode *get_modeBB() { ANNOUNCE(); return mode_BB; }
-/* ** Constructor ** */
-ir_mode *
-register_mode(ir_mode* new_mode)
+/**
+ * Registers a new mode if not defined yet, else returns
+ * the "equivalent" one.
+ */
+static ir_mode *register_mode(ir_mode* new_mode)
{
ir_mode *mode;
/* sanity checks */
switch (new_mode->sort)
{
- case auxiliary:
- case internal_boolean:
+ case irms_auxiliary:
+ case irms_internal_boolean:
assert(0 && "internal modes cannot be user defined");
+ return NULL;
break;
- case float_number:
+ case irms_float_number:
assert(0 && "not yet implemented");
+ return NULL;
break;
- case int_number:
- case reference:
- case character:
+ case irms_int_number:
+ case irms_reference:
+ case irms_character:
break;
default:
- assert(0);
+ assert(0 && "wrong mode sort");
+ return NULL;
}
/* copy mode struct to modes array */
return 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 mode_tmpl, *res;
+
+ 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.tv_priv = NULL;
+
+ return register_mode(&mode_tmpl);
+}
+
/* Functions for the direct access to all attributes od a ir_mode */
-#ifdef MODE_ACCESS_DEFINES
-# undef get_mode_modecode
-# undef get_mode_ident
-# undef get_mode_name
-# undef get_mode_sort
-# undef get_mode_size
-# undef get_mode_align
-#endif
modecode
get_mode_modecode(ir_mode *mode)
{
return mode->sort;
}
-int
-get_mode_size(ir_mode *mode)
+INLINE int
+get_mode_size_bits(ir_mode *mode)
{
ANNOUNCE();
return mode->size;
}
+int get_mode_size_bytes(ir_mode *mode) {
+ ANNOUNCE();
+ int size = get_mode_size_bits(mode);
+ if ((size % 8) != 0) return -1;
+ return size / 8;
+}
+
int
get_mode_align (ir_mode *mode)
{
ANNOUNCE();
return mode->align;
}
-#ifdef MODE_ACCESS_DEFINES
-# define get_mode_modecode(mode) (mode)->code
-# define get_mode_ident(mode) (mode)->name
-# define get_mode_name(mode) id_to_str((mode)->name)
-# define get_mode_sort(mode) (mode)->sort
-# define get_mode_size(mode) (mode)->size
-# define get_mode_align(mode) (mode)->align
-#endif
+
int
get_mode_sign (ir_mode *mode)
{
{
ANNOUNCE();
assert(mode);
- return (get_mode_sort(mode) == float_number);
+ return (get_mode_sort(mode) == irms_float_number);
}
int
{
ANNOUNCE();
assert(mode);
- return (get_mode_sort(mode) == int_number);
+ return (get_mode_sort(mode) == irms_int_number);
}
int
{
ANNOUNCE();
assert(mode);
- return (mode_is_num(mode) || get_mode_sort(mode) == character || get_mode_sort(mode) == reference);
+ return (mode_is_num(mode) || get_mode_sort(mode) == irms_character || get_mode_sort(mode) == irms_reference);
}
int
{
ANNOUNCE();
assert(mode);
- return (mode_is_data(mode) || get_mode_sort(mode) == internal_boolean);
+ return (mode_is_data(mode) || get_mode_sort(mode) == irms_internal_boolean);
}
int
}
#ifdef MODE_ACCESS_DEFINES
# define mode_is_signed(mode) (mode)->sign
-# define mode_is_float(mode) ((mode)->sort == float_number)
-# define mode_is_int(mode) ((mode)->sort == int_number)
-# define mode_is_num(mode) (((mode)->sort == float_number) || ((mode)->sort == int_number))
-# define mode_is_data(mode) (((mode)->sort == float_number) || ((mode)->sort == int_number) || ((mode)->sort == character) || ((mode)->sort == reference))
-# define mode_is_datab(mode) (((mode)->sort == float_number) || ((mode)->sort == int_number) || ((mode)->sort == character) || ((mode)->sort == reference) || ((mode)->sort == internal_boolean))
-# define mode_is_dataM(mode) (((mode)->sort == float_number) || ((mode)->sort == int_number) || ((mode)->sort == character) || ((mode)->sort == reference) || ((mode)->code == irm_M))
+# define mode_is_float(mode) ((mode)->sort == irms_float_number)
+# define mode_is_int(mode) ((mode)->sort == irms_int_number)
+# define mode_is_num(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number))
+# define mode_is_data(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference))
+# define mode_is_datab(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference) || ((mode)->sort == irms_internal_boolean))
+# define mode_is_dataM(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference) || ((mode)->code == irm_M))
#endif
/* Returns true if sm can be converted to lm without loss. */
-bool
+int
smaller_mode(ir_mode *sm, ir_mode *lm)
{
ANNOUNCE();
switch(get_mode_sort(sm))
{
- case int_number:
+ case irms_int_number:
switch(get_mode_sort(lm))
{
- case int_number:
+ case irms_int_number:
/* integers are convertable if
* - both have the same sign and lm is the larger one
* - lm is the signed one and is at least two bits larger
*/
if (mode_is_signed(sm))
{
- if ( mode_is_signed(lm) && (get_mode_size(lm) > get_mode_size(sm)) )
+ if ( mode_is_signed(lm) && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
return 1;
}
else if (mode_is_signed(lm))
{
- if (get_mode_size(lm) > get_mode_size(sm) + 1)
+ if (get_mode_size_bits(lm) > get_mode_size_bits(sm) + 1)
return 1;
}
- else if (get_mode_size(lm) > get_mode_size(sm))
+ else if (get_mode_size_bits(lm) > get_mode_size_bits(sm))
{
return 1;
}
break;
- case float_number:
+ case irms_float_number:
/* int to float works if the float is large enough */
return 0;
}
break;
- case float_number:
+ case irms_float_number:
/* XXX currently only the three standard 32,64,80 bit floats
* are supported which can safely be converted */
- if ( (get_mode_sort(lm) == float_number)
- && (get_mode_size(lm) > get_mode_size(sm)) )
+ if ( (get_mode_sort(lm) == irms_float_number)
+ && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
return 1;
break;
- case reference:
+ case irms_reference:
/* do exist machines out there with different pointer lenghts ?*/
return 0;
return 0;
}
-/** ** initialization ** **/
+/* ** initialization ** */
void
init_mode (void)
{
ANNOUNCE();
/* init flexible array */
- modes = NEW_ARR_F(ir_mode, irm_max);
- modes_min = NEW_ARR_F(tarval*, irm_max);
- modes_max = NEW_ARR_F(tarval*, irm_max);
+ modes = NEW_ARR_F(ir_mode, irm_max);
+ modes_min = NEW_ARR_F(tarval*, irm_max);
+ modes_max = NEW_ARR_F(tarval*, irm_max);
modes_null = NEW_ARR_F(tarval*, irm_max);
- modes_one = NEW_ARR_F(tarval*, irm_max);
+ modes_one = NEW_ARR_F(tarval*, irm_max);
/* initialize predefined modes */
/* Basic Block */
mode_BB = &modes[irm_BB];
mode_BB->name = id_from_str("BB", 2);
mode_BB->code = irm_BB;
- mode_BB->sort = auxiliary;
+ mode_BB->sort = irms_auxiliary;
mode_BB->sign = 0;
+ mode_BB->tv_priv = NULL;
/* eXecution */
mode_X = &modes[irm_X];
mode_X->name = id_from_str("X", 1);
mode_X->code = irm_X;
- mode_X->sort = auxiliary;
+ mode_X->sort = irms_auxiliary;
mode_X->sign = 0;
+ mode_X->tv_priv = NULL;
/* Memory */
mode_M = &modes[irm_M];
mode_M->name = id_from_str("M", 1);
mode_M->code = irm_M;
- mode_M->sort = auxiliary;
+ mode_M->sort = irms_auxiliary;
mode_M->sign = 0;
+ mode_M->tv_priv = NULL;
/* Tuple */
mode_T = &modes[irm_T];
mode_T->name = id_from_str("T", 1);
mode_T->code = irm_T;
mode_T->sign = 0;
+ mode_T->tv_priv = NULL;
/* boolean */
mode_b = &modes[irm_b];
mode_b->name = id_from_str("b", 1);
mode_b->code = irm_b;
- mode_b->sort = internal_boolean;
+ mode_b->sort = irms_internal_boolean;
mode_b->sign = 0;
+ mode_b->tv_priv = NULL;
/* float */
mode_F = &modes[irm_F];
mode_F->name = id_from_str("F", 1);
mode_F->code = irm_F;
- mode_F->sort = float_number;
+ mode_F->sort = irms_float_number;
mode_F->sign = 1;
mode_F->align = 32;
mode_F->size = 32;
+ mode_F->tv_priv = NULL;
set_mode_values(mode_F);
mode_D = &modes[irm_D];
mode_D->name = id_from_str("D", 1);
mode_D->code = irm_D;
- mode_D->sort = float_number;
+ mode_D->sort = irms_float_number;
mode_D->sign = 1;
mode_D->align = 32;
mode_D->size = 64;
+ mode_D->tv_priv = NULL;
set_mode_values(mode_D);
mode_E = &modes[irm_E];
mode_E->name = id_from_str("E", 1);
mode_E->code = irm_E;
- mode_E->sort = float_number;
+ mode_E->sort = irms_float_number;
mode_E->sign = 1;
mode_E->align = 32;
mode_E->size = 80;
+ mode_E->tv_priv = NULL;
set_mode_values(mode_E);
mode_Bs = &modes[irm_Bs];
mode_Bs->name = id_from_str("Bs", 2);
mode_Bs->code = irm_Bs;
- mode_Bs->sort = int_number;
+ mode_Bs->sort = irms_int_number;
mode_Bs->sign = 1;
mode_Bs->align = 8;
mode_Bs->size = 8;
+ mode_Bs->tv_priv = NULL;
set_mode_values(mode_Bs);
mode_Bu = &modes[irm_Bu];
mode_Bu->name = id_from_str("Bu", 2);
mode_Bu->code = irm_Bu;
- mode_Bu->sort = int_number;
+ mode_Bu->sort = irms_int_number;
mode_Bu->sign = 0;
mode_Bu->align = 8;
mode_Bu->size = 8;
+ mode_Bu->tv_priv = NULL;
set_mode_values(mode_Bu);
mode_Hs = &modes[irm_Hs];
mode_Hs->name = id_from_str("Hs", 2);
mode_Hs->code = irm_Hs;
- mode_Hs->sort = int_number;
+ mode_Hs->sort = irms_int_number;
mode_Hs->sign = 1;
mode_Hs->align = 16;
mode_Hs->size = 16;
+ mode_Hs->tv_priv = NULL;
set_mode_values(mode_Hs);
mode_Hu = &modes[irm_Hu];
mode_Hu->name = id_from_str("Hu", 2);
mode_Hu->code = irm_Hu;
- mode_Hu->sort = int_number;
+ mode_Hu->sort = irms_int_number;
mode_Hu->sign = 0;
mode_Hu->align = 16;
mode_Hu->size = 16;
+ mode_Hu->tv_priv = NULL;
set_mode_values(mode_Hu);
mode_Is = &modes[irm_Is];
mode_Is->name = id_from_str("Is", 2);
mode_Is->code = irm_Is;
- mode_Is->sort = int_number;
+ mode_Is->sort = irms_int_number;
mode_Is->sign = 1;
mode_Is->align = 32;
mode_Is->size = 32;
+ mode_Is->tv_priv = NULL;
set_mode_values(mode_Is);
mode_Iu = &modes[irm_Iu];
mode_Iu->name = id_from_str("Iu", 2);
mode_Iu->code = irm_Iu;
- mode_Iu->sort = int_number;
+ mode_Iu->sort = irms_int_number;
mode_Iu->sign = 0;
mode_Iu->align = 32;
mode_Iu->size = 32;
+ mode_Iu->tv_priv = NULL;
set_mode_values(mode_Iu);
mode_Ls = &modes[irm_Ls];
mode_Ls->name = id_from_str("Ls", 2);
mode_Ls->code = irm_Ls;
- mode_Ls->sort = int_number;
+ mode_Ls->sort = irms_int_number;
mode_Ls->sign = 1;
mode_Ls->align = 32;
mode_Ls->size = 64;
+ mode_Ls->tv_priv = NULL;
set_mode_values(mode_Ls);
mode_Lu = &modes[irm_Lu];
mode_Lu->name = id_from_str("Lu", 2);
mode_Lu->code = irm_Lu;
- mode_Lu->sort = int_number;
+ mode_Lu->sort = irms_int_number;
mode_Lu->sign = 0;
mode_Lu->align = 32;
mode_Lu->size = 64;
+ mode_Lu->tv_priv = NULL;
set_mode_values(mode_Lu);
mode_C = &modes[irm_C];
mode_C->name = id_from_str("C", 1);
mode_C->code = irm_C;
- mode_C->sort = character;
+ mode_C->sort = irms_character;
mode_C->sign = 0;
mode_C->align = 8;
mode_C->size = 8;
+ mode_C->tv_priv = NULL;
set_mode_values(mode_C);
mode_U = &modes[irm_U];
mode_U->name = id_from_str("U", 1);
mode_U->code = irm_U;
- mode_U->sort = character;
+ mode_U->sort = irms_character;
mode_U->sign = 0;
mode_U->align = 16;
mode_U->size = 16;
+ mode_U->tv_priv = NULL;
set_mode_values(mode_U);
mode_P = &modes[irm_P];
mode_P->name = id_from_str("P", 1);
mode_P->code = irm_P;
- mode_P->sort = reference;
+ mode_P->sort = irms_reference;
mode_P->sign = 0;
mode_P->align = 32;
mode_P->size = 32;
+ mode_P->tv_priv = NULL;
num_modes = irm_max;
}