1 /* Operations with long integers.
2 Copyright (C) 2006-2013 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 static int add_double_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
27 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
28 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
31 #define add_double(l1,h1,l2,h2,lv,hv) \
32 add_double_with_sign (l1, h1, l2, h2, lv, hv, false)
34 static int neg_double (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
35 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*);
37 static int mul_double_wide_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
38 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
39 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
40 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
43 #define mul_double(l1,h1,l2,h2,lv,hv) \
44 mul_double_wide_with_sign (l1, h1, l2, h2, lv, hv, NULL, NULL, false)
46 static int div_and_round_double (unsigned, int, unsigned HOST_WIDE_INT
,
47 HOST_WIDE_INT
, unsigned HOST_WIDE_INT
,
48 HOST_WIDE_INT
, unsigned HOST_WIDE_INT
*,
49 HOST_WIDE_INT
*, unsigned HOST_WIDE_INT
*,
52 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
53 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
54 and SUM1. Then this yields nonzero if overflow occurred during the
57 Overflow occurs if A and B have the same sign, but A and SUM differ in
58 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
60 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
62 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
63 We do that by representing the two-word integer in 4 words, with only
64 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
65 number. The value of the word is LOWPART + HIGHPART * BASE. */
68 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
70 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
71 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
73 /* Unpack a two-word integer into 4 words.
74 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
75 WORDS points to the array of HOST_WIDE_INTs. */
78 encode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT low
, HOST_WIDE_INT hi
)
80 words
[0] = LOWPART (low
);
81 words
[1] = HIGHPART (low
);
82 words
[2] = LOWPART (hi
);
83 words
[3] = HIGHPART (hi
);
86 /* Pack an array of 4 words into a two-word integer.
87 WORDS points to the array of words.
88 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
91 decode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT
*low
,
94 *low
= words
[0] + words
[1] * BASE
;
95 *hi
= words
[2] + words
[3] * BASE
;
98 /* Add two doubleword integers with doubleword result.
99 Return nonzero if the operation overflows according to UNSIGNED_P.
100 Each argument is given as two `HOST_WIDE_INT' pieces.
101 One argument is L1 and H1; the other, L2 and H2.
102 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
105 add_double_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
106 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
107 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
110 unsigned HOST_WIDE_INT l
;
114 h
= (HOST_WIDE_INT
) ((unsigned HOST_WIDE_INT
) h1
115 + (unsigned HOST_WIDE_INT
) h2
122 return ((unsigned HOST_WIDE_INT
) h
< (unsigned HOST_WIDE_INT
) h1
126 return OVERFLOW_SUM_SIGN (h1
, h2
, h
);
129 /* Negate a doubleword integer with doubleword result.
130 Return nonzero if the operation overflows, assuming it's signed.
131 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
132 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
135 neg_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
136 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
)
142 return (*hv
& h1
) < 0;
152 /* Multiply two doubleword integers with quadword result.
153 Return nonzero if the operation overflows according to UNSIGNED_P.
154 Each argument is given as two `HOST_WIDE_INT' pieces.
155 One argument is L1 and H1; the other, L2 and H2.
156 The value is stored as four `HOST_WIDE_INT' pieces in *LV and *HV,
158 If lw is NULL then only the low part and no overflow is computed. */
161 mul_double_wide_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
162 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
163 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
164 unsigned HOST_WIDE_INT
*lw
, HOST_WIDE_INT
*hw
,
167 HOST_WIDE_INT arg1
[4];
168 HOST_WIDE_INT arg2
[4];
169 HOST_WIDE_INT prod
[4 * 2];
170 unsigned HOST_WIDE_INT carry
;
172 unsigned HOST_WIDE_INT neglow
;
173 HOST_WIDE_INT neghigh
;
175 encode (arg1
, l1
, h1
);
176 encode (arg2
, l2
, h2
);
178 memset (prod
, 0, sizeof prod
);
180 for (i
= 0; i
< 4; i
++)
183 for (j
= 0; j
< 4; j
++)
186 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
187 carry
+= (unsigned HOST_WIDE_INT
) arg1
[i
] * arg2
[j
];
188 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
190 prod
[k
] = LOWPART (carry
);
191 carry
= HIGHPART (carry
);
196 decode (prod
, lv
, hv
);
198 /* We are not interested in the wide part nor in overflow. */
202 decode (prod
+ 4, lw
, hw
);
204 /* Unsigned overflow is immediate. */
206 return (*lw
| *hw
) != 0;
208 /* Check for signed overflow by calculating the signed representation of the
209 top half of the result; it should agree with the low half's sign bit. */
212 neg_double (l2
, h2
, &neglow
, &neghigh
);
213 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
217 neg_double (l1
, h1
, &neglow
, &neghigh
);
218 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
220 return (*hv
< 0 ? ~(*lw
& *hw
) : *lw
| *hw
) != 0;
223 /* Shift the doubleword integer in L1, H1 right by COUNT places
224 keeping only PREC bits of result. ARITH nonzero specifies
225 arithmetic shifting; otherwise use logical shift.
226 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
229 rshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
230 unsigned HOST_WIDE_INT count
, unsigned int prec
,
231 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
234 unsigned HOST_WIDE_INT signmask
;
237 ? -((unsigned HOST_WIDE_INT
) h1
>> (HOST_BITS_PER_WIDE_INT
- 1))
240 if (SHIFT_COUNT_TRUNCATED
)
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
) (-1) << (prec
- count
- HOST_BITS_PER_WIDE_INT
));
275 *hv
|= signmask
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
);
280 *lv
&= ~((unsigned HOST_WIDE_INT
) (-1) << (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 (SHIFT_COUNT_TRUNCATED
)
301 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
303 /* Shifting by the host word size is undefined according to the
304 ANSI standard, so we must handle this as a special case. */
308 else if (count
>= HOST_BITS_PER_WIDE_INT
)
310 *hv
= l1
<< (count
- HOST_BITS_PER_WIDE_INT
);
315 *hv
= (((unsigned HOST_WIDE_INT
) h1
<< count
)
316 | (l1
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
320 /* Sign extend all bits that are beyond the precision. */
322 signmask
= -((prec
> HOST_BITS_PER_WIDE_INT
323 ? ((unsigned HOST_WIDE_INT
) *hv
324 >> (prec
- HOST_BITS_PER_WIDE_INT
- 1))
325 : (*lv
>> (prec
- 1))) & 1);
327 if (prec
>= HOST_BITS_PER_DOUBLE_INT
)
329 else if (prec
>= HOST_BITS_PER_WIDE_INT
)
331 *hv
&= ~((HOST_WIDE_INT
) (-1) << (prec
- HOST_BITS_PER_WIDE_INT
));
332 *hv
|= signmask
<< (prec
- HOST_BITS_PER_WIDE_INT
);
337 *lv
&= ~((unsigned HOST_WIDE_INT
) (-1) << prec
);
338 *lv
|= signmask
<< prec
;
342 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
343 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
344 CODE is a tree code for a kind of division, one of
345 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
347 It controls how the quotient is rounded to an integer.
348 Return nonzero if the operation overflows.
349 UNS nonzero says do unsigned division. */
352 div_and_round_double (unsigned code
, int uns
,
353 /* num == numerator == dividend */
354 unsigned HOST_WIDE_INT lnum_orig
,
355 HOST_WIDE_INT hnum_orig
,
356 /* den == denominator == divisor */
357 unsigned HOST_WIDE_INT lden_orig
,
358 HOST_WIDE_INT hden_orig
,
359 unsigned HOST_WIDE_INT
*lquo
,
360 HOST_WIDE_INT
*hquo
, unsigned HOST_WIDE_INT
*lrem
,
364 HOST_WIDE_INT num
[4 + 1]; /* extra element for scaling. */
365 HOST_WIDE_INT den
[4], quo
[4];
367 unsigned HOST_WIDE_INT work
;
368 unsigned HOST_WIDE_INT carry
= 0;
369 unsigned HOST_WIDE_INT lnum
= lnum_orig
;
370 HOST_WIDE_INT hnum
= hnum_orig
;
371 unsigned HOST_WIDE_INT lden
= lden_orig
;
372 HOST_WIDE_INT hden
= hden_orig
;
375 if (hden
== 0 && lden
== 0)
376 overflow
= 1, lden
= 1;
378 /* Calculate quotient sign and convert operands to unsigned. */
384 /* (minimum integer) / (-1) is the only overflow case. */
385 if (neg_double (lnum
, hnum
, &lnum
, &hnum
)
386 && ((HOST_WIDE_INT
) lden
& hden
) == -1)
392 neg_double (lden
, hden
, &lden
, &hden
);
396 if (hnum
== 0 && hden
== 0)
397 { /* single precision */
399 /* This unsigned division rounds toward zero. */
405 { /* trivial case: dividend < divisor */
406 /* hden != 0 already checked. */
413 memset (quo
, 0, sizeof quo
);
415 memset (num
, 0, sizeof num
); /* to zero 9th element */
416 memset (den
, 0, sizeof den
);
418 encode (num
, lnum
, hnum
);
419 encode (den
, lden
, hden
);
421 /* Special code for when the divisor < BASE. */
422 if (hden
== 0 && lden
< (unsigned HOST_WIDE_INT
) BASE
)
424 /* hnum != 0 already checked. */
425 for (i
= 4 - 1; i
>= 0; i
--)
427 work
= num
[i
] + carry
* BASE
;
428 quo
[i
] = work
/ lden
;
434 /* Full double precision division,
435 with thanks to Don Knuth's "Seminumerical Algorithms". */
436 int num_hi_sig
, den_hi_sig
;
437 unsigned HOST_WIDE_INT quo_est
, scale
;
439 /* Find the highest nonzero divisor digit. */
440 for (i
= 4 - 1;; i
--)
447 /* Insure that the first digit of the divisor is at least BASE/2.
448 This is required by the quotient digit estimation algorithm. */
450 scale
= BASE
/ (den
[den_hi_sig
] + 1);
452 { /* scale divisor and dividend */
454 for (i
= 0; i
<= 4 - 1; i
++)
456 work
= (num
[i
] * scale
) + carry
;
457 num
[i
] = LOWPART (work
);
458 carry
= HIGHPART (work
);
463 for (i
= 0; i
<= 4 - 1; i
++)
465 work
= (den
[i
] * scale
) + carry
;
466 den
[i
] = LOWPART (work
);
467 carry
= HIGHPART (work
);
468 if (den
[i
] != 0) den_hi_sig
= i
;
475 for (i
= num_hi_sig
- den_hi_sig
- 1; i
>= 0; i
--)
477 /* Guess the next quotient digit, quo_est, by dividing the first
478 two remaining dividend digits by the high order quotient digit.
479 quo_est is never low and is at most 2 high. */
480 unsigned HOST_WIDE_INT tmp
;
482 num_hi_sig
= i
+ den_hi_sig
+ 1;
483 work
= num
[num_hi_sig
] * BASE
+ num
[num_hi_sig
- 1];
484 if (num
[num_hi_sig
] != den
[den_hi_sig
])
485 quo_est
= work
/ den
[den_hi_sig
];
489 /* Refine quo_est so it's usually correct, and at most one high. */
490 tmp
= work
- quo_est
* den
[den_hi_sig
];
492 && (den
[den_hi_sig
- 1] * quo_est
493 > (tmp
* BASE
+ num
[num_hi_sig
- 2])))
496 /* Try QUO_EST as the quotient digit, by multiplying the
497 divisor by QUO_EST and subtracting from the remaining dividend.
498 Keep in mind that QUO_EST is the I - 1st digit. */
501 for (j
= 0; j
<= den_hi_sig
; j
++)
503 work
= quo_est
* den
[j
] + carry
;
504 carry
= HIGHPART (work
);
505 work
= num
[i
+ j
] - LOWPART (work
);
506 num
[i
+ j
] = LOWPART (work
);
507 carry
+= HIGHPART (work
) != 0;
510 /* If quo_est was high by one, then num[i] went negative and
511 we need to correct things. */
512 if (num
[num_hi_sig
] < (HOST_WIDE_INT
) carry
)
515 carry
= 0; /* add divisor back in */
516 for (j
= 0; j
<= den_hi_sig
; j
++)
518 work
= num
[i
+ j
] + den
[j
] + carry
;
519 carry
= HIGHPART (work
);
520 num
[i
+ j
] = LOWPART (work
);
523 num
[num_hi_sig
] += carry
;
526 /* Store the quotient digit. */
531 decode (quo
, lquo
, hquo
);
534 /* If result is negative, make it so. */
536 neg_double (*lquo
, *hquo
, lquo
, hquo
);
538 /* Compute trial remainder: rem = num - (quo * den) */
539 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
540 neg_double (*lrem
, *hrem
, lrem
, hrem
);
541 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
546 case TRUNC_MOD_EXPR
: /* round toward zero */
547 case EXACT_DIV_EXPR
: /* for this one, it shouldn't matter */
551 case FLOOR_MOD_EXPR
: /* round toward negative infinity */
552 if (quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio < 0 && rem != 0 */
555 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1,
563 case CEIL_MOD_EXPR
: /* round toward positive infinity */
564 if (!quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio > 0 && rem != 0 */
566 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
574 case ROUND_MOD_EXPR
: /* round to closest integer */
576 unsigned HOST_WIDE_INT labs_rem
= *lrem
;
577 HOST_WIDE_INT habs_rem
= *hrem
;
578 unsigned HOST_WIDE_INT labs_den
= lden
, ltwice
;
579 HOST_WIDE_INT habs_den
= hden
, htwice
;
581 /* Get absolute values. */
583 neg_double (*lrem
, *hrem
, &labs_rem
, &habs_rem
);
585 neg_double (lden
, hden
, &labs_den
, &habs_den
);
587 /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient. */
588 mul_double ((HOST_WIDE_INT
) 2, (HOST_WIDE_INT
) 0,
589 labs_rem
, habs_rem
, <wice
, &htwice
);
591 if (((unsigned HOST_WIDE_INT
) habs_den
592 < (unsigned HOST_WIDE_INT
) htwice
)
593 || (((unsigned HOST_WIDE_INT
) habs_den
594 == (unsigned HOST_WIDE_INT
) htwice
)
595 && (labs_den
<= ltwice
)))
599 add_double (*lquo
, *hquo
,
600 (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1, lquo
, hquo
);
603 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
615 /* Compute true remainder: rem = num - (quo * den) */
616 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
617 neg_double (*lrem
, *hrem
, lrem
, hrem
);
618 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
623 /* Construct from a buffer of length LEN. BUFFER will be read according
624 to byte endianess and word endianess. Only the lower LEN bytes
625 of the result are set; the remaining high bytes are cleared. */
628 double_int::from_buffer (const unsigned char *buffer
, int len
)
630 double_int result
= double_int_zero
;
631 int words
= len
/ UNITS_PER_WORD
;
633 gcc_assert (len
* BITS_PER_UNIT
<= HOST_BITS_PER_DOUBLE_INT
);
635 for (int byte
= 0; byte
< len
; byte
++)
638 int bitpos
= byte
* BITS_PER_UNIT
;
639 unsigned HOST_WIDE_INT value
;
641 if (len
> UNITS_PER_WORD
)
643 int word
= byte
/ UNITS_PER_WORD
;
645 if (WORDS_BIG_ENDIAN
)
646 word
= (words
- 1) - word
;
648 offset
= word
* UNITS_PER_WORD
;
650 if (BYTES_BIG_ENDIAN
)
651 offset
+= (UNITS_PER_WORD
- 1) - (byte
% UNITS_PER_WORD
);
653 offset
+= byte
% UNITS_PER_WORD
;
656 offset
= BYTES_BIG_ENDIAN
? (len
- 1) - byte
: byte
;
658 value
= (unsigned HOST_WIDE_INT
) buffer
[offset
];
660 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
661 result
.low
|= value
<< bitpos
;
663 result
.high
|= value
<< (bitpos
- HOST_BITS_PER_WIDE_INT
);
670 /* Returns mask for PREC bits. */
673 double_int::mask (unsigned prec
)
675 unsigned HOST_WIDE_INT m
;
678 if (prec
> HOST_BITS_PER_WIDE_INT
)
680 prec
-= HOST_BITS_PER_WIDE_INT
;
681 m
= ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1;
682 mask
.high
= (HOST_WIDE_INT
) m
;
688 mask
.low
= prec
? ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1 : 0;
694 /* Returns a maximum value for signed or unsigned integer
695 of precision PREC. */
698 double_int::max_value (unsigned int prec
, bool uns
)
700 return double_int::mask (prec
- (uns
? 0 : 1));
703 /* Returns a minimum value for signed or unsigned integer
704 of precision PREC. */
707 double_int::min_value (unsigned int prec
, bool uns
)
710 return double_int_zero
;
711 return double_int_one
.lshift (prec
- 1, prec
, false);
714 /* Clears the bits of CST over the precision PREC. If UNS is false, the bits
715 outside of the precision are set to the sign bit (i.e., the PREC-th one),
716 otherwise they are set to zero.
718 This corresponds to returning the value represented by PREC lowermost bits
719 of CST, with the given signedness. */
722 double_int::ext (unsigned prec
, bool uns
) const
725 return this->zext (prec
);
727 return this->sext (prec
);
730 /* The same as double_int::ext with UNS = true. */
733 double_int::zext (unsigned prec
) const
735 const double_int
&cst
= *this;
736 double_int mask
= double_int::mask (prec
);
739 r
.low
= cst
.low
& mask
.low
;
740 r
.high
= cst
.high
& mask
.high
;
745 /* The same as double_int::ext with UNS = false. */
748 double_int::sext (unsigned prec
) const
750 const double_int
&cst
= *this;
751 double_int mask
= double_int::mask (prec
);
753 unsigned HOST_WIDE_INT snum
;
755 if (prec
<= HOST_BITS_PER_WIDE_INT
)
759 prec
-= HOST_BITS_PER_WIDE_INT
;
760 snum
= (unsigned HOST_WIDE_INT
) cst
.high
;
762 if (((snum
>> (prec
- 1)) & 1) == 1)
764 r
.low
= cst
.low
| ~mask
.low
;
765 r
.high
= cst
.high
| ~mask
.high
;
769 r
.low
= cst
.low
& mask
.low
;
770 r
.high
= cst
.high
& mask
.high
;
776 /* Returns true if CST fits in signed HOST_WIDE_INT. */
779 double_int::fits_shwi () const
781 const double_int
&cst
= *this;
783 return (HOST_WIDE_INT
) cst
.low
>= 0;
784 else if (cst
.high
== -1)
785 return (HOST_WIDE_INT
) cst
.low
< 0;
790 /* Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in
791 unsigned HOST_WIDE_INT if UNS is true. */
794 double_int::fits_hwi (bool uns
) const
797 return this->fits_uhwi ();
799 return this->fits_shwi ();
805 double_int::operator * (double_int b
) const
807 const double_int
&a
= *this;
809 mul_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
813 /* Multiplies *this with B and returns a reference to *this. */
816 double_int::operator *= (double_int b
)
818 mul_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
822 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
823 *OVERFLOW is set to nonzero. */
826 double_int::mul_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
828 const double_int
&a
= *this;
830 *overflow
= mul_double_wide_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
832 &tem
.low
, &tem
.high
, unsigned_p
);
837 double_int::wide_mul_with_sign (double_int b
, bool unsigned_p
,
838 double_int
*higher
, bool *overflow
) const
842 *overflow
= mul_double_wide_with_sign (low
, high
, b
.low
, b
.high
,
843 &lower
.low
, &lower
.high
,
844 &higher
->low
, &higher
->high
,
852 double_int::operator + (double_int b
) const
854 const double_int
&a
= *this;
856 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
860 /* Adds B to *this and returns a reference to *this. */
863 double_int::operator += (double_int b
)
865 add_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
870 /* Returns A + B. If the operation overflows according to UNSIGNED_P,
871 *OVERFLOW is set to nonzero. */
874 double_int::add_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
876 const double_int
&a
= *this;
878 *overflow
= add_double_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
879 &ret
.low
, &ret
.high
, unsigned_p
);
886 double_int::operator - (double_int b
) const
888 const double_int
&a
= *this;
890 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
891 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
895 /* Subtracts B from *this and returns a reference to *this. */
898 double_int::operator -= (double_int b
)
900 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
901 add_double (low
, high
, b
.low
, b
.high
, &low
, &high
);
906 /* Returns A - B. If the operation overflows via inconsistent sign bits,
907 *OVERFLOW is set to nonzero. */
910 double_int::sub_with_overflow (double_int b
, bool *overflow
) const
913 neg_double (b
.low
, b
.high
, &ret
.low
, &ret
.high
);
914 add_double (low
, high
, ret
.low
, ret
.high
, &ret
.low
, &ret
.high
);
915 *overflow
= OVERFLOW_SUM_SIGN (ret
.high
, b
.high
, high
);
922 double_int::operator - () const
924 const double_int
&a
= *this;
926 neg_double (a
.low
, a
.high
, &ret
.low
, &ret
.high
);
931 double_int::neg_with_overflow (bool *overflow
) const
934 *overflow
= neg_double (low
, high
, &ret
.low
, &ret
.high
);
938 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
939 specified by CODE). CODE is enum tree_code in fact, but double_int.h
940 must be included before tree.h. The remainder after the division is
944 double_int::divmod_with_overflow (double_int b
, bool uns
, unsigned code
,
945 double_int
*mod
, bool *overflow
) const
947 const double_int
&a
= *this;
950 *overflow
= div_and_round_double (code
, uns
, a
.low
, a
.high
,
951 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
952 &mod
->low
, &mod
->high
);
957 double_int::divmod (double_int b
, bool uns
, unsigned code
,
958 double_int
*mod
) const
960 const double_int
&a
= *this;
963 div_and_round_double (code
, uns
, a
.low
, a
.high
,
964 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
965 &mod
->low
, &mod
->high
);
969 /* The same as double_int::divmod with UNS = false. */
972 double_int::sdivmod (double_int b
, unsigned code
, double_int
*mod
) const
974 return this->divmod (b
, false, code
, mod
);
977 /* The same as double_int::divmod with UNS = true. */
980 double_int::udivmod (double_int b
, unsigned code
, double_int
*mod
) const
982 return this->divmod (b
, true, code
, mod
);
985 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
986 specified by CODE). CODE is enum tree_code in fact, but double_int.h
987 must be included before tree.h. */
990 double_int::div (double_int b
, bool uns
, unsigned code
) const
994 return this->divmod (b
, uns
, code
, &mod
);
997 /* The same as double_int::div with UNS = false. */
1000 double_int::sdiv (double_int b
, unsigned code
) const
1002 return this->div (b
, false, code
);
1005 /* The same as double_int::div with UNS = true. */
1008 double_int::udiv (double_int b
, unsigned code
) const
1010 return this->div (b
, true, code
);
1013 /* Returns A % B (computed as unsigned depending on UNS, and rounded as
1014 specified by CODE). CODE is enum tree_code in fact, but double_int.h
1015 must be included before tree.h. */
1018 double_int::mod (double_int b
, bool uns
, unsigned code
) const
1022 this->divmod (b
, uns
, code
, &mod
);
1026 /* The same as double_int::mod with UNS = false. */
1029 double_int::smod (double_int b
, unsigned code
) const
1031 return this->mod (b
, false, code
);
1034 /* The same as double_int::mod with UNS = true. */
1037 double_int::umod (double_int b
, unsigned code
) const
1039 return this->mod (b
, true, code
);
1042 /* Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
1043 the multiple in *MULTIPLE. Otherwise return FALSE and leave *MULTIPLE
1047 double_int::multiple_of (double_int factor
,
1048 bool unsigned_p
, double_int
*multiple
) const
1050 double_int remainder
;
1051 double_int quotient
= this->divmod (factor
, unsigned_p
,
1052 TRUNC_DIV_EXPR
, &remainder
);
1053 if (remainder
.is_zero ())
1055 *multiple
= quotient
;
1062 /* Set BITPOS bit in A. */
1064 double_int::set_bit (unsigned bitpos
) const
1066 double_int a
= *this;
1067 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
1068 a
.low
|= (unsigned HOST_WIDE_INT
) 1 << bitpos
;
1070 a
.high
|= (HOST_WIDE_INT
) 1 << (bitpos
- HOST_BITS_PER_WIDE_INT
);
1075 /* Count trailing zeros in A. */
1077 double_int::trailing_zeros () const
1079 const double_int
&a
= *this;
1080 unsigned HOST_WIDE_INT w
= a
.low
? a
.low
: (unsigned HOST_WIDE_INT
) a
.high
;
1081 unsigned bits
= a
.low
? 0 : HOST_BITS_PER_WIDE_INT
;
1083 return HOST_BITS_PER_DOUBLE_INT
;
1084 bits
+= ctz_hwi (w
);
1088 /* Shift A left by COUNT places. */
1091 double_int::lshift (HOST_WIDE_INT count
) const
1095 gcc_checking_assert (count
>= 0);
1097 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
1099 /* Shifting by the host word size is undefined according to the
1100 ANSI standard, so we must handle this as a special case. */
1104 else if (count
>= HOST_BITS_PER_WIDE_INT
)
1106 ret
.high
= low
<< (count
- HOST_BITS_PER_WIDE_INT
);
1111 ret
.high
= (((unsigned HOST_WIDE_INT
) high
<< count
)
1112 | (low
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
1113 ret
.low
= low
<< count
;
1119 /* Shift A right by COUNT places. */
1122 double_int::rshift (HOST_WIDE_INT count
) const
1126 gcc_checking_assert (count
>= 0);
1128 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
1130 /* Shifting by the host word size is undefined according to the
1131 ANSI standard, so we must handle this as a special case. */
1135 else if (count
>= HOST_BITS_PER_WIDE_INT
)
1139 = (unsigned HOST_WIDE_INT
) (high
>> (count
- HOST_BITS_PER_WIDE_INT
));
1143 ret
.high
= high
>> count
;
1144 ret
.low
= ((low
>> count
)
1145 | ((unsigned HOST_WIDE_INT
) high
1146 << (HOST_BITS_PER_WIDE_INT
- count
- 1) << 1));
1152 /* Shift A left by COUNT places keeping only PREC bits of result. Shift
1153 right if COUNT is negative. ARITH true specifies arithmetic shifting;
1154 otherwise use logical shift. */
1157 double_int::lshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1161 lshift_double (low
, high
, count
, prec
, &ret
.low
, &ret
.high
);
1163 rshift_double (low
, high
, absu_hwi (count
), prec
, &ret
.low
, &ret
.high
, arith
);
1167 /* Shift A right by COUNT places keeping only PREC bits of result. Shift
1168 left if COUNT is negative. ARITH true specifies arithmetic shifting;
1169 otherwise use logical shift. */
1172 double_int::rshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1176 rshift_double (low
, high
, count
, prec
, &ret
.low
, &ret
.high
, arith
);
1178 lshift_double (low
, high
, absu_hwi (count
), prec
, &ret
.low
, &ret
.high
);
1182 /* Arithmetic shift A left by COUNT places keeping only PREC bits of result.
1183 Shift right if COUNT is negative. */
1186 double_int::alshift (HOST_WIDE_INT count
, unsigned int prec
) const
1190 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
);
1192 rshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
, true);
1196 /* Arithmetic shift A right by COUNT places keeping only PREC bits of result.
1197 Shift left if COUNT is negative. */
1200 double_int::arshift (HOST_WIDE_INT count
, unsigned int prec
) const
1204 rshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, true);
1206 lshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
);
1210 /* Logical shift A left by COUNT places keeping only PREC bits of result.
1211 Shift right if COUNT is negative. */
1214 double_int::llshift (HOST_WIDE_INT count
, unsigned int prec
) const
1218 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
);
1220 rshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
, false);
1224 /* Logical shift A right by COUNT places keeping only PREC bits of result.
1225 Shift left if COUNT is negative. */
1228 double_int::lrshift (HOST_WIDE_INT count
, unsigned int prec
) const
1232 rshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, false);
1234 lshift_double (low
, high
, absu_hwi (count
), prec
, &r
.low
, &r
.high
);
1238 /* Rotate A left by COUNT places keeping only PREC bits of result.
1239 Rotate right if COUNT is negative. */
1242 double_int::lrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1250 t1
= this->llshift (count
, prec
);
1251 t2
= this->lrshift (prec
- count
, prec
);
1256 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
1257 Rotate right if COUNT is negative. */
1260 double_int::rrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1268 t1
= this->lrshift (count
, prec
);
1269 t2
= this->llshift (prec
- count
, prec
);
1274 /* Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the
1275 comparison is given by UNS. */
1278 double_int::cmp (double_int b
, bool uns
) const
1281 return this->ucmp (b
);
1283 return this->scmp (b
);
1286 /* Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B,
1290 double_int::ucmp (double_int b
) const
1292 const double_int
&a
= *this;
1293 if ((unsigned HOST_WIDE_INT
) a
.high
< (unsigned HOST_WIDE_INT
) b
.high
)
1295 if ((unsigned HOST_WIDE_INT
) a
.high
> (unsigned HOST_WIDE_INT
) b
.high
)
1305 /* Compares two signed values A and B. Returns -1 if A < B, 0 if A == B,
1309 double_int::scmp (double_int b
) const
1311 const double_int
&a
= *this;
1312 if (a
.high
< b
.high
)
1314 if (a
.high
> b
.high
)
1324 /* Compares two unsigned values A and B for less-than. */
1327 double_int::ult (double_int b
) const
1329 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1331 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1338 /* Compares two unsigned values A and B for less-than or equal-to. */
1341 double_int::ule (double_int b
) const
1343 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1345 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1352 /* Compares two unsigned values A and B for greater-than. */
1355 double_int::ugt (double_int b
) const
1357 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1359 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1366 /* Compares two signed values A and B for less-than. */
1369 double_int::slt (double_int b
) const
1380 /* Compares two signed values A and B for less-than or equal-to. */
1383 double_int::sle (double_int b
) const
1394 /* Compares two signed values A and B for greater-than. */
1397 double_int::sgt (double_int b
) const
1409 /* Compares two values A and B. Returns max value. Signedness of the
1410 comparison is given by UNS. */
1413 double_int::max (double_int b
, bool uns
)
1415 return (this->cmp (b
, uns
) == 1) ? *this : b
;
1418 /* Compares two signed values A and B. Returns max value. */
1421 double_int::smax (double_int b
)
1423 return (this->scmp (b
) == 1) ? *this : b
;
1426 /* Compares two unsigned values A and B. Returns max value. */
1429 double_int::umax (double_int b
)
1431 return (this->ucmp (b
) == 1) ? *this : b
;
1434 /* Compares two values A and B. Returns mix value. Signedness of the
1435 comparison is given by UNS. */
1438 double_int::min (double_int b
, bool uns
)
1440 return (this->cmp (b
, uns
) == -1) ? *this : b
;
1443 /* Compares two signed values A and B. Returns min value. */
1446 double_int::smin (double_int b
)
1448 return (this->scmp (b
) == -1) ? *this : b
;
1451 /* Compares two unsigned values A and B. Returns min value. */
1454 double_int::umin (double_int b
)
1456 return (this->ucmp (b
) == -1) ? *this : b
;
1459 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
1462 double_int_split_digit (double_int
*cst
, unsigned base
)
1464 unsigned HOST_WIDE_INT resl
, reml
;
1465 HOST_WIDE_INT resh
, remh
;
1467 div_and_round_double (FLOOR_DIV_EXPR
, true, cst
->low
, cst
->high
, base
, 0,
1468 &resl
, &resh
, &reml
, &remh
);
1475 /* Dumps CST to FILE. If UNS is true, CST is considered to be unsigned,
1476 otherwise it is signed. */
1479 dump_double_int (FILE *file
, double_int cst
, bool uns
)
1481 unsigned digits
[100], n
;
1486 fprintf (file
, "0");
1490 if (!uns
&& cst
.is_negative ())
1492 fprintf (file
, "-");
1496 for (n
= 0; !cst
.is_zero (); n
++)
1497 digits
[n
] = double_int_split_digit (&cst
, 10);
1498 for (i
= n
- 1; i
>= 0; i
--)
1499 fprintf (file
, "%u", digits
[i
]);
1503 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1507 mpz_set_double_int (mpz_t result
, double_int val
, bool uns
)
1509 bool negate
= false;
1510 unsigned HOST_WIDE_INT vp
[2];
1512 if (!uns
&& val
.is_negative ())
1519 vp
[1] = (unsigned HOST_WIDE_INT
) val
.high
;
1520 mpz_import (result
, 2, -1, sizeof (HOST_WIDE_INT
), 0, 0, vp
);
1523 mpz_neg (result
, result
);
1526 /* Returns VAL converted to TYPE. If WRAP is true, then out-of-range
1527 values of VAL will be wrapped; otherwise, they will be set to the
1528 appropriate minimum or maximum TYPE bound. */
1531 mpz_get_double_int (const_tree type
, mpz_t val
, bool wrap
)
1533 unsigned HOST_WIDE_INT
*vp
;
1543 get_type_static_bounds (type
, min
, max
);
1545 if (mpz_cmp (val
, min
) < 0)
1547 else if (mpz_cmp (val
, max
) > 0)
1554 /* Determine the number of unsigned HOST_WIDE_INT that are required
1555 for representing the value. The code to calculate count is
1556 extracted from the GMP manual, section "Integer Import and Export":
1557 http://gmplib.org/manual/Integer-Import-and-Export.html */
1558 numb
= 8*sizeof(HOST_WIDE_INT
);
1559 count
= (mpz_sizeinbase (val
, 2) + numb
-1) / numb
;
1562 vp
= (unsigned HOST_WIDE_INT
*) alloca (count
* sizeof(HOST_WIDE_INT
));
1566 mpz_export (vp
, &count
, -1, sizeof (HOST_WIDE_INT
), 0, 0, val
);
1568 gcc_assert (wrap
|| count
<= 2);
1571 res
.high
= (HOST_WIDE_INT
) vp
[1];
1573 res
= res
.ext (TYPE_PRECISION (type
), TYPE_UNSIGNED (type
));
1574 if (mpz_sgn (val
) < 0)