INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n)
{
if (m == n) return 1;
- if(!bcmp( m + offsetof(ir_mode,sort) , n + offsetof(ir_mode,sort), offsetof(ir_mode,min)-offsetof(ir_mode,min))) return 1;
+ if (0 == memcmp(&m->sort, &n->sort, offsetof(ir_mode,min) - offsetof(ir_mode,sort))) return 1;
return 0;
}
*/
static void set_mode_values(ir_mode* mode)
{
- mode->min = get_tarval_min(mode);
- mode->max= get_tarval_max(mode);
- mode->null= get_tarval_null(mode);
- mode->one= get_tarval_one(mode);
+ switch (get_mode_sort(mode))
+ {
+ case irms_int_number:
+ case irms_float_number:
+ mode->min = get_tarval_min(mode);
+ mode->max = get_tarval_max(mode);
+ mode->null = get_tarval_null(mode);
+ mode->one = get_tarval_one(mode);
+ break;
+
+ case irms_internal_boolean:
+ mode->min = tarval_b_false;
+ mode->max = tarval_b_true;
+ mode->null = tarval_b_false;
+ mode->one = tarval_b_true;
+ break;
+
+ case irms_reference:
+ mode->min = tarval_bad;
+ mode->max = tarval_bad;
+ mode->null = (get_mode_modecode(mode)==irm_P)?tarval_P_void:tarval_bad;
+ mode->one = tarval_bad;
+ break;
+
+ case irms_character:
+ case irms_auxiliary:
+ case irms_memory:
+ case irms_control_flow:
+ mode->min = tarval_bad;
+ mode->max = tarval_bad;
+ mode->null = tarval_bad;
+ mode->one = tarval_bad;
+ break;
+ }
}
+
/* * *
* globals defined in irmode.h
* * */
ir_mode *mode_b;
ir_mode *mode_P;
+/* machine specific modes */
+ir_mode *mode_P_mach; /* machine specific pointer mode */
+
/* * *
* functions defined in irmode.h
* * */
INLINE ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; }
INLINE ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; }
+
+ir_mode *get_modeP_mach(void) { ANNOUNCE(); return mode_P_mach; }
+void set_modeP_mach(ir_mode *p) {
+ ANNOUNCE();
+ assert(mode_is_reference(p));
+ mode_P_mach = p;
+ }
+
/**
* Registers a new mode if not defined yet, else returns
* the "equivalent" one.
ANNOUNCE();
assert(new_mode);
-
-
/* copy mode struct to modes array */
mode=(ir_mode*) obstack_copy(&modes, new_mode, sizeof(ir_mode));
if(num_modes>=irm_max) mode->code = num_modes;
num_modes++;
- if(mode->sort==irms_int_number || mode->sort==irms_float_number || mode->sort==irms_character) set_mode_values(mode);
+ set_mode_values(mode);
return mode;
}
mode_tmpl.align = align;
mode_tmpl.sign = sign ? 1 : 0;
mode_tmpl.arithmetic = arithmetic;
+ mode_tmpl.link = NULL;
mode_tmpl.tv_priv = NULL;
/* first check if there already is a matching mode */
# undef mode_is_float
# undef mode_is_int
# undef mode_is_num
+# undef mode_is_numP
# undef mode_is_data
# undef mode_is_datab
# undef mode_is_dataM
return (mode_is_int(mode) || mode_is_float(mode));
}
+int
+mode_is_numP (const ir_mode *mode)
+{
+ ANNOUNCE();
+ assert(mode);
+ return (mode_is_int(mode) || mode_is_float(mode) || mode_is_reference(mode));
+}
+
int
mode_is_data (const ir_mode *mode)
{
newmode.size = 0;
newmode.align = 0;
newmode.sign = 0;
+ newmode.link = NULL;
newmode.tv_priv = NULL;
/* Control Flow Modes*/
mode_Lu = register_mode(&newmode);
- /* Integer Number Modes */
+ /* Character Modes */
newmode.sort = irms_character;
newmode.arithmetic = irma_none;
newmode.size = 32;
mode_P = register_mode(&newmode);
+
+ /* set the machine specific modes to the predifined ones */
+ mode_P_mach = mode_P;
}