X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firmode.c;h=a9923d2946a83c377478db9241b420e8779cd658;hb=0acb7d2b481592f9053e8f3667fcc691736d13a7;hp=c58d111f367ab3151f8d259fbaf305b25c49f500;hpb=f63191418c11e52f79236bf4b404f8d7a135e075;p=libfirm diff --git a/ir/ir/irmode.c b/ir/ir/irmode.c index c58d111f3..a9923d294 100644 --- a/ir/ir/irmode.c +++ b/ir/ir/irmode.c @@ -489,7 +489,7 @@ tarval * get_mode_all_one(ir_mode *mode) { assert(mode); assert(get_mode_modecode(mode) < (modecode) num_modes); - assert(mode_is_data(mode)); + assert(mode_is_data(mode) || mode == mode_b); return mode->all_one; } @@ -586,23 +586,27 @@ smaller_mode(const ir_mode *sm, const ir_mode *lm) { case irms_int_number: switch (get_mode_sort(lm)) { case irms_int_number: + if(get_mode_arithmetic(sm) != get_mode_arithmetic(lm)) + return 0; + + /* only two complement implemented */ + assert(get_mode_arithmetic(sm)==irma_twos_complement); + /* integers are convertable if * - both have the same sign and lm is the larger one * - lm is the signed one and is at least two bits larger * (one for the sign, one for the highest bit of sm) * - sm & lm are two_complement and lm has greater or equal number of bits */ - if ( get_mode_arithmetic(sm) == get_mode_arithmetic(lm) - && get_mode_arithmetic(sm) == irma_twos_complement) { - return lm_bits >= sm_bits; - } else if (mode_is_signed(sm)) { - if ( mode_is_signed(lm) && (lm_bits >= sm_bits) ) - return 1; - } else if (mode_is_signed(lm)) { - if (lm_bits > sm_bits + 1) - return 1; - } else if (lm_bits >= sm_bits) { - return 1; + if(mode_is_signed(sm)) { + if(!mode_is_signed(lm)) + return 0; + return sm_bits <= lm_bits; + } else { + if(mode_is_signed(lm)) { + return sm_bits < lm_bits; + } + return sm_bits <= lm_bits; } break; @@ -666,7 +670,7 @@ void set_reference_mode_unsigned_eq(ir_mode *ref_mode, ir_mode *int_mode) { /* initialization, build the default modes */ void -init_mode (void) { +init_mode(void) { ir_mode newmode; obstack_init(&modes);