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


you are about an hour behind in reading your email. I had just committed a patch that is very close to this.

On 08/27/2013 02:31 PM, Richard Sandiford wrote:
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]