# include "irtools.h"
# include "array.h"
-/* * *
- * local values
- * * */
-
-
-/** dynamic array to hold all modes */
+/** Obstack to hold all modes. */
static struct obstack modes;
-/** number of defined modes */
+/** Number of defined modes. */
static int num_modes = 0;
+/** The list of all currently existing modes. */
static ir_mode **mode_list;
-/* * *
- * local functions
- * * */
-
/**
* Compare modes that don't need to have their code field
* correctly set
*
* TODO: Add other fields
**/
-INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n) {
+static INLINE int modes_are_equal(const ir_mode *m, const ir_mode *n) {
if (m == n) return 1;
if (m->sort == n->sort &&
m->arithmetic == n->arithmetic &&
* none found
*/
static ir_mode *find_mode(const ir_mode *m) {
- unsigned len = ARR_LEN(mode_list);
- unsigned i;
-
- for(i = 0; i < len; ++i) {
+ int i;
+ for (i = ARR_LEN(mode_list) - 1; i >= 0; --i) {
ir_mode *n = mode_list[i];
if (modes_are_equal(n, m))
return n;
}
+ return NULL;
+}
+
+#ifdef FIRM_STATISTICS
+/* return the mode index, only needed for statistics */
+int stat_find_mode_index(const ir_mode *m) {
+ int i;
+ for (i = ARR_LEN(mode_list) - 1; i >= 0; --i) {
+ ir_mode *n = mode_list[i];
+ if (modes_are_equal(n, m))
+ return i;
+ }
+ return -1;
+}
+/* return the mode for a given index, only needed for statistics */
+ir_mode *stat_mode_for_index(int idx) {
+ if (0 <= idx && idx < ARR_LEN(mode_list))
+ return mode_list[idx];
return NULL;
}
+#endif
/**
* sets special values of modes
/*
* Creates a new mode.
*/
-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 *new_ir_mode(const char *name, ir_mode_sort sort, int bit_size, int sign,
+ ir_mode_arithmetic arithmetic, unsigned int modulo_shift)
{
ir_mode mode_tmpl;
ir_mode *mode = NULL;
/*
* 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 sign,
- mode_arithmetic arithmetic, unsigned int modulo_shift)
+ir_mode *new_ir_vector_mode(const char *name, ir_mode_sort sort, int bit_size, unsigned num_of_elem, int sign,
+ ir_mode_arithmetic arithmetic, unsigned int modulo_shift)
{
ir_mode mode_tmpl;
ir_mode *mode = NULL;
}
/* Functions for the direct access to all attributes of an ir_mode */
-modecode (get_mode_modecode)(const ir_mode *mode) {
+ir_modecode (get_mode_modecode)(const ir_mode *mode) {
return _get_mode_modecode(mode);
}
return get_id_str(mode->name);
}
-mode_sort (get_mode_sort)(const ir_mode* mode) {
+ir_mode_sort (get_mode_sort)(const ir_mode* mode) {
return _get_mode_sort(mode);
}
return _get_mode_sign(mode);
}
-mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode) {
+ir_mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode) {
return get_mode_arithmetic(mode);
}
tarval *get_mode_min(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_data(mode));
return mode->min;
tarval *get_mode_max(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_data(mode));
return mode->max;
tarval *get_mode_null(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_datab(mode));
return mode->null;
tarval *get_mode_one(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_datab(mode));
return mode->one;
tarval *get_mode_minus_one(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_data(mode));
return mode->minus_one;
tarval *get_mode_all_one(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_datab(mode));
return mode->all_one;
}
tarval *get_mode_infinite(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_float(mode));
return get_tarval_plus_inf(mode);
tarval *get_mode_NAN(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
assert(mode_is_float(mode));
return get_tarval_nan(mode);
case irms_int_number:
switch (get_mode_sort(lm)) {
case irms_int_number:
- if(get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
+ if (get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
return 0;
/* only two complement implemented */
- assert(get_mode_arithmetic(sm)==irma_twos_complement);
+ assert(get_mode_arithmetic(sm) == irma_twos_complement);
/* integers are convertable if
* - both have the same sign and lm is the larger one
* (one for the sign, one for the highest bit of sm)
* - sm & lm are two_complement and lm has greater or equal number of bits
*/
- if(mode_is_signed(sm)) {
- if(!mode_is_signed(lm))
+ if (mode_is_signed(sm)) {
+ if (!mode_is_signed(lm))
return 0;
return sm_bits <= lm_bits;
} else {
- if(mode_is_signed(lm)) {
+ if (mode_is_signed(lm)) {
return sm_bits < lm_bits;
}
return sm_bits <= lm_bits;
ir_mode *find_unsigned_mode(const ir_mode *mode) {
ir_mode n = *mode;
- assert(mode->sort == irms_int_number);
+ /* allowed for reference mode */
+ if (mode->sort == irms_reference)
+ n.sort = irms_int_number;
+
+ assert(n.sort == irms_int_number);
n.sign = 0;
return find_mode(&n);
}