1 /* Operations with long integers.
2 Copyright (C) 2006-2015 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 BITS_PER_UNIT and *_BIG_ENDIAN. */
29 static int add_double_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
30 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
31 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
34 #define add_double(l1,h1,l2,h2,lv,hv) \
35 add_double_with_sign (l1, h1, l2, h2, lv, hv, false)
37 static int neg_double (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
38 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*);
40 static int mul_double_wide_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
41 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
42 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
43 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
46 #define mul_double(l1,h1,l2,h2,lv,hv) \
47 mul_double_wide_with_sign (l1, h1, l2, h2, lv, hv, NULL, NULL, false)
49 static int div_and_round_double (unsigned, int, unsigned HOST_WIDE_INT
,
50 HOST_WIDE_INT
, unsigned HOST_WIDE_INT
,
51 HOST_WIDE_INT
, unsigned HOST_WIDE_INT
*,
52 HOST_WIDE_INT
*, unsigned HOST_WIDE_INT
*,
55 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
56 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
57 and SUM1. Then this yields nonzero if overflow occurred during the
60 Overflow occurs if A and B have the same sign, but A and SUM differ in
61 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
63 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
65 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
66 We do that by representing the two-word integer in 4 words, with only
67 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
68 number. The value of the word is LOWPART + HIGHPART * BASE. */
71 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
73 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
74 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
76 /* Unpack a two-word integer into 4 words.
77 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
78 WORDS points to the array of HOST_WIDE_INTs. */
81 encode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT low
, HOST_WIDE_INT hi
)
83 words
[0] = LOWPART (low
);
84 words
[1] = HIGHPART (low
);
85 words
[2] = LOWPART (hi
);
86 words
[3] = HIGHPART (hi
);
89 /* Pack an array of 4 words into a two-word integer.
90 WORDS points to the array of words.
91 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
94 decode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT
*low
,
97 *low
= words
[0] + words
[1] * BASE
;
98 *hi
= words
[2] + words
[3] * BASE
;
101 /* Add two doubleword integers with doubleword result.
102 Return nonzero if the operation overflows according to UNSIGNED_P.
103 Each argument is given as two `HOST_WIDE_INT' pieces.
104 One argument is L1 and H1; the other, L2 and H2.
105 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
108 add_double_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
109 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
110 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
113 unsigned HOST_WIDE_INT l
;
117 h
= (HOST_WIDE_INT
) ((unsigned HOST_WIDE_INT
) h1
118 + (unsigned HOST_WIDE_INT
) h2
125 return ((unsigned HOST_WIDE_INT
) h
< (unsigned HOST_WIDE_INT
) h1
129 return OVERFLOW_SUM_SIGN (h1
, h2
, h
);
132 /* Negate a doubleword integer with doubleword result.
133 Return nonzero if the operation overflows, assuming it's signed.
134 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
135 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
138 neg_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
139 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
)
144 *hv
= - (unsigned HOST_WIDE_INT
) h1
;
145 return (*hv
& h1
) < 0;
155 /* Multiply two doubleword integers with quadword result.
156 Return nonzero if the operation overflows according to UNSIGNED_P.
157 Each argument is given as two `HOST_WIDE_INT' pieces.
158 One argument is L1 and H1; the other, L2 and H2.
159 The value is stored as four `HOST_WIDE_INT' pieces in *LV and *HV,
161 If lw is NULL then only the low part and no overflow is computed. */
164 mul_double_wide_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
165 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
166 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
167 unsigned HOST_WIDE_INT
*lw
, HOST_WIDE_INT
*hw
,
170 HOST_WIDE_INT arg1
[4];
171 HOST_WIDE_INT arg2
[4];
172 HOST_WIDE_INT prod
[4 * 2];
173 unsigned HOST_WIDE_INT carry
;
175 unsigned HOST_WIDE_INT neglow
;
176 HOST_WIDE_INT neghigh
;
178 encode (arg1
, l1
, h1
);
179 encode (arg2
, l2
, h2
);
181 memset (prod
, 0, sizeof prod
);
183 for (i
= 0; i
< 4; i
++)
186 for (j
= 0; j
< 4; j
++)
189 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
190 carry
+= (unsigned HOST_WIDE_INT
) arg1
[i
] * arg2
[j
];
191 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
193 prod
[k
] = LOWPART (carry
);
194 carry
= HIGHPART (carry
);
199 decode (prod
, lv
, hv
);
201 /* We are not interested in the wide part nor in overflow. */
205 decode (prod
+ 4, lw
, hw
);
207 /* Unsigned overflow is immediate. */
209 return (*lw
| *hw
) != 0;
211 /* Check for signed overflow by calculating the signed representation of the
212 top half of the result; it should agree with the low half's sign bit. */
215 neg_double (l2
, h2
, &neglow
, &neghigh
);
216 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
220 neg_double (l1
, h1
, &neglow
, &neghigh
);
221 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
223 return (*hv
< 0 ? ~(*lw
& *hw
) : *lw
| *hw
) != 0;
226 /* Shift the doubleword integer in L1, H1 right by COUNT places
227 keeping only PREC bits of result. ARITH nonzero specifies
228 arithmetic shifting; otherwise use logical shift.
229 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
232 rshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
233 unsigned HOST_WIDE_INT count
, unsigned int prec
,
234 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
237 unsigned HOST_WIDE_INT signmask
;
240 ? -((unsigned HOST_WIDE_INT
) h1
>> (HOST_BITS_PER_WIDE_INT
- 1))
243 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
245 /* Shifting by the host word size is undefined according to the
246 ANSI standard, so we must handle this as a special case. */
250 else if (count
>= HOST_BITS_PER_WIDE_INT
)
253 *lv
= (unsigned HOST_WIDE_INT
) h1
>> (count
- HOST_BITS_PER_WIDE_INT
);
257 *hv
= (unsigned HOST_WIDE_INT
) h1
>> count
;
259 | ((unsigned HOST_WIDE_INT
) h1
260 << (HOST_BITS_PER_WIDE_INT
- count
- 1) << 1));
263 /* Zero / sign extend all bits that are beyond the precision. */
270 else if ((prec
- count
) >= HOST_BITS_PER_DOUBLE_INT
)
272 else if ((prec
- count
) >= HOST_BITS_PER_WIDE_INT
)
274 *hv
&= ~(HOST_WIDE_INT_M1U
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
));
275 *hv
|= signmask
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
);
280 *lv
&= ~(HOST_WIDE_INT_M1U
<< (prec
- count
));
281 *lv
|= signmask
<< (prec
- count
);
285 /* Shift the doubleword integer in L1, H1 left by COUNT places
286 keeping only PREC bits of result.
287 Shift right if COUNT is negative.
288 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
289 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
292 lshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
293 unsigned HOST_WIDE_INT count
, unsigned int prec
,
294 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
)
296 unsigned HOST_WIDE_INT signmask
;
298 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
300 /* Shifting by the host word size is undefined according to the
301 ANSI standard, so we must handle this as a special case. */
305 else if (count
>= HOST_BITS_PER_WIDE_INT
)
307 *hv
= l1
<< (count
- HOST_BITS_PER_WIDE_INT
);
312 *hv
= (((unsigned HOST_WIDE_INT
) h1
<< count
)
313 | (l1
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
317 /* Sign extend all bits that are beyond the precision. */
319 signmask
= -((prec
> HOST_BITS_PER_WIDE_INT
320 ? ((unsigned HOST_WIDE_INT
) *hv
321 >> (prec
- HOST_BITS_PER_WIDE_INT
- 1))
322 : (*lv
>> (prec
- 1))) & 1);
324 if (prec
>= HOST_BITS_PER_DOUBLE_INT
)
326 else if (prec
>= HOST_BITS_PER_WIDE_INT
)
328 *hv
&= ~(HOST_WIDE_INT_M1U
<< (prec
- HOST_BITS_PER_WIDE_INT
));
329 *hv
|= signmask
<< (prec
- HOST_BITS_PER_WIDE_INT
);
334 *lv
&= ~(HOST_WIDE_INT_M1U
<< prec
);
335 *lv
|= signmask
<< prec
;
339 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
340 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
341 CODE is a tree code for a kind of division, one of
342 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
344 It controls how the quotient is rounded to an integer.
345 Return nonzero if the operation overflows.
346 UNS nonzero says do unsigned division. */
349 div_and_round_double (unsigned code
, int uns
,
350 /* num == numerator == dividend */
351 unsigned HOST_WIDE_INT lnum_orig
,
352 HOST_WIDE_INT hnum_orig
,
353 /* den == denominator == divisor */
354 unsigned HOST_WIDE_INT lden_orig
,
355 HOST_WIDE_INT hden_orig
,
356 unsigned HOST_WIDE_INT
*lquo
,
357 HOST_WIDE_INT
*hquo
, unsigned HOST_WIDE_INT
*lrem
,
361 HOST_WIDE_INT num
[4 + 1]; /* extra element for scaling. */
362 HOST_WIDE_INT den
[4], quo
[4];
364 unsigned HOST_WIDE_INT work
;
365 unsigned HOST_WIDE_INT carry
= 0;
366 unsigned HOST_WIDE_INT lnum
= lnum_orig
;
367 HOST_WIDE_INT hnum
= hnum_orig
;
368 unsigned HOST_WIDE_INT lden
= lden_orig
;
369 HOST_WIDE_INT hden
= hden_orig
;
372 if (hden
== 0 && lden
== 0)
373 overflow
= 1, lden
= 1;
375 /* Calculate quotient sign and convert operands to unsigned. */
381 /* (minimum integer) / (-1) is the only overflow case. */
382 if (neg_double (lnum
, hnum
, &lnum
, &hnum
)
383 && ((HOST_WIDE_INT
) lden
& hden
) == -1)
389 neg_double (lden
, hden
, &lden
, &hden
);
393 if (hnum
== 0 && hden
== 0)
394 { /* single precision */
396 /* This unsigned division rounds toward zero. */
402 { /* trivial case: dividend < divisor */
403 /* hden != 0 already checked. */
410 memset (quo
, 0, sizeof quo
);
412 memset (num
, 0, sizeof num
); /* to zero 9th element */
413 memset (den
, 0, sizeof den
);
415 encode (num
, lnum
, hnum
);
416 encode (den
, lden
, hden
);
418 /* Special code for when the divisor < BASE. */
419 if (hden
== 0 && lden
< (unsigned HOST_WIDE_INT
) BASE
)
421 /* hnum != 0 already checked. */
422 for (i
= 4 - 1; i
>= 0; i
--)
424 work
= num
[i
] + carry
* BASE
;
425 quo
[i
] = work
/ lden
;
431 /* Full double precision division,
432 with thanks to Don Knuth's "Seminumerical Algorithms". */
433 int num_hi_sig
, den_hi_sig
;
434 unsigned HOST_WIDE_INT quo_est
, scale
;
436 /* Find the highest nonzero divisor digit. */
437 for (i
= 4 - 1;; i
--)
444 /* Insure that the first digit of the divisor is at least BASE/2.
445 This is required by the quotient digit estimation algorithm. */
447 scale
= BASE
/ (den
[den_hi_sig
] + 1);
449 { /* scale divisor and dividend */
451 for (i
= 0; i
<= 4 - 1; i
++)
453 work
= (num
[i
] * scale
) + carry
;
454 num
[i
] = LOWPART (work
);
455 carry
= HIGHPART (work
);
460 for (i
= 0; i
<= 4 - 1; i
++)
462 work
= (den
[i
] * scale
) + carry
;
463 den
[i
] = LOWPART (work
);
464 carry
= HIGHPART (work
);
465 if (den
[i
] != 0) den_hi_sig
= i
;
472 for (i
= num_hi_sig
- den_hi_sig
- 1; i
>= 0; i
--)
474 /* Guess the next quotient digit, quo_est, by dividing the first
475 two remaining dividend digits by the high order quotient digit.
476 quo_est is never low and is at most 2 high. */
477 unsigned HOST_WIDE_INT tmp
;
479 num_hi_sig
= i
+ den_hi_sig
+ 1;
480 work
= num
[num_hi_sig
] * BASE
+ num
[num_hi_sig
- 1];
481 if (num
[num_hi_sig
] != den
[den_hi_sig
])
482 quo_est
= work
/ den
[den_hi_sig
];
486 /* Refine quo_est so it's usually correct, and at most one high. */
487 tmp
= work
- quo_est
* den
[den_hi_sig
];
489 && (den
[den_hi_sig
- 1] * quo_est
490 > (tmp
* BASE
+ num
[num_hi_sig
- 2])))
493 /* Try QUO_EST as the quotient digit, by multiplying the
494 divisor by QUO_EST and subtracting from the remaining dividend.
495 Keep in mind that QUO_EST is the I - 1st digit. */
498 for (j
= 0; j
<= den_hi_sig
; j
++)
500 work
= quo_est
* den
[j
] + carry
;
501 carry
= HIGHPART (work
);
502 work
= num
[i
+ j
] - LOWPART (work
);
503 num
[i
+ j
] = LOWPART (work
);
504 carry
+= HIGHPART (work
) != 0;
507 /* If quo_est was high by one, then num[i] went negative and
508 we need to correct things. */
509 if (num
[num_hi_sig
] < (HOST_WIDE_INT
) carry
)
512 carry
= 0; /* add divisor back in */
513 for (j
= 0; j
<= den_hi_sig
; j
++)
515 work
= num
[i
+ j
] + den
[j
] + carry
;
516 carry
= HIGHPART (work
);
517 num
[i
+ j
] = LOWPART (work
);
520 num
[num_hi_sig
] += carry
;
523 /* Store the quotient digit. */
528 decode (quo
, lquo
, hquo
);
531 /* If result is negative, make it so. */
533 neg_double (*lquo
, *hquo
, lquo
, hquo
);
535 /* Compute trial remainder: rem = num - (quo * den) */
536 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
537 neg_double (*lrem
, *hrem
, lrem
, hrem
);
538 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
543 case TRUNC_MOD_EXPR
: /* round toward zero */
544 case EXACT_DIV_EXPR
: /* for this one, it shouldn't matter */
548 case FLOOR_MOD_EXPR
: /* round toward negative infinity */
549 if (quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio < 0 && rem != 0 */
552 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1,
560 case CEIL_MOD_EXPR
: /* round toward positive infinity */
561 if (!quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio > 0 && rem != 0 */
563 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
571 case ROUND_MOD_EXPR
: /* round to closest integer */
573 unsigned HOST_WIDE_INT labs_rem
= *lrem
;
574 HOST_WIDE_INT habs_rem
= *hrem
;
575 unsigned HOST_WIDE_INT labs_den
= lden
, lnegabs_rem
, ldiff
;
576 HOST_WIDE_INT habs_den
= hden
, hnegabs_rem
, hdiff
;
578 /* Get absolute values. */
579 if (!uns
&& *hrem
< 0)
580 neg_double (*lrem
, *hrem
, &labs_rem
, &habs_rem
);
581 if (!uns
&& hden
< 0)
582 neg_double (lden
, hden
, &labs_den
, &habs_den
);
584 /* If abs(rem) >= abs(den) - abs(rem), adjust the quotient. */
585 neg_double (labs_rem
, habs_rem
, &lnegabs_rem
, &hnegabs_rem
);
586 add_double (labs_den
, habs_den
, lnegabs_rem
, hnegabs_rem
,
589 if (((unsigned HOST_WIDE_INT
) habs_rem
590 > (unsigned HOST_WIDE_INT
) hdiff
)
591 || (habs_rem
== hdiff
&& labs_rem
>= ldiff
))
595 add_double (*lquo
, *hquo
,
596 (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1, lquo
, hquo
);
599 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
611 /* Compute true remainder: rem = num - (quo * den) */
612 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
613 neg_double (*lrem
, *hrem
, lrem
, hrem
);
614 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
619 /* Construct from a buffer of length LEN. BUFFER will be read according
620 to byte endianess and word endianess. Only the lower LEN bytes
621 of the result are set; the remaining high bytes are cleared. */
624 double_int::from_buffer (const unsigned char *buffer
, int len
)
626 double_int result
= double_int_zero
;
627 int words
= len
/ UNITS_PER_WORD
;
629 gcc_assert (len
* BITS_PER_UNIT
<= HOST_BITS_PER_DOUBLE_INT
);
631 for (int byte
= 0; byte
< len
; byte
++)
634 int bitpos
= byte
* BITS_PER_UNIT
;
635 unsigned HOST_WIDE_INT value
;
637 if (len
> UNITS_PER_WORD
)
639 int word
= byte
/ UNITS_PER_WORD
;
641 if (WORDS_BIG_ENDIAN
)
642 word
= (words
- 1) - word
;
644 offset
= word
* UNITS_PER_WORD
;
646 if (BYTES_BIG_ENDIAN
)
647 offset
+= (UNITS_PER_WORD
- 1) - (byte
% UNITS_PER_WORD
);
649 offset
+= byte
% UNITS_PER_WORD
;
652 offset
= BYTES_BIG_ENDIAN
? (len
- 1) - byte
: byte
;
654 value
= (unsigned HOST_WIDE_INT
) buffer
[offset
];
656 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
657 result
.low
|= value
<< bitpos
;
659 result
.high
|= value
<< (bitpos
- HOST_BITS_PER_WIDE_INT
);
666 /* Returns mask for PREC bits. */
669 double_int::mask (unsigned prec
)
671 unsigned HOST_WIDE_INT m
;
674 if (prec
> HOST_BITS_PER_WIDE_INT
)
676 prec
-= HOST_BITS_PER_WIDE_INT
;
677 m
= ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1;
678 mask
.high
= (HOST_WIDE_INT
) m
;
684 mask
.low
= prec
? ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1 : 0;
690 /* Returns a maximum value for signed or unsigned integer
691 of precision PREC. */
694 double_int::max_value (unsigned int prec
, bool uns
)
696 return double_int::mask (prec
- (uns
? 0 : 1));
699 /* Returns a minimum value for signed or unsigned integer
700 of precision PREC. */
703 double_int::min_value (unsigned int prec
, bool uns
)
706 return double_int_zero
;
707 return double_int_one
.lshift (prec
- 1, prec
, false);
710 /* Clears the bits of CST over the precision PREC. If UNS is false, the bits
711 outside of the precision are set to the sign bit (i.e., the PREC-th one),
712 otherwise they are set to zero.
714 This corresponds to returning the value represented by PREC lowermost bits
715 of CST, with the given signedness. */
718 double_int::ext (unsigned prec
, bool uns
) const
721 return this->zext (prec
);
723 return this->sext (prec
);
726 /* The same as double_int::ext with UNS = true. */
729 double_int::zext (unsigned prec
) const
731 const double_int
&cst
= *this;
732 double_int mask
= double_int::mask (prec
);
735 r
.low
= cst
.low
& mask
.low
;
736 r
.high
= cst
.high
& mask
.high
;
741 /* The same as double_int::ext with UNS = false. */
744 double_int::sext (unsigned prec
) const
746 const double_int
&cst
= *this;
747 double_int mask
= double_int::mask (prec
);
749 unsigned HOST_WIDE_INT snum
;
751 if (prec
<= HOST_BITS_PER_WIDE_INT
)
755 prec
-= HOST_BITS_PER_WIDE_INT
;
756 snum
= (unsigned HOST_WIDE_INT
) cst
.high
;
758 if (((snum
>> (prec
- 1)) & 1) == 1)
760 r
.low
= cst
.low
| ~mask
.low
;
761 r
.high
= cst
.high
| ~mask
.high
;
765 r
.low
= cst
.low
& mask
.low
;
766 r
.high
= cst
.high
& mask
.high
;
772 /* Returns true if CST fits in signed HOST_WIDE_INT. */
775 double_int::fits_shwi () const
777 const double_int
&cst
= *this;
779 return (HOST_WIDE_INT
) cst
.low
>= 0;
780 else if (cst
.high
== -1)
781 return (HOST_WIDE_INT
) cst
.low
< 0;
786 /* Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in
787 unsigned HOST_WIDE_INT if UNS is true. */
790 double_int::fits_hwi (bool uns
) const
793 return this->fits_uhwi ();
795 return this->fits_shwi ();
801 double_int::operator * (double_int b
) const
803 const double_int
&a
= *this;
805 mul_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
809 /* Multiplies *this with B and returns a reference to *this. */
812 double_int::operator *= (double_int b
)
814 mul_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
818 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
819 *OVERFLOW is set to nonzero. */
822 double_int::mul_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
824 const double_int
&a
= *this;
826 *overflow
= mul_double_wide_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
828 &tem
.low
, &tem
.high
, unsigned_p
);
833 double_int::wide_mul_with_sign (double_int b
, bool unsigned_p
,
834 double_int
*higher
, bool *overflow
) const
838 *overflow
= mul_double_wide_with_sign (low
, high
, b
.low
, b
.high
,
839 &lower
.low
, &lower
.high
,
840 &higher
->low
, &higher
->high
,
848 double_int::operator + (double_int b
) const
850 const double_int
&a
= *this;
852 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
856 /* Adds B to *this and returns a reference to *this. */
859 double_int::operator += (double_int b
)
861 add_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
866 /* Returns A + B. If the operation overflows according to UNSIGNED_P,
867 *OVERFLOW is set to nonzero. */
870 double_int::add_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
872 const double_int
&a
= *this;
874 *overflow
= add_double_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
875 &ret
.low
, &ret
.high
, unsigned_p
);
882 double_int::operator - (double_int b
) const
884 const double_int
&a
= *this;
886 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
887 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
891 /* Subtracts B from *this and returns a reference to *this. */
894 double_int::operator -= (double_int b
)
896 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
897 add_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
902 /* Returns A - B. If the operation overflows via inconsistent sign bits,
903 *OVERFLOW is set to nonzero. */
906 double_int::sub_with_overflow (double_int b
, bool *overflow
) const
909 neg_double (b
.low
, b
.high
, &ret
.low
, &ret
.high
);
910 add_double (low
, high
, ret
.low
, ret
.high
, &ret
.low
, &ret
.high
);
911 *overflow
= OVERFLOW_SUM_SIGN (ret
.high
, b
.high
, high
);
918 double_int::operator - () const
920 const double_int
&a
= *this;
922 neg_double (a
.low
, a
.high
, &ret
.low
, &ret
.high
);
927 double_int::neg_with_overflow (bool *overflow
) const
930 *overflow
= neg_double (low
, high
, &ret
.low
, &ret
.high
);
934 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
935 specified by CODE). CODE is enum tree_code in fact, but double_int.h
936 must be included before tree.h. The remainder after the division is
940 double_int::divmod_with_overflow (double_int b
, bool uns
, unsigned code
,
941 double_int
*mod
, bool *overflow
) const
943 const double_int
&a
= *this;
946 *overflow
= div_and_round_double (code
, uns
, a
.low
, a
.high
,
947 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
948 &mod
->low
, &mod
->high
);
953 double_int::divmod (double_int b
, bool uns
, unsigned code
,
954 double_int
*mod
) const
956 const double_int
&a
= *this;
959 div_and_round_double (code
, uns
, a
.low
, a
.high
,
960 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
961 &mod
->low
, &mod
->high
);
965 /* The same as double_int::divmod with UNS = false. */
968 double_int::sdivmod (double_int b
, unsigned code
, double_int
*mod
) const
970 return this->divmod (b
, false, code
, mod
);
973 /* The same as double_int::divmod with UNS = true. */
976 double_int::udivmod (double_int b
, unsigned code
, double_int
*mod
) const
978 return this->divmod (b
, true, code
, mod
);
981 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
982 specified by CODE). CODE is enum tree_code in fact, but double_int.h
983 must be included before tree.h. */
986 double_int::div (double_int b
, bool uns
, unsigned code
) const
990 return this->divmod (b
, uns
, code
, &mod
);
993 /* The same as double_int::div with UNS = false. */
996 double_int::sdiv (double_int b
, unsigned code
) const
998 return this->div (b
, false, code
);
1001 /* The same as double_int::div with UNS = true. */
1004 double_int::udiv (double_int b
, unsigned code
) const
1006 return this->div (b
, true, code
);
1009 /* Returns A % B (computed as unsigned depending on UNS, and rounded as
1010 specified by CODE). CODE is enum tree_code in fact, but double_int.h
1011 must be included before tree.h. */
1014 double_int::mod (double_int b
, bool uns
, unsigned code
) const
1018 this->divmod (b
, uns
, code
, &mod
);
1022 /* The same as double_int::mod with UNS = false. */
1025 double_int::smod (double_int b
, unsigned code
) const
1027 return this->mod (b
, false, code
);
1030 /* The same as double_int::mod with UNS = true. */
1033 double_int::umod (double_int b
, unsigned code
) const
1035 return this->mod (b
, true, code
);
1038 /* Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
1039 the multiple in *MULTIPLE. Otherwise return FALSE and leave *MULTIPLE
1043 double_int::multiple_of (double_int factor
,
1044 bool unsigned_p
, double_int
*multiple
) const
1046 double_int remainder
;
1047 double_int quotient
= this->divmod (factor
, unsigned_p
,
1048 TRUNC_DIV_EXPR
, &remainder
);
1049 if (remainder
.is_zero ())
1051 *multiple
= quotient
;
1058 /* Set BITPOS bit in A. */
1060 double_int::set_bit (unsigned bitpos
) const
1062 double_int a
= *this;
1063 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
1064 a
.low
|= (unsigned HOST_WIDE_INT
) 1 << bitpos
;
1066 a
.high
|= (HOST_WIDE_INT
) 1 << (bitpos
- HOST_BITS_PER_WIDE_INT
);
1071 /* Count trailing zeros in A. */
1073 double_int::trailing_zeros () const
1075 const double_int
&a
= *this;
1076 unsigned HOST_WIDE_INT w
= a
.low
? a
.low
: (unsigned HOST_WIDE_INT
) a
.high
;
1077 unsigned bits
= a
.low
? 0 : HOST_BITS_PER_WIDE_INT
;
1079 return HOST_BITS_PER_DOUBLE_INT
;
1080 bits
+= ctz_hwi (w
);
1084 /* Shift A left by COUNT places. */
1087 double_int::lshift (HOST_WIDE_INT count
) const
1091 gcc_checking_assert (count
>= 0);
1093 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
1095 /* Shifting by the host word size is undefined according to the
1096 ANSI standard, so we must handle this as a special case. */
1100 else if (count
>= HOST_BITS_PER_WIDE_INT
)
1102 ret
.high
= low
<< (count
- HOST_BITS_PER_WIDE_INT
);
1107 ret
.high
= (((unsigned HOST_WIDE_INT
) high
<< count
)
1108 | (low
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
1109 ret
.low
= low
<< count
;
1115 /* Shift A right by COUNT places. */
1118 double_int::rshift (HOST_WIDE_INT count
) const
1122 gcc_checking_assert (count
>= 0);
1124 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
1126 /* Shifting by the host word size is undefined according to the
1127 ANSI standard, so we must handle this as a special case. */
1131 else if (count
>= HOST_BITS_PER_WIDE_INT
)
1135 = (unsigned HOST_WIDE_INT
) (high
>> (count
- HOST_BITS_PER_WIDE_INT
));
1139 ret
.high
= high
>> count
;
1140 ret
.low
= ((low
>> count
)
1141 | ((unsigned HOST_WIDE_INT
) high
1142 << (HOST_BITS_PER_WIDE_INT
- count
- 1) << 1));
1148 /* Shift A left by COUNT places keeping only PREC bits of result. Shift
1149 right if COUNT is negative. ARITH true specifies arithmetic shifting;
1150 otherwise use logical shift. */
1153 double_int::lshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1157 lshift_double (low
, high
, count
, prec
, &ret
.low
, &ret
.high
);
1159 rshift_double (low
, high
, absu_hwi (count
), prec
, &ret
.low
, &ret
.high
, arith
);
1163 /* Shift A right by COUNT places keeping only PREC bits of result. Shift
1164 left if COUNT is negative. ARITH true specifies arithmetic shifting;
1165 otherwise use logical shift. */
1168 double_int::rshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1172 rshift_double (low
, high
, count
, prec
, &ret
.low
, &ret
.high
, arith
);
1174 lshift_double (low
, high
, absu_hwi (count
), prec
, &ret
.low
, &ret
.high
);
1178 /* Arithmetic shift A left by COUNT places keeping only PREC bits of result.
1179 Shift right if COUNT is negative. */
1182 double_int::alshift (HOST_WIDE_INT count
, unsigned int prec
) const
1186 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
);
1188 rshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
, true);
1192 /* Arithmetic shift A right by COUNT places keeping only PREC bits of result.
1193 Shift left if COUNT is negative. */
1196 double_int::arshift (HOST_WIDE_INT count
, unsigned int prec
) const
1200 rshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, true);
1202 lshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
);
1206 /* Logical shift A left by COUNT places keeping only PREC bits of result.
1207 Shift right if COUNT is negative. */
1210 double_int::llshift (HOST_WIDE_INT count
, unsigned int prec
) const
1214 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
);
1216 rshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
, false);
1220 /* Logical shift A right by COUNT places keeping only PREC bits of result.
1221 Shift left if COUNT is negative. */
1224 double_int::lrshift (HOST_WIDE_INT count
, unsigned int prec
) const
1228 rshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, false);
1230 lshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
);
1234 /* Rotate A left by COUNT places keeping only PREC bits of result.
1235 Rotate right if COUNT is negative. */
1238 double_int::lrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1246 t1
= this->llshift (count
, prec
);
1247 t2
= this->lrshift (prec
- count
, prec
);
1252 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
1253 Rotate right if COUNT is negative. */
1256 double_int::rrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1264 t1
= this->lrshift (count
, prec
);
1265 t2
= this->llshift (prec
- count
, prec
);
1270 /* Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the
1271 comparison is given by UNS. */
1274 double_int::cmp (double_int b
, bool uns
) const
1277 return this->ucmp (b
);
1279 return this->scmp (b
);
1282 /* Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B,
1286 double_int::ucmp (double_int b
) const
1288 const double_int
&a
= *this;
1289 if ((unsigned HOST_WIDE_INT
) a
.high
< (unsigned HOST_WIDE_INT
) b
.high
)
1291 if ((unsigned HOST_WIDE_INT
) a
.high
> (unsigned HOST_WIDE_INT
) b
.high
)
1301 /* Compares two signed values A and B. Returns -1 if A < B, 0 if A == B,
1305 double_int::scmp (double_int b
) const
1307 const double_int
&a
= *this;
1308 if (a
.high
< b
.high
)
1310 if (a
.high
> b
.high
)
1320 /* Compares two unsigned values A and B for less-than. */
1323 double_int::ult (double_int b
) const
1325 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1327 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1334 /* Compares two unsigned values A and B for less-than or equal-to. */
1337 double_int::ule (double_int b
) const
1339 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1341 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1348 /* Compares two unsigned values A and B for greater-than. */
1351 double_int::ugt (double_int b
) const
1353 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1355 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1362 /* Compares two signed values A and B for less-than. */
1365 double_int::slt (double_int b
) const
1376 /* Compares two signed values A and B for less-than or equal-to. */
1379 double_int::sle (double_int b
) const
1390 /* Compares two signed values A and B for greater-than. */
1393 double_int::sgt (double_int b
) const
1405 /* Compares two values A and B. Returns max value. Signedness of the
1406 comparison is given by UNS. */
1409 double_int::max (double_int b
, bool uns
)
1411 return (this->cmp (b
, uns
) == 1) ? *this : b
;
1414 /* Compares two signed values A and B. Returns max value. */
1417 double_int::smax (double_int b
)
1419 return (this->scmp (b
) == 1) ? *this : b
;
1422 /* Compares two unsigned values A and B. Returns max value. */
1425 double_int::umax (double_int b
)
1427 return (this->ucmp (b
) == 1) ? *this : b
;
1430 /* Compares two values A and B. Returns mix value. Signedness of the
1431 comparison is given by UNS. */
1434 double_int::min (double_int b
, bool uns
)
1436 return (this->cmp (b
, uns
) == -1) ? *this : b
;
1439 /* Compares two signed values A and B. Returns min value. */
1442 double_int::smin (double_int b
)
1444 return (this->scmp (b
) == -1) ? *this : b
;
1447 /* Compares two unsigned values A and B. Returns min value. */
1450 double_int::umin (double_int b
)
1452 return (this->ucmp (b
) == -1) ? *this : b
;
1455 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
1458 double_int_split_digit (double_int
*cst
, unsigned base
)
1460 unsigned HOST_WIDE_INT resl
, reml
;
1461 HOST_WIDE_INT resh
, remh
;
1463 div_and_round_double (FLOOR_DIV_EXPR
, true, cst
->low
, cst
->high
, base
, 0,
1464 &resl
, &resh
, &reml
, &remh
);
1471 /* Dumps CST to FILE. If UNS is true, CST is considered to be unsigned,
1472 otherwise it is signed. */
1475 dump_double_int (FILE *file
, double_int cst
, bool uns
)
1477 unsigned digits
[100], n
;
1482 fprintf (file
, "0");
1486 if (!uns
&& cst
.is_negative ())
1488 fprintf (file
, "-");
1492 for (n
= 0; !cst
.is_zero (); n
++)
1493 digits
[n
] = double_int_split_digit (&cst
, 10);
1494 for (i
= n
- 1; i
>= 0; i
--)
1495 fprintf (file
, "%u", digits
[i
]);
1499 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1503 mpz_set_double_int (mpz_t result
, double_int val
, bool uns
)
1505 bool negate
= false;
1506 unsigned HOST_WIDE_INT vp
[2];
1508 if (!uns
&& val
.is_negative ())
1515 vp
[1] = (unsigned HOST_WIDE_INT
) val
.high
;
1516 mpz_import (result
, 2, -1, sizeof (HOST_WIDE_INT
), 0, 0, vp
);
1519 mpz_neg (result
, result
);
1522 /* Returns VAL converted to TYPE. If WRAP is true, then out-of-range
1523 values of VAL will be wrapped; otherwise, they will be set to the
1524 appropriate minimum or maximum TYPE bound. */
1527 mpz_get_double_int (const_tree type
, mpz_t val
, bool wrap
)
1529 unsigned HOST_WIDE_INT
*vp
;
1539 get_type_static_bounds (type
, min
, max
);
1541 if (mpz_cmp (val
, min
) < 0)
1543 else if (mpz_cmp (val
, max
) > 0)
1550 /* Determine the number of unsigned HOST_WIDE_INT that are required
1551 for representing the value. The code to calculate count is
1552 extracted from the GMP manual, section "Integer Import and Export":
1553 http://gmplib.org/manual/Integer-Import-and-Export.html */
1554 numb
= 8 * sizeof (HOST_WIDE_INT
);
1555 count
= (mpz_sizeinbase (val
, 2) + numb
-1) / numb
;
1558 vp
= (unsigned HOST_WIDE_INT
*) alloca (count
* sizeof (HOST_WIDE_INT
));
1562 mpz_export (vp
, &count
, -1, sizeof (HOST_WIDE_INT
), 0, 0, val
);
1564 gcc_assert (wrap
|| count
<= 2);
1567 res
.high
= (HOST_WIDE_INT
) vp
[1];
1569 res
= res
.ext (TYPE_PRECISION (type
), TYPE_UNSIGNED (type
));
1570 if (mpz_sgn (val
) < 0)