On Tue, 27 Aug 2013, Richard Sandiford wrote: > Kenneth Zadeck <zad...@naturalbridge.com> writes: > > fixed fits_uhwi_p. > > > > tested on x86-64. > > > > kenny > > > > Index: gcc/wide-int.h > > =================================================================== > > --- gcc/wide-int.h (revision 201985) > > +++ gcc/wide-int.h (working copy) > > @@ -1650,7 +1650,7 @@ wide_int_ro::fits_shwi_p () const > > inline bool > > wide_int_ro::fits_uhwi_p () const > > { > > - return len == 1 || (len == 2 && val[1] == 0); > > + return (len == 1 && val[0] >= 0) || (len == 2 && val[1] == 0); > > } > > With upper bits being undefined, it doesn't seem safe to check
Err - we're back at upper bits being undefined? Ugh. Then having both fits_uhwi_p and fits_shwi_p doesn't make sense. > val[0] or val[1] like this. I was thinking along the lines of: > > inline bool > wide_int_ro::fits_uhwi_p () const > { > if (precision <= HOST_BITS_PER_WIDE_INT) > return true; > if (len == 1) > return val[0] >= 0; > if (precision < HOST_BITS_PER_WIDE_INT * 2) > return ((unsigned HOST_WIDE_INT) val[1] > << (HOST_BITS_PER_WIDE_INT * 2 - precision)) == 0; > return val[1] == 0; > } > > Since we don't have a sign, everything HWI-sized or smaller fits in a > uhwi without loss of precision. Which then means fits_hwi_p () is simply if (precision <= HOST_BITS_PER_WIDE_INT) return true; zext (); // ick, modification in a predicate! stupid undefined bits! return len == 1 || (len == 2 && val[1] == 0); but if upper bits are undefined then the whole encoding and len business is broken. Richard.