aboutsummaryrefslogtreecommitdiff
path: root/gcc/wide-int-print.cc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-10-26 16:09:17 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-10-26 16:09:17 +0000
commit7984457f8295811880c37e7861aa7c0454ce9845 (patch)
tree8520bb6366825f7c10916bd90242062701968241 /gcc/wide-int-print.cc
parent18b279715c298992748426a41083ec76f3875bfa (diff)
downloadgcc-7984457f8295811880c37e7861aa7c0454ce9845.zip
gcc-7984457f8295811880c37e7861aa7c0454ce9845.tar.gz
gcc-7984457f8295811880c37e7861aa7c0454ce9845.tar.bz2
Stop print_hex from printing bits above the precision
2017-10-26 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * wide-int-print.cc (print_hex): Loop based on extract_uhwi. Don't print any bits outside the precision of the value. * wide-int.cc (test_printing): Add some new tests. From-SVN: r254109
Diffstat (limited to 'gcc/wide-int-print.cc')
-rw-r--r--gcc/wide-int-print.cc34
1 files changed, 16 insertions, 18 deletions
diff --git a/gcc/wide-int-print.cc b/gcc/wide-int-print.cc
index 36d8ad8..8874e81 100644
--- a/gcc/wide-int-print.cc
+++ b/gcc/wide-int-print.cc
@@ -103,30 +103,28 @@ print_decu (const wide_int_ref &wi, FILE *file)
}
void
-print_hex (const wide_int_ref &wi, char *buf)
+print_hex (const wide_int_ref &val, char *buf)
{
- int i = wi.get_len ();
-
- if (wi == 0)
+ if (val == 0)
buf += sprintf (buf, "0x0");
else
{
- if (wi::neg_p (wi))
+ buf += sprintf (buf, "0x");
+ int start = ROUND_DOWN (val.get_precision (), HOST_BITS_PER_WIDE_INT);
+ int width = val.get_precision () - start;
+ bool first_p = true;
+ for (int i = start; i >= 0; i -= HOST_BITS_PER_WIDE_INT)
{
- int j;
- /* If the number is negative, we may need to pad value with
- 0xFFF... because the leading elements may be missing and
- we do not print a '-' with hex. */
- buf += sprintf (buf, "0x");
- for (j = BLOCKS_NEEDED (wi.get_precision ()); j > i; j--)
- buf += sprintf (buf, HOST_WIDE_INT_PRINT_PADDED_HEX, HOST_WIDE_INT_M1);
-
+ unsigned HOST_WIDE_INT uhwi = wi::extract_uhwi (val, i, width);
+ if (!first_p)
+ buf += sprintf (buf, HOST_WIDE_INT_PRINT_PADDED_HEX, uhwi);
+ else if (uhwi != 0)
+ {
+ buf += sprintf (buf, HOST_WIDE_INT_PRINT_HEX_PURE, uhwi);
+ first_p = false;
+ }
+ width = HOST_BITS_PER_WIDE_INT;
}
- else
- buf += sprintf (buf, "0x" HOST_WIDE_INT_PRINT_HEX_PURE, wi.elt (--i));
-
- while (--i >= 0)
- buf += sprintf (buf, HOST_WIDE_INT_PRINT_PADDED_HEX, wi.elt (i));
}
}