+/*
+ * 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,
+ mode_arithmetic arithmetic, unsigned int modulo_shift )
+{
+ ir_mode mode_tmpl;
+ ir_mode *mode;
+
+ 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.sign = sign ? 1 : 0;
+ mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
+ mode_tmpl.vector_elem = num_of_elem;
+ mode_tmpl.arithmetic = arithmetic;
+ mode_tmpl.link = NULL;
+ mode_tmpl.tv_priv = NULL;
+
+ mode = find_mode(&mode_tmpl);
+ if (mode)
+ return mode;
+
+ if (num_of_elem <= 1) {
+ assert(0 && "vector modes should have at least 2 elements");
+ return NULL;
+ }
+
+ /* sanity checks */
+ switch (sort)
+ {
+ case irms_auxiliary:
+ case irms_control_flow:
+ case irms_memory:
+ case irms_internal_boolean:
+ assert(0 && "internal modes cannot be user defined");
+ return NULL;
+
+ case irms_reference:
+ case irms_character:
+ assert(0 && "only integer and floating point modes can be vectorized");
+ return NULL;
+
+ case irms_float_number:
+ assert(0 && "not yet implemented");
+ return NULL;
+
+ case irms_int_number:
+ return register_mode(&mode_tmpl);
+ }
+ return NULL; /* to shut up gcc */
+}
+