X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftv%2Ftv.c;h=47ef2d4b6a53c94332b147bea1b3e05282ff91ce;hb=e3b765fcef0e337f4fe2e17d57d2fbaf1912ec79;hp=d15de356781b634dbfd4a210a3e05f1757b439f8;hpb=f82110689db75f46a28ec31e76f510d0fba2ecb2;p=libfirm diff --git a/ir/tv/tv.c b/ir/tv/tv.c index d15de3567..47ef2d4b6 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -100,18 +100,6 @@ static tarval_int_overflow_mode_t int_overflow_mode = TV_OVERFLOW_WRAP; /** if this is set non-zero, the constant folding for floating point is OFF */ static int no_float = 0; -/** IEEE-754r half precision */ -static const ieee_descriptor_t half_desc = { 5, 10, 0 }; -/** IEEE-754 single precision */ -static const ieee_descriptor_t single_desc = { 8, 23, 0 }; -/** IEEE-754 double precision */ -static const ieee_descriptor_t double_desc = { 11, 52, 0 }; -/** Intel x87 extended precision */ -static const ieee_descriptor_t extended_desc = { 15, 63, 1 }; - -/** IEEE-754r quad precision */ -static const ieee_descriptor_t quad_desc = { 15, 112, 0 }; - /**************************************************************************** * private functions ****************************************************************************/ @@ -304,22 +292,9 @@ ir_tarval *tarval_unreachable = &reserved_tv[5]; /** * get the float descriptor for given mode. */ -static const ieee_descriptor_t *get_descriptor(const ir_mode *mode) -{ - switch (get_mode_size_bits(mode)) { - case 16: return &half_desc; - case 32: return &single_desc; - case 64: return &double_desc; - case 80: - case 96: - case 128: return &extended_desc; /* FIXME: HACK for x86 where we have - sizeof(long double)==16 with 10 byte - real payload */ - /* case 128: return &quad_desc; */ - default: - (void) quad_desc; - panic("Unsupported mode in get_descriptor()"); - } +static const float_descriptor_t *get_descriptor(const ir_mode *mode) +{ + return &mode->float_desc; } ir_tarval *new_integer_tarval_from_str(const char *str, size_t len, char sign, @@ -393,18 +368,13 @@ static ir_tarval *new_tarval_from_str_int(const char *str, size_t len, */ ir_tarval *new_tarval_from_str(const char *str, size_t len, ir_mode *mode) { - const ieee_descriptor_t *desc; + const float_descriptor_t *desc; assert(str); assert(len); assert(mode); switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - panic("Unsupported tarval creation with mode %F", mode); - case irms_internal_boolean: /* match [tT][rR][uU][eE]|[fF][aA][lL][sS][eE] */ if (!strcasecmp(str, "true")) @@ -426,8 +396,9 @@ ir_tarval *new_tarval_from_str(const char *str, size_t len, ir_mode *mode) /* FALLTHROUGH */ case irms_int_number: return new_tarval_from_str_int(str, len, mode); + default: + panic("Unsupported tarval creation with mode %F", mode); } - panic("Unsupported tarval creation with mode %F", mode); } /* @@ -483,7 +454,7 @@ long get_tarval_long(ir_tarval* tv) ir_tarval *new_tarval_from_long_double(long double d, ir_mode *mode) { - const ieee_descriptor_t *desc; + const float_descriptor_t *desc; assert(mode && (get_mode_sort(mode) == irms_float_number)); desc = get_descriptor(mode); @@ -569,14 +540,9 @@ ir_tarval *(get_tarval_unreachable)(void) ir_tarval *get_tarval_max(ir_mode *mode) { - const ieee_descriptor_t *desc; + const float_descriptor_t *desc; switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - panic("mode %F does not support maximum value", mode); - case irms_internal_boolean: return tarval_b_true; @@ -589,20 +555,16 @@ ir_tarval *get_tarval_max(ir_mode *mode) case irms_int_number: sc_max_from_bits(get_mode_size_bits(mode), mode_is_signed(mode), NULL); return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode); + default: + panic("mode %F does not support maximum value", mode); } - return tarval_bad; } ir_tarval *get_tarval_min(ir_mode *mode) { - const ieee_descriptor_t *desc; + const float_descriptor_t *desc; switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - panic("mode %F does not support minimum value", mode); - case irms_internal_boolean: return tarval_b_false; @@ -615,8 +577,9 @@ ir_tarval *get_tarval_min(ir_mode *mode) case irms_int_number: sc_min_from_bits(get_mode_size_bits(mode), mode_is_signed(mode), NULL); return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode); + default: + panic("mode %F does not support minimum value", mode); } - return tarval_bad; } /** The bit pattern for the pointer NULL */ @@ -625,11 +588,6 @@ static long _null_value = 0; ir_tarval *get_tarval_null(ir_mode *mode) { switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - panic("mode %F does not support null value", mode); - case irms_float_number: return new_tarval_from_double(0.0, mode); @@ -639,18 +597,14 @@ ir_tarval *get_tarval_null(ir_mode *mode) case irms_reference: return new_tarval_from_long(_null_value, mode); + default: + panic("mode %F does not support null value", mode); } - return tarval_bad; } ir_tarval *get_tarval_one(ir_mode *mode) { switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - panic("mode %F does not support one value", mode); - case irms_internal_boolean: return tarval_b_true; @@ -660,28 +614,25 @@ ir_tarval *get_tarval_one(ir_mode *mode) case irms_reference: case irms_int_number: return new_tarval_from_long(1l, mode); + default: + panic("mode %F does not support one value", mode); } - return tarval_bad; } ir_tarval *get_tarval_all_one(ir_mode *mode) { switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - panic("mode %F does not support all-one value", mode); - case irms_int_number: case irms_internal_boolean: case irms_reference: return tarval_not(get_mode_null(mode)); - case irms_float_number: return new_tarval_from_double(1.0, mode); + + default: + panic("mode %F does not support all-one value", mode); } - return tarval_bad; } int tarval_is_constant(ir_tarval *tv) @@ -696,12 +647,6 @@ int tarval_is_constant(ir_tarval *tv) ir_tarval *get_tarval_minus_one(ir_mode *mode) { switch (get_mode_sort(mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - case irms_internal_boolean: - panic("mode %F does not support minus one value", mode); - case irms_reference: return tarval_bad; @@ -710,13 +655,15 @@ ir_tarval *get_tarval_minus_one(ir_mode *mode) case irms_int_number: return new_tarval_from_long(-1l, mode); + + default: + panic("mode %F does not support minus one value", mode); } - return tarval_bad; } ir_tarval *get_tarval_nan(ir_mode *mode) { - const ieee_descriptor_t *desc; + const float_descriptor_t *desc; if (get_mode_sort(mode) == irms_float_number) { desc = get_descriptor(mode); @@ -729,7 +676,7 @@ ir_tarval *get_tarval_nan(ir_mode *mode) ir_tarval *get_tarval_plus_inf(ir_mode *mode) { if (get_mode_sort(mode) == irms_float_number) { - const ieee_descriptor_t *desc = get_descriptor(mode); + const float_descriptor_t *desc = get_descriptor(mode); fc_get_plusinf(desc, NULL); return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode); } else @@ -739,7 +686,7 @@ ir_tarval *get_tarval_plus_inf(ir_mode *mode) ir_tarval *get_tarval_minus_inf(ir_mode *mode) { if (get_mode_sort(mode) == irms_float_number) { - const ieee_descriptor_t *desc = get_descriptor(mode); + const float_descriptor_t *desc = get_descriptor(mode); fc_get_minusinf(desc, NULL); return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode); } else @@ -825,13 +772,6 @@ ir_relation tarval_cmp(ir_tarval *a, ir_tarval *b) /* Here the two tarvals are unequal and of the same mode */ switch (get_mode_sort(a->mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - if (a == b) - return ir_relation_equal; - return ir_relation_false; - case irms_float_number: /* * BEWARE: we cannot compare a == b here, because @@ -854,8 +794,10 @@ ir_relation tarval_cmp(ir_tarval *a, ir_tarval *b) if (a == b) return ir_relation_equal; return a == tarval_b_true ? ir_relation_greater : ir_relation_less; + + default: + panic("can't compare values of mode %F", a->mode); } - return ir_relation_false; } /* @@ -865,7 +807,7 @@ ir_tarval *tarval_convert_to(ir_tarval *src, ir_mode *dst_mode) { char *buffer; fp_value *res = NULL; - const ieee_descriptor_t *desc; + const float_descriptor_t *desc; int len; carry_flag = -1; @@ -877,12 +819,7 @@ ir_tarval *tarval_convert_to(ir_tarval *src, ir_mode *dst_mode) return src; switch (get_mode_sort(src->mode)) { - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - break; - - /* cast float to something */ + /* cast float to something */ case irms_float_number: switch (get_mode_sort(dst_mode)) { case irms_float_number: @@ -958,6 +895,8 @@ ir_tarval *tarval_convert_to(ir_tarval *src, ir_mode *dst_mode) return get_tarval_overflow(buffer, src->length, dst_mode); } break; + default: + return tarval_bad; } return tarval_bad; @@ -1494,21 +1433,9 @@ int tarval_snprintf(char *buf, size_t len, ir_tarval *tv) return snprintf(buf, len, "%s%s%s", prefix, (tv == tarval_b_true) ? "true" : "false", suffix); } - case irms_control_flow: - case irms_memory: - case irms_auxiliary: - if (tv == tarval_bad) - return snprintf(buf, len, ""); - if (tv == tarval_undefined) - return snprintf(buf, len, ""); - if (tv == tarval_unreachable) - return snprintf(buf, len, ""); - if (tv == tarval_reachable) - return snprintf(buf, len, ""); + default: return snprintf(buf, len, ""); } - - return 0; } /** @@ -1662,16 +1589,18 @@ int get_tarval_lowest_bit(ir_tarval *tv) * Returns non-zero if the mantissa of a floating point IEEE-754 * tarval is zero (i.e. 1.0Exxx) */ -int tarval_ieee754_zero_mantissa(ir_tarval *tv) +int tarval_zero_mantissa(ir_tarval *tv) { - assert(get_mode_arithmetic(tv->mode) == irma_ieee754); + assert(get_mode_arithmetic(tv->mode) == irma_ieee754 + || get_mode_arithmetic(tv->mode) == irma_x86_extended_float); return fc_zero_mantissa((const fp_value*) tv->value); } /* Returns the exponent of a floating point IEEE-754 tarval. */ -int tarval_ieee754_get_exponent(ir_tarval *tv) +int tarval_get_exponent(ir_tarval *tv) { - assert(get_mode_arithmetic(tv->mode) == irma_ieee754); + assert(get_mode_arithmetic(tv->mode) == irma_ieee754 + || get_mode_arithmetic(tv->mode) == irma_x86_extended_float); return fc_get_exponent((const fp_value*) tv->value); } @@ -1681,7 +1610,7 @@ int tarval_ieee754_get_exponent(ir_tarval *tv) */ int tarval_ieee754_can_conv_lossless(ir_tarval *tv, ir_mode *mode) { - const ieee_descriptor_t *desc = get_descriptor(mode); + const float_descriptor_t *desc = get_descriptor(mode); return fc_can_lossless_conv_to((const fp_value*) tv->value, desc); } @@ -1691,18 +1620,6 @@ unsigned tarval_ieee754_get_exact(void) return fc_is_exact(); } -/* Return the size of the mantissa in bits (including possible - implicit bits) for the given mode. */ -unsigned tarval_ieee754_get_mantissa_size(const ir_mode *mode) -{ - const ieee_descriptor_t *desc; - - assert(get_mode_arithmetic(mode) == irma_ieee754); - desc = get_descriptor(mode); - - return desc->mantissa_size + desc->explicit_one; -} - /* check if its the a floating point NaN */ int tarval_is_NaN(ir_tarval *tv) {