On Sun, Mar 31, 2013 at 7:51 PM, Kenneth Zadeck <zad...@naturalbridge.com> wrote: > richard, > > I was able to add everything except for the checking asserts. While I > think that this is a reasonable idea, it is difficult to add that to a > function that is defined in hwint.h because of circular includes. I could > move this another file (though this appears to be the logical correct place > for it), or we can do without the asserts. > > The context is that [sz]ext_hwi is that are used are over the compiler but > are generally written out long. The wide-int class uses them also, but > wide-int did not see like the right place for them to live and i believe > that you suggested that i move them. > > ok to commit, or do you have a suggested resolution to the assert issue?
Yes, do #ifdef ENABLE_CHECKING extern HOST_WIDE_INT sext_hwi (HOST_WIDE_INT, unsigned int); #else +/* Sign extend SRC starting from PREC. */ + +static inline HOST_WIDE_INT +sext_hwi (HOST_WIDE_INT src, unsigned int prec) +{ + if (prec == HOST_BITS_PER_WIDE_INT) + return src; + else + { int shift = HOST_BITS_PER_WIDE_INT - prec; + return (src << shift) >> shift; + } +} #endif and for ENABLE_CHECKING only provide an out-of-line implementation in hwint.c. That's how we did it with abs_hwi (well, we just do not provide an inline variant there - that's another possibility). Note that hwint.h is always included after config.h so the ENABLE_CHECKING definition should be available. Richard. > > kenny > > > On 03/27/2013 10:13 AM, Richard Biener wrote: >> >> On Wed, Feb 27, 2013 at 1:22 AM, Kenneth Zadeck >> <zad...@naturalbridge.com> wrote: >>> >>> Here is the first of my wide int patches with joseph's comments and the >>> patch rot removed. >>> >>> I would like to get these pre approved for the next stage 1. >> >> + int shift = HOST_BITS_PER_WIDE_INT - (prec & >> (HOST_BITS_PER_WIDE_INT - 1)); >> >> I think this should gcc_checking_assert that prec is not out of range >> (any reason why prec is signed int and not unsigned int?) rather than >> ignore bits in prec. >> >> +static inline HOST_WIDE_INT >> +zext_hwi (HOST_WIDE_INT src, int prec) >> +{ >> + if (prec == HOST_BITS_PER_WIDE_INT) >> + return src; >> + else >> + return src & (((HOST_WIDE_INT)1 >> + << (prec & (HOST_BITS_PER_WIDE_INT - 1))) - 1); >> +} >> >> likewise. Also I'm not sure I agree about the signedness of the result / >> src. >> zext_hwi (-1, HOST_BITS_PER_WIDE_INT) < 0 is true which is odd. >> >> The patch misses context of uses, so I'm not sure what the above functions >> are intended to do. >> >> Richard. >> >>> On 10/05/2012 08:14 PM, Joseph S. Myers wrote: >>>> >>>> On Fri, 5 Oct 2012, Kenneth Zadeck wrote: >>>> >>>>> +# define HOST_HALF_WIDE_INT_PRINT "h" >>>> >>>> This may cause problems on hosts not supporting %hd (MinGW?), and >>>> there's >>>> no real need for using "h" here given the promotion of short to int; you >>>> can just use "" (rather than e.g. needing special handling in >>>> xm-mingw32.h >>>> like is done for HOST_LONG_LONG_FORMAT). >>>> >