This series of patches is from a read-through of wide-int.h and wide-int.cc.
(The series from earlier in the week was from a diff of preexisting files.)
This first patch fixes some comments, typos and formatting. It also
removes some dead code. I'll follow up with a gdb-friendly replacement
for the old dump function.
Tested on x86_64-linux-gnu. OK to install?
Thanks,
Richard
Index: gcc/wide-int.cc
===================================================================
--- gcc/wide-int.cc 2014-04-25 11:33:57.809153807 +0100
+++ gcc/wide-int.cc 2014-04-25 12:33:59.202021025 +0100
@@ -37,12 +37,6 @@ typedef unsigned int UDItype __attribute
#include "longlong.h"
#endif
-/* This is the maximal size of the buffer needed for dump. */
-const unsigned int MAX_SIZE = (4 * (MAX_BITSIZE_MODE_ANY_INT / 4
- + (MAX_BITSIZE_MODE_ANY_INT
- / HOST_BITS_PER_WIDE_INT)
- + 32));
-
static const HOST_WIDE_INT zeros[WIDE_INT_MAX_ELTS] = {};
/*
@@ -51,7 +45,7 @@ static const HOST_WIDE_INT zeros[WIDE_IN
/* Quantities to deal with values that hold half of a wide int. Used
in multiply and divide. */
-#define HALF_INT_MASK (((HOST_WIDE_INT)1 << HOST_BITS_PER_HALF_WIDE_INT) - 1)
+#define HALF_INT_MASK (((HOST_WIDE_INT) 1 << HOST_BITS_PER_HALF_WIDE_INT) - 1)
#define BLOCK_OF(TARGET) ((TARGET) / HOST_BITS_PER_WIDE_INT)
#define BLOCKS_NEEDED(PREC) \
@@ -129,8 +123,8 @@ wi::from_array (HOST_WIDE_INT *val, cons
/* Construct a wide int from a buffer of length LEN. BUFFER will be
read according to byte endianess and word endianess of the target.
- Only the lower LEN bytes of the result are set; the remaining high
- bytes are cleared. */
+ Only the lower BUFFER_LEN bytes of the result are set; the remaining
+ high bytes are cleared. */
wide_int
wi::from_buffer (const unsigned char *buffer, unsigned int buffer_len)
{
@@ -212,7 +206,7 @@ wi::to_mpz (const wide_int_ref &x, mpz_t
mpz_import (result, len, -1, sizeof (HOST_WIDE_INT), 0, 0, v);
}
-/* Returns VAL converted to TYPE. If WRAP is true, then out-of-range
+/* Returns X converted to TYPE. If WRAP is true, then out-of-range
values of VAL will be wrapped; otherwise, they will be set to the
appropriate minimum or maximum TYPE bound. */
wide_int
@@ -243,8 +237,8 @@ wi::from_mpz (const_tree type, mpz_t x,
for representing the value. The code to calculate count is
extracted from the GMP manual, section "Integer Import and Export":
http://gmplib.org/manual/Integer-Import-and-Export.html */
- numb = 8*sizeof(HOST_WIDE_INT);
- count = (mpz_sizeinbase (x, 2) + numb-1) / numb;
+ numb = 8 * sizeof(HOST_WIDE_INT);
+ count = (mpz_sizeinbase (x, 2) + numb - 1) / numb;
HOST_WIDE_INT *val = res.write_val ();
mpz_export (val, &count, -1, sizeof (HOST_WIDE_INT), 0, 0, x);
if (count < 1)
@@ -352,9 +346,8 @@ wi::force_to_size (HOST_WIDE_INT *val, c
where we do allow comparisons of values of different precisions. */
static inline HOST_WIDE_INT
selt (const HOST_WIDE_INT *a, unsigned int len,
- unsigned int blocks_needed,
- unsigned int small_prec,
- unsigned int index, signop sgn)
+ unsigned int blocks_needed, unsigned int small_prec,
+ unsigned int index, signop sgn)
{
HOST_WIDE_INT val;
if (index < len)
@@ -388,7 +381,7 @@ top_bit_of (const HOST_WIDE_INT *a, unsi
/*
* Comparisons, note that only equality is an operator. The other
- * comparisons cannot be operators since they are inherently singed or
+ * comparisons cannot be operators since they are inherently signed or
* unsigned and C++ has no such operators.
*/
@@ -401,7 +394,7 @@ wi::eq_p_large (const HOST_WIDE_INT *op0
int l0 = op0len - 1;
unsigned int small_prec = prec & (HOST_BITS_PER_WIDE_INT - 1);
- while (op0len != op1len)
+ if (op0len != op1len)
return false;
if (op0len == BLOCKS_NEEDED (prec) && small_prec)
@@ -741,7 +734,7 @@ wi::mask (HOST_WIDE_INT *val, unsigned i
unsigned int shift = width & (HOST_BITS_PER_WIDE_INT - 1);
if (shift != 0)
{
- HOST_WIDE_INT last = (((unsigned HOST_WIDE_INT) 1) << shift) - 1;
+ HOST_WIDE_INT last = ((unsigned HOST_WIDE_INT) 1 << shift) - 1;
val[i++] = negate ? ~last : last;
}
else
@@ -774,12 +767,12 @@ wi::shifted_mask (HOST_WIDE_INT *val, un
unsigned int shift = start & (HOST_BITS_PER_WIDE_INT - 1);
if (shift)
{
- HOST_WIDE_INT block = (((unsigned HOST_WIDE_INT) 1) << shift) - 1;
+ HOST_WIDE_INT block = ((unsigned HOST_WIDE_INT) 1 << shift) - 1;
shift = end & (HOST_BITS_PER_WIDE_INT - 1);
if (shift)
{
/* case 000111000 */
- block = (((unsigned HOST_WIDE_INT) 1) << shift) - block - 1;
+ block = ((unsigned HOST_WIDE_INT) 1 << shift) - block - 1;
val[i++] = negate ? ~block : block;
return i;
}
@@ -796,7 +789,7 @@ wi::shifted_mask (HOST_WIDE_INT *val, un
if (shift != 0)
{
/* 000011111 */
- HOST_WIDE_INT block = (((unsigned HOST_WIDE_INT) 1) << shift) - 1;
+ HOST_WIDE_INT block = ((unsigned HOST_WIDE_INT) 1 << shift) - 1;
val[i++] = negate ? ~block : block;
}
else if (end < prec)
@@ -823,7 +816,7 @@ wi::and_large (HOST_WIDE_INT *val, const
if (l0 > l1)
{
HOST_WIDE_INT op1mask = -top_bit_of (op1, op1len, prec);
- if (op1mask == 0)
+ if (op1mask == 0)
{
l0 = l1;
len = l1 + 1;
@@ -1368,7 +1361,7 @@ wi::mul_internal (HOST_WIDE_INT *val, co
{
if (sgn == SIGNED)
{
- if ((HOST_WIDE_INT) (r) != sext_hwi (r, prec))
+ if ((HOST_WIDE_INT) r != sext_hwi (r, prec))
*overflow = true;
}
else
@@ -2133,60 +2126,3 @@ wi::only_sign_bit_p (const wide_int_ref
void gt_ggc_mx (widest_int *) { }
void gt_pch_nx (widest_int *, void (*) (void *, void *), void *) { }
void gt_pch_nx (widest_int *) { }
-
-/*
- * Private debug printing routines.
- */
-#ifdef DEBUG_WIDE_INT
-/* The debugging routines print results of wide operations into the
- dump files of the respective passes in which they were called. */
-static char *
-dumpa (const HOST_WIDE_INT *val, unsigned int len, unsigned int prec, char
*buf)
-{
- int i;
- unsigned int l;
- const char * sep = "";
-
- l = sprintf (buf, "[%d (", prec);
- for (i = len - 1; i >= 0; i--)
- {
- l += sprintf (&buf[l], "%s" HOST_WIDE_INT_PRINT_HEX, sep, val[i]);
- sep = " ";
- }
-
- gcc_assert (len != 0);
-
- l += sprintf (&buf[l], ")]");
-
- gcc_assert (l < MAX_SIZE);
- return buf;
-
-
-}
-#endif
-
-#if 0
-/* The debugging routines print results of wide operations into the
- dump files of the respective passes in which they were called. */
-char *
-wide_int_ro::dump (char* buf) const
-{
- int i;
- unsigned int l;
- const char * sep = "";
-
- l = sprintf (buf, "[%d (", precision);
- for (i = len - 1; i >= 0; i--)
- {
- l += sprintf (&buf[l], "%s" HOST_WIDE_INT_PRINT_HEX, sep, val[i]);
- sep = " ";
- }
-
- gcc_assert (len != 0);
-
- l += sprintf (&buf[l], ")]");
-
- gcc_assert (l < MAX_SIZE);
- return buf;
-}
-#endif
Index: gcc/wide-int.h
===================================================================
--- gcc/wide-int.h 2014-04-25 11:33:57.810153815 +0100
+++ gcc/wide-int.h 2014-04-25 11:33:57.818153878 +0100
@@ -98,8 +98,8 @@ #define WIDE_INT_H
1) Shifts and rotations are just weird. You have to specify a
precision in which the shift or rotate is to happen in. The bits
- above this precision remain unchanged. While this is what you
- want, it is clearly is non obvious.
+ above this precision are zeroed. While this is what you
+ want, it is clearly non obvious.
2) Larger precision math sometimes does not produce the same
answer as would be expected for doing the math at the proper
@@ -149,7 +149,7 @@ #define WIDE_INT_H
wide_int x = t;
However, a little more syntax is required for rtl constants since
- they do have an explicit precision. To make an rtl into a
+ they do not have an explicit precision. To make an rtl into a
wide_int, you have to pair it with a mode. The canonical way to do
this is with std::make_pair as in:
@@ -159,8 +159,8 @@ #define WIDE_INT_H
Similarly, a wide_int can only be constructed from a host value if
the target precision is given explicitly, such as in:
- wide_int x = wi::shwi (c, prec); // sign-extend X if necessary
- wide_int y = wi::uhwi (c, prec); // zero-extend X if necessary
+ wide_int x = wi::shwi (c, prec); // sign-extend C if necessary
+ wide_int y = wi::uhwi (c, prec); // zero-extend C if necessary
However, offset_int and widest_int have an inherent precision and so
can be initialized directly from a host value:
@@ -223,15 +223,11 @@ #define WIDE_INT_H
#include "signop.h"
#include "insn-modes.h"
-#if 0
-#define DEBUG_WIDE_INT
-#endif
-
/* The MAX_BITSIZE_MODE_ANY_INT is automatically generated by a very
early examination of the target's mode file. The WIDE_INT_MAX_ELTS
can accomodate at least 1 more bit so that unsigned numbers of that
- mode can be represented. Note that it is still possible to create
- fixed_wide_ints that have precisions greater than
+ mode can be represented as a signed value. Note that it is still
+ possible to create fixed_wide_ints that have precisions greater than
MAX_BITSIZE_MODE_ANY_INT. This can be useful when representing a
double-width multiplication result, for example. */
#define WIDE_INT_MAX_ELTS \
@@ -251,11 +247,12 @@ #define ADDR_MAX_BITSIZE 64
/* This is the internal precision used when doing any address
arithmetic. The '4' is really 3 + 1. Three of the bits are for
- the number of extra bits needed to do bit addresses and single bit is
- allow everything to be signed without loosing any precision. Then
- everything is rounded up to the next HWI for efficiency. */
+ the number of extra bits needed to do bit addresses and the other bit
+ is to allow everything to be signed without loosing any precision.
+ Then everything is rounded up to the next HWI for efficiency. */
#define ADDR_MAX_PRECISION \
- ((ADDR_MAX_BITSIZE + 4 + HOST_BITS_PER_WIDE_INT - 1) &
~(HOST_BITS_PER_WIDE_INT - 1))
+ ((ADDR_MAX_BITSIZE + 4 + HOST_BITS_PER_WIDE_INT - 1) \
+ & ~(HOST_BITS_PER_WIDE_INT - 1))
/* The number of HWIs needed to store an offset_int. */
#define OFFSET_INT_ELTS (ADDR_MAX_PRECISION / HOST_BITS_PER_WIDE_INT)
@@ -270,9 +267,9 @@ #define WI_UNARY_RESULT(T) \
typename wi::unary_traits <T>::result_type
/* Define a variable RESULT to hold the result of a binary operation on
- X and Y, which have types T1 and T2 respectively. Define VAR to
+ X and Y, which have types T1 and T2 respectively. Define VAL to
point to the blocks of RESULT. Once the user of the macro has
- filled in VAR, it should call RESULT.set_len to set the number
+ filled in VAL, it should call RESULT.set_len to set the number
of initialized blocks. */
#define WI_BINARY_RESULT_VAR(RESULT, VAL, T1, X, T2, Y) \
WI_BINARY_RESULT (T1, T2) RESULT = \
@@ -712,8 +709,6 @@ #define INCDEC_OPERATOR(OP, DELTA) \
#undef ASSIGNMENT_OPERATOR
#undef INCDEC_OPERATOR
- char *dump (char *) const;
-
static const bool is_sign_extended
= wi::int_traits <generic_wide_int <storage> >::is_sign_extended;
};
@@ -2568,6 +2563,7 @@ wi::div_ceil (const T1 &x, const T2 &y,
return quotient;
}
+/* Return X / Y, rouding towards +inf. Treat X and Y as unsigned values. */
template <typename T1, typename T2>
inline WI_BINARY_RESULT (T1, T2)
wi::udiv_ceil (const T1 &x, const T2 &y)
@@ -2923,8 +2919,7 @@ wi::arshift (const T1 &x, const T2 &y)
}
/* Return X >> Y, using an arithmetic shift if SGN is SIGNED and a
- logical shift otherwise. If BITSIZE is nonzero, only use the low
- BITSIZE bits of Y. */
+ logical shift otherwise. */
template <typename T1, typename T2>
inline WI_UNARY_RESULT (T1)
wi::rshift (const T1 &x, const T2 &y, signop sgn)
@@ -2982,8 +2977,7 @@ wi::parity (const wide_int_ref &x)
/* Extract WIDTH bits from X, starting at BITPOS. */
template <typename T>
inline unsigned HOST_WIDE_INT
-wi::extract_uhwi (const T &x, unsigned int bitpos,
- unsigned int width)
+wi::extract_uhwi (const T &x, unsigned int bitpos, unsigned int width)
{
unsigned precision = get_precision (x);
if (precision < bitpos + width)