Message ID | 20160201202527.GL3017@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
Jakub Jelinek <jakub@redhat.com> writes: > On Sat, Jan 30, 2016 at 02:04:45PM +0000, Richard Sandiford wrote: >> Not sure what to call it. Maybe canonize_uhwi? Like canonize, except >> that it takes a uhwi instead of a length. >> >> > Can that be done as a follow-up? Certainly it would need >> > to take the uhwi to store, pointer to the array of hwis, and precision. >> >> Yeah, guess it can wait. > > So like this? > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2016-02-01 Jakub Jelinek <jakub@redhat.com> > > * wide-int.cc (canonize_uhwi): New function. > (wi::divmod_internal): Use it. > > --- gcc/wide-int.cc.jj 2016-01-30 19:03:35.000000000 +0100 > +++ gcc/wide-int.cc 2016-02-01 12:28:23.501519292 +0100 > @@ -118,6 +118,20 @@ canonize (HOST_WIDE_INT *val, unsigned i > return 1; > } > > +/* VAL[0] is unsigned result of operation. Canonize it by adding > + another 0 block if needed, and return number of blocks needed. */ > + > +static inline unsigned int > +canonize_uhwi (HOST_WIDE_INT *val, unsigned int precision) s/is unsigned result of operation/is the unsigned result of an operation/ LGTM otherwise, thanks. Richard
--- gcc/wide-int.cc.jj 2016-01-30 19:03:35.000000000 +0100 +++ gcc/wide-int.cc 2016-02-01 12:28:23.501519292 +0100 @@ -118,6 +118,20 @@ canonize (HOST_WIDE_INT *val, unsigned i return 1; } +/* VAL[0] is unsigned result of operation. Canonize it by adding + another 0 block if needed, and return number of blocks needed. */ + +static inline unsigned int +canonize_uhwi (HOST_WIDE_INT *val, unsigned int precision) +{ + if (val[0] < 0 && precision > HOST_BITS_PER_WIDE_INT) + { + val[1] = 0; + return 2; + } + return 1; +} + /* * Conversion routines in and out of wide_int. */ @@ -1793,25 +1807,12 @@ wi::divmod_internal (HOST_WIDE_INT *quot if (quotient) { quotient[0] = o0 / o1; - if (o1 == 1 - && (HOST_WIDE_INT) o0 < 0 - && dividend_prec > HOST_BITS_PER_WIDE_INT) - { - quotient[1] = 0; - quotient_len = 2; - } + quotient_len = canonize_uhwi (quotient, dividend_prec); } if (remainder) { remainder[0] = o0 % o1; - if ((HOST_WIDE_INT) remainder[0] < 0 - && dividend_prec > HOST_BITS_PER_WIDE_INT) - { - remainder[1] = 0; - *remainder_len = 2; - } - else - *remainder_len = 1; + *remainder_len = canonize_uhwi (remainder, dividend_prec); } return quotient_len; }