diff mbox

Fix wide_int unsigned division (PR tree-optimization/69546, take 2)

Message ID 20160201202527.GL3017@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Feb. 1, 2016, 8:25 p.m. UTC
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.


	Jakub

Comments

Richard Sandiford Feb. 2, 2016, 3:49 p.m. UTC | #1
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
diff mbox

Patch

--- 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;
     }