+2017-10-26 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * 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.
+
2017-10-26 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* configure.ac (gcc_cv_as_ix86_xbrace_comment): Check if assembler
}
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));
}
}
VALUE_TYPE a = from_int<VALUE_TYPE> (42);
assert_deceq ("42", a, SIGNED);
assert_hexeq ("0x2a", a);
+ assert_hexeq ("0x1fffffffffffffffff", wi::shwi (-1, 69));
+ assert_hexeq ("0xffffffffffffffff", wi::mask (64, false, 69));
+ assert_hexeq ("0xffffffffffffffff", wi::mask <widest_int> (64, false));
+ if (WIDE_INT_MAX_PRECISION > 128)
+ {
+ assert_hexeq ("0x20000000000000000fffffffffffffffe",
+ wi::lshift (1, 129) + wi::lshift (1, 64) - 2);
+ assert_hexeq ("0x200000000000004000123456789abcdef",
+ wi::lshift (1, 129) + wi::lshift (1, 74)
+ + wi::lshift (0x1234567, 32) + 0x89abcdef);
+ }
}
/* Verify that various operations work correctly for VALUE_TYPE,