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. */
27 static int add_double_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
28 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
29 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
32 #define add_double(l1,h1,l2,h2,lv,hv) \
33 add_double_with_sign (l1, h1, l2, h2, lv, hv, false)
35 static int neg_double (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
36 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*);
38 static int mul_double_wide_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
39 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
40 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
41 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
44 #define mul_double(l1,h1,l2,h2,lv,hv) \
45 mul_double_wide_with_sign (l1, h1, l2, h2, lv, hv, NULL, NULL, false)
47 static int div_and_round_double (unsigned, 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
*, unsigned HOST_WIDE_INT
*,
53 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
54 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
55 and SUM1. Then this yields nonzero if overflow occurred during the
58 Overflow occurs if A and B have the same sign, but A and SUM differ in
59 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
61 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
63 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
64 We do that by representing the two-word integer in 4 words, with only
65 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
66 number. The value of the word is LOWPART + HIGHPART * BASE. */
69 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
71 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
72 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
74 /* Unpack a two-word integer into 4 words.
75 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
76 WORDS points to the array of HOST_WIDE_INTs. */
79 encode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT low
, HOST_WIDE_INT hi
)
81 words
[0] = LOWPART (low
);
82 words
[1] = HIGHPART (low
);
83 words
[2] = LOWPART (hi
);
84 words
[3] = HIGHPART (hi
);
87 /* Pack an array of 4 words into a two-word integer.
88 WORDS points to the array of words.
89 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
92 decode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT
*low
,
95 *low
= words
[0] + words
[1] * BASE
;
96 *hi
= words
[2] + words
[3] * BASE
;
99 /* Add two doubleword integers with doubleword result.
100 Return nonzero if the operation overflows according to UNSIGNED_P.
101 Each argument is given as two `HOST_WIDE_INT' pieces.
102 One argument is L1 and H1; the other, L2 and H2.
103 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
106 add_double_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
107 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
108 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
111 unsigned HOST_WIDE_INT l
;
115 h
= (HOST_WIDE_INT
) ((unsigned HOST_WIDE_INT
) h1
116 + (unsigned HOST_WIDE_INT
) h2
123 return ((unsigned HOST_WIDE_INT
) h
< (unsigned HOST_WIDE_INT
) h1
127 return OVERFLOW_SUM_SIGN (h1
, h2
, h
);
130 /* Negate a doubleword integer with doubleword result.
131 Return nonzero if the operation overflows, assuming it's signed.
132 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
133 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
136 neg_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
137 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
)
142 *hv
= - (unsigned HOST_WIDE_INT
) h1
;
143 return (*hv
& h1
) < 0;
153 /* Multiply two doubleword integers with quadword result.
154 Return nonzero if the operation overflows according to UNSIGNED_P.
155 Each argument is given as two `HOST_WIDE_INT' pieces.
156 One argument is L1 and H1; the other, L2 and H2.
157 The value is stored as four `HOST_WIDE_INT' pieces in *LV and *HV,
159 If lw is NULL then only the low part and no overflow is computed. */
162 mul_double_wide_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
163 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
164 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
165 unsigned HOST_WIDE_INT
*lw
, HOST_WIDE_INT
*hw
,
168 HOST_WIDE_INT arg1
[4];
169 HOST_WIDE_INT arg2
[4];
170 HOST_WIDE_INT prod
[4 * 2];
171 unsigned HOST_WIDE_INT carry
;
173 unsigned HOST_WIDE_INT neglow
;
174 HOST_WIDE_INT neghigh
;
176 encode (arg1
, l1
, h1
);
177 encode (arg2
, l2
, h2
);
179 memset (prod
, 0, sizeof prod
);
181 for (i
= 0; i
< 4; i
++)
184 for (j
= 0; j
< 4; j
++)
187 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
188 carry
+= (unsigned HOST_WIDE_INT
) arg1
[i
] * arg2
[j
];
189 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
191 prod
[k
] = LOWPART (carry
);
192 carry
= HIGHPART (carry
);
197 decode (prod
, lv
, hv
);
199 /* We are not interested in the wide part nor in overflow. */
203 decode (prod
+ 4, lw
, hw
);
205 /* Unsigned overflow is immediate. */
207 return (*lw
| *hw
) != 0;
209 /* Check for signed overflow by calculating the signed representation of the
210 top half of the result; it should agree with the low half's sign bit. */
213 neg_double (l2
, h2
, &neglow
, &neghigh
);
214 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
218 neg_double (l1
, h1
, &neglow
, &neghigh
);
219 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
221 return (*hv
< 0 ? ~(*lw
& *hw
) : *lw
| *hw
) != 0;
224 /* Shift the doubleword integer in L1, H1 right by COUNT places
225 keeping only PREC bits of result. ARITH nonzero specifies
226 arithmetic shifting; otherwise use logical shift.
227 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
230 rshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
231 unsigned HOST_WIDE_INT count
, unsigned int prec
,
232 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
235 unsigned HOST_WIDE_INT signmask
;
238 ? -((unsigned HOST_WIDE_INT
) h1
>> (HOST_BITS_PER_WIDE_INT
- 1))
241 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
243 /* Shifting by the host word size is undefined according to the
244 ANSI standard, so we must handle this as a special case. */
248 else if (count
>= HOST_BITS_PER_WIDE_INT
)
251 *lv
= (unsigned HOST_WIDE_INT
) h1
>> (count
- HOST_BITS_PER_WIDE_INT
);
255 *hv
= (unsigned HOST_WIDE_INT
) h1
>> count
;
257 | ((unsigned HOST_WIDE_INT
) h1
258 << (HOST_BITS_PER_WIDE_INT
- count
- 1) << 1));
261 /* Zero / sign extend all bits that are beyond the precision. */
268 else if ((prec
- count
) >= HOST_BITS_PER_DOUBLE_INT
)
270 else if ((prec
- count
) >= HOST_BITS_PER_WIDE_INT
)
272 *hv
&= ~(HOST_WIDE_INT_M1U
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
));
273 *hv
|= signmask
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
);
278 *lv
&= ~(HOST_WIDE_INT_M1U
<< (prec
- count
));
279 *lv
|= signmask
<< (prec
- count
);
283 /* Shift the doubleword integer in L1, H1 left by COUNT places
284 keeping only PREC bits of result.
285 Shift right if COUNT is negative.
286 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
287 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
290 lshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
291 unsigned HOST_WIDE_INT count
, unsigned int prec
,
292 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
)
294 unsigned HOST_WIDE_INT signmask
;
296 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
298 /* Shifting by the host word size is undefined according to the
299 ANSI standard, so we must handle this as a special case. */
303 else if (count
>= HOST_BITS_PER_WIDE_INT
)
305 *hv
= l1
<< (count
- HOST_BITS_PER_WIDE_INT
);
310 *hv
= (((unsigned HOST_WIDE_INT
) h1
<< count
)
311 | (l1
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
315 /* Sign extend all bits that are beyond the precision. */
317 signmask
= -((prec
> HOST_BITS_PER_WIDE_INT
318 ? ((unsigned HOST_WIDE_INT
) *hv
319 >> (prec
- HOST_BITS_PER_WIDE_INT
- 1))
320 : (*lv
>> (prec
- 1))) & 1);
322 if (prec
>= HOST_BITS_PER_DOUBLE_INT
)
324 else if (prec
>= HOST_BITS_PER_WIDE_INT
)
326 *hv
&= ~(HOST_WIDE_INT_M1U
<< (prec
- HOST_BITS_PER_WIDE_INT
));
327 *hv
|= signmask
<< (prec
- HOST_BITS_PER_WIDE_INT
);
332 *lv
&= ~(HOST_WIDE_INT_M1U
<< prec
);
333 *lv
|= signmask
<< prec
;
337 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
338 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
339 CODE is a tree code for a kind of division, one of
340 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
342 It controls how the quotient is rounded to an integer.
343 Return nonzero if the operation overflows.
344 UNS nonzero says do unsigned division. */
347 div_and_round_double (unsigned code
, int uns
,
348 /* num == numerator == dividend */
349 unsigned HOST_WIDE_INT lnum_orig
,
350 HOST_WIDE_INT hnum_orig
,
351 /* den == denominator == divisor */
352 unsigned HOST_WIDE_INT lden_orig
,
353 HOST_WIDE_INT hden_orig
,
354 unsigned HOST_WIDE_INT
*lquo
,
355 HOST_WIDE_INT
*hquo
, unsigned HOST_WIDE_INT
*lrem
,
359 HOST_WIDE_INT num
[4 + 1]; /* extra element for scaling. */
360 HOST_WIDE_INT den
[4], quo
[4];
362 unsigned HOST_WIDE_INT work
;
363 unsigned HOST_WIDE_INT carry
= 0;
364 unsigned HOST_WIDE_INT lnum
= lnum_orig
;
365 HOST_WIDE_INT hnum
= hnum_orig
;
366 unsigned HOST_WIDE_INT lden
= lden_orig
;
367 HOST_WIDE_INT hden
= hden_orig
;
370 if (hden
== 0 && lden
== 0)
371 overflow
= 1, lden
= 1;
373 /* Calculate quotient sign and convert operands to unsigned. */
379 /* (minimum integer) / (-1) is the only overflow case. */
380 if (neg_double (lnum
, hnum
, &lnum
, &hnum
)
381 && ((HOST_WIDE_INT
) lden
& hden
) == -1)
387 neg_double (lden
, hden
, &lden
, &hden
);
391 if (hnum
== 0 && hden
== 0)
392 { /* single precision */
394 /* This unsigned division rounds toward zero. */
400 { /* trivial case: dividend < divisor */
401 /* hden != 0 already checked. */
408 memset (quo
, 0, sizeof quo
);
410 memset (num
, 0, sizeof num
); /* to zero 9th element */
411 memset (den
, 0, sizeof den
);
413 encode (num
, lnum
, hnum
);
414 encode (den
, lden
, hden
);
416 /* Special code for when the divisor < BASE. */
417 if (hden
== 0 && lden
< (unsigned HOST_WIDE_INT
) BASE
)
419 /* hnum != 0 already checked. */
420 for (i
= 4 - 1; i
>= 0; i
--)
422 work
= num
[i
] + carry
* BASE
;
423 quo
[i
] = work
/ lden
;
429 /* Full double precision division,
430 with thanks to Don Knuth's "Seminumerical Algorithms". */
431 int num_hi_sig
, den_hi_sig
;
432 unsigned HOST_WIDE_INT quo_est
, scale
;
434 /* Find the highest nonzero divisor digit. */
435 for (i
= 4 - 1;; i
--)
442 /* Insure that the first digit of the divisor is at least BASE/2.
443 This is required by the quotient digit estimation algorithm. */
445 scale
= BASE
/ (den
[den_hi_sig
] + 1);
447 { /* scale divisor and dividend */
449 for (i
= 0; i
<= 4 - 1; i
++)
451 work
= (num
[i
] * scale
) + carry
;
452 num
[i
] = LOWPART (work
);
453 carry
= HIGHPART (work
);
458 for (i
= 0; i
<= 4 - 1; i
++)
460 work
= (den
[i
] * scale
) + carry
;
461 den
[i
] = LOWPART (work
);
462 carry
= HIGHPART (work
);
463 if (den
[i
] != 0) den_hi_sig
= i
;
470 for (i
= num_hi_sig
- den_hi_sig
- 1; i
>= 0; i
--)
472 /* Guess the next quotient digit, quo_est, by dividing the first
473 two remaining dividend digits by the high order quotient digit.
474 quo_est is never low and is at most 2 high. */
475 unsigned HOST_WIDE_INT tmp
;
477 num_hi_sig
= i
+ den_hi_sig
+ 1;
478 work
= num
[num_hi_sig
] * BASE
+ num
[num_hi_sig
- 1];
479 if (num
[num_hi_sig
] != den
[den_hi_sig
])
480 quo_est
= work
/ den
[den_hi_sig
];
484 /* Refine quo_est so it's usually correct, and at most one high. */
485 tmp
= work
- quo_est
* den
[den_hi_sig
];
487 && (den
[den_hi_sig
- 1] * quo_est
488 > (tmp
* BASE
+ num
[num_hi_sig
- 2])))
491 /* Try QUO_EST as the quotient digit, by multiplying the
492 divisor by QUO_EST and subtracting from the remaining dividend.
493 Keep in mind that QUO_EST is the I - 1st digit. */
496 for (j
= 0; j
<= den_hi_sig
; j
++)
498 work
= quo_est
* den
[j
] + carry
;
499 carry
= HIGHPART (work
);
500 work
= num
[i
+ j
] - LOWPART (work
);
501 num
[i
+ j
] = LOWPART (work
);
502 carry
+= HIGHPART (work
) != 0;
505 /* If quo_est was high by one, then num[i] went negative and
506 we need to correct things. */
507 if (num
[num_hi_sig
] < (HOST_WIDE_INT
) carry
)
510 carry
= 0; /* add divisor back in */
511 for (j
= 0; j
<= den_hi_sig
; j
++)
513 work
= num
[i
+ j
] + den
[j
] + carry
;
514 carry
= HIGHPART (work
);
515 num
[i
+ j
] = LOWPART (work
);
518 num
[num_hi_sig
] += carry
;
521 /* Store the quotient digit. */
526 decode (quo
, lquo
, hquo
);
529 /* If result is negative, make it so. */
531 neg_double (*lquo
, *hquo
, lquo
, hquo
);
533 /* Compute trial remainder: rem = num - (quo * den) */
534 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
535 neg_double (*lrem
, *hrem
, lrem
, hrem
);
536 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
541 case TRUNC_MOD_EXPR
: /* round toward zero */
542 case EXACT_DIV_EXPR
: /* for this one, it shouldn't matter */
546 case FLOOR_MOD_EXPR
: /* round toward negative infinity */
547 if (quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio < 0 && rem != 0 */
550 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1,
558 case CEIL_MOD_EXPR
: /* round toward positive infinity */
559 if (!quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio > 0 && rem != 0 */
561 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
569 case ROUND_MOD_EXPR
: /* round to closest integer */
571 unsigned HOST_WIDE_INT labs_rem
= *lrem
;
572 HOST_WIDE_INT habs_rem
= *hrem
;
573 unsigned HOST_WIDE_INT labs_den
= lden
, lnegabs_rem
, ldiff
;
574 HOST_WIDE_INT habs_den
= hden
, hnegabs_rem
, hdiff
;
576 /* Get absolute values. */
577 if (!uns
&& *hrem
< 0)
578 neg_double (*lrem
, *hrem
, &labs_rem
, &habs_rem
);
579 if (!uns
&& hden
< 0)
580 neg_double (lden
, hden
, &labs_den
, &habs_den
);
582 /* If abs(rem) >= abs(den) - abs(rem), adjust the quotient. */
583 neg_double (labs_rem
, habs_rem
, &lnegabs_rem
, &hnegabs_rem
);
584 add_double (labs_den
, habs_den
, lnegabs_rem
, hnegabs_rem
,
587 if (((unsigned HOST_WIDE_INT
) habs_rem
588 > (unsigned HOST_WIDE_INT
) hdiff
)
589 || (habs_rem
== hdiff
&& labs_rem
>= ldiff
))
593 add_double (*lquo
, *hquo
,
594 (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1, lquo
, hquo
);
597 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
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
);
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. */
622 double_int::from_buffer (const unsigned char *buffer
, int len
)
624 double_int result
= double_int_zero
;
625 int words
= len
/ UNITS_PER_WORD
;
627 gcc_assert (len
* BITS_PER_UNIT
<= HOST_BITS_PER_DOUBLE_INT
);
629 for (int byte
= 0; byte
< len
; byte
++)
632 int bitpos
= byte
* BITS_PER_UNIT
;
633 unsigned HOST_WIDE_INT value
;
635 if (len
> UNITS_PER_WORD
)
637 int word
= byte
/ UNITS_PER_WORD
;
639 if (WORDS_BIG_ENDIAN
)
640 word
= (words
- 1) - word
;
642 offset
= word
* UNITS_PER_WORD
;
644 if (BYTES_BIG_ENDIAN
)
645 offset
+= (UNITS_PER_WORD
- 1) - (byte
% UNITS_PER_WORD
);
647 offset
+= byte
% UNITS_PER_WORD
;
650 offset
= BYTES_BIG_ENDIAN
? (len
- 1) - byte
: byte
;
652 value
= (unsigned HOST_WIDE_INT
) buffer
[offset
];
654 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
655 result
.low
|= value
<< bitpos
;
657 result
.high
|= value
<< (bitpos
- HOST_BITS_PER_WIDE_INT
);
664 /* Returns mask for PREC bits. */
667 double_int::mask (unsigned prec
)
669 unsigned HOST_WIDE_INT m
;
672 if (prec
> HOST_BITS_PER_WIDE_INT
)
674 prec
-= HOST_BITS_PER_WIDE_INT
;
675 m
= ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1;
676 mask
.high
= (HOST_WIDE_INT
) m
;
682 mask
.low
= prec
? ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1 : 0;
688 /* Returns a maximum value for signed or unsigned integer
689 of precision PREC. */
692 double_int::max_value (unsigned int prec
, bool uns
)
694 return double_int::mask (prec
- (uns
? 0 : 1));
697 /* Returns a minimum value for signed or unsigned integer
698 of precision PREC. */
701 double_int::min_value (unsigned int prec
, bool uns
)
704 return double_int_zero
;
705 return double_int_one
.lshift (prec
- 1, prec
, false);
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.
712 This corresponds to returning the value represented by PREC lowermost bits
713 of CST, with the given signedness. */
716 double_int::ext (unsigned prec
, bool uns
) const
719 return this->zext (prec
);
721 return this->sext (prec
);
724 /* The same as double_int::ext with UNS = true. */
727 double_int::zext (unsigned prec
) const
729 const double_int
&cst
= *this;
730 double_int mask
= double_int::mask (prec
);
733 r
.low
= cst
.low
& mask
.low
;
734 r
.high
= cst
.high
& mask
.high
;
739 /* The same as double_int::ext with UNS = false. */
742 double_int::sext (unsigned prec
) const
744 const double_int
&cst
= *this;
745 double_int mask
= double_int::mask (prec
);
747 unsigned HOST_WIDE_INT snum
;
749 if (prec
<= HOST_BITS_PER_WIDE_INT
)
753 prec
-= HOST_BITS_PER_WIDE_INT
;
754 snum
= (unsigned HOST_WIDE_INT
) cst
.high
;
756 if (((snum
>> (prec
- 1)) & 1) == 1)
758 r
.low
= cst
.low
| ~mask
.low
;
759 r
.high
= cst
.high
| ~mask
.high
;
763 r
.low
= cst
.low
& mask
.low
;
764 r
.high
= cst
.high
& mask
.high
;
770 /* Returns true if CST fits in signed HOST_WIDE_INT. */
773 double_int::fits_shwi () const
775 const double_int
&cst
= *this;
777 return (HOST_WIDE_INT
) cst
.low
>= 0;
778 else if (cst
.high
== -1)
779 return (HOST_WIDE_INT
) cst
.low
< 0;
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. */
788 double_int::fits_hwi (bool uns
) const
791 return this->fits_uhwi ();
793 return this->fits_shwi ();
799 double_int::operator * (double_int b
) const
801 const double_int
&a
= *this;
803 mul_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
807 /* Multiplies *this with B and returns a reference to *this. */
810 double_int::operator *= (double_int b
)
812 mul_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
816 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
817 *OVERFLOW is set to nonzero. */
820 double_int::mul_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
822 const double_int
&a
= *this;
824 *overflow
= mul_double_wide_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
826 &tem
.low
, &tem
.high
, unsigned_p
);
831 double_int::wide_mul_with_sign (double_int b
, bool unsigned_p
,
832 double_int
*higher
, bool *overflow
) const
836 *overflow
= mul_double_wide_with_sign (low
, high
, b
.low
, b
.high
,
837 &lower
.low
, &lower
.high
,
838 &higher
->low
, &higher
->high
,
846 double_int::operator + (double_int b
) const
848 const double_int
&a
= *this;
850 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
854 /* Adds B to *this and returns a reference to *this. */
857 double_int::operator += (double_int b
)
859 add_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
864 /* Returns A + B. If the operation overflows according to UNSIGNED_P,
865 *OVERFLOW is set to nonzero. */
868 double_int::add_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
870 const double_int
&a
= *this;
872 *overflow
= add_double_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
873 &ret
.low
, &ret
.high
, unsigned_p
);
880 double_int::operator - (double_int b
) const
882 const double_int
&a
= *this;
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
);
889 /* Subtracts B from *this and returns a reference to *this. */
892 double_int::operator -= (double_int b
)
894 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
895 add_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
900 /* Returns A - B. If the operation overflows via inconsistent sign bits,
901 *OVERFLOW is set to nonzero. */
904 double_int::sub_with_overflow (double_int b
, bool *overflow
) const
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
);
916 double_int::operator - () const
918 const double_int
&a
= *this;
920 neg_double (a
.low
, a
.high
, &ret
.low
, &ret
.high
);
925 double_int::neg_with_overflow (bool *overflow
) const
928 *overflow
= neg_double (low
, high
, &ret
.low
, &ret
.high
);
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
938 double_int::divmod_with_overflow (double_int b
, bool uns
, unsigned code
,
939 double_int
*mod
, bool *overflow
) const
941 const double_int
&a
= *this;
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
);
951 double_int::divmod (double_int b
, bool uns
, unsigned code
,
952 double_int
*mod
) const
954 const double_int
&a
= *this;
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
);
963 /* The same as double_int::divmod with UNS = false. */
966 double_int::sdivmod (double_int b
, unsigned code
, double_int
*mod
) const
968 return this->divmod (b
, false, code
, mod
);
971 /* The same as double_int::divmod with UNS = true. */
974 double_int::udivmod (double_int b
, unsigned code
, double_int
*mod
) const
976 return this->divmod (b
, true, code
, mod
);
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. */
984 double_int::div (double_int b
, bool uns
, unsigned code
) const
988 return this->divmod (b
, uns
, code
, &mod
);
991 /* The same as double_int::div with UNS = false. */
994 double_int::sdiv (double_int b
, unsigned code
) const
996 return this->div (b
, false, code
);
999 /* The same as double_int::div with UNS = true. */
1002 double_int::udiv (double_int b
, unsigned code
) const
1004 return this->div (b
, true, code
);
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. */
1012 double_int::mod (double_int b
, bool uns
, unsigned code
) const
1016 this->divmod (b
, uns
, code
, &mod
);
1020 /* The same as double_int::mod with UNS = false. */
1023 double_int::smod (double_int b
, unsigned code
) const
1025 return this->mod (b
, false, code
);
1028 /* The same as double_int::mod with UNS = true. */
1031 double_int::umod (double_int b
, unsigned code
) const
1033 return this->mod (b
, true, code
);
1036 /* Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
1037 the multiple in *MULTIPLE. Otherwise return FALSE and leave *MULTIPLE
1041 double_int::multiple_of (double_int factor
,
1042 bool unsigned_p
, double_int
*multiple
) const
1044 double_int remainder
;
1045 double_int quotient
= this->divmod (factor
, unsigned_p
,
1046 TRUNC_DIV_EXPR
, &remainder
);
1047 if (remainder
.is_zero ())
1049 *multiple
= quotient
;
1056 /* Set BITPOS bit in A. */
1058 double_int::set_bit (unsigned bitpos
) const
1060 double_int a
= *this;
1061 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
1062 a
.low
|= (unsigned HOST_WIDE_INT
) 1 << bitpos
;
1064 a
.high
|= (HOST_WIDE_INT
) 1 << (bitpos
- HOST_BITS_PER_WIDE_INT
);
1069 /* Count trailing zeros in A. */
1071 double_int::trailing_zeros () const
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
;
1077 return HOST_BITS_PER_DOUBLE_INT
;
1078 bits
+= ctz_hwi (w
);
1082 /* Shift A left by COUNT places. */
1085 double_int::lshift (HOST_WIDE_INT count
) const
1089 gcc_checking_assert (count
>= 0);
1091 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
1093 /* Shifting by the host word size is undefined according to the
1094 ANSI standard, so we must handle this as a special case. */
1098 else if (count
>= HOST_BITS_PER_WIDE_INT
)
1100 ret
.high
= low
<< (count
- HOST_BITS_PER_WIDE_INT
);
1105 ret
.high
= (((unsigned HOST_WIDE_INT
) high
<< count
)
1106 | (low
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
1107 ret
.low
= low
<< count
;
1113 /* Shift A right by COUNT places. */
1116 double_int::rshift (HOST_WIDE_INT count
) const
1120 gcc_checking_assert (count
>= 0);
1122 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
1124 /* Shifting by the host word size is undefined according to the
1125 ANSI standard, so we must handle this as a special case. */
1129 else if (count
>= HOST_BITS_PER_WIDE_INT
)
1133 = (unsigned HOST_WIDE_INT
) (high
>> (count
- HOST_BITS_PER_WIDE_INT
));
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));
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. */
1151 double_int::lshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1155 lshift_double (low
, high
, count
, prec
, &ret
.low
, &ret
.high
);
1157 rshift_double (low
, high
, absu_hwi (count
), prec
, &ret
.low
, &ret
.high
, arith
);
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. */
1166 double_int::rshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1170 rshift_double (low
, high
, count
, prec
, &ret
.low
, &ret
.high
, arith
);
1172 lshift_double (low
, high
, absu_hwi (count
), prec
, &ret
.low
, &ret
.high
);
1176 /* Arithmetic shift A left by COUNT places keeping only PREC bits of result.
1177 Shift right if COUNT is negative. */
1180 double_int::alshift (HOST_WIDE_INT count
, unsigned int prec
) const
1184 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
);
1186 rshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
, true);
1190 /* Arithmetic shift A right by COUNT places keeping only PREC bits of result.
1191 Shift left if COUNT is negative. */
1194 double_int::arshift (HOST_WIDE_INT count
, unsigned int prec
) const
1198 rshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, true);
1200 lshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
);
1204 /* Logical shift A left by COUNT places keeping only PREC bits of result.
1205 Shift right if COUNT is negative. */
1208 double_int::llshift (HOST_WIDE_INT count
, unsigned int prec
) const
1212 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
);
1214 rshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
, false);
1218 /* Logical shift A right by COUNT places keeping only PREC bits of result.
1219 Shift left if COUNT is negative. */
1222 double_int::lrshift (HOST_WIDE_INT count
, unsigned int prec
) const
1226 rshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, false);
1228 lshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
);
1232 /* Rotate A left by COUNT places keeping only PREC bits of result.
1233 Rotate right if COUNT is negative. */
1236 double_int::lrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1244 t1
= this->llshift (count
, prec
);
1245 t2
= this->lrshift (prec
- count
, prec
);
1250 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
1251 Rotate right if COUNT is negative. */
1254 double_int::rrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1262 t1
= this->lrshift (count
, prec
);
1263 t2
= this->llshift (prec
- count
, prec
);
1268 /* Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the
1269 comparison is given by UNS. */
1272 double_int::cmp (double_int b
, bool uns
) const
1275 return this->ucmp (b
);
1277 return this->scmp (b
);
1280 /* Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B,
1284 double_int::ucmp (double_int b
) const
1286 const double_int
&a
= *this;
1287 if ((unsigned HOST_WIDE_INT
) a
.high
< (unsigned HOST_WIDE_INT
) b
.high
)
1289 if ((unsigned HOST_WIDE_INT
) a
.high
> (unsigned HOST_WIDE_INT
) b
.high
)
1299 /* Compares two signed values A and B. Returns -1 if A < B, 0 if A == B,
1303 double_int::scmp (double_int b
) const
1305 const double_int
&a
= *this;
1306 if (a
.high
< b
.high
)
1308 if (a
.high
> b
.high
)
1318 /* Compares two unsigned values A and B for less-than. */
1321 double_int::ult (double_int b
) const
1323 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1325 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1332 /* Compares two unsigned values A and B for less-than or equal-to. */
1335 double_int::ule (double_int b
) const
1337 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1339 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1346 /* Compares two unsigned values A and B for greater-than. */
1349 double_int::ugt (double_int b
) const
1351 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1353 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1360 /* Compares two signed values A and B for less-than. */
1363 double_int::slt (double_int b
) const
1374 /* Compares two signed values A and B for less-than or equal-to. */
1377 double_int::sle (double_int b
) const
1388 /* Compares two signed values A and B for greater-than. */
1391 double_int::sgt (double_int b
) const
1403 /* Compares two values A and B. Returns max value. Signedness of the
1404 comparison is given by UNS. */
1407 double_int::max (double_int b
, bool uns
)
1409 return (this->cmp (b
, uns
) == 1) ? *this : b
;
1412 /* Compares two signed values A and B. Returns max value. */
1415 double_int::smax (double_int b
)
1417 return (this->scmp (b
) == 1) ? *this : b
;
1420 /* Compares two unsigned values A and B. Returns max value. */
1423 double_int::umax (double_int b
)
1425 return (this->ucmp (b
) == 1) ? *this : b
;
1428 /* Compares two values A and B. Returns mix value. Signedness of the
1429 comparison is given by UNS. */
1432 double_int::min (double_int b
, bool uns
)
1434 return (this->cmp (b
, uns
) == -1) ? *this : b
;
1437 /* Compares two signed values A and B. Returns min value. */
1440 double_int::smin (double_int b
)
1442 return (this->scmp (b
) == -1) ? *this : b
;
1445 /* Compares two unsigned values A and B. Returns min value. */
1448 double_int::umin (double_int b
)
1450 return (this->ucmp (b
) == -1) ? *this : b
;
1453 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
1456 double_int_split_digit (double_int
*cst
, unsigned base
)
1458 unsigned HOST_WIDE_INT resl
, reml
;
1459 HOST_WIDE_INT resh
, remh
;
1461 div_and_round_double (FLOOR_DIV_EXPR
, true, cst
->low
, cst
->high
, base
, 0,
1462 &resl
, &resh
, &reml
, &remh
);
1469 /* Dumps CST to FILE. If UNS is true, CST is considered to be unsigned,
1470 otherwise it is signed. */
1473 dump_double_int (FILE *file
, double_int cst
, bool uns
)
1475 unsigned digits
[100], n
;
1480 fprintf (file
, "0");
1484 if (!uns
&& cst
.is_negative ())
1486 fprintf (file
, "-");
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
]);
1497 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1501 mpz_set_double_int (mpz_t result
, double_int val
, bool uns
)
1503 bool negate
= false;
1504 unsigned HOST_WIDE_INT vp
[2];
1506 if (!uns
&& val
.is_negative ())
1513 vp
[1] = (unsigned HOST_WIDE_INT
) val
.high
;
1514 mpz_import (result
, 2, -1, sizeof (HOST_WIDE_INT
), 0, 0, vp
);
1517 mpz_neg (result
, result
);
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. */
1525 mpz_get_double_int (const_tree type
, mpz_t val
, bool wrap
)
1527 unsigned HOST_WIDE_INT
*vp
;
1537 get_type_static_bounds (type
, min
, max
);
1539 if (mpz_cmp (val
, min
) < 0)
1541 else if (mpz_cmp (val
, max
) > 0)
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
;
1556 vp
= (unsigned HOST_WIDE_INT
*) alloca (count
* sizeof (HOST_WIDE_INT
));
1560 mpz_export (vp
, &count
, -1, sizeof (HOST_WIDE_INT
), 0, 0, val
);
1562 gcc_assert (wrap
|| count
<= 2);
1565 res
.high
= (HOST_WIDE_INT
) vp
[1];
1567 res
= res
.ext (TYPE_PRECISION (type
), TYPE_UNSIGNED (type
));
1568 if (mpz_sgn (val
) < 0)