X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firmode.c;h=959f7f467a3c1d75a7582b042b737d27a232cc99;hb=22792ba22e7275e68cfbdd8aa6305c2e9e26bc9b;hp=41f1de2010ed96ffac941525ad38a8c17f6a2556;hpb=ea75e9d38674b468f602a0699fb64b9c01254797;p=libfirm diff --git a/ir/ir/irmode.c b/ir/ir/irmode.c index 41f1de201..959f7f467 100644 --- a/ir/ir/irmode.c +++ b/ir/ir/irmode.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -21,14 +21,13 @@ * @file * @brief Data modes of operations. * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Mathias Heil - * @version $Id$ */ #include "config.h" #include #include - #include +#include #include "irprog_t.h" #include "irmode_t.h" @@ -47,40 +46,13 @@ static struct obstack modes; /** The list of all currently existing modes. */ static ir_mode **mode_list; -const char *get_mode_arithmetic_name(ir_mode_arithmetic ari) -{ -#define X(a) case a: return #a - switch (ari) { - X(irma_uninitialized); - X(irma_none); - X(irma_twos_complement); - X(irma_ones_complement); - X(irma_int_BCD); - X(irma_ieee754); - X(irma_float_BCD); - default: return ""; - } -#undef X -} - -/** - * Compare modes that don't need to have their code field - * correctly set - * - * TODO: Add other fields - **/ -static inline int modes_are_equal(const ir_mode *m, const ir_mode *n) -{ - if (m == n) return 1; - if (m->sort == n->sort && - m->arithmetic == n->arithmetic && - m->size == n->size && - m->sign == n->sign && - m->modulo_shift == n->modulo_shift && - m->vector_elem == n->vector_elem) - return 1; - - return 0; +static bool modes_are_equal(const ir_mode *m, const ir_mode *n) +{ + return m->sort == n->sort && + m->arithmetic == n->arithmetic && + m->size == n->size && + m->sign == n->sign && + m->modulo_shift == n->modulo_shift; } /** @@ -90,8 +62,8 @@ static inline int modes_are_equal(const ir_mode *m, const ir_mode *n) */ static ir_mode *find_mode(const ir_mode *m) { - int i; - for (i = ARR_LEN(mode_list) - 1; i >= 0; --i) { + size_t i, n_modes; + for (i = 0, n_modes = ARR_LEN(mode_list); i < n_modes; ++i) { ir_mode *n = mode_list[i]; if (modes_are_equal(n, m)) return n; @@ -99,28 +71,6 @@ static ir_mode *find_mode(const ir_mode *m) return NULL; } -#ifdef FIRM_STATISTICS -/* return the mode index, only needed for statistics */ -int stat_find_mode_index(const ir_mode *m) -{ - int i; - for (i = ARR_LEN(mode_list) - 1; i >= 0; --i) { - ir_mode *n = mode_list[i]; - if (modes_are_equal(n, m)) - return i; - } - return -1; -} - -/* return the mode for a given index, only needed for statistics */ -ir_mode *stat_mode_for_index(int idx) -{ - if (0 <= idx && idx < ARR_LEN(mode_list)) - return mode_list[idx]; - return NULL; -} -#endif - /** * sets special values of modes */ @@ -151,9 +101,12 @@ static void set_mode_values(ir_mode* mode) mode->all_one = tarval_b_true; break; - case irms_auxiliary: - case irms_memory: case irms_control_flow: + case irms_block: + case irms_tuple: + case irms_any: + case irms_bad: + case irms_memory: mode->min = tarval_bad; mode->max = tarval_bad; mode->null = tarval_bad; @@ -178,9 +131,9 @@ ir_mode *mode_ANY; ir_mode *mode_BAD; /* predefined numerical modes: */ -ir_mode *mode_F; /* float */ -ir_mode *mode_D; /* double */ -ir_mode *mode_E; /* long double */ +ir_mode *mode_F; +ir_mode *mode_D; +ir_mode *mode_Q; ir_mode *mode_Bs; /* integral values, signed and unsigned */ ir_mode *mode_Bu; /* 8 bit */ @@ -204,11 +157,10 @@ ir_mode *mode_P_data; /**< machine specific pointer mode for data addresses */ * functions defined in irmode.h * * */ -/* JNI access functions */ ir_mode *get_modeT(void) { return mode_T; } ir_mode *get_modeF(void) { return mode_F; } ir_mode *get_modeD(void) { return mode_D; } -ir_mode *get_modeE(void) { return mode_E; } +ir_mode *get_modeQ(void) { return mode_Q; } ir_mode *get_modeBs(void) { return mode_Bs; } ir_mode *get_modeBu(void) { return mode_Bu; } ir_mode *get_modeHs(void) { return mode_Hs; } @@ -230,12 +182,12 @@ ir_mode *get_modeBAD(void) { return mode_BAD; } ir_mode *(get_modeP_code)(void) { - return _get_modeP_code(); + return get_modeP_code_(); } ir_mode *(get_modeP_data)(void) { - return _get_modeP_data(); + return get_modeP_data_(); } void set_modeP_code(ir_mode *p) @@ -248,134 +200,93 @@ void set_modeP_data(ir_mode *p) { assert(mode_is_reference(p)); mode_P_data = p; + mode_P = p; } -/** - * Registers a new mode. - * - * @param new_mode The new mode template. +/* + * Creates a new mode. */ -static ir_mode *register_mode(const ir_mode *new_mode) -{ - ir_mode *mode = NULL; - - assert(new_mode); - - /* copy mode struct to modes array */ - mode = (ir_mode *)obstack_copy(&modes, new_mode, sizeof(*mode)); - ARR_APP1(ir_mode*, mode_list, mode); +static ir_mode *alloc_mode(const char *name, ir_mode_sort sort, + ir_mode_arithmetic arithmetic, unsigned bit_size, + int sign, unsigned modulo_shift) +{ + ir_mode *mode_tmpl = OALLOCZ(&modes, ir_mode); + + mode_tmpl->name = new_id_from_str(name); + mode_tmpl->sort = sort; + mode_tmpl->size = bit_size; + mode_tmpl->sign = sign ? 1 : 0; + mode_tmpl->modulo_shift = modulo_shift; + mode_tmpl->arithmetic = arithmetic; + mode_tmpl->link = NULL; + mode_tmpl->tv_priv = NULL; + return mode_tmpl; +} + +static ir_mode *register_mode(ir_mode *mode) +{ + /* does any of the existing modes have the same properties? */ + ir_mode *old = find_mode(mode); + if (old != NULL) { + /* remove new mode from obstack */ + obstack_free(&modes, mode); + return old; + } mode->kind = k_ir_mode; mode->type = new_type_primitive(mode); - - /* add the new mode to the irp list of modes */ + ARR_APP1(ir_mode*, mode_list, mode); add_irp_mode(mode); - set_mode_values(mode); - - hook_new_mode(new_mode, mode); + hook_new_mode(mode); return mode; } -/* - * Creates a new mode. - */ -ir_mode *new_ir_mode(const char *name, ir_mode_sort sort, int bit_size, int sign, - ir_mode_arithmetic arithmetic, unsigned int modulo_shift) -{ - ir_mode mode_tmpl; - ir_mode *mode = NULL; - - mode_tmpl.name = new_id_from_str(name); - mode_tmpl.sort = sort; - mode_tmpl.size = bit_size; - mode_tmpl.sign = sign ? 1 : 0; - mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number || - mode_tmpl.sort == irms_reference) ? modulo_shift : 0; - mode_tmpl.vector_elem = 1; - mode_tmpl.arithmetic = arithmetic; - mode_tmpl.link = NULL; - mode_tmpl.tv_priv = NULL; - - mode = find_mode(&mode_tmpl); - if (mode) { - hook_new_mode(&mode_tmpl, mode); - return mode; - } - - /* sanity checks */ - switch (sort) { - case irms_auxiliary: - case irms_control_flow: - case irms_memory: - case irms_internal_boolean: - panic("internal modes cannot be user defined"); +ir_mode *new_int_mode(const char *name, ir_mode_arithmetic arithmetic, + unsigned bit_size, int sign, unsigned modulo_shift) +{ + ir_mode *result = alloc_mode(name, irms_int_number, arithmetic, bit_size, + sign, modulo_shift); + return register_mode(result); +} - case irms_float_number: - case irms_int_number: - case irms_reference: - mode = register_mode(&mode_tmpl); - break; - } - assert(mode != NULL); - return mode; +ir_mode *new_reference_mode(const char *name, ir_mode_arithmetic arithmetic, + unsigned bit_size, unsigned modulo_shift) +{ + ir_mode *result = alloc_mode(name, irms_reference, arithmetic, bit_size, + 0, modulo_shift); + return register_mode(result); } -/* - * Creates a new vector mode. - */ -ir_mode *new_ir_vector_mode(const char *name, ir_mode_sort sort, int bit_size, unsigned num_of_elem, int sign, - ir_mode_arithmetic arithmetic, unsigned int modulo_shift) -{ - ir_mode mode_tmpl; - ir_mode *mode = NULL; - - mode_tmpl.name = new_id_from_str(name); - mode_tmpl.sort = sort; - mode_tmpl.size = bit_size * num_of_elem; - 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) { - hook_new_mode(&mode_tmpl, mode); - return mode; - } +ir_mode *new_float_mode(const char *name, ir_mode_arithmetic arithmetic, + unsigned exponent_size, unsigned mantissa_size) +{ + bool explicit_one = false; + unsigned bit_size = exponent_size + mantissa_size + 1; + ir_mode *result; - if (num_of_elem <= 1) { - assert(0 && "vector modes should have at least 2 elements"); - return NULL; + if (arithmetic == irma_x86_extended_float) { + explicit_one = true; + bit_size++; + } else if (arithmetic != irma_ieee754) { + panic("Arithmetic %s invalid for float"); } + if (exponent_size >= 256) + panic("Exponents >= 256 bits not supported"); + if (mantissa_size >= 256) + panic("Mantissa >= 256 bits not supported"); - /* sanity checks */ - switch (sort) { - case irms_auxiliary: - case irms_control_flow: - case irms_memory: - case irms_internal_boolean: - panic("internal modes cannot be user defined"); - - case irms_reference: - panic("only integer and floating point modes can be vectorized"); - - case irms_float_number: - panic("not yet implemented"); - - case irms_int_number: - mode = register_mode(&mode_tmpl); - } - assert(mode != NULL); - return mode; + result = alloc_mode(name, irms_float_number, irma_x86_extended_float, bit_size, 1, 0); + result->float_desc.exponent_size = exponent_size; + result->float_desc.mantissa_size = mantissa_size; + result->float_desc.explicit_one = explicit_one; + return register_mode(result); } /* Functions for the direct access to all attributes of an ir_mode */ ident *(get_mode_ident)(const ir_mode *mode) { - return _get_mode_ident(mode); + return get_mode_ident_(mode); } const char *get_mode_name(const ir_mode *mode) @@ -383,29 +294,24 @@ const char *get_mode_name(const ir_mode *mode) return get_id_str(mode->name); } -ir_mode_sort (get_mode_sort)(const ir_mode* mode) -{ - return _get_mode_sort(mode); -} - unsigned (get_mode_size_bits)(const ir_mode *mode) { - return _get_mode_size_bits(mode); + return get_mode_size_bits_(mode); } unsigned (get_mode_size_bytes)(const ir_mode *mode) { - return _get_mode_size_bytes(mode); + return get_mode_size_bytes_(mode); } int (get_mode_sign)(const ir_mode *mode) { - return _get_mode_sign(mode); + return get_mode_sign_(mode); } ir_mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode) { - return get_mode_arithmetic(mode); + return get_mode_arithmetic_(mode); } @@ -415,25 +321,20 @@ ir_mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode) */ unsigned int (get_mode_modulo_shift)(const ir_mode *mode) { - return _get_mode_modulo_shift(mode); -} - -unsigned int (get_mode_n_vector_elems)(const ir_mode *mode) -{ - return _get_mode_vector_elems(mode); + return get_mode_modulo_shift_(mode); } void *(get_mode_link)(const ir_mode *mode) { - return _get_mode_link(mode); + return get_mode_link_(mode); } void (set_mode_link)(ir_mode *mode, void *l) { - _set_mode_link(mode, l); + set_mode_link_(mode, l); } -tarval *get_mode_min(ir_mode *mode) +ir_tarval *get_mode_min(ir_mode *mode) { assert(mode); assert(mode_is_data(mode)); @@ -441,7 +342,7 @@ tarval *get_mode_min(ir_mode *mode) return mode->min; } -tarval *get_mode_max(ir_mode *mode) +ir_tarval *get_mode_max(ir_mode *mode) { assert(mode); assert(mode_is_data(mode)); @@ -449,7 +350,7 @@ tarval *get_mode_max(ir_mode *mode) return mode->max; } -tarval *get_mode_null(ir_mode *mode) +ir_tarval *get_mode_null(ir_mode *mode) { assert(mode); assert(mode_is_datab(mode)); @@ -457,7 +358,7 @@ tarval *get_mode_null(ir_mode *mode) return mode->null; } -tarval *get_mode_one(ir_mode *mode) +ir_tarval *get_mode_one(ir_mode *mode) { assert(mode); assert(mode_is_datab(mode)); @@ -465,7 +366,7 @@ tarval *get_mode_one(ir_mode *mode) return mode->one; } -tarval *get_mode_minus_one(ir_mode *mode) +ir_tarval *get_mode_minus_one(ir_mode *mode) { assert(mode); assert(mode_is_data(mode)); @@ -473,14 +374,14 @@ tarval *get_mode_minus_one(ir_mode *mode) return mode->minus_one; } -tarval *get_mode_all_one(ir_mode *mode) +ir_tarval *get_mode_all_one(ir_mode *mode) { assert(mode); assert(mode_is_datab(mode)); return mode->all_one; } -tarval *get_mode_infinite(ir_mode *mode) +ir_tarval *get_mode_infinite(ir_mode *mode) { assert(mode); assert(mode_is_float(mode)); @@ -488,7 +389,7 @@ tarval *get_mode_infinite(ir_mode *mode) return get_tarval_plus_inf(mode); } -tarval *get_mode_NAN(ir_mode *mode) +ir_tarval *get_mode_NAN(ir_mode *mode) { assert(mode); assert(mode_is_float(mode)); @@ -503,52 +404,52 @@ int is_mode(const void *thing) int (mode_is_signed)(const ir_mode *mode) { - return _mode_is_signed(mode); + return mode_is_signed_(mode); } int (mode_is_float)(const ir_mode *mode) { - return _mode_is_float(mode); + return mode_is_float_(mode); } int (mode_is_int)(const ir_mode *mode) { - return _mode_is_int(mode); + return mode_is_int_(mode); } int (mode_is_reference)(const ir_mode *mode) { - return _mode_is_reference(mode); + return mode_is_reference_(mode); } int (mode_is_num)(const ir_mode *mode) { - return _mode_is_num(mode); + return mode_is_num_(mode); } int (mode_is_data)(const ir_mode *mode) { - return _mode_is_data(mode); + return mode_is_data_(mode); } int (mode_is_datab)(const ir_mode *mode) { - return _mode_is_datab(mode); + return mode_is_datab_(mode); } int (mode_is_dataM)(const ir_mode *mode) { - return _mode_is_dataM(mode); + return mode_is_dataM_(mode); } -int (mode_is_float_vector)(const ir_mode *mode) +unsigned (get_mode_mantissa_size)(const ir_mode *mode) { - return _mode_is_float_vector(mode); + return get_mode_mantissa_size_(mode); } -int (mode_is_int_vector)(const ir_mode *mode) +unsigned (get_mode_exponent_size)(const ir_mode *mode) { - return _mode_is_int_vector(mode); + return get_mode_exponent_size_(mode); } /* Returns true if sm can be converted to lm without loss. */ @@ -590,7 +491,6 @@ int smaller_mode(const ir_mode *sm, const ir_mode *lm) } return sm_bits <= lm_bits; } - break; case irms_float_number: /* int to float works if the float is large enough */ @@ -628,7 +528,6 @@ int smaller_mode(const ir_mode *sm, const ir_mode *lm) and backwards without loss. */ int values_in_mode(const ir_mode *sm, const ir_mode *lm) { - int sm_bits, lm_bits; ir_mode_arithmetic arith; assert(sm); @@ -639,9 +538,6 @@ int values_in_mode(const ir_mode *sm, const ir_mode *lm) if (sm == mode_b) return mode_is_int(lm); - sm_bits = get_mode_size_bits(sm); - lm_bits = get_mode_size_bits(lm); - arith = get_mode_arithmetic(sm); if (arith != get_mode_arithmetic(lm)) return 0; @@ -686,181 +582,45 @@ void set_reference_mode_unsigned_eq(ir_mode *ref_mode, ir_mode *int_mode) ref_mode->eq_unsigned = int_mode; } +static ir_mode *new_internal_mode(const char *name, ir_mode_sort sort) +{ + ir_mode *mode = alloc_mode(name, sort, irma_none, 0, 0, 0); + return register_mode(mode); +} + /* 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); + mode_BB = new_internal_mode("BB", irms_block); + mode_X = new_internal_mode("X", irms_control_flow); + mode_M = new_internal_mode("M", irms_memory); + mode_T = new_internal_mode("T", irms_tuple); + mode_ANY = new_internal_mode("ANY", irms_any); + mode_BAD = new_internal_mode("BAD", irms_bad); + mode_b = new_internal_mode("b", irms_internal_boolean); + + mode_F = new_float_mode("F", irma_ieee754, 8, 23); + mode_D = new_float_mode("D", irma_ieee754, 11, 52); + mode_Q = new_float_mode("Q", irma_ieee754, 15, 112); + + mode_Bs = new_int_mode("Bs", irma_twos_complement, 8, 1, 32); + mode_Bu = new_int_mode("Bu", irma_twos_complement, 8, 0, 32); + mode_Hs = new_int_mode("Hs", irma_twos_complement, 16, 1, 32); + mode_Hu = new_int_mode("Hu", irma_twos_complement, 16, 0, 32); + mode_Is = new_int_mode("Is", irma_twos_complement, 32, 1, 32); + mode_Iu = new_int_mode("Iu", irma_twos_complement, 32, 0, 32); + mode_Ls = new_int_mode("Ls", irma_twos_complement, 64, 1, 64); + mode_Lu = new_int_mode("Lu", irma_twos_complement, 64, 0, 64); + mode_LLs = new_int_mode("LLs", irma_twos_complement, 128, 1, 128); + mode_LLu = new_int_mode("LLu", irma_twos_complement, 128, 0, 128); + + mode_P = new_reference_mode("P", irma_twos_complement, 32, 32); + set_reference_mode_signed_eq(mode_P, mode_Is); + set_reference_mode_unsigned_eq(mode_P, mode_Iu); /* set the machine specific modes to the predefined ones */ mode_P_code = mode_P; @@ -958,7 +718,12 @@ int is_reinterpret_cast(const ir_mode *src, const ir_mode *dst) if (ma != get_mode_arithmetic(dst)) return 0; - return ma == irma_twos_complement || ma == irma_ones_complement; + return ma == irma_twos_complement; +} + +ir_type *(get_type_for_mode) (const ir_mode *mode) +{ + return get_type_for_mode_(mode); } void finish_mode(void) @@ -975,7 +740,6 @@ void finish_mode(void) mode_F = NULL; mode_D = NULL; - mode_E = NULL; mode_Bs = NULL; mode_Bu = NULL;