1 /* Operations with long integers.
2 Copyright (C) 2006, 2007, 2009, 2010, 2012 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
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
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/>. */
22 #include "coretypes.h"
23 #include "tm.h" /* For SHIFT_COUNT_TRUNCATED. */
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
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
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. */
42 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
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. */
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. */
65 decode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT
*low
,
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. */
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
,
84 unsigned HOST_WIDE_INT l
;
88 h
= (HOST_WIDE_INT
) ((unsigned HOST_WIDE_INT
) h1
89 + (unsigned HOST_WIDE_INT
) h2
96 return ((unsigned HOST_WIDE_INT
) h
< (unsigned HOST_WIDE_INT
) h1
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
)
116 return (*hv
& h1
) < 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
,
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
;
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
++)
154 for (j
= 0; j
< 4; j
++)
157 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
158 carry
+= arg1
[i
] * arg2
[j
];
159 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
161 prod
[k
] = LOWPART (carry
);
162 carry
= HIGHPART (carry
);
167 decode (prod
, lv
, hv
);
168 decode (prod
+ 4, &toplow
, &tophigh
);
170 /* Unsigned overflow is immediate. */
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. */
178 neg_double (l2
, h2
, &neglow
, &neghigh
);
179 add_double (neglow
, neghigh
, toplow
, tophigh
, &toplow
, &tophigh
);
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 right by COUNT places
190 keeping only PREC bits of result. ARITH nonzero specifies
191 arithmetic shifting; otherwise use logical shift.
192 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
195 rshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
196 unsigned HOST_WIDE_INT count
, unsigned int prec
,
197 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
200 unsigned HOST_WIDE_INT signmask
;
203 ? -((unsigned HOST_WIDE_INT
) h1
>> (HOST_BITS_PER_WIDE_INT
- 1))
206 if (SHIFT_COUNT_TRUNCATED
)
209 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
211 /* Shifting by the host word size is undefined according to the
212 ANSI standard, so we must handle this as a special case. */
216 else if (count
>= HOST_BITS_PER_WIDE_INT
)
219 *lv
= (unsigned HOST_WIDE_INT
) h1
>> (count
- HOST_BITS_PER_WIDE_INT
);
223 *hv
= (unsigned HOST_WIDE_INT
) h1
>> count
;
225 | ((unsigned HOST_WIDE_INT
) h1
226 << (HOST_BITS_PER_WIDE_INT
- count
- 1) << 1));
229 /* Zero / sign extend all bits that are beyond the precision. */
236 else if ((prec
- count
) >= HOST_BITS_PER_DOUBLE_INT
)
238 else if ((prec
- count
) >= HOST_BITS_PER_WIDE_INT
)
240 *hv
&= ~((HOST_WIDE_INT
) (-1) << (prec
- count
- HOST_BITS_PER_WIDE_INT
));
241 *hv
|= signmask
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
);
246 *lv
&= ~((unsigned HOST_WIDE_INT
) (-1) << (prec
- count
));
247 *lv
|= signmask
<< (prec
- count
);
251 /* Shift the doubleword integer in L1, H1 left by COUNT places
252 keeping only PREC bits of result.
253 Shift right 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. */
258 lshift_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
, bool arith
)
262 unsigned HOST_WIDE_INT signmask
;
266 rshift_double (l1
, h1
, absu_hwi (count
), prec
, lv
, hv
, arith
);
270 if (SHIFT_COUNT_TRUNCATED
)
273 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
275 /* Shifting by the host word size is undefined according to the
276 ANSI standard, so we must handle this as a special case. */
280 else if (count
>= HOST_BITS_PER_WIDE_INT
)
282 *hv
= l1
<< (count
- HOST_BITS_PER_WIDE_INT
);
287 *hv
= (((unsigned HOST_WIDE_INT
) h1
<< count
)
288 | (l1
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
292 /* Sign extend all bits that are beyond the precision. */
294 signmask
= -((prec
> HOST_BITS_PER_WIDE_INT
295 ? ((unsigned HOST_WIDE_INT
) *hv
296 >> (prec
- HOST_BITS_PER_WIDE_INT
- 1))
297 : (*lv
>> (prec
- 1))) & 1);
299 if (prec
>= HOST_BITS_PER_DOUBLE_INT
)
301 else if (prec
>= HOST_BITS_PER_WIDE_INT
)
303 *hv
&= ~((HOST_WIDE_INT
) (-1) << (prec
- HOST_BITS_PER_WIDE_INT
));
304 *hv
|= signmask
<< (prec
- HOST_BITS_PER_WIDE_INT
);
309 *lv
&= ~((unsigned HOST_WIDE_INT
) (-1) << prec
);
310 *lv
|= signmask
<< prec
;
314 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
315 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
316 CODE is a tree code for a kind of division, one of
317 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
319 It controls how the quotient is rounded to an integer.
320 Return nonzero if the operation overflows.
321 UNS nonzero says do unsigned division. */
324 div_and_round_double (unsigned code
, int uns
,
325 /* num == numerator == dividend */
326 unsigned HOST_WIDE_INT lnum_orig
,
327 HOST_WIDE_INT hnum_orig
,
328 /* den == denominator == divisor */
329 unsigned HOST_WIDE_INT lden_orig
,
330 HOST_WIDE_INT hden_orig
,
331 unsigned HOST_WIDE_INT
*lquo
,
332 HOST_WIDE_INT
*hquo
, unsigned HOST_WIDE_INT
*lrem
,
336 HOST_WIDE_INT num
[4 + 1]; /* extra element for scaling. */
337 HOST_WIDE_INT den
[4], quo
[4];
339 unsigned HOST_WIDE_INT work
;
340 unsigned HOST_WIDE_INT carry
= 0;
341 unsigned HOST_WIDE_INT lnum
= lnum_orig
;
342 HOST_WIDE_INT hnum
= hnum_orig
;
343 unsigned HOST_WIDE_INT lden
= lden_orig
;
344 HOST_WIDE_INT hden
= hden_orig
;
347 if (hden
== 0 && lden
== 0)
348 overflow
= 1, lden
= 1;
350 /* Calculate quotient sign and convert operands to unsigned. */
356 /* (minimum integer) / (-1) is the only overflow case. */
357 if (neg_double (lnum
, hnum
, &lnum
, &hnum
)
358 && ((HOST_WIDE_INT
) lden
& hden
) == -1)
364 neg_double (lden
, hden
, &lden
, &hden
);
368 if (hnum
== 0 && hden
== 0)
369 { /* single precision */
371 /* This unsigned division rounds toward zero. */
377 { /* trivial case: dividend < divisor */
378 /* hden != 0 already checked. */
385 memset (quo
, 0, sizeof quo
);
387 memset (num
, 0, sizeof num
); /* to zero 9th element */
388 memset (den
, 0, sizeof den
);
390 encode (num
, lnum
, hnum
);
391 encode (den
, lden
, hden
);
393 /* Special code for when the divisor < BASE. */
394 if (hden
== 0 && lden
< (unsigned HOST_WIDE_INT
) BASE
)
396 /* hnum != 0 already checked. */
397 for (i
= 4 - 1; i
>= 0; i
--)
399 work
= num
[i
] + carry
* BASE
;
400 quo
[i
] = work
/ lden
;
406 /* Full double precision division,
407 with thanks to Don Knuth's "Seminumerical Algorithms". */
408 int num_hi_sig
, den_hi_sig
;
409 unsigned HOST_WIDE_INT quo_est
, scale
;
411 /* Find the highest nonzero divisor digit. */
412 for (i
= 4 - 1;; i
--)
419 /* Insure that the first digit of the divisor is at least BASE/2.
420 This is required by the quotient digit estimation algorithm. */
422 scale
= BASE
/ (den
[den_hi_sig
] + 1);
424 { /* scale divisor and dividend */
426 for (i
= 0; i
<= 4 - 1; i
++)
428 work
= (num
[i
] * scale
) + carry
;
429 num
[i
] = LOWPART (work
);
430 carry
= HIGHPART (work
);
435 for (i
= 0; i
<= 4 - 1; i
++)
437 work
= (den
[i
] * scale
) + carry
;
438 den
[i
] = LOWPART (work
);
439 carry
= HIGHPART (work
);
440 if (den
[i
] != 0) den_hi_sig
= i
;
447 for (i
= num_hi_sig
- den_hi_sig
- 1; i
>= 0; i
--)
449 /* Guess the next quotient digit, quo_est, by dividing the first
450 two remaining dividend digits by the high order quotient digit.
451 quo_est is never low and is at most 2 high. */
452 unsigned HOST_WIDE_INT tmp
;
454 num_hi_sig
= i
+ den_hi_sig
+ 1;
455 work
= num
[num_hi_sig
] * BASE
+ num
[num_hi_sig
- 1];
456 if (num
[num_hi_sig
] != den
[den_hi_sig
])
457 quo_est
= work
/ den
[den_hi_sig
];
461 /* Refine quo_est so it's usually correct, and at most one high. */
462 tmp
= work
- quo_est
* den
[den_hi_sig
];
464 && (den
[den_hi_sig
- 1] * quo_est
465 > (tmp
* BASE
+ num
[num_hi_sig
- 2])))
468 /* Try QUO_EST as the quotient digit, by multiplying the
469 divisor by QUO_EST and subtracting from the remaining dividend.
470 Keep in mind that QUO_EST is the I - 1st digit. */
473 for (j
= 0; j
<= den_hi_sig
; j
++)
475 work
= quo_est
* den
[j
] + carry
;
476 carry
= HIGHPART (work
);
477 work
= num
[i
+ j
] - LOWPART (work
);
478 num
[i
+ j
] = LOWPART (work
);
479 carry
+= HIGHPART (work
) != 0;
482 /* If quo_est was high by one, then num[i] went negative and
483 we need to correct things. */
484 if (num
[num_hi_sig
] < (HOST_WIDE_INT
) carry
)
487 carry
= 0; /* add divisor back in */
488 for (j
= 0; j
<= den_hi_sig
; j
++)
490 work
= num
[i
+ j
] + den
[j
] + carry
;
491 carry
= HIGHPART (work
);
492 num
[i
+ j
] = LOWPART (work
);
495 num
[num_hi_sig
] += carry
;
498 /* Store the quotient digit. */
503 decode (quo
, lquo
, hquo
);
506 /* If result is negative, make it so. */
508 neg_double (*lquo
, *hquo
, lquo
, hquo
);
510 /* Compute trial remainder: rem = num - (quo * den) */
511 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
512 neg_double (*lrem
, *hrem
, lrem
, hrem
);
513 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
518 case TRUNC_MOD_EXPR
: /* round toward zero */
519 case EXACT_DIV_EXPR
: /* for this one, it shouldn't matter */
523 case FLOOR_MOD_EXPR
: /* round toward negative infinity */
524 if (quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio < 0 && rem != 0 */
527 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1,
535 case CEIL_MOD_EXPR
: /* round toward positive infinity */
536 if (!quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio > 0 && rem != 0 */
538 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
546 case ROUND_MOD_EXPR
: /* round to closest integer */
548 unsigned HOST_WIDE_INT labs_rem
= *lrem
;
549 HOST_WIDE_INT habs_rem
= *hrem
;
550 unsigned HOST_WIDE_INT labs_den
= lden
, ltwice
;
551 HOST_WIDE_INT habs_den
= hden
, htwice
;
553 /* Get absolute values. */
555 neg_double (*lrem
, *hrem
, &labs_rem
, &habs_rem
);
557 neg_double (lden
, hden
, &labs_den
, &habs_den
);
559 /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient. */
560 mul_double ((HOST_WIDE_INT
) 2, (HOST_WIDE_INT
) 0,
561 labs_rem
, habs_rem
, <wice
, &htwice
);
563 if (((unsigned HOST_WIDE_INT
) habs_den
564 < (unsigned HOST_WIDE_INT
) htwice
)
565 || (((unsigned HOST_WIDE_INT
) habs_den
566 == (unsigned HOST_WIDE_INT
) htwice
)
567 && (labs_den
<= ltwice
)))
571 add_double (*lquo
, *hquo
,
572 (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1, lquo
, hquo
);
575 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
587 /* Compute true remainder: rem = num - (quo * den) */
588 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
589 neg_double (*lrem
, *hrem
, lrem
, hrem
);
590 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
595 /* Returns mask for PREC bits. */
598 double_int_mask (unsigned prec
)
600 unsigned HOST_WIDE_INT m
;
603 if (prec
> HOST_BITS_PER_WIDE_INT
)
605 prec
-= HOST_BITS_PER_WIDE_INT
;
606 m
= ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1;
607 mask
.high
= (HOST_WIDE_INT
) m
;
613 mask
.low
= ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1;
619 /* Returns a maximum value for signed or unsigned integer
620 of precision PREC. */
623 double_int_max_value (unsigned int prec
, bool uns
)
625 return double_int_mask (prec
- (uns
? 0 : 1));
628 /* Returns a minimum value for signed or unsigned integer
629 of precision PREC. */
632 double_int_min_value (unsigned int prec
, bool uns
)
635 return double_int_zero
;
636 return double_int_lshift (double_int_one
, prec
- 1, prec
, false);
639 /* Clears the bits of CST over the precision PREC. If UNS is false, the bits
640 outside of the precision are set to the sign bit (i.e., the PREC-th one),
641 otherwise they are set to zero.
643 This corresponds to returning the value represented by PREC lowermost bits
644 of CST, with the given signedness. */
647 double_int_ext (double_int cst
, unsigned prec
, bool uns
)
650 return double_int_zext (cst
, prec
);
652 return double_int_sext (cst
, prec
);
655 /* The same as double_int_ext with UNS = true. */
658 double_int_zext (double_int cst
, unsigned prec
)
660 double_int mask
= double_int_mask (prec
);
663 r
.low
= cst
.low
& mask
.low
;
664 r
.high
= cst
.high
& mask
.high
;
669 /* The same as double_int_ext with UNS = false. */
672 double_int_sext (double_int cst
, unsigned prec
)
674 double_int mask
= double_int_mask (prec
);
676 unsigned HOST_WIDE_INT snum
;
678 if (prec
<= HOST_BITS_PER_WIDE_INT
)
682 prec
-= HOST_BITS_PER_WIDE_INT
;
683 snum
= (unsigned HOST_WIDE_INT
) cst
.high
;
685 if (((snum
>> (prec
- 1)) & 1) == 1)
687 r
.low
= cst
.low
| ~mask
.low
;
688 r
.high
= cst
.high
| ~mask
.high
;
692 r
.low
= cst
.low
& mask
.low
;
693 r
.high
= cst
.high
& mask
.high
;
699 /* Returns true if CST fits in signed HOST_WIDE_INT. */
702 double_int_fits_in_shwi_p (double_int cst
)
705 return (HOST_WIDE_INT
) cst
.low
>= 0;
706 else if (cst
.high
== -1)
707 return (HOST_WIDE_INT
) cst
.low
< 0;
712 /* Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in
713 unsigned HOST_WIDE_INT if UNS is true. */
716 double_int_fits_in_hwi_p (double_int cst
, bool uns
)
719 return double_int_fits_in_uhwi_p (cst
);
721 return double_int_fits_in_shwi_p (cst
);
727 double_int_mul (double_int a
, double_int b
)
730 mul_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
734 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
735 *OVERFLOW is set to nonzero. */
738 double_int_mul_with_sign (double_int a
, double_int b
,
739 bool unsigned_p
, int *overflow
)
742 *overflow
= mul_double_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
743 &ret
.low
, &ret
.high
, unsigned_p
);
750 double_int_add (double_int a
, double_int b
)
753 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
760 double_int_sub (double_int a
, double_int b
)
763 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
764 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
771 double_int_neg (double_int a
)
774 neg_double (a
.low
, a
.high
, &ret
.low
, &ret
.high
);
778 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
779 specified by CODE). CODE is enum tree_code in fact, but double_int.h
780 must be included before tree.h. The remainder after the division is
784 double_int_divmod (double_int a
, double_int b
, bool uns
, unsigned code
,
789 div_and_round_double (code
, uns
, a
.low
, a
.high
,
790 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
791 &mod
->low
, &mod
->high
);
795 /* The same as double_int_divmod with UNS = false. */
798 double_int_sdivmod (double_int a
, double_int b
, unsigned code
, double_int
*mod
)
800 return double_int_divmod (a
, b
, false, code
, mod
);
803 /* The same as double_int_divmod with UNS = true. */
806 double_int_udivmod (double_int a
, double_int b
, unsigned code
, double_int
*mod
)
808 return double_int_divmod (a
, b
, true, code
, mod
);
811 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
812 specified by CODE). CODE is enum tree_code in fact, but double_int.h
813 must be included before tree.h. */
816 double_int_div (double_int a
, double_int b
, bool uns
, unsigned code
)
820 return double_int_divmod (a
, b
, uns
, code
, &mod
);
823 /* The same as double_int_div with UNS = false. */
826 double_int_sdiv (double_int a
, double_int b
, unsigned code
)
828 return double_int_div (a
, b
, false, code
);
831 /* The same as double_int_div with UNS = true. */
834 double_int_udiv (double_int a
, double_int b
, unsigned code
)
836 return double_int_div (a
, b
, true, code
);
839 /* Returns A % B (computed as unsigned depending on UNS, and rounded as
840 specified by CODE). CODE is enum tree_code in fact, but double_int.h
841 must be included before tree.h. */
844 double_int_mod (double_int a
, double_int b
, bool uns
, unsigned code
)
848 double_int_divmod (a
, b
, uns
, code
, &mod
);
852 /* The same as double_int_mod with UNS = false. */
855 double_int_smod (double_int a
, double_int b
, unsigned code
)
857 return double_int_mod (a
, b
, false, code
);
860 /* The same as double_int_mod with UNS = true. */
863 double_int_umod (double_int a
, double_int b
, unsigned code
)
865 return double_int_mod (a
, b
, true, code
);
868 /* Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
869 the multiple in *MULTIPLE. Otherwise return FALSE and leave *MULTIPLE
873 double_int_multiple_of (double_int product
, double_int factor
,
874 bool unsigned_p
, double_int
*multiple
)
876 double_int remainder
;
877 double_int quotient
= double_int_divmod (product
, factor
, unsigned_p
,
878 TRUNC_DIV_EXPR
, &remainder
);
879 if (double_int_zero_p (remainder
))
881 *multiple
= quotient
;
888 /* Set BITPOS bit in A. */
890 double_int_setbit (double_int a
, unsigned bitpos
)
892 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
893 a
.low
|= (unsigned HOST_WIDE_INT
) 1 << bitpos
;
895 a
.high
|= (HOST_WIDE_INT
) 1 << (bitpos
- HOST_BITS_PER_WIDE_INT
);
900 /* Count trailing zeros in A. */
902 double_int_ctz (double_int a
)
904 unsigned HOST_WIDE_INT w
= a
.low
? a
.low
: (unsigned HOST_WIDE_INT
) a
.high
;
905 unsigned bits
= a
.low
? 0 : HOST_BITS_PER_WIDE_INT
;
907 return HOST_BITS_PER_DOUBLE_INT
;
912 /* Shift A left by COUNT places keeping only PREC bits of result. Shift
913 right if COUNT is negative. ARITH true specifies arithmetic shifting;
914 otherwise use logical shift. */
917 double_int_lshift (double_int a
, HOST_WIDE_INT count
, unsigned int prec
, bool arith
)
920 lshift_double (a
.low
, a
.high
, count
, prec
, &ret
.low
, &ret
.high
, arith
);
924 /* Shift A rigth by COUNT places keeping only PREC bits of result. Shift
925 left if COUNT is negative. ARITH true specifies arithmetic shifting;
926 otherwise use logical shift. */
929 double_int_rshift (double_int a
, HOST_WIDE_INT count
, unsigned int prec
, bool arith
)
932 lshift_double (a
.low
, a
.high
, -count
, prec
, &ret
.low
, &ret
.high
, arith
);
936 /* Rotate A left by COUNT places keeping only PREC bits of result.
937 Rotate right if COUNT is negative. */
940 double_int_lrotate (double_int a
, HOST_WIDE_INT count
, unsigned int prec
)
948 t1
= double_int_lshift (a
, count
, prec
, false);
949 t2
= double_int_rshift (a
, prec
- count
, prec
, false);
951 return double_int_ior (t1
, t2
);
954 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
955 Rotate right if COUNT is negative. */
958 double_int_rrotate (double_int a
, HOST_WIDE_INT count
, unsigned int prec
)
966 t1
= double_int_rshift (a
, count
, prec
, false);
967 t2
= double_int_lshift (a
, prec
- count
, prec
, false);
969 return double_int_ior (t1
, t2
);
972 /* Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the
973 comparison is given by UNS. */
976 double_int_cmp (double_int a
, double_int b
, bool uns
)
979 return double_int_ucmp (a
, b
);
981 return double_int_scmp (a
, b
);
984 /* Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B,
988 double_int_ucmp (double_int a
, double_int b
)
990 if ((unsigned HOST_WIDE_INT
) a
.high
< (unsigned HOST_WIDE_INT
) b
.high
)
992 if ((unsigned HOST_WIDE_INT
) a
.high
> (unsigned HOST_WIDE_INT
) b
.high
)
1002 /* Compares two signed values A and B. Returns -1 if A < B, 0 if A == B,
1006 double_int_scmp (double_int a
, double_int b
)
1008 if (a
.high
< b
.high
)
1010 if (a
.high
> b
.high
)
1020 /* Compares two values A and B. Returns max value. Signedness of the
1021 comparison is given by UNS. */
1024 double_int_max (double_int a
, double_int b
, bool uns
)
1026 return (double_int_cmp (a
, b
, uns
) == 1) ? a
: b
;
1029 /* Compares two signed values A and B. Returns max value. */
1031 double_int
double_int_smax (double_int a
, double_int b
)
1033 return (double_int_scmp (a
, b
) == 1) ? a
: b
;
1036 /* Compares two unsigned values A and B. Returns max value. */
1038 double_int
double_int_umax (double_int a
, double_int b
)
1040 return (double_int_ucmp (a
, b
) == 1) ? a
: b
;
1043 /* Compares two values A and B. Returns mix value. Signedness of the
1044 comparison is given by UNS. */
1046 double_int
double_int_min (double_int a
, double_int b
, bool uns
)
1048 return (double_int_cmp (a
, b
, uns
) == -1) ? a
: b
;
1051 /* Compares two signed values A and B. Returns min value. */
1053 double_int
double_int_smin (double_int a
, double_int b
)
1055 return (double_int_scmp (a
, b
) == -1) ? a
: b
;
1058 /* Compares two unsigned values A and B. Returns min value. */
1060 double_int
double_int_umin (double_int a
, double_int b
)
1062 return (double_int_ucmp (a
, b
) == -1) ? a
: b
;
1065 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
1068 double_int_split_digit (double_int
*cst
, unsigned base
)
1070 unsigned HOST_WIDE_INT resl
, reml
;
1071 HOST_WIDE_INT resh
, remh
;
1073 div_and_round_double (FLOOR_DIV_EXPR
, true, cst
->low
, cst
->high
, base
, 0,
1074 &resl
, &resh
, &reml
, &remh
);
1081 /* Dumps CST to FILE. If UNS is true, CST is considered to be unsigned,
1082 otherwise it is signed. */
1085 dump_double_int (FILE *file
, double_int cst
, bool uns
)
1087 unsigned digits
[100], n
;
1090 if (double_int_zero_p (cst
))
1092 fprintf (file
, "0");
1096 if (!uns
&& double_int_negative_p (cst
))
1098 fprintf (file
, "-");
1099 cst
= double_int_neg (cst
);
1102 for (n
= 0; !double_int_zero_p (cst
); n
++)
1103 digits
[n
] = double_int_split_digit (&cst
, 10);
1104 for (i
= n
- 1; i
>= 0; i
--)
1105 fprintf (file
, "%u", digits
[i
]);
1109 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1113 mpz_set_double_int (mpz_t result
, double_int val
, bool uns
)
1115 bool negate
= false;
1116 unsigned HOST_WIDE_INT vp
[2];
1118 if (!uns
&& double_int_negative_p (val
))
1121 val
= double_int_neg (val
);
1125 vp
[1] = (unsigned HOST_WIDE_INT
) val
.high
;
1126 mpz_import (result
, 2, -1, sizeof (HOST_WIDE_INT
), 0, 0, vp
);
1129 mpz_neg (result
, result
);
1132 /* Returns VAL converted to TYPE. If WRAP is true, then out-of-range
1133 values of VAL will be wrapped; otherwise, they will be set to the
1134 appropriate minimum or maximum TYPE bound. */
1137 mpz_get_double_int (const_tree type
, mpz_t val
, bool wrap
)
1139 unsigned HOST_WIDE_INT
*vp
;
1149 get_type_static_bounds (type
, min
, max
);
1151 if (mpz_cmp (val
, min
) < 0)
1153 else if (mpz_cmp (val
, max
) > 0)
1160 /* Determine the number of unsigned HOST_WIDE_INT that are required
1161 for representing the value. The code to calculate count is
1162 extracted from the GMP manual, section "Integer Import and Export":
1163 http://gmplib.org/manual/Integer-Import-and-Export.html */
1164 numb
= 8*sizeof(HOST_WIDE_INT
);
1165 count
= (mpz_sizeinbase (val
, 2) + numb
-1) / numb
;
1168 vp
= (unsigned HOST_WIDE_INT
*) alloca (count
* sizeof(HOST_WIDE_INT
));
1172 mpz_export (vp
, &count
, -1, sizeof (HOST_WIDE_INT
), 0, 0, val
);
1174 gcc_assert (wrap
|| count
<= 2);
1177 res
.high
= (HOST_WIDE_INT
) vp
[1];
1179 res
= double_int_ext (res
, TYPE_PRECISION (type
), TYPE_UNSIGNED (type
));
1180 if (mpz_sgn (val
) < 0)
1181 res
= double_int_neg (res
);