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_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
*,
42 static int mul_double_wide_with_sign (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
43 unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
44 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
45 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*,
48 #define mul_double(l1,h1,l2,h2,lv,hv) \
49 mul_double_with_sign (l1, h1, l2, h2, lv, hv, false)
51 static void lshift_double (unsigned HOST_WIDE_INT
, HOST_WIDE_INT
,
52 HOST_WIDE_INT
, unsigned int,
53 unsigned HOST_WIDE_INT
*, HOST_WIDE_INT
*, bool);
55 static int div_and_round_double (unsigned, int, unsigned HOST_WIDE_INT
,
56 HOST_WIDE_INT
, unsigned HOST_WIDE_INT
,
57 HOST_WIDE_INT
, unsigned HOST_WIDE_INT
*,
58 HOST_WIDE_INT
*, unsigned HOST_WIDE_INT
*,
61 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
62 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
63 and SUM1. Then this yields nonzero if overflow occurred during the
66 Overflow occurs if A and B have the same sign, but A and SUM differ in
67 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
69 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
71 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
72 We do that by representing the two-word integer in 4 words, with only
73 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
74 number. The value of the word is LOWPART + HIGHPART * BASE. */
77 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
79 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
80 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
82 /* Unpack a two-word integer into 4 words.
83 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
84 WORDS points to the array of HOST_WIDE_INTs. */
87 encode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT low
, HOST_WIDE_INT hi
)
89 words
[0] = LOWPART (low
);
90 words
[1] = HIGHPART (low
);
91 words
[2] = LOWPART (hi
);
92 words
[3] = HIGHPART (hi
);
95 /* Pack an array of 4 words into a two-word integer.
96 WORDS points to the array of words.
97 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
100 decode (HOST_WIDE_INT
*words
, unsigned HOST_WIDE_INT
*low
,
103 *low
= words
[0] + words
[1] * BASE
;
104 *hi
= words
[2] + words
[3] * BASE
;
107 /* Add two doubleword integers with doubleword result.
108 Return nonzero if the operation overflows according to UNSIGNED_P.
109 Each argument is given as two `HOST_WIDE_INT' pieces.
110 One argument is L1 and H1; the other, L2 and H2.
111 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
114 add_double_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
115 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
116 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
119 unsigned HOST_WIDE_INT l
;
123 h
= (HOST_WIDE_INT
) ((unsigned HOST_WIDE_INT
) h1
124 + (unsigned HOST_WIDE_INT
) h2
131 return ((unsigned HOST_WIDE_INT
) h
< (unsigned HOST_WIDE_INT
) h1
135 return OVERFLOW_SUM_SIGN (h1
, h2
, h
);
138 /* Negate a doubleword integer with doubleword result.
139 Return nonzero if the operation overflows, assuming it's signed.
140 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
141 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
144 neg_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
145 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
)
151 return (*hv
& h1
) < 0;
161 /* Multiply two doubleword integers with doubleword result.
162 Return nonzero if the operation overflows according to UNSIGNED_P.
163 Each argument is given as two `HOST_WIDE_INT' pieces.
164 One argument is L1 and H1; the other, L2 and H2.
165 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
168 mul_double_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
169 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
170 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
173 unsigned HOST_WIDE_INT toplow
;
174 HOST_WIDE_INT tophigh
;
176 return mul_double_wide_with_sign (l1
, h1
, l2
, h2
,
177 lv
, hv
, &toplow
, &tophigh
,
182 mul_double_wide_with_sign (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
183 unsigned HOST_WIDE_INT l2
, HOST_WIDE_INT h2
,
184 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
185 unsigned HOST_WIDE_INT
*lw
, HOST_WIDE_INT
*hw
,
188 HOST_WIDE_INT arg1
[4];
189 HOST_WIDE_INT arg2
[4];
190 HOST_WIDE_INT prod
[4 * 2];
191 unsigned HOST_WIDE_INT carry
;
193 unsigned HOST_WIDE_INT neglow
;
194 HOST_WIDE_INT neghigh
;
196 encode (arg1
, l1
, h1
);
197 encode (arg2
, l2
, h2
);
199 memset (prod
, 0, sizeof prod
);
201 for (i
= 0; i
< 4; i
++)
204 for (j
= 0; j
< 4; j
++)
207 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
208 carry
+= (unsigned HOST_WIDE_INT
) arg1
[i
] * arg2
[j
];
209 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
211 prod
[k
] = LOWPART (carry
);
212 carry
= HIGHPART (carry
);
217 decode (prod
, lv
, hv
);
218 decode (prod
+ 4, lw
, hw
);
220 /* Unsigned overflow is immediate. */
222 return (*lw
| *hw
) != 0;
224 /* Check for signed overflow by calculating the signed representation of the
225 top half of the result; it should agree with the low half's sign bit. */
228 neg_double (l2
, h2
, &neglow
, &neghigh
);
229 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
233 neg_double (l1
, h1
, &neglow
, &neghigh
);
234 add_double (neglow
, neghigh
, *lw
, *hw
, lw
, hw
);
236 return (*hv
< 0 ? ~(*lw
& *hw
) : *lw
| *hw
) != 0;
239 /* Shift the doubleword integer in L1, H1 right by COUNT places
240 keeping only PREC bits of result. ARITH nonzero specifies
241 arithmetic shifting; otherwise use logical shift.
242 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
245 rshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
246 unsigned HOST_WIDE_INT count
, unsigned int prec
,
247 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
,
250 unsigned HOST_WIDE_INT signmask
;
253 ? -((unsigned HOST_WIDE_INT
) h1
>> (HOST_BITS_PER_WIDE_INT
- 1))
256 if (SHIFT_COUNT_TRUNCATED
)
259 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
261 /* Shifting by the host word size is undefined according to the
262 ANSI standard, so we must handle this as a special case. */
266 else if (count
>= HOST_BITS_PER_WIDE_INT
)
269 *lv
= (unsigned HOST_WIDE_INT
) h1
>> (count
- HOST_BITS_PER_WIDE_INT
);
273 *hv
= (unsigned HOST_WIDE_INT
) h1
>> count
;
275 | ((unsigned HOST_WIDE_INT
) h1
276 << (HOST_BITS_PER_WIDE_INT
- count
- 1) << 1));
279 /* Zero / sign extend all bits that are beyond the precision. */
286 else if ((prec
- count
) >= HOST_BITS_PER_DOUBLE_INT
)
288 else if ((prec
- count
) >= HOST_BITS_PER_WIDE_INT
)
290 *hv
&= ~((HOST_WIDE_INT
) (-1) << (prec
- count
- HOST_BITS_PER_WIDE_INT
));
291 *hv
|= signmask
<< (prec
- count
- HOST_BITS_PER_WIDE_INT
);
296 *lv
&= ~((unsigned HOST_WIDE_INT
) (-1) << (prec
- count
));
297 *lv
|= signmask
<< (prec
- count
);
301 /* Shift the doubleword integer in L1, H1 left by COUNT places
302 keeping only PREC bits of result.
303 Shift right if COUNT is negative.
304 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
305 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
308 lshift_double (unsigned HOST_WIDE_INT l1
, HOST_WIDE_INT h1
,
309 HOST_WIDE_INT count
, unsigned int prec
,
310 unsigned HOST_WIDE_INT
*lv
, HOST_WIDE_INT
*hv
, bool arith
)
312 unsigned HOST_WIDE_INT signmask
;
316 rshift_double (l1
, h1
, absu_hwi (count
), prec
, lv
, hv
, arith
);
320 if (SHIFT_COUNT_TRUNCATED
)
323 if (count
>= HOST_BITS_PER_DOUBLE_INT
)
325 /* Shifting by the host word size is undefined according to the
326 ANSI standard, so we must handle this as a special case. */
330 else if (count
>= HOST_BITS_PER_WIDE_INT
)
332 *hv
= l1
<< (count
- HOST_BITS_PER_WIDE_INT
);
337 *hv
= (((unsigned HOST_WIDE_INT
) h1
<< count
)
338 | (l1
>> (HOST_BITS_PER_WIDE_INT
- count
- 1) >> 1));
342 /* Sign extend all bits that are beyond the precision. */
344 signmask
= -((prec
> HOST_BITS_PER_WIDE_INT
345 ? ((unsigned HOST_WIDE_INT
) *hv
346 >> (prec
- HOST_BITS_PER_WIDE_INT
- 1))
347 : (*lv
>> (prec
- 1))) & 1);
349 if (prec
>= HOST_BITS_PER_DOUBLE_INT
)
351 else if (prec
>= HOST_BITS_PER_WIDE_INT
)
353 *hv
&= ~((HOST_WIDE_INT
) (-1) << (prec
- HOST_BITS_PER_WIDE_INT
));
354 *hv
|= signmask
<< (prec
- HOST_BITS_PER_WIDE_INT
);
359 *lv
&= ~((unsigned HOST_WIDE_INT
) (-1) << prec
);
360 *lv
|= signmask
<< prec
;
364 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
365 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
366 CODE is a tree code for a kind of division, one of
367 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
369 It controls how the quotient is rounded to an integer.
370 Return nonzero if the operation overflows.
371 UNS nonzero says do unsigned division. */
374 div_and_round_double (unsigned code
, int uns
,
375 /* num == numerator == dividend */
376 unsigned HOST_WIDE_INT lnum_orig
,
377 HOST_WIDE_INT hnum_orig
,
378 /* den == denominator == divisor */
379 unsigned HOST_WIDE_INT lden_orig
,
380 HOST_WIDE_INT hden_orig
,
381 unsigned HOST_WIDE_INT
*lquo
,
382 HOST_WIDE_INT
*hquo
, unsigned HOST_WIDE_INT
*lrem
,
386 HOST_WIDE_INT num
[4 + 1]; /* extra element for scaling. */
387 HOST_WIDE_INT den
[4], quo
[4];
389 unsigned HOST_WIDE_INT work
;
390 unsigned HOST_WIDE_INT carry
= 0;
391 unsigned HOST_WIDE_INT lnum
= lnum_orig
;
392 HOST_WIDE_INT hnum
= hnum_orig
;
393 unsigned HOST_WIDE_INT lden
= lden_orig
;
394 HOST_WIDE_INT hden
= hden_orig
;
397 if (hden
== 0 && lden
== 0)
398 overflow
= 1, lden
= 1;
400 /* Calculate quotient sign and convert operands to unsigned. */
406 /* (minimum integer) / (-1) is the only overflow case. */
407 if (neg_double (lnum
, hnum
, &lnum
, &hnum
)
408 && ((HOST_WIDE_INT
) lden
& hden
) == -1)
414 neg_double (lden
, hden
, &lden
, &hden
);
418 if (hnum
== 0 && hden
== 0)
419 { /* single precision */
421 /* This unsigned division rounds toward zero. */
427 { /* trivial case: dividend < divisor */
428 /* hden != 0 already checked. */
435 memset (quo
, 0, sizeof quo
);
437 memset (num
, 0, sizeof num
); /* to zero 9th element */
438 memset (den
, 0, sizeof den
);
440 encode (num
, lnum
, hnum
);
441 encode (den
, lden
, hden
);
443 /* Special code for when the divisor < BASE. */
444 if (hden
== 0 && lden
< (unsigned HOST_WIDE_INT
) BASE
)
446 /* hnum != 0 already checked. */
447 for (i
= 4 - 1; i
>= 0; i
--)
449 work
= num
[i
] + carry
* BASE
;
450 quo
[i
] = work
/ lden
;
456 /* Full double precision division,
457 with thanks to Don Knuth's "Seminumerical Algorithms". */
458 int num_hi_sig
, den_hi_sig
;
459 unsigned HOST_WIDE_INT quo_est
, scale
;
461 /* Find the highest nonzero divisor digit. */
462 for (i
= 4 - 1;; i
--)
469 /* Insure that the first digit of the divisor is at least BASE/2.
470 This is required by the quotient digit estimation algorithm. */
472 scale
= BASE
/ (den
[den_hi_sig
] + 1);
474 { /* scale divisor and dividend */
476 for (i
= 0; i
<= 4 - 1; i
++)
478 work
= (num
[i
] * scale
) + carry
;
479 num
[i
] = LOWPART (work
);
480 carry
= HIGHPART (work
);
485 for (i
= 0; i
<= 4 - 1; i
++)
487 work
= (den
[i
] * scale
) + carry
;
488 den
[i
] = LOWPART (work
);
489 carry
= HIGHPART (work
);
490 if (den
[i
] != 0) den_hi_sig
= i
;
497 for (i
= num_hi_sig
- den_hi_sig
- 1; i
>= 0; i
--)
499 /* Guess the next quotient digit, quo_est, by dividing the first
500 two remaining dividend digits by the high order quotient digit.
501 quo_est is never low and is at most 2 high. */
502 unsigned HOST_WIDE_INT tmp
;
504 num_hi_sig
= i
+ den_hi_sig
+ 1;
505 work
= num
[num_hi_sig
] * BASE
+ num
[num_hi_sig
- 1];
506 if (num
[num_hi_sig
] != den
[den_hi_sig
])
507 quo_est
= work
/ den
[den_hi_sig
];
511 /* Refine quo_est so it's usually correct, and at most one high. */
512 tmp
= work
- quo_est
* den
[den_hi_sig
];
514 && (den
[den_hi_sig
- 1] * quo_est
515 > (tmp
* BASE
+ num
[num_hi_sig
- 2])))
518 /* Try QUO_EST as the quotient digit, by multiplying the
519 divisor by QUO_EST and subtracting from the remaining dividend.
520 Keep in mind that QUO_EST is the I - 1st digit. */
523 for (j
= 0; j
<= den_hi_sig
; j
++)
525 work
= quo_est
* den
[j
] + carry
;
526 carry
= HIGHPART (work
);
527 work
= num
[i
+ j
] - LOWPART (work
);
528 num
[i
+ j
] = LOWPART (work
);
529 carry
+= HIGHPART (work
) != 0;
532 /* If quo_est was high by one, then num[i] went negative and
533 we need to correct things. */
534 if (num
[num_hi_sig
] < (HOST_WIDE_INT
) carry
)
537 carry
= 0; /* add divisor back in */
538 for (j
= 0; j
<= den_hi_sig
; j
++)
540 work
= num
[i
+ j
] + den
[j
] + carry
;
541 carry
= HIGHPART (work
);
542 num
[i
+ j
] = LOWPART (work
);
545 num
[num_hi_sig
] += carry
;
548 /* Store the quotient digit. */
553 decode (quo
, lquo
, hquo
);
556 /* If result is negative, make it so. */
558 neg_double (*lquo
, *hquo
, lquo
, hquo
);
560 /* Compute trial remainder: rem = num - (quo * den) */
561 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
562 neg_double (*lrem
, *hrem
, lrem
, hrem
);
563 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
568 case TRUNC_MOD_EXPR
: /* round toward zero */
569 case EXACT_DIV_EXPR
: /* for this one, it shouldn't matter */
573 case FLOOR_MOD_EXPR
: /* round toward negative infinity */
574 if (quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio < 0 && rem != 0 */
577 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1,
585 case CEIL_MOD_EXPR
: /* round toward positive infinity */
586 if (!quo_neg
&& (*lrem
!= 0 || *hrem
!= 0)) /* ratio > 0 && rem != 0 */
588 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
596 case ROUND_MOD_EXPR
: /* round to closest integer */
598 unsigned HOST_WIDE_INT labs_rem
= *lrem
;
599 HOST_WIDE_INT habs_rem
= *hrem
;
600 unsigned HOST_WIDE_INT labs_den
= lden
, ltwice
;
601 HOST_WIDE_INT habs_den
= hden
, htwice
;
603 /* Get absolute values. */
605 neg_double (*lrem
, *hrem
, &labs_rem
, &habs_rem
);
607 neg_double (lden
, hden
, &labs_den
, &habs_den
);
609 /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient. */
610 mul_double ((HOST_WIDE_INT
) 2, (HOST_WIDE_INT
) 0,
611 labs_rem
, habs_rem
, <wice
, &htwice
);
613 if (((unsigned HOST_WIDE_INT
) habs_den
614 < (unsigned HOST_WIDE_INT
) htwice
)
615 || (((unsigned HOST_WIDE_INT
) habs_den
616 == (unsigned HOST_WIDE_INT
) htwice
)
617 && (labs_den
<= ltwice
)))
621 add_double (*lquo
, *hquo
,
622 (HOST_WIDE_INT
) -1, (HOST_WIDE_INT
) -1, lquo
, hquo
);
625 add_double (*lquo
, *hquo
, (HOST_WIDE_INT
) 1, (HOST_WIDE_INT
) 0,
637 /* Compute true remainder: rem = num - (quo * den) */
638 mul_double (*lquo
, *hquo
, lden_orig
, hden_orig
, lrem
, hrem
);
639 neg_double (*lrem
, *hrem
, lrem
, hrem
);
640 add_double (lnum_orig
, hnum_orig
, *lrem
, *hrem
, lrem
, hrem
);
645 /* Construct from a buffer of length LEN. BUFFER will be read according
646 to byte endianess and word endianess. Only the lower LEN bytes
647 of the result are set; the remaining high bytes are cleared. */
650 double_int::from_buffer (const unsigned char *buffer
, int len
)
652 double_int result
= double_int_zero
;
653 int words
= len
/ UNITS_PER_WORD
;
655 gcc_assert (len
* BITS_PER_UNIT
<= HOST_BITS_PER_DOUBLE_INT
);
657 for (int byte
= 0; byte
< len
; byte
++)
660 int bitpos
= byte
* BITS_PER_UNIT
;
661 unsigned HOST_WIDE_INT value
;
663 if (len
> UNITS_PER_WORD
)
665 int word
= byte
/ UNITS_PER_WORD
;
667 if (WORDS_BIG_ENDIAN
)
668 word
= (words
- 1) - word
;
670 offset
= word
* UNITS_PER_WORD
;
672 if (BYTES_BIG_ENDIAN
)
673 offset
+= (UNITS_PER_WORD
- 1) - (byte
% UNITS_PER_WORD
);
675 offset
+= byte
% UNITS_PER_WORD
;
678 offset
= BYTES_BIG_ENDIAN
? (len
- 1) - byte
: byte
;
680 value
= (unsigned HOST_WIDE_INT
) buffer
[offset
];
682 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
683 result
.low
|= value
<< bitpos
;
685 result
.high
|= value
<< (bitpos
- HOST_BITS_PER_WIDE_INT
);
692 /* Returns mask for PREC bits. */
695 double_int::mask (unsigned prec
)
697 unsigned HOST_WIDE_INT m
;
700 if (prec
> HOST_BITS_PER_WIDE_INT
)
702 prec
-= HOST_BITS_PER_WIDE_INT
;
703 m
= ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1;
704 mask
.high
= (HOST_WIDE_INT
) m
;
710 mask
.low
= prec
? ((unsigned HOST_WIDE_INT
) 2 << (prec
- 1)) - 1 : 0;
716 /* Returns a maximum value for signed or unsigned integer
717 of precision PREC. */
720 double_int::max_value (unsigned int prec
, bool uns
)
722 return double_int::mask (prec
- (uns
? 0 : 1));
725 /* Returns a minimum value for signed or unsigned integer
726 of precision PREC. */
729 double_int::min_value (unsigned int prec
, bool uns
)
732 return double_int_zero
;
733 return double_int_one
.lshift (prec
- 1, prec
, false);
736 /* Clears the bits of CST over the precision PREC. If UNS is false, the bits
737 outside of the precision are set to the sign bit (i.e., the PREC-th one),
738 otherwise they are set to zero.
740 This corresponds to returning the value represented by PREC lowermost bits
741 of CST, with the given signedness. */
744 double_int::ext (unsigned prec
, bool uns
) const
747 return this->zext (prec
);
749 return this->sext (prec
);
752 /* The same as double_int::ext with UNS = true. */
755 double_int::zext (unsigned prec
) const
757 const double_int
&cst
= *this;
758 double_int mask
= double_int::mask (prec
);
761 r
.low
= cst
.low
& mask
.low
;
762 r
.high
= cst
.high
& mask
.high
;
767 /* The same as double_int::ext with UNS = false. */
770 double_int::sext (unsigned prec
) const
772 const double_int
&cst
= *this;
773 double_int mask
= double_int::mask (prec
);
775 unsigned HOST_WIDE_INT snum
;
777 if (prec
<= HOST_BITS_PER_WIDE_INT
)
781 prec
-= HOST_BITS_PER_WIDE_INT
;
782 snum
= (unsigned HOST_WIDE_INT
) cst
.high
;
784 if (((snum
>> (prec
- 1)) & 1) == 1)
786 r
.low
= cst
.low
| ~mask
.low
;
787 r
.high
= cst
.high
| ~mask
.high
;
791 r
.low
= cst
.low
& mask
.low
;
792 r
.high
= cst
.high
& mask
.high
;
798 /* Returns true if CST fits in signed HOST_WIDE_INT. */
801 double_int::fits_shwi () const
803 const double_int
&cst
= *this;
805 return (HOST_WIDE_INT
) cst
.low
>= 0;
806 else if (cst
.high
== -1)
807 return (HOST_WIDE_INT
) cst
.low
< 0;
812 /* Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in
813 unsigned HOST_WIDE_INT if UNS is true. */
816 double_int::fits_hwi (bool uns
) const
819 return this->fits_uhwi ();
821 return this->fits_shwi ();
827 double_int::operator * (double_int b
) const
829 const double_int
&a
= *this;
831 mul_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
835 /* Returns A * B. If the operation overflows according to UNSIGNED_P,
836 *OVERFLOW is set to nonzero. */
839 double_int::mul_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
841 const double_int
&a
= *this;
843 *overflow
= mul_double_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
844 &ret
.low
, &ret
.high
, unsigned_p
);
849 double_int::wide_mul_with_sign (double_int b
, bool unsigned_p
,
850 double_int
*higher
, bool *overflow
) const
854 *overflow
= mul_double_wide_with_sign (low
, high
, b
.low
, b
.high
,
855 &lower
.low
, &lower
.high
,
856 &higher
->low
, &higher
->high
,
864 double_int::operator + (double_int b
) const
866 const double_int
&a
= *this;
868 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
872 /* Returns A + B. If the operation overflows according to UNSIGNED_P,
873 *OVERFLOW is set to nonzero. */
876 double_int::add_with_sign (double_int b
, bool unsigned_p
, bool *overflow
) const
878 const double_int
&a
= *this;
880 *overflow
= add_double_with_sign (a
.low
, a
.high
, b
.low
, b
.high
,
881 &ret
.low
, &ret
.high
, unsigned_p
);
888 double_int::operator - (double_int b
) const
890 const double_int
&a
= *this;
892 neg_double (b
.low
, b
.high
, &b
.low
, &b
.high
);
893 add_double (a
.low
, a
.high
, b
.low
, b
.high
, &ret
.low
, &ret
.high
);
897 /* Returns A - B. If the operation overflows via inconsistent sign bits,
898 *OVERFLOW is set to nonzero. */
901 double_int::sub_with_overflow (double_int b
, bool *overflow
) const
904 neg_double (b
.low
, b
.high
, &ret
.low
, &ret
.high
);
905 add_double (low
, high
, ret
.low
, ret
.high
, &ret
.low
, &ret
.high
);
906 *overflow
= OVERFLOW_SUM_SIGN (ret
.high
, b
.high
, high
);
913 double_int::operator - () const
915 const double_int
&a
= *this;
917 neg_double (a
.low
, a
.high
, &ret
.low
, &ret
.high
);
922 double_int::neg_with_overflow (bool *overflow
) const
925 *overflow
= neg_double (low
, high
, &ret
.low
, &ret
.high
);
929 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
930 specified by CODE). CODE is enum tree_code in fact, but double_int.h
931 must be included before tree.h. The remainder after the division is
935 double_int::divmod_with_overflow (double_int b
, bool uns
, unsigned code
,
936 double_int
*mod
, bool *overflow
) const
938 const double_int
&a
= *this;
941 *overflow
= div_and_round_double (code
, uns
, a
.low
, a
.high
,
942 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
943 &mod
->low
, &mod
->high
);
948 double_int::divmod (double_int b
, bool uns
, unsigned code
,
949 double_int
*mod
) const
951 const double_int
&a
= *this;
954 div_and_round_double (code
, uns
, a
.low
, a
.high
,
955 b
.low
, b
.high
, &ret
.low
, &ret
.high
,
956 &mod
->low
, &mod
->high
);
960 /* The same as double_int::divmod with UNS = false. */
963 double_int::sdivmod (double_int b
, unsigned code
, double_int
*mod
) const
965 return this->divmod (b
, false, code
, mod
);
968 /* The same as double_int::divmod with UNS = true. */
971 double_int::udivmod (double_int b
, unsigned code
, double_int
*mod
) const
973 return this->divmod (b
, true, code
, mod
);
976 /* Returns A / B (computed as unsigned depending on UNS, and rounded as
977 specified by CODE). CODE is enum tree_code in fact, but double_int.h
978 must be included before tree.h. */
981 double_int::div (double_int b
, bool uns
, unsigned code
) const
985 return this->divmod (b
, uns
, code
, &mod
);
988 /* The same as double_int::div with UNS = false. */
991 double_int::sdiv (double_int b
, unsigned code
) const
993 return this->div (b
, false, code
);
996 /* The same as double_int::div with UNS = true. */
999 double_int::udiv (double_int b
, unsigned code
) const
1001 return this->div (b
, true, code
);
1004 /* Returns A % B (computed as unsigned depending on UNS, and rounded as
1005 specified by CODE). CODE is enum tree_code in fact, but double_int.h
1006 must be included before tree.h. */
1009 double_int::mod (double_int b
, bool uns
, unsigned code
) const
1013 this->divmod (b
, uns
, code
, &mod
);
1017 /* The same as double_int::mod with UNS = false. */
1020 double_int::smod (double_int b
, unsigned code
) const
1022 return this->mod (b
, false, code
);
1025 /* The same as double_int::mod with UNS = true. */
1028 double_int::umod (double_int b
, unsigned code
) const
1030 return this->mod (b
, true, code
);
1033 /* Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
1034 the multiple in *MULTIPLE. Otherwise return FALSE and leave *MULTIPLE
1038 double_int::multiple_of (double_int factor
,
1039 bool unsigned_p
, double_int
*multiple
) const
1041 double_int remainder
;
1042 double_int quotient
= this->divmod (factor
, unsigned_p
,
1043 TRUNC_DIV_EXPR
, &remainder
);
1044 if (remainder
.is_zero ())
1046 *multiple
= quotient
;
1053 /* Set BITPOS bit in A. */
1055 double_int::set_bit (unsigned bitpos
) const
1057 double_int a
= *this;
1058 if (bitpos
< HOST_BITS_PER_WIDE_INT
)
1059 a
.low
|= (unsigned HOST_WIDE_INT
) 1 << bitpos
;
1061 a
.high
|= (HOST_WIDE_INT
) 1 << (bitpos
- HOST_BITS_PER_WIDE_INT
);
1066 /* Count trailing zeros in A. */
1068 double_int::trailing_zeros () const
1070 const double_int
&a
= *this;
1071 unsigned HOST_WIDE_INT w
= a
.low
? a
.low
: (unsigned HOST_WIDE_INT
) a
.high
;
1072 unsigned bits
= a
.low
? 0 : HOST_BITS_PER_WIDE_INT
;
1074 return HOST_BITS_PER_DOUBLE_INT
;
1075 bits
+= ctz_hwi (w
);
1079 /* Shift A left by COUNT places keeping only PREC bits of result. Shift
1080 right if COUNT is negative. ARITH true specifies arithmetic shifting;
1081 otherwise use logical shift. */
1084 double_int::lshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1086 const double_int
&a
= *this;
1088 lshift_double (a
.low
, a
.high
, count
, prec
, &ret
.low
, &ret
.high
, arith
);
1092 /* Shift A right by COUNT places keeping only PREC bits of result. Shift
1093 left if COUNT is negative. ARITH true specifies arithmetic shifting;
1094 otherwise use logical shift. */
1097 double_int::rshift (HOST_WIDE_INT count
, unsigned int prec
, bool arith
) const
1099 const double_int
&a
= *this;
1101 lshift_double (a
.low
, a
.high
, -count
, prec
, &ret
.low
, &ret
.high
, arith
);
1105 /* Arithmetic shift A left by COUNT places keeping only PREC bits of result.
1106 Shift right if COUNT is negative. */
1109 double_int::alshift (HOST_WIDE_INT count
, unsigned int prec
) const
1112 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, true);
1116 /* Arithmetic shift A right by COUNT places keeping only PREC bits of result.
1117 Shift left if COUNT is negative. */
1120 double_int::arshift (HOST_WIDE_INT count
, unsigned int prec
) const
1123 lshift_double (low
, high
, -count
, prec
, &r
.low
, &r
.high
, true);
1127 /* Logical shift A left by COUNT places keeping only PREC bits of result.
1128 Shift right if COUNT is negative. */
1131 double_int::llshift (HOST_WIDE_INT count
, unsigned int prec
) const
1134 lshift_double (low
, high
, count
, prec
, &r
.low
, &r
.high
, false);
1138 /* Logical shift A right by COUNT places keeping only PREC bits of result.
1139 Shift left if COUNT is negative. */
1142 double_int::lrshift (HOST_WIDE_INT count
, unsigned int prec
) const
1145 lshift_double (low
, high
, -count
, prec
, &r
.low
, &r
.high
, false);
1149 /* Rotate A left by COUNT places keeping only PREC bits of result.
1150 Rotate right if COUNT is negative. */
1153 double_int::lrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1161 t1
= this->lshift (count
, prec
, false);
1162 t2
= this->rshift (prec
- count
, prec
, false);
1167 /* Rotate A rigth by COUNT places keeping only PREC bits of result.
1168 Rotate right if COUNT is negative. */
1171 double_int::rrotate (HOST_WIDE_INT count
, unsigned int prec
) const
1179 t1
= this->rshift (count
, prec
, false);
1180 t2
= this->lshift (prec
- count
, prec
, false);
1185 /* Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the
1186 comparison is given by UNS. */
1189 double_int::cmp (double_int b
, bool uns
) const
1192 return this->ucmp (b
);
1194 return this->scmp (b
);
1197 /* Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B,
1201 double_int::ucmp (double_int b
) const
1203 const double_int
&a
= *this;
1204 if ((unsigned HOST_WIDE_INT
) a
.high
< (unsigned HOST_WIDE_INT
) b
.high
)
1206 if ((unsigned HOST_WIDE_INT
) a
.high
> (unsigned HOST_WIDE_INT
) b
.high
)
1216 /* Compares two signed values A and B. Returns -1 if A < B, 0 if A == B,
1220 double_int::scmp (double_int b
) const
1222 const double_int
&a
= *this;
1223 if (a
.high
< b
.high
)
1225 if (a
.high
> b
.high
)
1235 /* Compares two unsigned values A and B for less-than. */
1238 double_int::ult (double_int b
) const
1240 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1242 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1249 /* Compares two unsigned values A and B for less-than or equal-to. */
1252 double_int::ule (double_int b
) const
1254 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1256 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1263 /* Compares two unsigned values A and B for greater-than. */
1266 double_int::ugt (double_int b
) const
1268 if ((unsigned HOST_WIDE_INT
) high
> (unsigned HOST_WIDE_INT
) b
.high
)
1270 if ((unsigned HOST_WIDE_INT
) high
< (unsigned HOST_WIDE_INT
) b
.high
)
1277 /* Compares two signed values A and B for less-than. */
1280 double_int::slt (double_int b
) const
1291 /* Compares two signed values A and B for less-than or equal-to. */
1294 double_int::sle (double_int b
) const
1305 /* Compares two signed values A and B for greater-than. */
1308 double_int::sgt (double_int b
) const
1320 /* Compares two values A and B. Returns max value. Signedness of the
1321 comparison is given by UNS. */
1324 double_int::max (double_int b
, bool uns
)
1326 return (this->cmp (b
, uns
) == 1) ? *this : b
;
1329 /* Compares two signed values A and B. Returns max value. */
1332 double_int::smax (double_int b
)
1334 return (this->scmp (b
) == 1) ? *this : b
;
1337 /* Compares two unsigned values A and B. Returns max value. */
1340 double_int::umax (double_int b
)
1342 return (this->ucmp (b
) == 1) ? *this : b
;
1345 /* Compares two values A and B. Returns mix value. Signedness of the
1346 comparison is given by UNS. */
1349 double_int::min (double_int b
, bool uns
)
1351 return (this->cmp (b
, uns
) == -1) ? *this : b
;
1354 /* Compares two signed values A and B. Returns min value. */
1357 double_int::smin (double_int b
)
1359 return (this->scmp (b
) == -1) ? *this : b
;
1362 /* Compares two unsigned values A and B. Returns min value. */
1365 double_int::umin (double_int b
)
1367 return (this->ucmp (b
) == -1) ? *this : b
;
1370 /* Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
1373 double_int_split_digit (double_int
*cst
, unsigned base
)
1375 unsigned HOST_WIDE_INT resl
, reml
;
1376 HOST_WIDE_INT resh
, remh
;
1378 div_and_round_double (FLOOR_DIV_EXPR
, true, cst
->low
, cst
->high
, base
, 0,
1379 &resl
, &resh
, &reml
, &remh
);
1386 /* Dumps CST to FILE. If UNS is true, CST is considered to be unsigned,
1387 otherwise it is signed. */
1390 dump_double_int (FILE *file
, double_int cst
, bool uns
)
1392 unsigned digits
[100], n
;
1397 fprintf (file
, "0");
1401 if (!uns
&& cst
.is_negative ())
1403 fprintf (file
, "-");
1407 for (n
= 0; !cst
.is_zero (); n
++)
1408 digits
[n
] = double_int_split_digit (&cst
, 10);
1409 for (i
= n
- 1; i
>= 0; i
--)
1410 fprintf (file
, "%u", digits
[i
]);
1414 /* Sets RESULT to VAL, taken unsigned if UNS is true and as signed
1418 mpz_set_double_int (mpz_t result
, double_int val
, bool uns
)
1420 bool negate
= false;
1421 unsigned HOST_WIDE_INT vp
[2];
1423 if (!uns
&& val
.is_negative ())
1430 vp
[1] = (unsigned HOST_WIDE_INT
) val
.high
;
1431 mpz_import (result
, 2, -1, sizeof (HOST_WIDE_INT
), 0, 0, vp
);
1434 mpz_neg (result
, result
);
1437 /* Returns VAL converted to TYPE. If WRAP is true, then out-of-range
1438 values of VAL will be wrapped; otherwise, they will be set to the
1439 appropriate minimum or maximum TYPE bound. */
1442 mpz_get_double_int (const_tree type
, mpz_t val
, bool wrap
)
1444 unsigned HOST_WIDE_INT
*vp
;
1454 get_type_static_bounds (type
, min
, max
);
1456 if (mpz_cmp (val
, min
) < 0)
1458 else if (mpz_cmp (val
, max
) > 0)
1465 /* Determine the number of unsigned HOST_WIDE_INT that are required
1466 for representing the value. The code to calculate count is
1467 extracted from the GMP manual, section "Integer Import and Export":
1468 http://gmplib.org/manual/Integer-Import-and-Export.html */
1469 numb
= 8*sizeof(HOST_WIDE_INT
);
1470 count
= (mpz_sizeinbase (val
, 2) + numb
-1) / numb
;
1473 vp
= (unsigned HOST_WIDE_INT
*) alloca (count
* sizeof(HOST_WIDE_INT
));
1477 mpz_export (vp
, &count
, -1, sizeof (HOST_WIDE_INT
), 0, 0, val
);
1479 gcc_assert (wrap
|| count
<= 2);
1482 res
.high
= (HOST_WIDE_INT
) vp
[1];
1484 res
= res
.ext (TYPE_PRECISION (type
), TYPE_UNSIGNED (type
));
1485 if (mpz_sgn (val
) < 0)