- /* signed long integer */
- newmode.name = new_id_from_chars("Ls", 2);
- newmode.code = irm_Ls;
- newmode.sign = 1;
- newmode.size = 64;
- newmode.modulo_shift = 64;
-
- mode_Ls = register_mode(&newmode);
-
- /* unsigned long integer */
- newmode.name = new_id_from_chars("Lu", 2);
- newmode.code = irm_Lu;
- newmode.sign = 0;
- newmode.size = 64;
- newmode.modulo_shift = 64;
-
- mode_Lu = register_mode(&newmode);
-
- /* Character Modes */
- newmode.sort = irms_character;
- newmode.arithmetic = irma_twos_complement;
-
- /* Character */
- newmode.name = new_id_from_chars("C", 1);
- newmode.code = irm_C;
- newmode.sign = 0;
- newmode.size = 8;
- newmode.modulo_shift = 32;
-
- mode_C = register_mode(&newmode);
-
- /* Unicode character */
- newmode.name = new_id_from_chars("U", 1);
- newmode.code = irm_U;
- newmode.sign = 0;
- newmode.size = 16;
- newmode.modulo_shift = 32;
-
- mode_U = register_mode(&newmode);
-
- /* Reference Modes */
- newmode.sort = irms_reference;
- newmode.arithmetic = irma_twos_complement;
-
- /* pointer */
- newmode.name = new_id_from_chars("P", 1);
- newmode.code = irm_P;
- newmode.sign = 0;
- newmode.size = 32;
- newmode.modulo_shift = 0;
-
- mode_P = register_mode(&newmode);
-
- /* set the machine specific modes to the predefined ones */
- mode_P_code = mode_P;
- mode_P_data = mode_P;
+/* initialization, build the default modes */
+void init_mode(void) {
+ ir_mode newmode;
+
+ obstack_init(&modes);
+ mode_list = NEW_ARR_F(ir_mode*, 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);
+ mode_BB = register_mode(&newmode);
+
+ /* eXecution */
+ newmode.name = new_id_from_chars("X", 1);
+ mode_X = register_mode(&newmode);
+
+ /* Memory Modes */
+ newmode.sort = irms_memory;
+
+ /* Memory */
+ newmode.name = new_id_from_chars("M", 1);
+ mode_M = register_mode(&newmode);
+
+ /* Auxiliary Modes */
+ newmode.sort = irms_auxiliary,
+
+ /* Tuple */
+ newmode.name = new_id_from_chars("T", 1);
+ mode_T = register_mode(&newmode);
+
+ /* ANY */
+ newmode.name = new_id_from_chars("ANY", 3);
+ mode_ANY = register_mode(&newmode);
+
+ /* BAD */
+ newmode.name = new_id_from_chars("BAD", 3);
+ mode_BAD = register_mode(&newmode);
+
+ /* Internal Boolean Modes */
+ newmode.sort = irms_internal_boolean;
+
+ /* boolean */
+ newmode.name = new_id_from_chars("b", 1);
+ 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.sign = 1;
+ newmode.size = 32;
+ mode_F = register_mode(&newmode);
+
+ /* double */
+ newmode.name = new_id_from_chars("D", 1);
+ newmode.sign = 1;
+ newmode.size = 64;
+ mode_D = register_mode(&newmode);
+
+ /* extended */
+ newmode.name = new_id_from_chars("E", 1);
+ 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);
+
+ /* Integer Number Modes */
+ newmode.sort = irms_int_number;
+ newmode.arithmetic = irma_twos_complement;
+
+ /* signed byte */
+ newmode.name = new_id_from_chars("Bs", 2);
+ newmode.sign = 1;
+ newmode.size = 8;
+ newmode.modulo_shift = 32;
+ mode_Bs = register_mode(&newmode);
+
+ /* unsigned byte */
+ newmode.name = new_id_from_chars("Bu", 2);
+ newmode.arithmetic = irma_twos_complement;
+ newmode.sign = 0;
+ newmode.size = 8;
+ newmode.modulo_shift = 32;
+ mode_Bu = register_mode(&newmode);
+
+ /* signed short integer */
+ newmode.name = new_id_from_chars("Hs", 2);
+ newmode.sign = 1;
+ newmode.size = 16;
+ newmode.modulo_shift = 32;
+ mode_Hs = register_mode(&newmode);
+
+ /* unsigned short integer */
+ newmode.name = new_id_from_chars("Hu", 2);
+ newmode.sign = 0;
+ newmode.size = 16;
+ newmode.modulo_shift = 32;
+ mode_Hu = register_mode(&newmode);
+
+ /* signed integer */
+ newmode.name = new_id_from_chars("Is", 2);
+ newmode.sign = 1;
+ newmode.size = 32;
+ newmode.modulo_shift = 32;
+ mode_Is = register_mode(&newmode);
+
+ /* unsigned integer */
+ newmode.name = new_id_from_chars("Iu", 2);
+ newmode.sign = 0;
+ newmode.size = 32;
+ newmode.modulo_shift = 32;
+ mode_Iu = register_mode(&newmode);
+
+ /* signed long integer */
+ newmode.name = new_id_from_chars("Ls", 2);
+ newmode.sign = 1;
+ newmode.size = 64;
+ newmode.modulo_shift = 64;
+ mode_Ls = register_mode(&newmode);
+
+ /* unsigned long integer */
+ newmode.name = new_id_from_chars("Lu", 2);
+ newmode.sign = 0;
+ newmode.size = 64;
+ newmode.modulo_shift = 64;
+ mode_Lu = register_mode(&newmode);
+
+ /* signed long long integer */
+ newmode.name = new_id_from_chars("LLs", 3);
+ newmode.sign = 1;
+ newmode.size = 128;
+ newmode.modulo_shift = 128;
+ mode_LLs = register_mode(&newmode);
+
+ /* unsigned long long integer */
+ newmode.name = new_id_from_chars("LLu", 3);
+ newmode.sign = 0;
+ newmode.size = 128;
+ newmode.modulo_shift = 128;
+ mode_LLu = register_mode(&newmode);
+
+ /* Reference Mode */
+ newmode.sort = irms_reference;
+ newmode.arithmetic = irma_twos_complement;
+
+ /* pointer */
+ newmode.name = new_id_from_chars("P", 1);
+ newmode.sign = 0;
+ newmode.size = 32;
+ newmode.modulo_shift = 32;
+ newmode.eq_signed = mode_Is;
+ newmode.eq_unsigned = mode_Iu;
+ mode_P = register_mode(&newmode);
+
+ /* set the machine specific modes to the predefined ones */
+ mode_P_code = mode_P;
+ mode_P_data = mode_P;