2011-11-29 Dodji Seketeli <dodji@redhat.com>
[official-gcc.git] / gcc / double-int.c
blob834eaf9d6c27be3bfa65fafeb0c53d3d0bffbd77
1 /* Operations with long integers.
2 Copyright (C) 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h" /* For SHIFT_COUNT_TRUNCATED. */
24 #include "tree.h"
26 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
27 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
28 and SUM1. Then this yields nonzero if overflow occurred during the
29 addition.
31 Overflow occurs if A and B have the same sign, but A and SUM differ in
32 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
33 sign. */
34 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
36 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
37 We do that by representing the two-word integer in 4 words, with only
38 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
39 number. The value of the word is LOWPART + HIGHPART * BASE. */
41 #define LOWPART(x) \
42 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
43 #define HIGHPART(x) \
44 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
45 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
47 /* Unpack a two-word integer into 4 words.
48 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
49 WORDS points to the array of HOST_WIDE_INTs. */
51 static void
52 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
54 words[0] = LOWPART (low);
55 words[1] = HIGHPART (low);
56 words[2] = LOWPART (hi);
57 words[3] = HIGHPART (hi);
60 /* Pack an array of 4 words into a two-word integer.
61 WORDS points to the array of words.
62 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
64 static void
65 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
66 HOST_WIDE_INT *hi)
68 *low = words[0] + words[1] * BASE;
69 *hi = words[2] + words[3] * BASE;
72 /* Add two doubleword integers with doubleword result.
73 Return nonzero if the operation overflows according to UNSIGNED_P.
74 Each argument is given as two `HOST_WIDE_INT' pieces.
75 One argument is L1 and H1; the other, L2 and H2.
76 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
78 int
79 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
80 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
81 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
82 bool unsigned_p)
84 unsigned HOST_WIDE_INT l;
85 HOST_WIDE_INT h;
87 l = l1 + l2;
88 h = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) h1
89 + (unsigned HOST_WIDE_INT) h2
90 + (l < l1));
92 *lv = l;
93 *hv = h;
95 if (unsigned_p)
96 return ((unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1
97 || (h == h1
98 && l < l1));
99 else
100 return OVERFLOW_SUM_SIGN (h1, h2, h);
103 /* Negate a doubleword integer with doubleword result.
104 Return nonzero if the operation overflows, assuming it's signed.
105 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
106 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
109 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
110 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
112 if (l1 == 0)
114 *lv = 0;
115 *hv = - h1;
116 return (*hv & h1) < 0;
118 else
120 *lv = -l1;
121 *hv = ~h1;
122 return 0;
126 /* Multiply two doubleword integers with doubleword result.
127 Return nonzero if the operation overflows according to UNSIGNED_P.
128 Each argument is given as two `HOST_WIDE_INT' pieces.
129 One argument is L1 and H1; the other, L2 and H2.
130 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
133 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
134 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
135 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
136 bool unsigned_p)
138 HOST_WIDE_INT arg1[4];
139 HOST_WIDE_INT arg2[4];
140 HOST_WIDE_INT prod[4 * 2];
141 unsigned HOST_WIDE_INT carry;
142 int i, j, k;
143 unsigned HOST_WIDE_INT toplow, neglow;
144 HOST_WIDE_INT tophigh, neghigh;
146 encode (arg1, l1, h1);
147 encode (arg2, l2, h2);
149 memset (prod, 0, sizeof prod);
151 for (i = 0; i < 4; i++)
153 carry = 0;
154 for (j = 0; j < 4; j++)
156 k = i + j;
157 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
158 carry += arg1[i] * arg2[j];
159 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
160 carry += prod[k];
161 prod[k] = LOWPART (carry);
162 carry = HIGHPART (carry);
164 prod[i + 4] = carry;
167 decode (prod, lv, hv);
168 decode (prod + 4, &toplow, &tophigh);
170 /* Unsigned overflow is immediate. */
171 if (unsigned_p)
172 return (toplow | tophigh) != 0;
174 /* Check for signed overflow by calculating the signed representation of the
175 top half of the result; it should agree with the low half's sign bit. */
176 if (h1 < 0)
178 neg_double (l2, h2, &neglow, &neghigh);
179 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
181 if (h2 < 0)
183 neg_double (l1, h1, &neglow, &neghigh);
184 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
186 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
189 /* Shift the doubleword integer in L1, H1 left by COUNT places
190 keeping only PREC bits of result.
191 Shift right if COUNT is negative.
192 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
193 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
195 void
196 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
197 HOST_WIDE_INT count, unsigned int prec,
198 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, bool arith)
200 unsigned HOST_WIDE_INT signmask;
202 if (count < 0)
204 rshift_double (l1, h1, -count, prec, lv, hv, arith);
205 return;
208 if (SHIFT_COUNT_TRUNCATED)
209 count %= prec;
211 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
213 /* Shifting by the host word size is undefined according to the
214 ANSI standard, so we must handle this as a special case. */
215 *hv = 0;
216 *lv = 0;
218 else if (count >= HOST_BITS_PER_WIDE_INT)
220 *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
221 *lv = 0;
223 else
225 *hv = (((unsigned HOST_WIDE_INT) h1 << count)
226 | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
227 *lv = l1 << count;
230 /* Sign extend all bits that are beyond the precision. */
232 signmask = -((prec > HOST_BITS_PER_WIDE_INT
233 ? ((unsigned HOST_WIDE_INT) *hv
234 >> (prec - HOST_BITS_PER_WIDE_INT - 1))
235 : (*lv >> (prec - 1))) & 1);
237 if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
239 else if (prec >= HOST_BITS_PER_WIDE_INT)
241 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
242 *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
244 else
246 *hv = signmask;
247 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
248 *lv |= signmask << prec;
252 /* Shift the doubleword integer in L1, H1 right by COUNT places
253 keeping only PREC bits of result. Shift left if COUNT is negative.
254 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
255 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
257 void
258 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
259 HOST_WIDE_INT count, unsigned int prec,
260 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
261 bool arith)
263 unsigned HOST_WIDE_INT signmask;
265 if (count < 0)
267 lshift_double (l1, h1, -count, prec, lv, hv, arith);
268 return;
271 signmask = (arith
272 ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
273 : 0);
275 if (SHIFT_COUNT_TRUNCATED)
276 count %= prec;
278 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
280 /* Shifting by the host word size is undefined according to the
281 ANSI standard, so we must handle this as a special case. */
282 *hv = 0;
283 *lv = 0;
285 else if (count >= HOST_BITS_PER_WIDE_INT)
287 *hv = 0;
288 *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
290 else
292 *hv = (unsigned HOST_WIDE_INT) h1 >> count;
293 *lv = ((l1 >> count)
294 | ((unsigned HOST_WIDE_INT) h1
295 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
298 /* Zero / sign extend all bits that are beyond the precision. */
300 if (count >= (HOST_WIDE_INT)prec)
302 *hv = signmask;
303 *lv = signmask;
305 else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
307 else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
309 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
310 *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
312 else
314 *hv = signmask;
315 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
316 *lv |= signmask << (prec - count);
320 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
321 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
322 CODE is a tree code for a kind of division, one of
323 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
324 or EXACT_DIV_EXPR
325 It controls how the quotient is rounded to an integer.
326 Return nonzero if the operation overflows.
327 UNS nonzero says do unsigned division. */
330 div_and_round_double (unsigned code, int uns,
331 /* num == numerator == dividend */
332 unsigned HOST_WIDE_INT lnum_orig,
333 HOST_WIDE_INT hnum_orig,
334 /* den == denominator == divisor */
335 unsigned HOST_WIDE_INT lden_orig,
336 HOST_WIDE_INT hden_orig,
337 unsigned HOST_WIDE_INT *lquo,
338 HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
339 HOST_WIDE_INT *hrem)
341 int quo_neg = 0;
342 HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */
343 HOST_WIDE_INT den[4], quo[4];
344 int i, j;
345 unsigned HOST_WIDE_INT work;
346 unsigned HOST_WIDE_INT carry = 0;
347 unsigned HOST_WIDE_INT lnum = lnum_orig;
348 HOST_WIDE_INT hnum = hnum_orig;
349 unsigned HOST_WIDE_INT lden = lden_orig;
350 HOST_WIDE_INT hden = hden_orig;
351 int overflow = 0;
353 if (hden == 0 && lden == 0)
354 overflow = 1, lden = 1;
356 /* Calculate quotient sign and convert operands to unsigned. */
357 if (!uns)
359 if (hnum < 0)
361 quo_neg = ~ quo_neg;
362 /* (minimum integer) / (-1) is the only overflow case. */
363 if (neg_double (lnum, hnum, &lnum, &hnum)
364 && ((HOST_WIDE_INT) lden & hden) == -1)
365 overflow = 1;
367 if (hden < 0)
369 quo_neg = ~ quo_neg;
370 neg_double (lden, hden, &lden, &hden);
374 if (hnum == 0 && hden == 0)
375 { /* single precision */
376 *hquo = *hrem = 0;
377 /* This unsigned division rounds toward zero. */
378 *lquo = lnum / lden;
379 goto finish_up;
382 if (hnum == 0)
383 { /* trivial case: dividend < divisor */
384 /* hden != 0 already checked. */
385 *hquo = *lquo = 0;
386 *hrem = hnum;
387 *lrem = lnum;
388 goto finish_up;
391 memset (quo, 0, sizeof quo);
393 memset (num, 0, sizeof num); /* to zero 9th element */
394 memset (den, 0, sizeof den);
396 encode (num, lnum, hnum);
397 encode (den, lden, hden);
399 /* Special code for when the divisor < BASE. */
400 if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
402 /* hnum != 0 already checked. */
403 for (i = 4 - 1; i >= 0; i--)
405 work = num[i] + carry * BASE;
406 quo[i] = work / lden;
407 carry = work % lden;
410 else
412 /* Full double precision division,
413 with thanks to Don Knuth's "Seminumerical Algorithms". */
414 int num_hi_sig, den_hi_sig;
415 unsigned HOST_WIDE_INT quo_est, scale;
417 /* Find the highest nonzero divisor digit. */
418 for (i = 4 - 1;; i--)
419 if (den[i] != 0)
421 den_hi_sig = i;
422 break;
425 /* Insure that the first digit of the divisor is at least BASE/2.
426 This is required by the quotient digit estimation algorithm. */
428 scale = BASE / (den[den_hi_sig] + 1);
429 if (scale > 1)
430 { /* scale divisor and dividend */
431 carry = 0;
432 for (i = 0; i <= 4 - 1; i++)
434 work = (num[i] * scale) + carry;
435 num[i] = LOWPART (work);
436 carry = HIGHPART (work);
439 num[4] = carry;
440 carry = 0;
441 for (i = 0; i <= 4 - 1; i++)
443 work = (den[i] * scale) + carry;
444 den[i] = LOWPART (work);
445 carry = HIGHPART (work);
446 if (den[i] != 0) den_hi_sig = i;
450 num_hi_sig = 4;
452 /* Main loop */
453 for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
455 /* Guess the next quotient digit, quo_est, by dividing the first
456 two remaining dividend digits by the high order quotient digit.
457 quo_est is never low and is at most 2 high. */
458 unsigned HOST_WIDE_INT tmp;
460 num_hi_sig = i + den_hi_sig + 1;
461 work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
462 if (num[num_hi_sig] != den[den_hi_sig])
463 quo_est = work / den[den_hi_sig];
464 else
465 quo_est = BASE - 1;
467 /* Refine quo_est so it's usually correct, and at most one high. */
468 tmp = work - quo_est * den[den_hi_sig];
469 if (tmp < BASE
470 && (den[den_hi_sig - 1] * quo_est
471 > (tmp * BASE + num[num_hi_sig - 2])))
472 quo_est--;
474 /* Try QUO_EST as the quotient digit, by multiplying the
475 divisor by QUO_EST and subtracting from the remaining dividend.
476 Keep in mind that QUO_EST is the I - 1st digit. */
478 carry = 0;
479 for (j = 0; j <= den_hi_sig; j++)
481 work = quo_est * den[j] + carry;
482 carry = HIGHPART (work);
483 work = num[i + j] - LOWPART (work);
484 num[i + j] = LOWPART (work);
485 carry += HIGHPART (work) != 0;
488 /* If quo_est was high by one, then num[i] went negative and
489 we need to correct things. */
490 if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
492 quo_est--;
493 carry = 0; /* add divisor back in */
494 for (j = 0; j <= den_hi_sig; j++)
496 work = num[i + j] + den[j] + carry;
497 carry = HIGHPART (work);
498 num[i + j] = LOWPART (work);
501 num [num_hi_sig] += carry;
504 /* Store the quotient digit. */
505 quo[i] = quo_est;
509 decode (quo, lquo, hquo);
511 finish_up:
512 /* If result is negative, make it so. */
513 if (quo_neg)
514 neg_double (*lquo, *hquo, lquo, hquo);
516 /* Compute trial remainder: rem = num - (quo * den) */
517 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
518 neg_double (*lrem, *hrem, lrem, hrem);
519 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
521 switch (code)
523 case TRUNC_DIV_EXPR:
524 case TRUNC_MOD_EXPR: /* round toward zero */
525 case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
526 return overflow;
528 case FLOOR_DIV_EXPR:
529 case FLOOR_MOD_EXPR: /* round toward negative infinity */
530 if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
532 /* quo = quo - 1; */
533 add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
534 lquo, hquo);
536 else
537 return overflow;
538 break;
540 case CEIL_DIV_EXPR:
541 case CEIL_MOD_EXPR: /* round toward positive infinity */
542 if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
544 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
545 lquo, hquo);
547 else
548 return overflow;
549 break;
551 case ROUND_DIV_EXPR:
552 case ROUND_MOD_EXPR: /* round to closest integer */
554 unsigned HOST_WIDE_INT labs_rem = *lrem;
555 HOST_WIDE_INT habs_rem = *hrem;
556 unsigned HOST_WIDE_INT labs_den = lden, ltwice;
557 HOST_WIDE_INT habs_den = hden, htwice;
559 /* Get absolute values. */
560 if (*hrem < 0)
561 neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
562 if (hden < 0)
563 neg_double (lden, hden, &labs_den, &habs_den);
565 /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient. */
566 mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
567 labs_rem, habs_rem, &ltwice, &htwice);
569 if (((unsigned HOST_WIDE_INT) habs_den
570 < (unsigned HOST_WIDE_INT) htwice)
571 || (((unsigned HOST_WIDE_INT) habs_den
572 == (unsigned HOST_WIDE_INT) htwice)
573 && (labs_den <= ltwice)))
575 if (*hquo < 0)
576 /* quo = quo - 1; */
577 add_double (*lquo, *hquo,
578 (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
579 else
580 /* quo = quo + 1; */
581 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
582 lquo, hquo);
584 else
585 return overflow;
587 break;
589 default:
590 gcc_unreachable ();
593 /* Compute true remainder: rem = num - (quo * den) */
594 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
595 neg_double (*lrem, *hrem, lrem, hrem);
596 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
597 return overflow;
601 /* Returns mask for PREC bits. */
603 double_int
604 double_int_mask (unsigned prec)
606 unsigned HOST_WIDE_INT m;
607 double_int mask;
609 if (prec > HOST_BITS_PER_WIDE_INT)
611 prec -= HOST_BITS_PER_WIDE_INT;
612 m = ((unsigned HOST_WIDE_INT) 2 << (prec - 1)) - 1;
613 mask.high = (HOST_WIDE_INT) m;
614 mask.low = ALL_ONES;
616 else
618 mask.high = 0;
619 mask.low = ((unsigned HOST_WIDE_INT) 2 << (prec - 1)) - 1;
622 return mask;
625 /* Clears the bits of CST over the precision PREC. If UNS is false, the bits
626 outside of the precision are set to the sign bit (i.e., the PREC-th one),
627 otherwise they are set to zero.
629 This corresponds to returning the value represented by PREC lowermost bits
630 of CST, with the given signedness. */
632 double_int
633 double_int_ext (double_int cst, unsigned prec, bool uns)
635 if (uns)
636 return double_int_zext (cst, prec);
637 else
638 return double_int_sext (cst, prec);
641 /* The same as double_int_ext with UNS = true. */
643 double_int
644 double_int_zext (double_int cst, unsigned prec)
646 double_int mask = double_int_mask (prec);
647 double_int r;
649 r.low = cst.low & mask.low;
650 r.high = cst.high & mask.high;
652 return r;
655 /* The same as double_int_ext with UNS = false. */
657 double_int
658 double_int_sext (double_int cst, unsigned prec)
660 double_int mask = double_int_mask (prec);
661 double_int r;
662 unsigned HOST_WIDE_INT snum;
664 if (prec <= HOST_BITS_PER_WIDE_INT)
665 snum = cst.low;
666 else
668 prec -= HOST_BITS_PER_WIDE_INT;
669 snum = (unsigned HOST_WIDE_INT) cst.high;
671 if (((snum >> (prec - 1)) & 1) == 1)
673 r.low = cst.low | ~mask.low;
674 r.high = cst.high | ~mask.high;
676 else
678 r.low = cst.low & mask.low;
679 r.high = cst.high & mask.high;
682 return r;
685 /* Returns true if CST fits in signed HOST_WIDE_INT. */
687 bool
688 double_int_fits_in_shwi_p (double_int cst)
690 if (cst.high == 0)
691 return (HOST_WIDE_INT) cst.low >= 0;
692 else if (cst.high == -1)
693 return (HOST_WIDE_INT) cst.low < 0;
694 else
695 return false;
698 /* Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in
699 unsigned HOST_WIDE_INT if UNS is true. */
701 bool
702 double_int_fits_in_hwi_p (double_int cst, bool uns)
704 if (uns)
705 return double_int_fits_in_uhwi_p (cst);
706 else
707 return double_int_fits_in_shwi_p (cst);
710 /* Returns A * B. */
712 double_int
713 double_int_mul (double_int a, double_int b)
715 double_int ret;
716 mul_double (a.low, a.high, b.low, b.high, &ret.low, &ret.high);
717 return ret;
720 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
721 *OVERFLOW is set to nonzero. */
723 double_int
724 double_int_mul_with_sign (double_int a, double_int b,
725 bool unsigned_p, int *overflow)
727 double_int ret;
728 *overflow = mul_double_with_sign (a.low, a.high, b.low, b.high,
729 &ret.low, &ret.high, unsigned_p);
730 return ret;
733 /* Returns A + B. */
735 double_int
736 double_int_add (double_int a, double_int b)
738 double_int ret;
739 add_double (a.low, a.high, b.low, b.high, &ret.low, &ret.high);
740 return ret;
743 /* Returns A - B. */
745 double_int
746 double_int_sub (double_int a, double_int b)
748 double_int ret;
749 neg_double (b.low, b.high, &b.low, &b.high);
750 add_double (a.low, a.high, b.low, b.high, &ret.low, &ret.high);
751 return ret;
754 /* Returns -A. */
756 double_int
757 double_int_neg (double_int a)
759 double_int ret;
760 neg_double (a.low, a.high, &ret.low, &ret.high);
761 return ret;
764 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
765 specified by CODE). CODE is enum tree_code in fact, but double_int.h
766 must be included before tree.h. The remainder after the division is
767 stored to MOD. */
769 double_int
770 double_int_divmod (double_int a, double_int b, bool uns, unsigned code,
771 double_int *mod)
773 double_int ret;
775 div_and_round_double (code, uns, a.low, a.high,
776 b.low, b.high, &ret.low, &ret.high,
777 &mod->low, &mod->high);
778 return ret;
781 /* The same as double_int_divmod with UNS = false. */
783 double_int
784 double_int_sdivmod (double_int a, double_int b, unsigned code, double_int *mod)
786 return double_int_divmod (a, b, false, code, mod);
789 /* The same as double_int_divmod with UNS = true. */
791 double_int
792 double_int_udivmod (double_int a, double_int b, unsigned code, double_int *mod)
794 return double_int_divmod (a, b, true, code, mod);
797 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
798 specified by CODE). CODE is enum tree_code in fact, but double_int.h
799 must be included before tree.h. */
801 double_int
802 double_int_div (double_int a, double_int b, bool uns, unsigned code)
804 double_int mod;
806 return double_int_divmod (a, b, uns, code, &mod);
809 /* The same as double_int_div with UNS = false. */
811 double_int
812 double_int_sdiv (double_int a, double_int b, unsigned code)
814 return double_int_div (a, b, false, code);
817 /* The same as double_int_div with UNS = true. */
819 double_int
820 double_int_udiv (double_int a, double_int b, unsigned code)
822 return double_int_div (a, b, true, code);
825 /* Returns A % B (computed as unsigned depending on UNS, and rounded as
826 specified by CODE). CODE is enum tree_code in fact, but double_int.h
827 must be included before tree.h. */
829 double_int
830 double_int_mod (double_int a, double_int b, bool uns, unsigned code)
832 double_int mod;
834 double_int_divmod (a, b, uns, code, &mod);
835 return mod;
838 /* The same as double_int_mod with UNS = false. */
840 double_int
841 double_int_smod (double_int a, double_int b, unsigned code)
843 return double_int_mod (a, b, false, code);
846 /* The same as double_int_mod with UNS = true. */
848 double_int
849 double_int_umod (double_int a, double_int b, unsigned code)
851 return double_int_mod (a, b, true, code);
854 /* Set BITPOS bit in A. */
855 double_int
856 double_int_setbit (double_int a, unsigned bitpos)
858 if (bitpos < HOST_BITS_PER_WIDE_INT)
859 a.low |= (unsigned HOST_WIDE_INT) 1 << bitpos;
860 else
861 a.high |= (HOST_WIDE_INT) 1 << (bitpos - HOST_BITS_PER_WIDE_INT);
863 return a;
866 /* Count trailing zeros in A. */
868 double_int_ctz (double_int a)
870 unsigned HOST_WIDE_INT w = a.low ? a.low : (unsigned HOST_WIDE_INT) a.high;
871 unsigned bits = a.low ? 0 : HOST_BITS_PER_WIDE_INT;
872 if (!w)
873 return HOST_BITS_PER_DOUBLE_INT;
874 bits += ctz_hwi (w);
875 return bits;
878 /* Shift A left by COUNT places keeping only PREC bits of result. Shift
879 right if COUNT is negative. ARITH true specifies arithmetic shifting;
880 otherwise use logical shift. */
882 double_int
883 double_int_lshift (double_int a, HOST_WIDE_INT count, unsigned int prec, bool arith)
885 double_int ret;
886 lshift_double (a.low, a.high, count, prec, &ret.low, &ret.high, arith);
887 return ret;
890 /* Shift A rigth by COUNT places keeping only PREC bits of result. Shift
891 left if COUNT is negative. ARITH true specifies arithmetic shifting;
892 otherwise use logical shift. */
894 double_int
895 double_int_rshift (double_int a, HOST_WIDE_INT count, unsigned int prec, bool arith)
897 double_int ret;
898 rshift_double (a.low, a.high, count, prec, &ret.low, &ret.high, arith);
899 return ret;
902 /* Rotate A left by COUNT places keeping only PREC bits of result.
903 Rotate right if COUNT is negative. */
905 double_int
906 double_int_lrotate (double_int a, HOST_WIDE_INT count, unsigned int prec)
908 double_int t1, t2;
910 count %= prec;
911 if (count < 0)
912 count += prec;
914 t1 = double_int_lshift (a, count, prec, false);
915 t2 = double_int_rshift (a, prec - count, prec, false);
917 return double_int_ior (t1, t2);
920 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
921 Rotate right if COUNT is negative. */
923 double_int
924 double_int_rrotate (double_int a, HOST_WIDE_INT count, unsigned int prec)
926 double_int t1, t2;
928 count %= prec;
929 if (count < 0)
930 count += prec;
932 t1 = double_int_rshift (a, count, prec, false);
933 t2 = double_int_lshift (a, prec - count, prec, false);
935 return double_int_ior (t1, t2);
938 /* Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the
939 comparison is given by UNS. */
942 double_int_cmp (double_int a, double_int b, bool uns)
944 if (uns)
945 return double_int_ucmp (a, b);
946 else
947 return double_int_scmp (a, b);
950 /* Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B,
951 and 1 if A > B. */
954 double_int_ucmp (double_int a, double_int b)
956 if ((unsigned HOST_WIDE_INT) a.high < (unsigned HOST_WIDE_INT) b.high)
957 return -1;
958 if ((unsigned HOST_WIDE_INT) a.high > (unsigned HOST_WIDE_INT) b.high)
959 return 1;
960 if (a.low < b.low)
961 return -1;
962 if (a.low > b.low)
963 return 1;
965 return 0;
968 /* Compares two signed values A and B. Returns -1 if A < B, 0 if A == B,
969 and 1 if A > B. */
972 double_int_scmp (double_int a, double_int b)
974 if (a.high < b.high)
975 return -1;
976 if (a.high > b.high)
977 return 1;
978 if (a.low < b.low)
979 return -1;
980 if (a.low > b.low)
981 return 1;
983 return 0;
986 /* Compares two values A and B. Returns max value. Signedness of the
987 comparison is given by UNS. */
989 double_int
990 double_int_max (double_int a, double_int b, bool uns)
992 return (double_int_cmp (a, b, uns) == 1) ? a : b;
995 /* Compares two signed values A and B. Returns max value. */
997 double_int double_int_smax (double_int a, double_int b)
999 return (double_int_scmp (a, b) == 1) ? a : b;
1002 /* Compares two unsigned values A and B. Returns max value. */
1004 double_int double_int_umax (double_int a, double_int b)
1006 return (double_int_ucmp (a, b) == 1) ? a : b;
1009 /* Compares two values A and B. Returns mix value. Signedness of the
1010 comparison is given by UNS. */
1012 double_int double_int_min (double_int a, double_int b, bool uns)
1014 return (double_int_cmp (a, b, uns) == -1) ? a : b;
1017 /* Compares two signed values A and B. Returns min value. */
1019 double_int double_int_smin (double_int a, double_int b)
1021 return (double_int_scmp (a, b) == -1) ? a : b;
1024 /* Compares two unsigned values A and B. Returns min value. */
1026 double_int double_int_umin (double_int a, double_int b)
1028 return (double_int_ucmp (a, b) == -1) ? a : b;
1031 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
1033 static unsigned
1034 double_int_split_digit (double_int *cst, unsigned base)
1036 unsigned HOST_WIDE_INT resl, reml;
1037 HOST_WIDE_INT resh, remh;
1039 div_and_round_double (FLOOR_DIV_EXPR, true, cst->low, cst->high, base, 0,
1040 &resl, &resh, &reml, &remh);
1041 cst->high = resh;
1042 cst->low = resl;
1044 return reml;
1047 /* Dumps CST to FILE. If UNS is true, CST is considered to be unsigned,
1048 otherwise it is signed. */
1050 void
1051 dump_double_int (FILE *file, double_int cst, bool uns)
1053 unsigned digits[100], n;
1054 int i;
1056 if (double_int_zero_p (cst))
1058 fprintf (file, "0");
1059 return;
1062 if (!uns && double_int_negative_p (cst))
1064 fprintf (file, "-");
1065 cst = double_int_neg (cst);
1068 for (n = 0; !double_int_zero_p (cst); n++)
1069 digits[n] = double_int_split_digit (&cst, 10);
1070 for (i = n - 1; i >= 0; i--)
1071 fprintf (file, "%u", digits[i]);
1075 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1076 otherwise. */
1078 void
1079 mpz_set_double_int (mpz_t result, double_int val, bool uns)
1081 bool negate = false;
1082 unsigned HOST_WIDE_INT vp[2];
1084 if (!uns && double_int_negative_p (val))
1086 negate = true;
1087 val = double_int_neg (val);
1090 vp[0] = val.low;
1091 vp[1] = (unsigned HOST_WIDE_INT) val.high;
1092 mpz_import (result, 2, -1, sizeof (HOST_WIDE_INT), 0, 0, vp);
1094 if (negate)
1095 mpz_neg (result, result);
1098 /* Returns VAL converted to TYPE. If WRAP is true, then out-of-range
1099 values of VAL will be wrapped; otherwise, they will be set to the
1100 appropriate minimum or maximum TYPE bound. */
1102 double_int
1103 mpz_get_double_int (const_tree type, mpz_t val, bool wrap)
1105 unsigned HOST_WIDE_INT *vp;
1106 size_t count, numb;
1107 double_int res;
1109 if (!wrap)
1111 mpz_t min, max;
1113 mpz_init (min);
1114 mpz_init (max);
1115 get_type_static_bounds (type, min, max);
1117 if (mpz_cmp (val, min) < 0)
1118 mpz_set (val, min);
1119 else if (mpz_cmp (val, max) > 0)
1120 mpz_set (val, max);
1122 mpz_clear (min);
1123 mpz_clear (max);
1126 /* Determine the number of unsigned HOST_WIDE_INT that are required
1127 for representing the value. The code to calculate count is
1128 extracted from the GMP manual, section "Integer Import and Export":
1129 http://gmplib.org/manual/Integer-Import-and-Export.html */
1130 numb = 8*sizeof(HOST_WIDE_INT);
1131 count = (mpz_sizeinbase (val, 2) + numb-1) / numb;
1132 if (count < 2)
1133 count = 2;
1134 vp = (unsigned HOST_WIDE_INT *) alloca (count * sizeof(HOST_WIDE_INT));
1136 vp[0] = 0;
1137 vp[1] = 0;
1138 mpz_export (vp, &count, -1, sizeof (HOST_WIDE_INT), 0, 0, val);
1140 gcc_assert (wrap || count <= 2);
1142 res.low = vp[0];
1143 res.high = (HOST_WIDE_INT) vp[1];
1145 res = double_int_ext (res, TYPE_PRECISION (type), TYPE_UNSIGNED (type));
1146 if (mpz_sgn (val) < 0)
1147 res = double_int_neg (res);
1149 return res;