+ default:
+ return 0;
+ }
+}
+
+/* Return the signed integer equivalent mode for an reference mode. */
+ir_mode *get_reference_mode_signed_eq(ir_mode *mode) {
+ assert(mode_is_reference(mode));
+ return mode->eq_signed;
+}
+
+/* Sets the signed integer equivalent mode for an reference mode. */
+void set_reference_mode_signed_eq(ir_mode *ref_mode, ir_mode *int_mode) {
+ assert(mode_is_reference(ref_mode));
+ assert(mode_is_int(int_mode));
+ ref_mode->eq_signed = int_mode;
+}
+
+/* Return the unsigned integer equivalent mode for an reference mode. */
+ir_mode *get_reference_mode_unsigned_eq(ir_mode *mode) {
+ assert(mode_is_reference(mode));
+ return mode->eq_unsigned;
+}
+
+/* Sets the unsigned integer equivalent mode for an reference mode. */
+void set_reference_mode_unsigned_eq(ir_mode *ref_mode, ir_mode *int_mode) {
+ assert(mode_is_reference(ref_mode));
+ assert(mode_is_int(int_mode));
+ ref_mode->eq_unsigned = int_mode;
+}
+
+/* initialization, build the default modes */
+void init_mode(void) {
+ ir_mode newmode;
+
+ obstack_init(&modes);
+ mode_list = NEW_ARR_F(ir_mode*, 0);
+
+ num_modes = 0;
+ /* initialize predefined modes */
+
+ /* Internal Modes */
+ newmode.arithmetic = irma_none;
+ newmode.size = 0;
+ newmode.sign = 0;
+ newmode.modulo_shift = 0;
+ newmode.vector_elem = 0;
+ newmode.eq_signed = NULL;
+ newmode.eq_unsigned = NULL;
+ newmode.link = NULL;
+ newmode.tv_priv = NULL;
+
+ /* Control Flow Modes*/
+ newmode.sort = irms_control_flow;
+
+ /* Basic Block */
+ newmode.name = new_id_from_chars("BB", 2);
+ newmode.code = irm_BB;
+
+ mode_BB = register_mode(&newmode);
+
+ /* eXecution */
+ newmode.name = new_id_from_chars("X", 1);
+ newmode.code = irm_X;
+
+ mode_X = register_mode(&newmode);
+
+ /* Memory Modes */
+ newmode.sort = irms_memory;
+
+ /* Memory */
+ newmode.name = new_id_from_chars("M", 1);
+ newmode.code = irm_M;
+
+ mode_M = register_mode(&newmode);
+
+ /* Auxiliary Modes */
+ newmode.sort = irms_auxiliary,
+
+ /* Tuple */
+ newmode.name = new_id_from_chars("T", 1);
+ newmode.code = irm_T;
+
+ mode_T = register_mode(&newmode);
+
+ /* ANY */
+ newmode.name = new_id_from_chars("ANY", 3);
+ newmode.code = irm_ANY;
+
+ mode_ANY = register_mode(&newmode);
+
+ /* BAD */
+ newmode.name = new_id_from_chars("BAD", 3);
+ newmode.code = irm_BAD;
+
+ mode_BAD = register_mode(&newmode);
+
+ /* Internal Boolean Modes */
+ newmode.sort = irms_internal_boolean;
+
+ /* boolean */
+ newmode.name = new_id_from_chars("b", 1);
+ newmode.code = irm_b;
+
+ mode_b = register_mode(&newmode);
+
+ /* Data Modes */
+ newmode.vector_elem = 1;
+
+ /* Float Number Modes */
+ newmode.sort = irms_float_number;
+ newmode.arithmetic = irma_ieee754;
+
+ /* float */
+ newmode.name = new_id_from_chars("F", 1);
+ newmode.code = irm_F;
+ newmode.sign = 1;
+ newmode.size = 32;
+
+ mode_F = register_mode(&newmode);
+
+ /* double */
+ newmode.name = new_id_from_chars("D", 1);
+ newmode.code = irm_D;
+ newmode.sign = 1;
+ newmode.size = 64;
+
+ mode_D = register_mode(&newmode);
+
+ /* extended */
+ newmode.name = new_id_from_chars("E", 1);
+ newmode.code = irm_E;
+ newmode.sign = 1;
+ /* note that the tarval module is calculating with 80 bits, but we use
+ * 96 bits, as that is what will be stored to memory by most hardware */
+ newmode.size = 96;
+
+ mode_E = register_mode(&newmode);