From: Michael Beck Date: Tue, 12 Sep 2006 07:56:26 +0000 (+0000) Subject: decimal output is now always unsigned for unsigned tarvals X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=8fb3ce50cde68cff60b14725b205a7c80702a115;p=libfirm decimal output is now always unsigned for unsigned tarvals [r8217] --- diff --git a/ir/tv/fltcalc.c b/ir/tv/fltcalc.c index eda9f5ede..105d9623f 100644 --- a/ir/tv/fltcalc.c +++ b/ir/tv/fltcalc.c @@ -1528,7 +1528,7 @@ char *fc_print(const void *a, char *buf, int buflen, unsigned base) case FC_PACKED: default: - snprintf(buf, buflen, "%s", sc_print(_pack(val, mul_1), value_size*4, SC_HEX)); + snprintf(buf, buflen, "%s", sc_print(_pack(val, mul_1), value_size*4, SC_HEX, 0)); buf[buflen - 1] = '\0'; break; } diff --git a/ir/tv/strcalc.c b/ir/tv/strcalc.c index 039d9be64..ec802385e 100644 --- a/ir/tv/strcalc.c +++ b/ir/tv/strcalc.c @@ -45,10 +45,10 @@ #define fail_char(a, b, c, d) _fail_char((a), (b), (c), (d), __FILE__, __LINE__) /* shortcut output for debugging */ -# define sc_print_hex(a) sc_print((a), 0, SC_HEX) -# define sc_print_dec(a) sc_print((a), 0, SC_DEC) -# define sc_print_oct(a) sc_print((a), 0, SC_OCT) -# define sc_print_bin(a) sc_print((a), 0, SC_BIN) +# define sc_print_hex(a) sc_print((a), 0, SC_HEX, 0) +# define sc_print_dec(a) sc_print((a), 0, SC_DEC, 1) +# define sc_print_oct(a) sc_print((a), 0, SC_OCT, 0) +# define sc_print_bin(a) sc_print((a), 0, SC_BIN, 0) #ifdef STRCALC_DEBUG_PRINTCOMP # define DEBUGPRINTF_COMPUTATION(x) printf x @@ -1444,7 +1444,7 @@ unsigned char sc_sub_bits(const void *value, int len, unsigned byte_ofs) * convert to a string * FIXME: Doesn't check buffer bounds */ -const char *sc_print(const void *value, unsigned bits, enum base_t base) +const char *sc_print(const void *value, unsigned bits, enum base_t base, int signed_mode) { static const char big_digits[] = "0123456789ABCDEF"; static const char small_digits[] = "0123456789abcdef"; @@ -1462,7 +1462,7 @@ const char *sc_print(const void *value, unsigned bits, enum base_t base) base_val = alloca(calc_buffer_size); div1_res = alloca(calc_buffer_size); div2_res = alloca(calc_buffer_size); - rem_res = alloca(calc_buffer_size); + rem_res = alloca(calc_buffer_size); pos = output_buffer + bit_pattern_size; *(--pos) = '\0'; @@ -1539,7 +1539,7 @@ const char *sc_print(const void *value, unsigned bits, enum base_t base) p = val; sign = 0; - if (base == SC_DEC) { + if (signed_mode && base == SC_DEC) { /* check for negative values */ if (_bit(val, bits - 1)) { _negate(val, div2_res); diff --git a/ir/tv/strcalc.h b/ir/tv/strcalc.h index fbb92874a..509530694 100644 --- a/ir/tv/strcalc.h +++ b/ir/tv/strcalc.h @@ -150,11 +150,12 @@ unsigned char sc_sub_bits(const void *value, int len, unsigned byte_ofs); /** * Converts a tarval into a string. * - * @param val1 the value pointer - * @param bits number of valid bits in this value - * @param base output base + * @param val1 the value pointer + * @param bits number of valid bits in this value + * @param base output base + * @param signed_mode print it signed (only decimal mode supported */ -const char *sc_print(const void *val1, unsigned bits, enum base_t base); +const char *sc_print(const void *val1, unsigned bits, enum base_t base, int signed_mode); /** Initialize the strcalc module. * Sets up internal data structures and constants diff --git a/ir/tv/tv.c b/ir/tv/tv.c index dd744b76c..63d8e7292 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -923,7 +923,7 @@ tarval *tarval_convert_to(tarval *src, ir_mode *m) /* decimal string representation because hexadecimal output is * interpreted unsigned by fc_val_from_str, so this is a HACK */ snprintf(buffer, 100, "%s", - sc_print(src->value, get_mode_size_bits(src->mode), SC_DEC)); + sc_print(src->value, get_mode_size_bits(src->mode), SC_DEC, mode_is_signed(src->mode))); buffer[100 - 1] = '\0'; switch (get_mode_size_bits(m)) { @@ -1485,17 +1485,17 @@ int tarval_snprintf(char *buf, size_t len, tarval *tv) switch (mode_info->mode_output) { case TVO_DECIMAL: - str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_DEC); + str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_DEC, mode_is_signed(tv->mode)); break; case TVO_OCTAL: - str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_OCT); + str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_OCT, 0); break; case TVO_HEX: case TVO_NATIVE: default: - str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_HEX); + str = sc_print(tv->value, get_mode_size_bits(tv->mode), SC_HEX, 0); break; } return snprintf(buf, len, "%s%s%s", prefix, str, suffix);