This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: wide-int branch updated


Kenneth Zadeck <zadeck@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
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.

I've tested the above on x86_64-linux-gnu FWIW, in case it looks OK.

Thanks,
Richard


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]