1 /* Operations with long integers.
2    Copyright (C) 2006-2014 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"			/* For BITS_PER_UNIT and *_BIG_ENDIAN.  */
24 #include "tree.h"
25 
26 static int add_double_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
27 				 unsigned HOST_WIDE_INT, HOST_WIDE_INT,
28 				 unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
29 				 bool);
30 
31 #define add_double(l1,h1,l2,h2,lv,hv) \
32   add_double_with_sign (l1, h1, l2, h2, lv, hv, false)
33 
34 static int neg_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
35 		       unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
36 
37 static int mul_double_wide_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
38 				      unsigned HOST_WIDE_INT, HOST_WIDE_INT,
39 				      unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
40 				      unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
41 				      bool);
42 
43 #define mul_double(l1,h1,l2,h2,lv,hv) \
44   mul_double_wide_with_sign (l1, h1, l2, h2, lv, hv, NULL, NULL, false)
45 
46 static int div_and_round_double (unsigned, int, unsigned HOST_WIDE_INT,
47 				 HOST_WIDE_INT, unsigned HOST_WIDE_INT,
48 				 HOST_WIDE_INT, unsigned HOST_WIDE_INT *,
49 				 HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
50 				 HOST_WIDE_INT *);
51 
52 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
53    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
54    and SUM1.  Then this yields nonzero if overflow occurred during the
55    addition.
56 
57    Overflow occurs if A and B have the same sign, but A and SUM differ in
58    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
59    sign.  */
60 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
61 
62 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
63    We do that by representing the two-word integer in 4 words, with only
64    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
65    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
66 
67 #define LOWPART(x) \
68   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
69 #define HIGHPART(x) \
70   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
71 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
72 
73 /* Unpack a two-word integer into 4 words.
74    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
75    WORDS points to the array of HOST_WIDE_INTs.  */
76 
77 static void
encode(HOST_WIDE_INT * words,unsigned HOST_WIDE_INT low,HOST_WIDE_INT hi)78 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
79 {
80   words[0] = LOWPART (low);
81   words[1] = HIGHPART (low);
82   words[2] = LOWPART (hi);
83   words[3] = HIGHPART (hi);
84 }
85 
86 /* Pack an array of 4 words into a two-word integer.
87    WORDS points to the array of words.
88    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
89 
90 static void
decode(HOST_WIDE_INT * words,unsigned HOST_WIDE_INT * low,HOST_WIDE_INT * hi)91 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
92 	HOST_WIDE_INT *hi)
93 {
94   *low = words[0] + words[1] * BASE;
95   *hi = words[2] + words[3] * BASE;
96 }
97 
98 /* Add two doubleword integers with doubleword result.
99    Return nonzero if the operation overflows according to UNSIGNED_P.
100    Each argument is given as two `HOST_WIDE_INT' pieces.
101    One argument is L1 and H1; the other, L2 and H2.
102    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
103 
104 static int
add_double_with_sign(unsigned HOST_WIDE_INT l1,HOST_WIDE_INT h1,unsigned HOST_WIDE_INT l2,HOST_WIDE_INT h2,unsigned HOST_WIDE_INT * lv,HOST_WIDE_INT * hv,bool unsigned_p)105 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
106 		      unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
107 		      unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
108 		      bool unsigned_p)
109 {
110   unsigned HOST_WIDE_INT l;
111   HOST_WIDE_INT h;
112 
113   l = l1 + l2;
114   h = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) h1
115 		       + (unsigned HOST_WIDE_INT) h2
116 		       + (l < l1));
117 
118   *lv = l;
119   *hv = h;
120 
121   if (unsigned_p)
122     return ((unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1
123 	    || (h == h1
124 		&& l < l1));
125   else
126     return OVERFLOW_SUM_SIGN (h1, h2, h);
127 }
128 
129 /* Negate a doubleword integer with doubleword result.
130    Return nonzero if the operation overflows, assuming it's signed.
131    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
132    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
133 
134 static int
neg_double(unsigned HOST_WIDE_INT l1,HOST_WIDE_INT h1,unsigned HOST_WIDE_INT * lv,HOST_WIDE_INT * hv)135 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
136 	    unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
137 {
138   if (l1 == 0)
139     {
140       *lv = 0;
141       *hv = - (unsigned HOST_WIDE_INT) h1;
142       return (*hv & h1) < 0;
143     }
144   else
145     {
146       *lv = -l1;
147       *hv = ~h1;
148       return 0;
149     }
150 }
151 
152 /* Multiply two doubleword integers with quadword result.
153    Return nonzero if the operation overflows according to UNSIGNED_P.
154    Each argument is given as two `HOST_WIDE_INT' pieces.
155    One argument is L1 and H1; the other, L2 and H2.
156    The value is stored as four `HOST_WIDE_INT' pieces in *LV and *HV,
157    *LW and *HW.
158    If lw is NULL then only the low part and no overflow is computed.  */
159 
160 static int
mul_double_wide_with_sign(unsigned HOST_WIDE_INT l1,HOST_WIDE_INT h1,unsigned HOST_WIDE_INT l2,HOST_WIDE_INT h2,unsigned HOST_WIDE_INT * lv,HOST_WIDE_INT * hv,unsigned HOST_WIDE_INT * lw,HOST_WIDE_INT * hw,bool unsigned_p)161 mul_double_wide_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
162 			   unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
163 			   unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
164 			   unsigned HOST_WIDE_INT *lw, HOST_WIDE_INT *hw,
165 			   bool unsigned_p)
166 {
167   HOST_WIDE_INT arg1[4];
168   HOST_WIDE_INT arg2[4];
169   HOST_WIDE_INT prod[4 * 2];
170   unsigned HOST_WIDE_INT carry;
171   int i, j, k;
172   unsigned HOST_WIDE_INT neglow;
173   HOST_WIDE_INT neghigh;
174 
175   encode (arg1, l1, h1);
176   encode (arg2, l2, h2);
177 
178   memset (prod, 0, sizeof prod);
179 
180   for (i = 0; i < 4; i++)
181     {
182       carry = 0;
183       for (j = 0; j < 4; j++)
184 	{
185 	  k = i + j;
186 	  /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
187 	  carry += (unsigned HOST_WIDE_INT) arg1[i] * arg2[j];
188 	  /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
189 	  carry += prod[k];
190 	  prod[k] = LOWPART (carry);
191 	  carry = HIGHPART (carry);
192 	}
193       prod[i + 4] = carry;
194     }
195 
196   decode (prod, lv, hv);
197 
198   /* We are not interested in the wide part nor in overflow.  */
199   if (lw == NULL)
200     return 0;
201 
202   decode (prod + 4, lw, hw);
203 
204   /* Unsigned overflow is immediate.  */
205   if (unsigned_p)
206     return (*lw | *hw) != 0;
207 
208   /* Check for signed overflow by calculating the signed representation of the
209      top half of the result; it should agree with the low half's sign bit.  */
210   if (h1 < 0)
211     {
212       neg_double (l2, h2, &neglow, &neghigh);
213       add_double (neglow, neghigh, *lw, *hw, lw, hw);
214     }
215   if (h2 < 0)
216     {
217       neg_double (l1, h1, &neglow, &neghigh);
218       add_double (neglow, neghigh, *lw, *hw, lw, hw);
219     }
220   return (*hv < 0 ? ~(*lw & *hw) : *lw | *hw) != 0;
221 }
222 
223 /* Shift the doubleword integer in L1, H1 right by COUNT places
224    keeping only PREC bits of result.  ARITH nonzero specifies
225    arithmetic shifting; otherwise use logical shift.
226    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
227 
228 static void
rshift_double(unsigned HOST_WIDE_INT l1,HOST_WIDE_INT h1,unsigned HOST_WIDE_INT count,unsigned int prec,unsigned HOST_WIDE_INT * lv,HOST_WIDE_INT * hv,bool arith)229 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
230 	       unsigned HOST_WIDE_INT count, unsigned int prec,
231 	       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
232 	       bool arith)
233 {
234   unsigned HOST_WIDE_INT signmask;
235 
236   signmask = (arith
237 	      ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
238 	      : 0);
239 
240   if (count >= HOST_BITS_PER_DOUBLE_INT)
241     {
242       /* Shifting by the host word size is undefined according to the
243 	 ANSI standard, so we must handle this as a special case.  */
244       *hv = 0;
245       *lv = 0;
246     }
247   else if (count >= HOST_BITS_PER_WIDE_INT)
248     {
249       *hv = 0;
250       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
251     }
252   else
253     {
254       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
255       *lv = ((l1 >> count)
256 	     | ((unsigned HOST_WIDE_INT) h1
257 		<< (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
258     }
259 
260   /* Zero / sign extend all bits that are beyond the precision.  */
261 
262   if (count >= prec)
263     {
264       *hv = signmask;
265       *lv = signmask;
266     }
267   else if ((prec - count) >= HOST_BITS_PER_DOUBLE_INT)
268     ;
269   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
270     {
271       *hv &= ~(HOST_WIDE_INT_M1U << (prec - count - HOST_BITS_PER_WIDE_INT));
272       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
273     }
274   else
275     {
276       *hv = signmask;
277       *lv &= ~(HOST_WIDE_INT_M1U << (prec - count));
278       *lv |= signmask << (prec - count);
279     }
280 }
281 
282 /* Shift the doubleword integer in L1, H1 left by COUNT places
283    keeping only PREC bits of result.
284    Shift right if COUNT is negative.
285    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
286    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
287 
288 static void
lshift_double(unsigned HOST_WIDE_INT l1,HOST_WIDE_INT h1,unsigned HOST_WIDE_INT count,unsigned int prec,unsigned HOST_WIDE_INT * lv,HOST_WIDE_INT * hv)289 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
290 	       unsigned HOST_WIDE_INT count, unsigned int prec,
291 	       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
292 {
293   unsigned HOST_WIDE_INT signmask;
294 
295   if (count >= HOST_BITS_PER_DOUBLE_INT)
296     {
297       /* Shifting by the host word size is undefined according to the
298 	 ANSI standard, so we must handle this as a special case.  */
299       *hv = 0;
300       *lv = 0;
301     }
302   else if (count >= HOST_BITS_PER_WIDE_INT)
303     {
304       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
305       *lv = 0;
306     }
307   else
308     {
309       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
310 	     | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
311       *lv = l1 << count;
312     }
313 
314   /* Sign extend all bits that are beyond the precision.  */
315 
316   signmask = -((prec > HOST_BITS_PER_WIDE_INT
317 		? ((unsigned HOST_WIDE_INT) *hv
318 		   >> (prec - HOST_BITS_PER_WIDE_INT - 1))
319 		: (*lv >> (prec - 1))) & 1);
320 
321   if (prec >= HOST_BITS_PER_DOUBLE_INT)
322     ;
323   else if (prec >= HOST_BITS_PER_WIDE_INT)
324     {
325       *hv &= ~(HOST_WIDE_INT_M1U << (prec - HOST_BITS_PER_WIDE_INT));
326       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
327     }
328   else
329     {
330       *hv = signmask;
331       *lv &= ~(HOST_WIDE_INT_M1U << prec);
332       *lv |= signmask << prec;
333     }
334 }
335 
336 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
337    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
338    CODE is a tree code for a kind of division, one of
339    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
340    or EXACT_DIV_EXPR
341    It controls how the quotient is rounded to an integer.
342    Return nonzero if the operation overflows.
343    UNS nonzero says do unsigned division.  */
344 
345 static int
div_and_round_double(unsigned code,int uns,unsigned HOST_WIDE_INT lnum_orig,HOST_WIDE_INT hnum_orig,unsigned HOST_WIDE_INT lden_orig,HOST_WIDE_INT hden_orig,unsigned HOST_WIDE_INT * lquo,HOST_WIDE_INT * hquo,unsigned HOST_WIDE_INT * lrem,HOST_WIDE_INT * hrem)346 div_and_round_double (unsigned code, int uns,
347 		      /* num == numerator == dividend */
348 		      unsigned HOST_WIDE_INT lnum_orig,
349 		      HOST_WIDE_INT hnum_orig,
350 		      /* den == denominator == divisor */
351 		      unsigned HOST_WIDE_INT lden_orig,
352 		      HOST_WIDE_INT hden_orig,
353 		      unsigned HOST_WIDE_INT *lquo,
354 		      HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
355 		      HOST_WIDE_INT *hrem)
356 {
357   int quo_neg = 0;
358   HOST_WIDE_INT num[4 + 1];	/* extra element for scaling.  */
359   HOST_WIDE_INT den[4], quo[4];
360   int i, j;
361   unsigned HOST_WIDE_INT work;
362   unsigned HOST_WIDE_INT carry = 0;
363   unsigned HOST_WIDE_INT lnum = lnum_orig;
364   HOST_WIDE_INT hnum = hnum_orig;
365   unsigned HOST_WIDE_INT lden = lden_orig;
366   HOST_WIDE_INT hden = hden_orig;
367   int overflow = 0;
368 
369   if (hden == 0 && lden == 0)
370     overflow = 1, lden = 1;
371 
372   /* Calculate quotient sign and convert operands to unsigned.  */
373   if (!uns)
374     {
375       if (hnum < 0)
376 	{
377 	  quo_neg = ~ quo_neg;
378 	  /* (minimum integer) / (-1) is the only overflow case.  */
379 	  if (neg_double (lnum, hnum, &lnum, &hnum)
380 	      && ((HOST_WIDE_INT) lden & hden) == -1)
381 	    overflow = 1;
382 	}
383       if (hden < 0)
384 	{
385 	  quo_neg = ~ quo_neg;
386 	  neg_double (lden, hden, &lden, &hden);
387 	}
388     }
389 
390   if (hnum == 0 && hden == 0)
391     {				/* single precision */
392       *hquo = *hrem = 0;
393       /* This unsigned division rounds toward zero.  */
394       *lquo = lnum / lden;
395       goto finish_up;
396     }
397 
398   if (hnum == 0)
399     {				/* trivial case: dividend < divisor */
400       /* hden != 0 already checked.  */
401       *hquo = *lquo = 0;
402       *hrem = hnum;
403       *lrem = lnum;
404       goto finish_up;
405     }
406 
407   memset (quo, 0, sizeof quo);
408 
409   memset (num, 0, sizeof num);	/* to zero 9th element */
410   memset (den, 0, sizeof den);
411 
412   encode (num, lnum, hnum);
413   encode (den, lden, hden);
414 
415   /* Special code for when the divisor < BASE.  */
416   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
417     {
418       /* hnum != 0 already checked.  */
419       for (i = 4 - 1; i >= 0; i--)
420 	{
421 	  work = num[i] + carry * BASE;
422 	  quo[i] = work / lden;
423 	  carry = work % lden;
424 	}
425     }
426   else
427     {
428       /* Full double precision division,
429 	 with thanks to Don Knuth's "Seminumerical Algorithms".  */
430       int num_hi_sig, den_hi_sig;
431       unsigned HOST_WIDE_INT quo_est, scale;
432 
433       /* Find the highest nonzero divisor digit.  */
434       for (i = 4 - 1;; i--)
435 	if (den[i] != 0)
436 	  {
437 	    den_hi_sig = i;
438 	    break;
439 	  }
440 
441       /* Insure that the first digit of the divisor is at least BASE/2.
442 	 This is required by the quotient digit estimation algorithm.  */
443 
444       scale = BASE / (den[den_hi_sig] + 1);
445       if (scale > 1)
446 	{		/* scale divisor and dividend */
447 	  carry = 0;
448 	  for (i = 0; i <= 4 - 1; i++)
449 	    {
450 	      work = (num[i] * scale) + carry;
451 	      num[i] = LOWPART (work);
452 	      carry = HIGHPART (work);
453 	    }
454 
455 	  num[4] = carry;
456 	  carry = 0;
457 	  for (i = 0; i <= 4 - 1; i++)
458 	    {
459 	      work = (den[i] * scale) + carry;
460 	      den[i] = LOWPART (work);
461 	      carry = HIGHPART (work);
462 	      if (den[i] != 0) den_hi_sig = i;
463 	    }
464 	}
465 
466       num_hi_sig = 4;
467 
468       /* Main loop */
469       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
470 	{
471 	  /* Guess the next quotient digit, quo_est, by dividing the first
472 	     two remaining dividend digits by the high order quotient digit.
473 	     quo_est is never low and is at most 2 high.  */
474 	  unsigned HOST_WIDE_INT tmp;
475 
476 	  num_hi_sig = i + den_hi_sig + 1;
477 	  work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
478 	  if (num[num_hi_sig] != den[den_hi_sig])
479 	    quo_est = work / den[den_hi_sig];
480 	  else
481 	    quo_est = BASE - 1;
482 
483 	  /* Refine quo_est so it's usually correct, and at most one high.  */
484 	  tmp = work - quo_est * den[den_hi_sig];
485 	  if (tmp < BASE
486 	      && (den[den_hi_sig - 1] * quo_est
487 		  > (tmp * BASE + num[num_hi_sig - 2])))
488 	    quo_est--;
489 
490 	  /* Try QUO_EST as the quotient digit, by multiplying the
491 	     divisor by QUO_EST and subtracting from the remaining dividend.
492 	     Keep in mind that QUO_EST is the I - 1st digit.  */
493 
494 	  carry = 0;
495 	  for (j = 0; j <= den_hi_sig; j++)
496 	    {
497 	      work = quo_est * den[j] + carry;
498 	      carry = HIGHPART (work);
499 	      work = num[i + j] - LOWPART (work);
500 	      num[i + j] = LOWPART (work);
501 	      carry += HIGHPART (work) != 0;
502 	    }
503 
504 	  /* If quo_est was high by one, then num[i] went negative and
505 	     we need to correct things.  */
506 	  if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
507 	    {
508 	      quo_est--;
509 	      carry = 0;		/* add divisor back in */
510 	      for (j = 0; j <= den_hi_sig; j++)
511 		{
512 		  work = num[i + j] + den[j] + carry;
513 		  carry = HIGHPART (work);
514 		  num[i + j] = LOWPART (work);
515 		}
516 
517 	      num [num_hi_sig] += carry;
518 	    }
519 
520 	  /* Store the quotient digit.  */
521 	  quo[i] = quo_est;
522 	}
523     }
524 
525   decode (quo, lquo, hquo);
526 
527  finish_up:
528   /* If result is negative, make it so.  */
529   if (quo_neg)
530     neg_double (*lquo, *hquo, lquo, hquo);
531 
532   /* Compute trial remainder:  rem = num - (quo * den)  */
533   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
534   neg_double (*lrem, *hrem, lrem, hrem);
535   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
536 
537   switch (code)
538     {
539     case TRUNC_DIV_EXPR:
540     case TRUNC_MOD_EXPR:	/* round toward zero */
541     case EXACT_DIV_EXPR:	/* for this one, it shouldn't matter */
542       return overflow;
543 
544     case FLOOR_DIV_EXPR:
545     case FLOOR_MOD_EXPR:	/* round toward negative infinity */
546       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
547 	{
548 	  /* quo = quo - 1;  */
549 	  add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
550 		      lquo, hquo);
551 	}
552       else
553 	return overflow;
554       break;
555 
556     case CEIL_DIV_EXPR:
557     case CEIL_MOD_EXPR:		/* round toward positive infinity */
558       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
559 	{
560 	  add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
561 		      lquo, hquo);
562 	}
563       else
564 	return overflow;
565       break;
566 
567     case ROUND_DIV_EXPR:
568     case ROUND_MOD_EXPR:	/* round to closest integer */
569       {
570 	unsigned HOST_WIDE_INT labs_rem = *lrem;
571 	HOST_WIDE_INT habs_rem = *hrem;
572 	unsigned HOST_WIDE_INT labs_den = lden, ltwice;
573 	HOST_WIDE_INT habs_den = hden, htwice;
574 
575 	/* Get absolute values.  */
576 	if (*hrem < 0)
577 	  neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
578 	if (hden < 0)
579 	  neg_double (lden, hden, &labs_den, &habs_den);
580 
581 	/* If (2 * abs (lrem) >= abs (lden)), adjust the quotient.  */
582 	mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
583 		    labs_rem, habs_rem, &ltwice, &htwice);
584 
585 	if (((unsigned HOST_WIDE_INT) habs_den
586 	     < (unsigned HOST_WIDE_INT) htwice)
587 	    || (((unsigned HOST_WIDE_INT) habs_den
588 		 == (unsigned HOST_WIDE_INT) htwice)
589 		&& (labs_den <= ltwice)))
590 	  {
591 	    if (quo_neg)
592 	      /* quo = quo - 1;  */
593 	      add_double (*lquo, *hquo,
594 			  (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
595 	    else
596 	      /* quo = quo + 1; */
597 	      add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
598 			  lquo, hquo);
599 	  }
600 	else
601 	  return overflow;
602       }
603       break;
604 
605     default:
606       gcc_unreachable ();
607     }
608 
609   /* Compute true remainder:  rem = num - (quo * den)  */
610   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
611   neg_double (*lrem, *hrem, lrem, hrem);
612   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
613   return overflow;
614 }
615 
616 
617 /* Construct from a buffer of length LEN.  BUFFER will be read according
618    to byte endianess and word endianess.  Only the lower LEN bytes
619    of the result are set; the remaining high bytes are cleared.  */
620 
621 double_int
from_buffer(const unsigned char * buffer,int len)622 double_int::from_buffer (const unsigned char *buffer, int len)
623 {
624   double_int result = double_int_zero;
625   int words = len / UNITS_PER_WORD;
626 
627   gcc_assert (len * BITS_PER_UNIT <= HOST_BITS_PER_DOUBLE_INT);
628 
629   for (int byte = 0; byte < len; byte++)
630     {
631       int offset;
632       int bitpos = byte * BITS_PER_UNIT;
633       unsigned HOST_WIDE_INT value;
634 
635       if (len > UNITS_PER_WORD)
636 	{
637 	  int word = byte / UNITS_PER_WORD;
638 
639 	  if (WORDS_BIG_ENDIAN)
640 	    word = (words - 1) - word;
641 
642 	  offset = word * UNITS_PER_WORD;
643 
644 	  if (BYTES_BIG_ENDIAN)
645 	    offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
646 	  else
647 	    offset += byte % UNITS_PER_WORD;
648 	}
649       else
650 	offset = BYTES_BIG_ENDIAN ? (len - 1) - byte : byte;
651 
652       value = (unsigned HOST_WIDE_INT) buffer[offset];
653 
654       if (bitpos < HOST_BITS_PER_WIDE_INT)
655 	result.low |= value << bitpos;
656       else
657 	result.high |= value << (bitpos - HOST_BITS_PER_WIDE_INT);
658     }
659 
660   return result;
661 }
662 
663 
664 /* Returns mask for PREC bits.  */
665 
666 double_int
mask(unsigned prec)667 double_int::mask (unsigned prec)
668 {
669   unsigned HOST_WIDE_INT m;
670   double_int mask;
671 
672   if (prec > HOST_BITS_PER_WIDE_INT)
673     {
674       prec -= HOST_BITS_PER_WIDE_INT;
675       m = ((unsigned HOST_WIDE_INT) 2 << (prec - 1)) - 1;
676       mask.high = (HOST_WIDE_INT) m;
677       mask.low = ALL_ONES;
678     }
679   else
680     {
681       mask.high = 0;
682       mask.low = prec ? ((unsigned HOST_WIDE_INT) 2 << (prec - 1)) - 1 : 0;
683     }
684 
685   return mask;
686 }
687 
688 /* Returns a maximum value for signed or unsigned integer
689    of precision PREC.  */
690 
691 double_int
max_value(unsigned int prec,bool uns)692 double_int::max_value (unsigned int prec, bool uns)
693 {
694   return double_int::mask (prec - (uns ? 0 : 1));
695 }
696 
697 /* Returns a minimum value for signed or unsigned integer
698    of precision PREC.  */
699 
700 double_int
min_value(unsigned int prec,bool uns)701 double_int::min_value (unsigned int prec, bool uns)
702 {
703   if (uns)
704     return double_int_zero;
705   return double_int_one.lshift (prec - 1, prec, false);
706 }
707 
708 /* Clears the bits of CST over the precision PREC.  If UNS is false, the bits
709    outside of the precision are set to the sign bit (i.e., the PREC-th one),
710    otherwise they are set to zero.
711 
712    This corresponds to returning the value represented by PREC lowermost bits
713    of CST, with the given signedness.  */
714 
715 double_int
ext(unsigned prec,bool uns)716 double_int::ext (unsigned prec, bool uns) const
717 {
718   if (uns)
719     return this->zext (prec);
720   else
721     return this->sext (prec);
722 }
723 
724 /* The same as double_int::ext with UNS = true.  */
725 
726 double_int
zext(unsigned prec)727 double_int::zext (unsigned prec) const
728 {
729   const double_int &cst = *this;
730   double_int mask = double_int::mask (prec);
731   double_int r;
732 
733   r.low = cst.low & mask.low;
734   r.high = cst.high & mask.high;
735 
736   return r;
737 }
738 
739 /* The same as double_int::ext with UNS = false.  */
740 
741 double_int
sext(unsigned prec)742 double_int::sext (unsigned prec) const
743 {
744   const double_int &cst = *this;
745   double_int mask = double_int::mask (prec);
746   double_int r;
747   unsigned HOST_WIDE_INT snum;
748 
749   if (prec <= HOST_BITS_PER_WIDE_INT)
750     snum = cst.low;
751   else
752     {
753       prec -= HOST_BITS_PER_WIDE_INT;
754       snum = (unsigned HOST_WIDE_INT) cst.high;
755     }
756   if (((snum >> (prec - 1)) & 1) == 1)
757     {
758       r.low = cst.low | ~mask.low;
759       r.high = cst.high | ~mask.high;
760     }
761   else
762     {
763       r.low = cst.low & mask.low;
764       r.high = cst.high & mask.high;
765     }
766 
767   return r;
768 }
769 
770 /* Returns true if CST fits in signed HOST_WIDE_INT.  */
771 
772 bool
fits_shwi()773 double_int::fits_shwi () const
774 {
775   const double_int &cst = *this;
776   if (cst.high == 0)
777     return (HOST_WIDE_INT) cst.low >= 0;
778   else if (cst.high == -1)
779     return (HOST_WIDE_INT) cst.low < 0;
780   else
781     return false;
782 }
783 
784 /* Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in
785    unsigned HOST_WIDE_INT if UNS is true.  */
786 
787 bool
fits_hwi(bool uns)788 double_int::fits_hwi (bool uns) const
789 {
790   if (uns)
791     return this->fits_uhwi ();
792   else
793     return this->fits_shwi ();
794 }
795 
796 /* Returns A * B.  */
797 
798 double_int
799 double_int::operator * (double_int b) const
800 {
801   const double_int &a = *this;
802   double_int ret;
803   mul_double (a.low, a.high, b.low, b.high, &ret.low, &ret.high);
804   return ret;
805 }
806 
807 /* Multiplies *this with B and returns a reference to *this.  */
808 
809 double_int &
810 double_int::operator *= (double_int b)
811 {
812   mul_double (low, high, b.low, b.high, &low, &high);
813   return *this;
814 }
815 
816 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
817    *OVERFLOW is set to nonzero.  */
818 
819 double_int
mul_with_sign(double_int b,bool unsigned_p,bool * overflow)820 double_int::mul_with_sign (double_int b, bool unsigned_p, bool *overflow) const
821 {
822   const double_int &a = *this;
823   double_int ret, tem;
824   *overflow = mul_double_wide_with_sign (a.low, a.high, b.low, b.high,
825 					 &ret.low, &ret.high,
826 					 &tem.low, &tem.high, unsigned_p);
827   return ret;
828 }
829 
830 double_int
wide_mul_with_sign(double_int b,bool unsigned_p,double_int * higher,bool * overflow)831 double_int::wide_mul_with_sign (double_int b, bool unsigned_p,
832 				double_int *higher, bool *overflow) const
833 
834 {
835   double_int lower;
836   *overflow = mul_double_wide_with_sign (low, high, b.low, b.high,
837 					 &lower.low, &lower.high,
838 					 &higher->low, &higher->high,
839 					 unsigned_p);
840   return lower;
841 }
842 
843 /* Returns A + B.  */
844 
845 double_int
846 double_int::operator + (double_int b) const
847 {
848   const double_int &a = *this;
849   double_int ret;
850   add_double (a.low, a.high, b.low, b.high, &ret.low, &ret.high);
851   return ret;
852 }
853 
854 /* Adds B to *this and returns a reference to *this.  */
855 
856 double_int &
857 double_int::operator += (double_int b)
858 {
859   add_double (low, high, b.low, b.high, &low, &high);
860   return *this;
861 }
862 
863 
864 /* Returns A + B. If the operation overflows according to UNSIGNED_P,
865    *OVERFLOW is set to nonzero.  */
866 
867 double_int
add_with_sign(double_int b,bool unsigned_p,bool * overflow)868 double_int::add_with_sign (double_int b, bool unsigned_p, bool *overflow) const
869 {
870   const double_int &a = *this;
871   double_int ret;
872   *overflow = add_double_with_sign (a.low, a.high, b.low, b.high,
873                                     &ret.low, &ret.high, unsigned_p);
874   return ret;
875 }
876 
877 /* Returns A - B.  */
878 
879 double_int
880 double_int::operator - (double_int b) const
881 {
882   const double_int &a = *this;
883   double_int ret;
884   neg_double (b.low, b.high, &b.low, &b.high);
885   add_double (a.low, a.high, b.low, b.high, &ret.low, &ret.high);
886   return ret;
887 }
888 
889 /* Subtracts B from *this and returns a reference to *this.  */
890 
891 double_int &
892 double_int::operator -= (double_int b)
893 {
894   neg_double (b.low, b.high, &b.low, &b.high);
895   add_double (low, high, b.low, b.high, &low, &high);
896   return *this;
897 }
898 
899 
900 /* Returns A - B. If the operation overflows via inconsistent sign bits,
901    *OVERFLOW is set to nonzero.  */
902 
903 double_int
sub_with_overflow(double_int b,bool * overflow)904 double_int::sub_with_overflow (double_int b, bool *overflow) const
905 {
906   double_int ret;
907   neg_double (b.low, b.high, &ret.low, &ret.high);
908   add_double (low, high, ret.low, ret.high, &ret.low, &ret.high);
909   *overflow = OVERFLOW_SUM_SIGN (ret.high, b.high, high);
910   return ret;
911 }
912 
913 /* Returns -A.  */
914 
915 double_int
916 double_int::operator - () const
917 {
918   const double_int &a = *this;
919   double_int ret;
920   neg_double (a.low, a.high, &ret.low, &ret.high);
921   return ret;
922 }
923 
924 double_int
neg_with_overflow(bool * overflow)925 double_int::neg_with_overflow (bool *overflow) const
926 {
927   double_int ret;
928   *overflow = neg_double (low, high, &ret.low, &ret.high);
929   return ret;
930 }
931 
932 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
933    specified by CODE).  CODE is enum tree_code in fact, but double_int.h
934    must be included before tree.h.  The remainder after the division is
935    stored to MOD.  */
936 
937 double_int
divmod_with_overflow(double_int b,bool uns,unsigned code,double_int * mod,bool * overflow)938 double_int::divmod_with_overflow (double_int b, bool uns, unsigned code,
939 				  double_int *mod, bool *overflow) const
940 {
941   const double_int &a = *this;
942   double_int ret;
943 
944   *overflow = div_and_round_double (code, uns, a.low, a.high,
945 				    b.low, b.high, &ret.low, &ret.high,
946 				    &mod->low, &mod->high);
947   return ret;
948 }
949 
950 double_int
divmod(double_int b,bool uns,unsigned code,double_int * mod)951 double_int::divmod (double_int b, bool uns, unsigned code,
952 		    double_int *mod) const
953 {
954   const double_int &a = *this;
955   double_int ret;
956 
957   div_and_round_double (code, uns, a.low, a.high,
958 			b.low, b.high, &ret.low, &ret.high,
959 			&mod->low, &mod->high);
960   return ret;
961 }
962 
963 /* The same as double_int::divmod with UNS = false.  */
964 
965 double_int
sdivmod(double_int b,unsigned code,double_int * mod)966 double_int::sdivmod (double_int b, unsigned code, double_int *mod) const
967 {
968   return this->divmod (b, false, code, mod);
969 }
970 
971 /* The same as double_int::divmod with UNS = true.  */
972 
973 double_int
udivmod(double_int b,unsigned code,double_int * mod)974 double_int::udivmod (double_int b, unsigned code, double_int *mod) const
975 {
976   return this->divmod (b, true, code, mod);
977 }
978 
979 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
980    specified by CODE).  CODE is enum tree_code in fact, but double_int.h
981    must be included before tree.h.  */
982 
983 double_int
div(double_int b,bool uns,unsigned code)984 double_int::div (double_int b, bool uns, unsigned code) const
985 {
986   double_int mod;
987 
988   return this->divmod (b, uns, code, &mod);
989 }
990 
991 /* The same as double_int::div with UNS = false.  */
992 
993 double_int
sdiv(double_int b,unsigned code)994 double_int::sdiv (double_int b, unsigned code) const
995 {
996   return this->div (b, false, code);
997 }
998 
999 /* The same as double_int::div with UNS = true.  */
1000 
1001 double_int
udiv(double_int b,unsigned code)1002 double_int::udiv (double_int b, unsigned code) const
1003 {
1004   return this->div (b, true, code);
1005 }
1006 
1007 /* Returns A % B (computed as unsigned depending on UNS, and rounded as
1008    specified by CODE).  CODE is enum tree_code in fact, but double_int.h
1009    must be included before tree.h.  */
1010 
1011 double_int
mod(double_int b,bool uns,unsigned code)1012 double_int::mod (double_int b, bool uns, unsigned code) const
1013 {
1014   double_int mod;
1015 
1016   this->divmod (b, uns, code, &mod);
1017   return mod;
1018 }
1019 
1020 /* The same as double_int::mod with UNS = false.  */
1021 
1022 double_int
smod(double_int b,unsigned code)1023 double_int::smod (double_int b, unsigned code) const
1024 {
1025   return this->mod (b, false, code);
1026 }
1027 
1028 /* The same as double_int::mod with UNS = true.  */
1029 
1030 double_int
umod(double_int b,unsigned code)1031 double_int::umod (double_int b, unsigned code) const
1032 {
1033   return this->mod (b, true, code);
1034 }
1035 
1036 /* Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
1037    the multiple in *MULTIPLE.  Otherwise return FALSE and leave *MULTIPLE
1038    unchanged.  */
1039 
1040 bool
multiple_of(double_int factor,bool unsigned_p,double_int * multiple)1041 double_int::multiple_of (double_int factor,
1042 			 bool unsigned_p, double_int *multiple) const
1043 {
1044   double_int remainder;
1045   double_int quotient = this->divmod (factor, unsigned_p,
1046 					   TRUNC_DIV_EXPR, &remainder);
1047   if (remainder.is_zero ())
1048     {
1049       *multiple = quotient;
1050       return true;
1051     }
1052 
1053   return false;
1054 }
1055 
1056 /* Set BITPOS bit in A.  */
1057 double_int
set_bit(unsigned bitpos)1058 double_int::set_bit (unsigned bitpos) const
1059 {
1060   double_int a = *this;
1061   if (bitpos < HOST_BITS_PER_WIDE_INT)
1062     a.low |= (unsigned HOST_WIDE_INT) 1 << bitpos;
1063   else
1064     a.high |= (HOST_WIDE_INT) 1 <<  (bitpos - HOST_BITS_PER_WIDE_INT);
1065 
1066   return a;
1067 }
1068 
1069 /* Count trailing zeros in A.  */
1070 int
trailing_zeros()1071 double_int::trailing_zeros () const
1072 {
1073   const double_int &a = *this;
1074   unsigned HOST_WIDE_INT w = a.low ? a.low : (unsigned HOST_WIDE_INT) a.high;
1075   unsigned bits = a.low ? 0 : HOST_BITS_PER_WIDE_INT;
1076   if (!w)
1077     return HOST_BITS_PER_DOUBLE_INT;
1078   bits += ctz_hwi (w);
1079   return bits;
1080 }
1081 
1082 /* Shift A left by COUNT places.  */
1083 
1084 double_int
lshift(HOST_WIDE_INT count)1085 double_int::lshift (HOST_WIDE_INT count) const
1086 {
1087   double_int ret;
1088 
1089   gcc_checking_assert (count >= 0);
1090 
1091   if (count >= HOST_BITS_PER_DOUBLE_INT)
1092     {
1093       /* Shifting by the host word size is undefined according to the
1094 	 ANSI standard, so we must handle this as a special case.  */
1095       ret.high = 0;
1096       ret.low = 0;
1097     }
1098   else if (count >= HOST_BITS_PER_WIDE_INT)
1099     {
1100       ret.high = low << (count - HOST_BITS_PER_WIDE_INT);
1101       ret.low = 0;
1102     }
1103   else
1104     {
1105       ret.high = (((unsigned HOST_WIDE_INT) high << count)
1106 	     | (low >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
1107       ret.low = low << count;
1108     }
1109 
1110   return ret;
1111 }
1112 
1113 /* Shift A right by COUNT places.  */
1114 
1115 double_int
rshift(HOST_WIDE_INT count)1116 double_int::rshift (HOST_WIDE_INT count) const
1117 {
1118   double_int ret;
1119 
1120   gcc_checking_assert (count >= 0);
1121 
1122   if (count >= HOST_BITS_PER_DOUBLE_INT)
1123     {
1124       /* Shifting by the host word size is undefined according to the
1125 	 ANSI standard, so we must handle this as a special case.  */
1126       ret.high = 0;
1127       ret.low = 0;
1128     }
1129   else if (count >= HOST_BITS_PER_WIDE_INT)
1130     {
1131       ret.high = 0;
1132       ret.low
1133 	= (unsigned HOST_WIDE_INT) (high >> (count - HOST_BITS_PER_WIDE_INT));
1134     }
1135   else
1136     {
1137       ret.high = high >> count;
1138       ret.low = ((low >> count)
1139 		 | ((unsigned HOST_WIDE_INT) high
1140 		    << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
1141     }
1142 
1143   return ret;
1144 }
1145 
1146 /* Shift A left by COUNT places keeping only PREC bits of result.  Shift
1147    right if COUNT is negative.  ARITH true specifies arithmetic shifting;
1148    otherwise use logical shift.  */
1149 
1150 double_int
lshift(HOST_WIDE_INT count,unsigned int prec,bool arith)1151 double_int::lshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const
1152 {
1153   double_int ret;
1154   if (count > 0)
1155     lshift_double (low, high, count, prec, &ret.low, &ret.high);
1156   else
1157     rshift_double (low, high, absu_hwi (count), prec, &ret.low, &ret.high, arith);
1158   return ret;
1159 }
1160 
1161 /* Shift A right by COUNT places keeping only PREC bits of result.  Shift
1162    left if COUNT is negative.  ARITH true specifies arithmetic shifting;
1163    otherwise use logical shift.  */
1164 
1165 double_int
rshift(HOST_WIDE_INT count,unsigned int prec,bool arith)1166 double_int::rshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const
1167 {
1168   double_int ret;
1169   if (count > 0)
1170     rshift_double (low, high, count, prec, &ret.low, &ret.high, arith);
1171   else
1172     lshift_double (low, high, absu_hwi (count), prec, &ret.low, &ret.high);
1173   return ret;
1174 }
1175 
1176 /* Arithmetic shift A left by COUNT places keeping only PREC bits of result.
1177    Shift right if COUNT is negative.  */
1178 
1179 double_int
alshift(HOST_WIDE_INT count,unsigned int prec)1180 double_int::alshift (HOST_WIDE_INT count, unsigned int prec) const
1181 {
1182   double_int r;
1183   if (count > 0)
1184     lshift_double (low, high, count, prec, &r.low, &r.high);
1185   else
1186     rshift_double (low, high, absu_hwi (count), prec, &r.low, &r.high, true);
1187   return r;
1188 }
1189 
1190 /* Arithmetic shift A right by COUNT places keeping only PREC bits of result.
1191    Shift left if COUNT is negative.  */
1192 
1193 double_int
arshift(HOST_WIDE_INT count,unsigned int prec)1194 double_int::arshift (HOST_WIDE_INT count, unsigned int prec) const
1195 {
1196   double_int r;
1197   if (count > 0)
1198     rshift_double (low, high, count, prec, &r.low, &r.high, true);
1199   else
1200     lshift_double (low, high, absu_hwi (count), prec, &r.low, &r.high);
1201   return r;
1202 }
1203 
1204 /* Logical shift A left by COUNT places keeping only PREC bits of result.
1205    Shift right if COUNT is negative.  */
1206 
1207 double_int
llshift(HOST_WIDE_INT count,unsigned int prec)1208 double_int::llshift (HOST_WIDE_INT count, unsigned int prec) const
1209 {
1210   double_int r;
1211   if (count > 0)
1212     lshift_double (low, high, count, prec, &r.low, &r.high);
1213   else
1214     rshift_double (low, high, absu_hwi (count), prec, &r.low, &r.high, false);
1215   return r;
1216 }
1217 
1218 /* Logical shift A right by COUNT places keeping only PREC bits of result.
1219    Shift left if COUNT is negative.  */
1220 
1221 double_int
lrshift(HOST_WIDE_INT count,unsigned int prec)1222 double_int::lrshift (HOST_WIDE_INT count, unsigned int prec) const
1223 {
1224   double_int r;
1225   if (count > 0)
1226     rshift_double (low, high, count, prec, &r.low, &r.high, false);
1227   else
1228     lshift_double (low, high, absu_hwi (count), prec, &r.low, &r.high);
1229   return r;
1230 }
1231 
1232 /* Rotate  A left by COUNT places keeping only PREC bits of result.
1233    Rotate right if COUNT is negative.  */
1234 
1235 double_int
lrotate(HOST_WIDE_INT count,unsigned int prec)1236 double_int::lrotate (HOST_WIDE_INT count, unsigned int prec) const
1237 {
1238   double_int t1, t2;
1239 
1240   count %= prec;
1241   if (count < 0)
1242     count += prec;
1243 
1244   t1 = this->llshift (count, prec);
1245   t2 = this->lrshift (prec - count, prec);
1246 
1247   return t1 | t2;
1248 }
1249 
1250 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
1251    Rotate right if COUNT is negative.  */
1252 
1253 double_int
rrotate(HOST_WIDE_INT count,unsigned int prec)1254 double_int::rrotate (HOST_WIDE_INT count, unsigned int prec) const
1255 {
1256   double_int t1, t2;
1257 
1258   count %= prec;
1259   if (count < 0)
1260     count += prec;
1261 
1262   t1 = this->lrshift (count, prec);
1263   t2 = this->llshift (prec - count, prec);
1264 
1265   return t1 | t2;
1266 }
1267 
1268 /* Returns -1 if A < B, 0 if A == B and 1 if A > B.  Signedness of the
1269    comparison is given by UNS.  */
1270 
1271 int
cmp(double_int b,bool uns)1272 double_int::cmp (double_int b, bool uns) const
1273 {
1274   if (uns)
1275     return this->ucmp (b);
1276   else
1277     return this->scmp (b);
1278 }
1279 
1280 /* Compares two unsigned values A and B.  Returns -1 if A < B, 0 if A == B,
1281    and 1 if A > B.  */
1282 
1283 int
ucmp(double_int b)1284 double_int::ucmp (double_int b) const
1285 {
1286   const double_int &a = *this;
1287   if ((unsigned HOST_WIDE_INT) a.high < (unsigned HOST_WIDE_INT) b.high)
1288     return -1;
1289   if ((unsigned HOST_WIDE_INT) a.high > (unsigned HOST_WIDE_INT) b.high)
1290     return 1;
1291   if (a.low < b.low)
1292     return -1;
1293   if (a.low > b.low)
1294     return 1;
1295 
1296   return 0;
1297 }
1298 
1299 /* Compares two signed values A and B.  Returns -1 if A < B, 0 if A == B,
1300    and 1 if A > B.  */
1301 
1302 int
scmp(double_int b)1303 double_int::scmp (double_int b) const
1304 {
1305   const double_int &a = *this;
1306   if (a.high < b.high)
1307     return -1;
1308   if (a.high > b.high)
1309     return 1;
1310   if (a.low < b.low)
1311     return -1;
1312   if (a.low > b.low)
1313     return 1;
1314 
1315   return 0;
1316 }
1317 
1318 /* Compares two unsigned values A and B for less-than.  */
1319 
1320 bool
ult(double_int b)1321 double_int::ult (double_int b) const
1322 {
1323   if ((unsigned HOST_WIDE_INT) high < (unsigned HOST_WIDE_INT) b.high)
1324     return true;
1325   if ((unsigned HOST_WIDE_INT) high > (unsigned HOST_WIDE_INT) b.high)
1326     return false;
1327   if (low < b.low)
1328     return true;
1329   return false;
1330 }
1331 
1332 /* Compares two unsigned values A and B for less-than or equal-to.  */
1333 
1334 bool
ule(double_int b)1335 double_int::ule (double_int b) const
1336 {
1337   if ((unsigned HOST_WIDE_INT) high < (unsigned HOST_WIDE_INT) b.high)
1338     return true;
1339   if ((unsigned HOST_WIDE_INT) high > (unsigned HOST_WIDE_INT) b.high)
1340     return false;
1341   if (low <= b.low)
1342     return true;
1343   return false;
1344 }
1345 
1346 /* Compares two unsigned values A and B for greater-than.  */
1347 
1348 bool
ugt(double_int b)1349 double_int::ugt (double_int b) const
1350 {
1351   if ((unsigned HOST_WIDE_INT) high > (unsigned HOST_WIDE_INT) b.high)
1352     return true;
1353   if ((unsigned HOST_WIDE_INT) high < (unsigned HOST_WIDE_INT) b.high)
1354     return false;
1355   if (low > b.low)
1356     return true;
1357   return false;
1358 }
1359 
1360 /* Compares two signed values A and B for less-than.  */
1361 
1362 bool
slt(double_int b)1363 double_int::slt (double_int b) const
1364 {
1365   if (high < b.high)
1366     return true;
1367   if (high > b.high)
1368     return false;
1369   if (low < b.low)
1370     return true;
1371   return false;
1372 }
1373 
1374 /* Compares two signed values A and B for less-than or equal-to.  */
1375 
1376 bool
sle(double_int b)1377 double_int::sle (double_int b) const
1378 {
1379   if (high < b.high)
1380     return true;
1381   if (high > b.high)
1382     return false;
1383   if (low <= b.low)
1384     return true;
1385   return false;
1386 }
1387 
1388 /* Compares two signed values A and B for greater-than.  */
1389 
1390 bool
sgt(double_int b)1391 double_int::sgt (double_int b) const
1392 {
1393   if (high > b.high)
1394     return true;
1395   if (high < b.high)
1396     return false;
1397   if (low > b.low)
1398     return true;
1399   return false;
1400 }
1401 
1402 
1403 /* Compares two values A and B.  Returns max value.  Signedness of the
1404    comparison is given by UNS.  */
1405 
1406 double_int
max(double_int b,bool uns)1407 double_int::max (double_int b, bool uns)
1408 {
1409   return (this->cmp (b, uns) == 1) ? *this : b;
1410 }
1411 
1412 /* Compares two signed values A and B.  Returns max value.  */
1413 
1414 double_int
smax(double_int b)1415 double_int::smax (double_int b)
1416 {
1417   return (this->scmp (b) == 1) ? *this : b;
1418 }
1419 
1420 /* Compares two unsigned values A and B.  Returns max value.  */
1421 
1422 double_int
umax(double_int b)1423 double_int::umax (double_int b)
1424 {
1425   return (this->ucmp (b) == 1) ? *this : b;
1426 }
1427 
1428 /* Compares two values A and B.  Returns mix value.  Signedness of the
1429    comparison is given by UNS.  */
1430 
1431 double_int
min(double_int b,bool uns)1432 double_int::min (double_int b, bool uns)
1433 {
1434   return (this->cmp (b, uns) == -1) ? *this : b;
1435 }
1436 
1437 /* Compares two signed values A and B.  Returns min value.  */
1438 
1439 double_int
smin(double_int b)1440 double_int::smin (double_int b)
1441 {
1442   return (this->scmp (b) == -1) ? *this : b;
1443 }
1444 
1445 /* Compares two unsigned values A and B.  Returns min value.  */
1446 
1447 double_int
umin(double_int b)1448 double_int::umin (double_int b)
1449 {
1450   return (this->ucmp (b) == -1) ? *this : b;
1451 }
1452 
1453 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it.  */
1454 
1455 static unsigned
double_int_split_digit(double_int * cst,unsigned base)1456 double_int_split_digit (double_int *cst, unsigned base)
1457 {
1458   unsigned HOST_WIDE_INT resl, reml;
1459   HOST_WIDE_INT resh, remh;
1460 
1461   div_and_round_double (FLOOR_DIV_EXPR, true, cst->low, cst->high, base, 0,
1462 			&resl, &resh, &reml, &remh);
1463   cst->high = resh;
1464   cst->low = resl;
1465 
1466   return reml;
1467 }
1468 
1469 /* Dumps CST to FILE.  If UNS is true, CST is considered to be unsigned,
1470    otherwise it is signed.  */
1471 
1472 void
dump_double_int(FILE * file,double_int cst,bool uns)1473 dump_double_int (FILE *file, double_int cst, bool uns)
1474 {
1475   unsigned digits[100], n;
1476   int i;
1477 
1478   if (cst.is_zero ())
1479     {
1480       fprintf (file, "0");
1481       return;
1482     }
1483 
1484   if (!uns && cst.is_negative ())
1485     {
1486       fprintf (file, "-");
1487       cst = -cst;
1488     }
1489 
1490   for (n = 0; !cst.is_zero (); n++)
1491     digits[n] = double_int_split_digit (&cst, 10);
1492   for (i = n - 1; i >= 0; i--)
1493     fprintf (file, "%u", digits[i]);
1494 }
1495 
1496 
1497 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1498    otherwise.  */
1499 
1500 void
mpz_set_double_int(mpz_t result,double_int val,bool uns)1501 mpz_set_double_int (mpz_t result, double_int val, bool uns)
1502 {
1503   bool negate = false;
1504   unsigned HOST_WIDE_INT vp[2];
1505 
1506   if (!uns && val.is_negative ())
1507     {
1508       negate = true;
1509       val = -val;
1510     }
1511 
1512   vp[0] = val.low;
1513   vp[1] = (unsigned HOST_WIDE_INT) val.high;
1514   mpz_import (result, 2, -1, sizeof (HOST_WIDE_INT), 0, 0, vp);
1515 
1516   if (negate)
1517     mpz_neg (result, result);
1518 }
1519 
1520 /* Returns VAL converted to TYPE.  If WRAP is true, then out-of-range
1521    values of VAL will be wrapped; otherwise, they will be set to the
1522    appropriate minimum or maximum TYPE bound.  */
1523 
1524 double_int
mpz_get_double_int(const_tree type,mpz_t val,bool wrap)1525 mpz_get_double_int (const_tree type, mpz_t val, bool wrap)
1526 {
1527   unsigned HOST_WIDE_INT *vp;
1528   size_t count, numb;
1529   double_int res;
1530 
1531   if (!wrap)
1532     {
1533       mpz_t min, max;
1534 
1535       mpz_init (min);
1536       mpz_init (max);
1537       get_type_static_bounds (type, min, max);
1538 
1539       if (mpz_cmp (val, min) < 0)
1540 	mpz_set (val, min);
1541       else if (mpz_cmp (val, max) > 0)
1542 	mpz_set (val, max);
1543 
1544       mpz_clear (min);
1545       mpz_clear (max);
1546     }
1547 
1548   /* Determine the number of unsigned HOST_WIDE_INT that are required
1549      for representing the value.  The code to calculate count is
1550      extracted from the GMP manual, section "Integer Import and Export":
1551      http://gmplib.org/manual/Integer-Import-and-Export.html  */
1552   numb = 8 * sizeof (HOST_WIDE_INT);
1553   count = (mpz_sizeinbase (val, 2) + numb-1) / numb;
1554   if (count < 2)
1555     count = 2;
1556   vp = (unsigned HOST_WIDE_INT *) alloca (count * sizeof (HOST_WIDE_INT));
1557 
1558   vp[0] = 0;
1559   vp[1] = 0;
1560   mpz_export (vp, &count, -1, sizeof (HOST_WIDE_INT), 0, 0, val);
1561 
1562   gcc_assert (wrap || count <= 2);
1563 
1564   res.low = vp[0];
1565   res.high = (HOST_WIDE_INT) vp[1];
1566 
1567   res = res.ext (TYPE_PRECISION (type), TYPE_UNSIGNED (type));
1568   if (mpz_sgn (val) < 0)
1569     res = -res;
1570 
1571   return res;
1572 }
1573