On Wed, 16 Oct 2013, Kenneth Zadeck wrote: > On 10/15/2013 02:30 PM, Richard Sandiford wrote: > > Richard Sandiford <rdsandif...@googlemail.com> writes: > > > if (small_prec) > > > ; > > > else if (precision == xprecision) > > > while (len >= 0 && val[len - 1] == -1) > > > len--; > > Err, len > 0 obviously. > you were only close. patch tested on ppc and committed as revision 203739. > > Index: gcc/tree.c > =================================================================== > --- gcc/tree.c (revision 203701) > +++ gcc/tree.c (working copy) > @@ -1204,7 +1204,7 @@ wide_int_to_tree (tree type, const wide_ > } > > wide_int cst = wide_int::from (pcst, prec, sgn); > - unsigned int len = int (cst.get_len ()); > + unsigned int len = cst.get_len (); > unsigned int small_prec = prec & (HOST_BITS_PER_WIDE_INT - 1); > bool recanonize = sgn == UNSIGNED > && small_prec > Index: gcc/tree.h > =================================================================== > --- gcc/tree.h (revision 203701) > +++ gcc/tree.h (working copy) > @@ -5204,13 +5204,13 @@ wi::int_traits <const_tree>::decompose ( > scratch[len - 1] = sext_hwi (val[len - 1], precision); > return wi::storage_ref (scratch, len, precision); > } > - } > - > - if (precision < xprecision + HOST_BITS_PER_WIDE_INT) > - { > - len = wi::force_to_size (scratch, val, len, xprecision, precision, > UNS > IGNED); > - return wi::storage_ref (scratch, len, precision); > - } > + } > + /* We have to futz here because a large unsigned int with > + precision 128 may look (0x0 0xFFFFFFFFFFFFFFFF 0xF...) as a > + tree-cst and as (0xF...) as a wide-int. */ > + else if (precision == xprecision && len == max_len) > + while (len > 1 && val[len - 1] == (HOST_WIDE_INT)-1) > + len--; > }
Err, that now undoes the extra zero word thing? Or was I confused about the previous code and this "append extra zero word for MSB set unsigned constants"? Richard.