X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftv%2Ftv.c;h=dc793f63b05fc469877534d0d490a2f1419d4541;hb=98ca7e71bc79bb2a3b2ccb039df78000fc48e70a;hp=17bce28fe72edba894db3ef107e364fdff7b087b;hpb=a94cba60b644054b5f9f1983a6bd9d3f2d6f9142;p=libfirm diff --git a/ir/tv/tv.c b/ir/tv/tv.c index 17bce28fe..dc793f63b 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -408,21 +408,11 @@ long double get_tarval_double(tarval *tv) /* * Access routines for tarval fields ======================================== */ -ir_mode *get_tarval_mode (tarval *tv) /* get the mode of the tarval */ -{ - ANNOUNCE(); - assert(tv); - return tv->mode; -} -/* -void *get_tarval_link (tarval *tv) -{ - ANNOUNCE (); - assert (tv); - return (tv->link); +/* get the mode of the tarval */ +ir_mode *(get_tarval_mode)(const tarval *tv) { + return _get_tarval_mode(tv); } -*/ /* * Special value query functions ============================================ @@ -434,30 +424,24 @@ void *get_tarval_link (tarval *tv) * therefore the irmode functions should be prefered to the functions below. */ -tarval *get_tarval_bad(void) -{ - ANNOUNCE(); - return tarval_bad; +tarval *(get_tarval_bad)(void) { + return _get_tarval_bad(); } -tarval *get_tarval_undefined(void) -{ - ANNOUNCE(); - return tarval_undefined; + +tarval *(get_tarval_undefined)(void) { + return _get_tarval_undefined(); } -tarval *get_tarval_b_false(void) -{ - ANNOUNCE(); - return tarval_b_false; + +tarval *(get_tarval_b_false)(void) { + return _get_tarval_b_false(); } -tarval *get_tarval_b_true(void) -{ - ANNOUNCE(); - return tarval_b_true; + +tarval *(get_tarval_b_true)(void) { + return _get_tarval_b_true(); } -tarval *get_tarval_P_void(void) -{ - ANNOUNCE(); - return tarval_P_void; + +tarval *(get_tarval_P_void)(void) { + return _get_tarval_P_void(); } tarval *get_tarval_max(ir_mode *mode) @@ -613,6 +597,36 @@ tarval *get_tarval_one(ir_mode *mode) return tarval_bad; } +tarval *get_tarval_minus_one(ir_mode *mode) +{ + ANNOUNCE(); + assert(mode); + + if (get_mode_n_vector_elems(mode) > 1) { + /* vector arithmetic not implemented yet */ + return tarval_bad; + } + + switch(get_mode_sort(mode)) + { + case irms_control_flow: + case irms_memory: + case irms_auxiliary: + case irms_internal_boolean: + case irms_reference: + assert(0); + break; + + case irms_float_number: + return mode_is_signed(mode) ? new_tarval_from_double(-1.0, mode) : tarval_bad; + + case irms_int_number: + case irms_character: + return mode_is_signed(mode) ? new_tarval_from_long(-1l, mode) : tarval_bad; + } + return tarval_bad; +} + tarval *get_tarval_nan(ir_mode *mode) { ANNOUNCE(); @@ -763,16 +777,22 @@ int tarval_is_one(tarval *a) /* * comparison */ -pnc_number tarval_cmp(tarval *a, tarval *b) +pn_Cmp tarval_cmp(tarval *a, tarval *b) { ANNOUNCE(); assert(a); assert(b); - if (a == tarval_bad || b == tarval_bad) assert(0 && "Comparison with tarval_bad"); - if (a == tarval_undefined || b == tarval_undefined) return False; - if (a == b) return Eq; - if (a->mode != b->mode) return False; + if (a == tarval_bad || b == tarval_bad) { + assert(0 && "Comparison with tarval_bad"); + return pn_Cmp_False; + } + + if (a == tarval_undefined || b == tarval_undefined) + return pn_Cmp_False; + + if (a->mode != b->mode) + return pn_Cmp_False; if (get_mode_n_vector_elems(a->mode) > 1) { /* vector arithmetic not implemented yet */ @@ -786,24 +806,34 @@ pnc_number tarval_cmp(tarval *a, tarval *b) case irms_memory: case irms_auxiliary: case irms_reference: - return False; + if (a == b) + return pn_Cmp_Eq; + return pn_Cmp_False; case irms_float_number: + /* + * BEWARE: we cannot compare a == b here, because + * a NaN is always Unordered to any other value, even to itself! + */ switch (fc_comp(a->value, b->value)) { - case -1: return Lt; - case 0: assert(0 && "different tarvals compare equal"); return Eq; - case 1: return Gt; - case 2: return Uo; - default: return False; + case -1: return pn_Cmp_Lt; + case 0: return pn_Cmp_Eq; + case 1: return pn_Cmp_Gt; + case 2: return pn_Cmp_Uo; + default: return pn_Cmp_False; } case irms_int_number: case irms_character: - return (sc_comp(a->value, b->value)==1)?(Gt):(Lt); + if (a == b) + return pn_Cmp_Eq; + return sc_comp(a->value, b->value) == 1 ? pn_Cmp_Gt : pn_Cmp_Lt; case irms_internal_boolean: - return (a == tarval_b_true)?(Gt):(Lt); + if (a == b) + return pn_Cmp_Eq; + return a == tarval_b_true ? pn_Cmp_Gt : pn_Cmp_Lt; } - return False; + return pn_Cmp_False; } /* @@ -1581,7 +1611,7 @@ int set_tarval_mode_output_option(ir_mode *mode, const tarval_mode_info *modein /* * Returns the output options of one mode. * - * This functions returns the modinfo of a given mode. + * This functions returns the mode info of a given mode. */ const tarval_mode_info *get_tarval_mode_output_option(ir_mode *mode) {