# include "ident.h"
# include "tv.h"
# include "obst.h"
+# include "irhooks.h"
#if 0
static long long count = 0;
mode_arithmetic arithmetic, unsigned int modulo_shift )
{
ir_mode mode_tmpl;
- ir_mode *mode;
+ ir_mode *mode = NULL;
mode_tmpl.name = new_id_from_str(name);
mode_tmpl.sort = sort;
mode_tmpl.tv_priv = NULL;
mode = find_mode(&mode_tmpl);
- if (mode)
- {
+ if (mode) {
+ hook_new_mode(&mode_tmpl, mode);
return mode;
}
case irms_memory:
case irms_internal_boolean:
assert(0 && "internal modes cannot be user defined");
- return NULL;
+ break;
case irms_float_number:
case irms_int_number:
case irms_reference:
case irms_character:
- return register_mode(&mode_tmpl);
+ mode = register_mode(&mode_tmpl);
}
- return NULL; /* to shut up gcc */
+ hook_new_mode(&mode_tmpl, mode);
+ return mode;
}
/*
mode_arithmetic arithmetic, unsigned int modulo_shift )
{
ir_mode mode_tmpl;
- ir_mode *mode;
+ ir_mode *mode = NULL;
mode_tmpl.name = new_id_from_str(name);
mode_tmpl.sort = sort;
mode_tmpl.tv_priv = NULL;
mode = find_mode(&mode_tmpl);
- if (mode)
+ if (mode) {
+ hook_new_mode(&mode_tmpl, mode);
return mode;
+ }
if (num_of_elem <= 1) {
assert(0 && "vector modes should have at least 2 elements");
- return NULL;
+ hook_new_mode(&mode_tmpl, mode);
+ return mode;
}
/* sanity checks */
case irms_memory:
case irms_internal_boolean:
assert(0 && "internal modes cannot be user defined");
- return NULL;
+ break;
case irms_reference:
case irms_character:
assert(0 && "only integer and floating point modes can be vectorized");
- return NULL;
+ break;
case irms_float_number:
assert(0 && "not yet implemented");
- return NULL;
+ break;
case irms_int_number:
- return register_mode(&mode_tmpl);
+ mode = register_mode(&mode_tmpl);
}
- return NULL; /* to shut up gcc */
+ hook_new_mode(&mode_tmpl, mode);
+ return mode;
}
/* Functions for the direct access to all attributes od a ir_mode */
return 0;
}
+/*
+ * Returns non-zero if the given mode might overflow on unary Minus.
+ *
+ * This does NOT happen on IEEE 754.
+ */
+int mode_overflow_on_unary_Minus(const ir_mode *mode)
+{
+ if (mode->sort == irms_float_number)
+ return mode->arithmetic == irma_ieee754 ? 0 : 1;
+ return 1;
+}
+
void finish_mode(void) {
obstack_free(&modes, 0);
- mode_T = NULL;
- mode_X = NULL;
- mode_M = NULL;
- mode_BB = NULL;
+ mode_T = NULL;
+ mode_X = NULL;
+ mode_M = NULL;
+ mode_BB = NULL;
mode_ANY = NULL;
mode_BAD = NULL;
- mode_F = NULL;
- mode_D = NULL;
- mode_E = NULL;
-
- mode_Bs = NULL;
- mode_Bu = NULL;
- mode_Hs = NULL;
- mode_Hu = NULL;
- mode_Is = NULL;
- mode_Iu = NULL;
- mode_Ls = NULL;
- mode_Lu = NULL;
-
- mode_C = NULL;
- mode_U = NULL;
- mode_b = NULL;
- mode_P = NULL;
+ mode_F = NULL;
+ mode_D = NULL;
+ mode_E = NULL;
+
+ mode_Bs = NULL;
+ mode_Bu = NULL;
+ mode_Hs = NULL;
+ mode_Hu = NULL;
+ mode_Is = NULL;
+ mode_Iu = NULL;
+ mode_Ls = NULL;
+ mode_Lu = NULL;
+
+ mode_C = NULL;
+ mode_U = NULL;
+ mode_b = NULL;
+ mode_P = NULL;
mode_P_mach = NULL;
}