decimal output is now always unsigned for unsigned tarvals
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 12 Sep 2006 07:56:26 +0000 (07:56 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 12 Sep 2006 07:56:26 +0000 (07:56 +0000)
[r8217]

ir/tv/fltcalc.c
ir/tv/strcalc.c
ir/tv/strcalc.h
ir/tv/tv.c

index eda9f5e..105d962 100644 (file)
@@ -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;
   }
index 039d9be..ec80238 100644 (file)
 #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);
index fbb9287..5095306 100644 (file)
@@ -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
index dd744b7..63d8e72 100644 (file)
@@ -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);