243#define WIDE_INT_MAX_INL_ELTS \
244 ((MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT) \
245 / HOST_BITS_PER_WIDE_INT)
247#define WIDE_INT_MAX_INL_PRECISION \
248 (WIDE_INT_MAX_INL_ELTS * HOST_BITS_PER_WIDE_INT)
252#define WIDE_INT_MAX_ELTS 1024
253#define WIDE_INT_MAX_PRECISION (WIDE_INT_MAX_ELTS * HOST_BITS_PER_WIDE_INT)
256#define WIDEST_INT_MAX_ELTS 2048
257#define WIDEST_INT_MAX_PRECISION (WIDEST_INT_MAX_ELTS * HOST_BITS_PER_WIDE_INT)
269#define ADDR_MAX_BITSIZE 64
276#define ADDR_MAX_PRECISION \
277 ((ADDR_MAX_BITSIZE + 4 + HOST_BITS_PER_WIDE_INT - 1) \
278 & ~(HOST_BITS_PER_WIDE_INT - 1))
281#define OFFSET_INT_ELTS (ADDR_MAX_PRECISION / HOST_BITS_PER_WIDE_INT)
284#define WIDE_INT_MAX_HWIS(PRECISION) \
285 ((PRECISION + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT)
289#define WI_BINARY_RESULT(T1, T2) \
290 typename wi::binary_traits <T1, T2>::result_type
294#define WI_BINARY_OPERATOR_RESULT(T1, T2) \
295 typename wi::binary_traits <T1, T2>::operator_result
299#define WI_SIGNED_SHIFT_RESULT(T1, T2) \
300 typename wi::binary_traits <T1, T2>::signed_shift_result_type
305#define WI_BINARY_PREDICATE_RESULT(T1, T2) \
306 typename wi::binary_traits <T1, T2>::predicate_result
311#define WI_SIGNED_BINARY_PREDICATE_RESULT(T1, T2) \
312 typename wi::binary_traits <T1, T2>::signed_predicate_result
315#define WI_UNARY_RESULT(T) \
316 typename wi::binary_traits <T, T>::result_type
323#define WI_BINARY_RESULT_VAR(RESULT, VAL, T1, X, T2, Y) \
324 WI_BINARY_RESULT (T1, T2) RESULT = \
325 wi::int_traits <WI_BINARY_RESULT (T1, T2)>::get_binary_result (X, Y); \
326 HOST_WIDE_INT *VAL = RESULT.write_val (0)
329#define WI_UNARY_RESULT_VAR(RESULT, VAL, T, X) \
330 WI_UNARY_RESULT (T) RESULT = \
331 wi::int_traits <WI_UNARY_RESULT (T)>::get_binary_result (X, X); \
332 HOST_WIDE_INT *VAL = RESULT.write_val (0)
340#define FIXED_WIDE_INT(N) \
341 generic_wide_int < fixed_wide_int_storage <N> >
343typedef generic_wide_int <wide_int_storage>
wide_int;
345typedef generic_wide_int <widest_int_storage <WIDEST_INT_MAX_PRECISION> >
widest_int;
346typedef generic_wide_int <widest_int_storage <WIDEST_INT_MAX_PRECISION * 2> >
widest2_int;
350template <
bool SE,
bool HDP = true>
362#define WIDE_INT_REF_FOR(T) \
364 <wide_int_ref_storage <wi::int_traits <T>::is_sign_extended, \
365 wi::int_traits <T>::host_dependent_precision> >
432 template <
typename T1,
typename T2,
442 template <
typename T1,
typename T2>
449 template <
typename T1,
typename T2>
457 template <
typename T1,
typename T2>
470 template <
typename T1,
typename T2>
481 template <
typename T1,
typename T2>
489 template <
typename T1,
typename T2>
502 template <
typename T1,
typename T2>
513 template <
typename T1,
typename T2>
527 template <
typename T1,
typename T2>
539 template <
typename T1,
typename T2>
551 template <
typename T>
554 template <
typename T1,
typename T2>
557 template <
typename T1,
typename T2>
558 void copy (T1 &,
const T2 &);
560#define UNARY_PREDICATE \
561 template <typename T> bool
562#define UNARY_FUNCTION \
563 template <typename T> WI_UNARY_RESULT (T)
564#define BINARY_PREDICATE \
565 template <typename T1, typename T2> bool
566#define BINARY_FUNCTION \
567 template <typename T1, typename T2> WI_BINARY_RESULT (T1, T2)
568#define SHIFT_FUNCTION \
569 template <typename T1, typename T2> WI_UNARY_RESULT (T1)
575 template <
typename T>
593 template <
typename T1,
typename T2>
594 int cmp (
const T1 &,
const T2 &,
signop);
596 template <
typename T1,
typename T2>
597 int cmps (
const T1 &,
const T2 &);
599 template <
typename T1,
typename T2>
600 int cmpu (
const T1 &,
const T2 &);
662 template <
typename T1,
typename T2>
665 template <
typename T1,
typename T2>
677#undef BINARY_PREDICATE
678#undef BINARY_FUNCTION
679#undef UNARY_PREDICATE
693 template <
typename T>
694 unsigned HOST_WIDE_INT
extract_uhwi (
const T &,
unsigned int,
unsigned int);
696 template <
typename T>
720 const HOST_WIDE_INT *
get_val ()
const;
724inline::wi::storage_ref::storage_ref (
const HOST_WIDE_INT *val_in,
726 unsigned int precision_in)
727 : val (val_in), len (len_in), precision (precision_in)
743inline const HOST_WIDE_INT *
774template <
typename storage>
780 template <
typename T>
783 template <
typename T>
789 unsigned HOST_WIDE_INT
to_uhwi (
unsigned int)
const;
795 HOST_WIDE_INT
elt (
unsigned int)
const;
797 unsigned HOST_WIDE_INT
ulow ()
const;
798 unsigned HOST_WIDE_INT
uhigh ()
const;
802 template <
typename T>
805#define ASSIGNMENT_OPERATOR(OP, F) \
806 template <typename T> \
807 generic_wide_int &OP (const T &c) { return (*this = wi::F (*this, c)); }
810#define SHIFT_ASSIGNMENT_OPERATOR(OP, OP2) \
811 template <typename T> \
812 generic_wide_int &OP (const T &c) { return (*this = *this OP2 c); }
814#define INCDEC_OPERATOR(OP, DELTA) \
815 generic_wide_int &OP () { *this += DELTA; return *this; }
828#undef SHIFT_ASSIGNMENT_OPERATOR
829#undef ASSIGNMENT_OPERATOR
830#undef INCDEC_OPERATOR
841template <
typename storage>
844template <
typename storage>
851template <
typename storage>
854 unsigned int precision)
855 : storage (x, precision)
861template <
typename storage>
866 return sext_hwi (this->get_val ()[0], precision);
868 return this->get_val ()[0];
872template <
typename storage>
877 return this->get_val ()[0];
879 return to_shwi (this->get_precision ());
885template <
typename storage>
886inline unsigned HOST_WIDE_INT
890 return zext_hwi (this->get_val ()[0], precision);
892 return this->get_val ()[0];
896template <
typename storage>
897inline unsigned HOST_WIDE_INT
900 return to_uhwi (this->get_precision ());
907template <
typename storage>
911 return this->get_val ()[0];
915template <
typename storage>
919 unsigned int len = this->get_len ();
922 unsigned HOST_WIDE_INT high = this->get_val ()[len - 1];
925 unsigned int precision = this->get_precision ();
930 return (HOST_WIDE_INT) (high) < 0 ? -1 : 0;
935template <
typename storage>
939 return this->get_val ()[0];
944template <
typename storage>
948 return this->get_val ()[this->get_len () - 1];
953template <
typename storage>
954inline unsigned HOST_WIDE_INT
957 return this->get_val ()[0];
962template <
typename storage>
963inline unsigned HOST_WIDE_INT
966 return this->get_val ()[this->get_len () - 1];
970template <
typename storage>
974 if (
i >= this->get_len ())
977 return this->get_val ()[
i];
982template <
typename storage>
986 HOST_WIDE_INT elt_i =
elt (
i);
989 unsigned int precision = this->get_precision ();
992 elt_i =
sext_hwi (elt_i, precision - lsb);
997template <
typename storage>
999inline generic_wide_int <storage> &
1000generic_wide_int <storage>::operator = (
const T &x)
1002 storage::operator = (x);
1007template <
typename storage>
1011 unsigned int len = this->get_len ();
1012 const HOST_WIDE_INT *val = this->get_val ();
1013 unsigned int precision = this->get_precision ();
1014 fprintf (stderr,
"[");
1016 fprintf (stderr,
"...,");
1017 for (
unsigned int i = 0;
i < len - 1; ++
i)
1025 template <
typename storage>
1029 static unsigned int get_precision (
const generic_wide_int <storage> &);
1031 const generic_wide_int <storage> &);
1035template <
typename storage>
1037wi::int_traits < generic_wide_int <storage> >::
1038get_precision (
const generic_wide_int <storage> &x)
1040 return x.get_precision ();
1043template <
typename storage>
1045wi::int_traits < generic_wide_int <storage> >::
1046decompose (HOST_WIDE_INT *,
unsigned int precision,
1047 const generic_wide_int <storage> &x)
1056template <
bool SE,
bool HDP>
1069 template <
typename T>
1072 template <
typename T>
1077template <
bool SE,
bool HDP>
1078inline wide_int_ref_storage <SE, HDP>::
1086template <
bool SE,
bool HDP>
1087template <
typename T>
1095template <
bool SE,
bool HDP>
1096template <
typename T>
1097inline wide_int_ref_storage <SE, HDP>::
1098wide_int_ref_storage (
const T &x,
unsigned int precision)
1105 template <
bool SE,
bool HDP>
1117 unsigned int force_to_size (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
1118 unsigned int,
unsigned int,
unsigned int,
1120 unsigned int from_array (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
1121 unsigned int,
unsigned int,
bool =
true);
1131 HOST_WIDE_INT *valp;
1138 template <
typename T>
1145 const HOST_WIDE_INT *
get_val ()
const;
1146 unsigned int get_len ()
const;
1147 HOST_WIDE_INT *
write_val (
unsigned int);
1148 void set_len (
unsigned int,
bool =
false);
1151 template <
typename T>
1156 unsigned int,
bool =
true);
1170 template <
typename T1,
typename T2>
1172 template <
typename T1,
typename T2>
1183template <
typename T>
1202 memcpy (
u.valp, x.
u.valp,
len * sizeof (HOST_WIDE_INT));
1209 XDELETEVEC (
u.valp);
1219 XDELETEVEC (
u.valp);
1225 memcpy (
u.valp, x.
u.valp,
len * sizeof (HOST_WIDE_INT));
1230template <
typename T>
1241 XDELETEVEC (
u.valp);
1244 u.valp = XNEWVEC (HOST_WIDE_INT,
1257inline const HOST_WIDE_INT *
1269inline HOST_WIDE_INT *
1303 unsigned int precision,
bool need_canon_p)
1318 x.
u.valp = XNEWVEC (HOST_WIDE_INT,
1323template <
typename T1,
typename T2>
1336template <
typename T1,
typename T2>
1360 template <
typename T>
1365 const HOST_WIDE_INT *
get_val ()
const;
1366 unsigned int get_len ()
const;
1367 HOST_WIDE_INT *
write_val (
unsigned int);
1368 void set_len (
unsigned int,
bool =
false);
1385 template <
typename T1,
typename T2>
1387 template <
typename T1,
typename T2>
1394template <
typename T>
1411inline const HOST_WIDE_INT *
1425inline HOST_WIDE_INT *
1447 x.precision,
N, sgn));
1456fixed_wide_int_storage <N>::from_array (
const HOST_WIDE_INT *val,
1461 result.set_len (
wi::from_array (result.write_val (len), val, len,
1467template <
typename T1,
typename T2>
1469wi::int_traits < fixed_wide_int_storage <N> >::
1470get_binary_result (
const T1 &,
const T2 &)
1476template <
typename T1,
typename T2>
1478wi::int_traits < fixed_wide_int_storage <N> >::
1479get_binary_precision (
const T1 &,
const T2 &)
1484#define WIDEST_INT(N) generic_wide_int < widest_int_storage <N> >
1494 HOST_WIDE_INT *valp;
1501 template <
typename T>
1505 template <
typename T>
1510 const HOST_WIDE_INT *
get_val ()
const;
1511 unsigned int get_len ()
const;
1512 HOST_WIDE_INT *
write_val (
unsigned int);
1513 void set_len (
unsigned int,
bool =
false);
1516 static WIDEST_INT (
N) from_array (
const HOST_WIDE_INT *,
unsigned int,
1530 template <
typename T1,
typename T2>
1532 template <
typename T1,
typename T2>
1542template <
typename T>
1558 u.valp = XNEWVEC (HOST_WIDE_INT,
len);
1559 memcpy (
u.valp, x.u.valp,
len * sizeof (HOST_WIDE_INT));
1567 XDELETEVEC (
u.valp);
1571inline widest_int_storage <N>&
1578 XDELETEVEC (
u.valp);
1583 u.valp = XNEWVEC (HOST_WIDE_INT,
len);
1584 memcpy (
u.valp, x.u.valp,
len * sizeof (HOST_WIDE_INT));
1590template <
typename T>
1591inline widest_int_storage <N>&
1592widest_int_storage <N>::operator = (
const T &x)
1598 XDELETEVEC (
u.valp);
1612inline const HOST_WIDE_INT *
1626inline HOST_WIDE_INT *
1630 XDELETEVEC (
u.valp);
1634 u.valp = XNEWVEC (HOST_WIDE_INT, l);
1650 HOST_WIDE_INT *valp =
u.valp;
1651 memcpy (
u.val, valp, l * sizeof (
u.val[0]));
1668 unsigned int exp_len = x.
len;
1669 unsigned int prec = result.get_precision ();
1670 if (sgn ==
UNSIGNED && prec > x.precision && x.val[x.
len - 1] < 0)
1673 x.precision, prec, sgn));
1682widest_int_storage <N>::from_array (
const HOST_WIDE_INT *val,
1687 result.set_len (
wi::from_array (result.write_val (len), val, len,
1688 result.get_precision (), need_canon_p));
1693template <
typename T1,
typename T2>
1695wi::int_traits < widest_int_storage <N> >::
1696get_binary_result (
const T1 &,
const T2 &)
1702template <
typename T1,
typename T2>
1704wi::int_traits < widest_int_storage <N> >::
1705get_binary_precision (
const T1 &,
const T2 &)
1729 unsigned int get_len ()
const;
1731 const HOST_WIDE_INT *
get_val ()
const;
1732 HOST_WIDE_INT *
write_val (
unsigned int);
1733 void set_len (
unsigned int,
bool =
false);
1735 template <
typename T>
1783 const_reference operator [] (
unsigned int)
const;
1809inline const HOST_WIDE_INT *
1815inline HOST_WIDE_INT *
1830template <
typename T>
1855trailing_wide_ints <N>::operator [] (
unsigned int index)
1862inline typename trailing_wide_ints <N>::const_reference
1863trailing_wide_ints <N>::operator [] (
unsigned int index)
const
1880 return (
num_elements * max_len - 1) *
sizeof (HOST_WIDE_INT);
1886#define TRAILING_WIDE_INT_ACCESSOR(NAME, FIELD, I) \
1887 trailing_wide_int get_##NAME () { return FIELD[I]; } \
1888 template <typename T> void set_##NAME (const T &x) { FIELD[I] = x; }
1893 template <
typename T,
bool signed_p>
1905template <
typename T,
bool signed_p>
1912template <
typename T,
bool signed_p>
2039 template<typename T, precision_type = int_traits<T>::precision_type>
2042 static int zero (
const T &) {
return 0; }
2045 template<
typename T>
2083wi::int_traits <wi::hwi_with_prec>::
2084decompose (HOST_WIDE_INT *scratch,
unsigned int precision,
2102 bool eq_p_large (
const HOST_WIDE_INT *,
unsigned int,
2103 const HOST_WIDE_INT *,
unsigned int,
unsigned int);
2104 bool lts_p_large (
const HOST_WIDE_INT *,
unsigned int,
unsigned int,
2105 const HOST_WIDE_INT *,
unsigned int);
2106 bool ltu_p_large (
const HOST_WIDE_INT *,
unsigned int,
unsigned int,
2107 const HOST_WIDE_INT *,
unsigned int);
2108 int cmps_large (
const HOST_WIDE_INT *,
unsigned int,
unsigned int,
2109 const HOST_WIDE_INT *,
unsigned int);
2110 int cmpu_large (
const HOST_WIDE_INT *,
unsigned int,
unsigned int,
2111 const HOST_WIDE_INT *,
unsigned int);
2112 unsigned int sext_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2113 unsigned int,
unsigned int,
unsigned int);
2114 unsigned int zext_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2115 unsigned int,
unsigned int,
unsigned int);
2116 unsigned int set_bit_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2117 unsigned int,
unsigned int,
unsigned int);
2118 unsigned int bswap_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2119 unsigned int,
unsigned int);
2121 unsigned int,
unsigned int);
2123 unsigned int lshift_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2124 unsigned int,
unsigned int,
unsigned int);
2125 unsigned int lrshift_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2126 unsigned int,
unsigned int,
unsigned int,
2128 unsigned int arshift_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2129 unsigned int,
unsigned int,
unsigned int,
2131 unsigned int and_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
unsigned int,
2132 const HOST_WIDE_INT *,
unsigned int,
unsigned int);
2133 unsigned int and_not_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2134 unsigned int,
const HOST_WIDE_INT *,
2135 unsigned int,
unsigned int);
2136 unsigned int or_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
unsigned int,
2137 const HOST_WIDE_INT *,
unsigned int,
unsigned int);
2138 unsigned int or_not_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2139 unsigned int,
const HOST_WIDE_INT *,
2140 unsigned int,
unsigned int);
2141 unsigned int xor_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
unsigned int,
2142 const HOST_WIDE_INT *,
unsigned int,
unsigned int);
2143 unsigned int add_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
unsigned int,
2144 const HOST_WIDE_INT *,
unsigned int,
unsigned int,
2146 unsigned int sub_large (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
unsigned int,
2147 const HOST_WIDE_INT *,
unsigned int,
unsigned int,
2149 unsigned int mul_internal (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2150 unsigned int,
const HOST_WIDE_INT *,
2151 unsigned int,
unsigned int,
signop,
2154 HOST_WIDE_INT *,
const HOST_WIDE_INT *,
2155 unsigned int,
unsigned int,
2156 const HOST_WIDE_INT *,
2157 unsigned int,
unsigned int,
2162template <
typename T>
2166 return wi::int_traits <T>::get_precision (x);
2171template <
typename T1,
typename T2>
2176 return res_traits::get_binary_precision (x,
y);
2180template <
typename T1,
typename T2>
2184 unsigned int len =
y.get_len ();
2185 HOST_WIDE_INT *xval = x.write_val (len);
2186 const HOST_WIDE_INT *yval =
y.get_val ();
2193 if (!wi::int_traits <T1>::needs_write_val_arg)
2194 x.set_len (len,
y.is_sign_extended);
2198template <
typename T>
2208template <
typename T>
2216 return xi.slow () >= 0;
2217 return xi.len == 2 && xi.uhigh () == 0;
2222template <
typename T>
2229 return xi.sign_mask () < 0;
2233template <
typename T>
2238 return xi.sign_mask ();
2242template <
typename T1,
typename T2>
2249 if (xi.is_sign_extended && yi.is_sign_extended)
2252 if (xi.len != yi.len)
2256 if (xi.val[
i] != yi.val[
i])
2258 while (++
i != xi.len);
2261 if (
LIKELY (yi.len == 1))
2269 return xi.val[0] == 0;
2271 unsigned HOST_WIDE_INT diff = xi.val[0] ^ yi.val[0];
2281template <
typename T1,
typename T2>
2285 return !
eq_p (x,
y);
2289template <
typename T1,
typename T2>
2304 return xi.to_shwi () < yi.to_shwi ();
2322template <
typename T1,
typename T2>
2331 return xi.len == 1 && xi.to_uhwi () < (
unsigned HOST_WIDE_INT) yi.val[0];
2333 return yi.len != 1 || yi.to_uhwi () > (
unsigned HOST_WIDE_INT) xi.val[0];
2337 if (
LIKELY (xi.len + yi.len == 2))
2339 unsigned HOST_WIDE_INT xl = xi.to_uhwi ();
2340 unsigned HOST_WIDE_INT yl = yi.to_uhwi ();
2347template <
typename T1,
typename T2>
2358template <
typename T1,
typename T2>
2366template <
typename T1,
typename T2>
2374template <
typename T1,
typename T2>
2385template <
typename T1,
typename T2>
2393template <
typename T1,
typename T2>
2401template <
typename T1,
typename T2>
2412template <
typename T1,
typename T2>
2420template <
typename T1,
typename T2>
2428template <
typename T1,
typename T2>
2440template <
typename T1,
typename T2>
2451 return neg_p (xi) ? -1 : !(xi.len == 1 && xi.val[0] == 0);
2455 HOST_WIDE_INT xl = xi.to_shwi ();
2456 HOST_WIDE_INT yl = yi.to_shwi ();
2457 return xl < yl ? -1 : xl > yl;
2471 return neg_p (yi) ? 1 : -1;
2477template <
typename T1,
typename T2>
2491 unsigned HOST_WIDE_INT xl = xi.to_uhwi ();
2492 unsigned HOST_WIDE_INT yl = yi.val[0];
2493 return xl < yl ? -1 : xl > yl;
2501 unsigned HOST_WIDE_INT xl = xi.val[0];
2502 unsigned HOST_WIDE_INT yl = yi.to_uhwi ();
2503 return xl < yl ? -1 : xl > yl;
2508 if (
LIKELY (xi.len + yi.len == 2))
2510 unsigned HOST_WIDE_INT xl = xi.to_uhwi ();
2511 unsigned HOST_WIDE_INT yl = yi.to_uhwi ();
2512 return xl < yl ? -1 : xl > yl;
2519template <
typename T1,
typename T2>
2530template <
typename T>
2536 if (result.needs_write_val_arg)
2537 val = result.write_val (xi.len);
2538 for (
unsigned int i = 0;
i < xi.len; ++
i)
2539 val[
i] = ~xi.val[
i];
2540 result.set_len (xi.len);
2545template <
typename T>
2554template <
typename T>
2563template <
typename T>
2571template <
typename T>
2573wi::sext (
const T &x,
unsigned int offset)
2579 if (result.needs_write_val_arg)
2580 val = result.write_val (
MAX (xi.len,
2584 val[0] =
sext_hwi (xi.ulow (), offset);
2585 result.set_len (1,
true);
2593template <
typename T>
2595wi::zext (
const T &x,
unsigned int offset)
2609 if (result.needs_write_val_arg)
2610 val = result.write_val (
MAX (xi.len,
2616 val[0] =
zext_hwi (xi.ulow (), offset);
2617 result.set_len (1,
true);
2626template <
typename T>
2634template <
typename T>
2641 if (result.needs_write_val_arg)
2642 val = result.write_val (
MAX (xi.len,
2658template <
typename T>
2665 static_assert (!result.needs_write_val_arg,
2666 "bswap on widest_int makes no sense");
2672template <
typename T>
2679 static_assert (!result.needs_write_val_arg,
2680 "bitreverse on widest_int makes no sense");
2687template <
typename T1,
typename T2>
2701template <
typename T1,
typename T2>
2709template <
typename T1,
typename T2>
2718template <
typename T1,
typename T2>
2732template <
typename T1,
typename T2>
2740template <
typename T1,
typename T2>
2748template <
typename T1,
typename T2>
2756 bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2757 if (result.needs_write_val_arg)
2758 val = result.write_val (
MAX (xi.len, yi.len));
2759 if (
LIKELY (xi.len + yi.len == 2))
2761 val[0] = xi.ulow () & yi.ulow ();
2762 result.set_len (1, is_sign_extended);
2765 result.set_len (
and_large (val, xi.val, xi.len, yi.val, yi.len,
2771template <
typename T1,
typename T2>
2779 bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2780 if (result.needs_write_val_arg)
2781 val = result.write_val (
MAX (xi.len, yi.len));
2782 if (
LIKELY (xi.len + yi.len == 2))
2784 val[0] = xi.ulow () & ~yi.ulow ();
2785 result.set_len (1, is_sign_extended);
2788 result.set_len (
and_not_large (val, xi.val, xi.len, yi.val, yi.len,
2794template <
typename T1,
typename T2>
2802 bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2803 if (result.needs_write_val_arg)
2804 val = result.write_val (
MAX (xi.len, yi.len));
2805 if (
LIKELY (xi.len + yi.len == 2))
2807 val[0] = xi.ulow () | yi.ulow ();
2808 result.set_len (1, is_sign_extended);
2811 result.set_len (
or_large (val, xi.val, xi.len,
2812 yi.val, yi.len,
precision), is_sign_extended);
2817template <
typename T1,
typename T2>
2825 bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2826 if (result.needs_write_val_arg)
2827 val = result.write_val (
MAX (xi.len, yi.len));
2828 if (
LIKELY (xi.len + yi.len == 2))
2830 val[0] = xi.ulow () | ~yi.ulow ();
2831 result.set_len (1, is_sign_extended);
2834 result.set_len (
or_not_large (val, xi.val, xi.len, yi.val, yi.len,
2840template <
typename T1,
typename T2>
2848 bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2849 if (result.needs_write_val_arg)
2850 val = result.write_val (
MAX (xi.len, yi.len));
2851 if (
LIKELY (xi.len + yi.len == 2))
2853 val[0] = xi.ulow () ^ yi.ulow ();
2854 result.set_len (1, is_sign_extended);
2857 result.set_len (
xor_large (val, xi.val, xi.len,
2858 yi.val, yi.len,
precision), is_sign_extended);
2863template <
typename T1,
typename T2>
2871 if (result.needs_write_val_arg)
2872 val = result.write_val (
MAX (xi.len, yi.len) + 1);
2875 val[0] = xi.ulow () + yi.ulow ();
2889 &&
LIKELY (xi.len + yi.len == 2))
2891 unsigned HOST_WIDE_INT xl = xi.ulow ();
2892 unsigned HOST_WIDE_INT yl = yi.ulow ();
2893 unsigned HOST_WIDE_INT resultl = xl + yl;
2895 val[1] = (HOST_WIDE_INT) resultl < 0 ? 0 : -1;
2896 result.set_len (1 + (((resultl ^ xl) & (resultl ^ yl))
2900 result.set_len (
add_large (val, xi.val, xi.len,
2908template <
typename T1,
typename T2>
2916 if (result.needs_write_val_arg)
2917 val = result.write_val (
MAX (xi.len, yi.len) + 1);
2920 unsigned HOST_WIDE_INT xl = xi.ulow ();
2921 unsigned HOST_WIDE_INT yl = yi.ulow ();
2922 unsigned HOST_WIDE_INT resultl = xl + yl;
2925 if ((((resultl ^ xl) & (resultl ^ yl))
2930 else if (xl < resultl)
2946 result.set_len (
add_large (val, xi.val, xi.len,
2953template <
typename T1,
typename T2>
2961 if (result.needs_write_val_arg)
2962 val = result.write_val (
MAX (xi.len, yi.len) + 1);
2965 val[0] = xi.ulow () - yi.ulow ();
2979 &&
LIKELY (xi.len + yi.len == 2))
2981 unsigned HOST_WIDE_INT xl = xi.ulow ();
2982 unsigned HOST_WIDE_INT yl = yi.ulow ();
2983 unsigned HOST_WIDE_INT resultl = xl - yl;
2985 val[1] = (HOST_WIDE_INT) resultl < 0 ? 0 : -1;
2986 result.set_len (1 + (((resultl ^ xl) & (xl ^ yl))
2990 result.set_len (
sub_large (val, xi.val, xi.len,
2998template <
typename T1,
typename T2>
3006 if (result.needs_write_val_arg)
3007 val = result.write_val (
MAX (xi.len, yi.len) + 1);
3010 unsigned HOST_WIDE_INT xl = xi.ulow ();
3011 unsigned HOST_WIDE_INT yl = yi.ulow ();
3012 unsigned HOST_WIDE_INT resultl = xl - yl;
3015 if ((((xl ^ yl) & (resultl ^ xl)) >> (
precision - 1)) & 1)
3035 result.set_len (
sub_large (val, xi.val, xi.len,
3042template <
typename T1,
typename T2>
3050 if (result.needs_write_val_arg)
3051 val = result.write_val (xi.len + yi.len + 2);
3054 val[0] = xi.ulow () * yi.ulow ();
3058 result.set_len (
mul_internal (val, xi.val, xi.len, yi.val, yi.len,
3065template <
typename T1,
typename T2>
3073 if (result.needs_write_val_arg)
3074 val = result.write_val (xi.len + yi.len + 2);
3077 sgn, overflow,
false));
3083template <
typename T1,
typename T2>
3092template <
typename T1,
typename T2>
3101template <
typename T1,
typename T2>
3109 static_assert (!result.needs_write_val_arg,
3110 "mul_high on widest_int doesn't make sense");
3120template <
typename T1,
typename T2>
3129 if (quotient.needs_write_val_arg)
3130 quotient_val = quotient.write_val ((sgn ==
UNSIGNED
3131 && xi.val[xi.len - 1] < 0)
3135 quotient.set_len (
divmod_internal (quotient_val, 0, 0, xi.val, xi.len,
3137 yi.val, yi.len, yi.precision,
3143template <
typename T1,
typename T2>
3151template <
typename T1,
typename T2>
3161template <
typename T1,
typename T2>
3171 unsigned int remainder_len;
3172 if (quotient.needs_write_val_arg)
3174 unsigned int est_len;
3175 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3178 est_len = xi.len + 1;
3179 quotient_val = quotient.write_val (est_len);
3180 remainder_val = remainder.write_val (est_len);
3183 &remainder_len, remainder_val,
3185 yi.val, yi.len, yi.precision, sgn,
3187 remainder.set_len (remainder_len);
3189 return quotient - 1;
3194template <
typename T1,
typename T2>
3203template <
typename T1,
typename T2>
3213template <
typename T1,
typename T2>
3223 unsigned int remainder_len;
3224 if (quotient.needs_write_val_arg)
3226 unsigned int est_len;
3227 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3230 est_len = xi.len + 1;
3231 quotient_val = quotient.write_val (est_len);
3232 remainder_val = remainder.write_val (est_len);
3235 &remainder_len, remainder_val,
3237 yi.val, yi.len, yi.precision, sgn,
3239 remainder.set_len (remainder_len);
3241 return quotient + 1;
3246template <
typename T1,
typename T2>
3256template <
typename T1,
typename T2>
3266 unsigned int remainder_len;
3267 if (quotient.needs_write_val_arg)
3269 unsigned int est_len;
3270 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3273 est_len = xi.len + 1;
3274 quotient_val = quotient.write_val (est_len);
3275 remainder_val = remainder.write_val (est_len);
3278 &remainder_len, remainder_val,
3280 yi.val, yi.len, yi.precision, sgn,
3282 remainder.set_len (remainder_len);
3292 return quotient - 1;
3294 return quotient + 1;
3300 return quotient + 1;
3308template <
typename T1,
typename T2>
3319 unsigned int remainder_len;
3320 if (quotient.needs_write_val_arg)
3322 unsigned int est_len;
3323 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3326 est_len = xi.len + 1;
3327 quotient_val = quotient.write_val (est_len);
3328 remainder_val = remainder.write_val (est_len);
3331 &remainder_len, remainder_val,
3333 yi.val, yi.len, yi.precision, sgn, 0));
3334 remainder.set_len (remainder_len);
3336 *remainder_ptr = remainder;
3342template <
typename T1,
typename T2>
3351 while (
gt_p (x, 0, sgn))
3364template <
typename T1,
typename T2>
3373 unsigned int remainder_len;
3374 if (remainder.needs_write_val_arg)
3375 remainder_val = remainder.write_val ((sgn ==
UNSIGNED
3376 && xi.val[xi.len - 1] < 0)
3382 yi.val, yi.len, yi.precision, sgn, overflow);
3383 remainder.set_len (remainder_len);
3390template <
typename T1,
typename T2>
3399template <
typename T1,
typename T2>
3409template <
typename T1,
typename T2>
3419 unsigned int remainder_len;
3420 if (quotient.needs_write_val_arg)
3422 unsigned int est_len;
3423 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3426 est_len = xi.len + 1;
3427 quotient_val = quotient.write_val (est_len);
3428 remainder_val = remainder.write_val (est_len);
3431 &remainder_len, remainder_val,
3433 yi.val, yi.len, yi.precision, sgn,
3435 remainder.set_len (remainder_len);
3438 return remainder +
y;
3445template <
typename T1,
typename T2>
3455template <
typename T1,
typename T2>
3465 unsigned int remainder_len;
3466 if (quotient.needs_write_val_arg)
3468 unsigned int est_len;
3469 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3472 est_len = xi.len + 1;
3473 quotient_val = quotient.write_val (est_len);
3474 remainder_val = remainder.write_val (est_len);
3477 &remainder_len, remainder_val,
3479 yi.val, yi.len, yi.precision, sgn,
3481 remainder.set_len (remainder_len);
3484 return remainder -
y;
3491template <
typename T1,
typename T2>
3501 unsigned int remainder_len;
3502 if (quotient.needs_write_val_arg)
3504 unsigned int est_len;
3505 if (sgn ==
UNSIGNED && xi.val[xi.len - 1] < 0)
3508 est_len = xi.len + 1;
3509 quotient_val = quotient.write_val (est_len);
3510 remainder_val = remainder.write_val (est_len);
3513 &remainder_len, remainder_val,
3515 yi.val, yi.len, yi.precision, sgn,
3517 remainder.set_len (remainder_len);
3527 return remainder +
y;
3529 return remainder -
y;
3535 return remainder -
y;
3543template <
typename T1,
typename T2>
3552template <
typename T1,
typename T2>
3570template <
typename T1,
typename T2>
3581 if (result.needs_write_val_arg)
3582 val = result.write_val (1);
3588 unsigned int shift = yi.to_uhwi ();
3589 if (result.needs_write_val_arg)
3605 val[0] = xi.ulow () << shift;
3617template <
typename T1,
typename T2>
3627 if (
geu_p (yi, xi.precision))
3629 if (result.needs_write_val_arg)
3630 val = result.write_val (1);
3636 unsigned int shift = yi.to_uhwi ();
3637 if (result.needs_write_val_arg)
3639 unsigned int est_len = xi.len;
3640 if (xi.val[xi.len - 1] < 0 && shift)
3644 val = result.write_val (est_len);
3660 val[0] = xi.to_uhwi () >> shift;
3664 result.set_len (
lrshift_large (val, xi.val, xi.len, xi.precision,
3672template <
typename T1,
typename T2>
3681 if (result.needs_write_val_arg)
3682 val = result.write_val (xi.len);
3684 if (
geu_p (yi, xi.precision))
3691 unsigned int shift = yi.to_uhwi ();
3694 val[0] =
sext_hwi (xi.ulow () >> shift, xi.precision - shift);
3695 result.set_len (1,
true);
3698 result.set_len (
arshift_large (val, xi.val, xi.len, xi.precision,
3706template <
typename T1,
typename T2>
3719template <
typename T1,
typename T2>
3721wi::lrotate (
const T1 &x,
const T2 &
y,
unsigned int width)
3732 return wi::zext (left, width) | right;
3733 return left | right;
3739template <
typename T1,
typename T2>
3741wi::rrotate (
const T1 &x,
const T2 &
y,
unsigned int width)
3751 return wi::zext (left, width) | right;
3752 return left | right;
3764template <
typename T>
3765inline unsigned HOST_WIDE_INT
3780 unsigned HOST_WIDE_INT res = xi.elt (start);
3784 unsigned HOST_WIDE_INT upper = xi.elt (start + 1);
3791template <
typename T>
3801#define SIGNED_BINARY_PREDICATE(OP, F) \
3802 template <typename T1, typename T2> \
3803 inline WI_SIGNED_BINARY_PREDICATE_RESULT (T1, T2) \
3804 OP (const T1 &x, const T2 &y) \
3806 return wi::F (x, y); \
3814#undef SIGNED_BINARY_PREDICATE
3816#define UNARY_OPERATOR(OP, F) \
3817 template<typename T> \
3818 WI_UNARY_RESULT (generic_wide_int<T>) \
3819 OP (const generic_wide_int<T> &x) \
3824#define BINARY_PREDICATE(OP, F) \
3825 template<typename T1, typename T2> \
3826 WI_BINARY_PREDICATE_RESULT (T1, T2) \
3827 OP (const T1 &x, const T2 &y) \
3829 return wi::F (x, y); \
3832#define BINARY_OPERATOR(OP, F) \
3833 template<typename T1, typename T2> \
3834 WI_BINARY_OPERATOR_RESULT (T1, T2) \
3835 OP (const T1 &x, const T2 &y) \
3837 return wi::F (x, y); \
3840#define SHIFT_OPERATOR(OP, F) \
3841 template<typename T1, typename T2> \
3842 WI_BINARY_OPERATOR_RESULT (T1, T1) \
3843 OP (const T1 &x, const T2 &y) \
3845 return wi::F (x, y); \
3860#undef UNARY_OPERATOR
3861#undef BINARY_PREDICATE
3862#undef BINARY_OPERATOR
3863#undef SHIFT_OPERATOR
3865template <
typename T1,
typename T2>
3867operator >> (const T1 &x, const T2 &
y)
3872template <
typename T1,
typename T2>
3874operator / (
const T1 &x,
const T2 &
y)
3879template <
typename T1,
typename T2>
3881operator % (
const T1 &x,
const T2 &
y)
3886void gt_ggc_mx (generic_wide_int <wide_int_storage> *) =
delete;
3887void gt_pch_nx (generic_wide_int <wide_int_storage> *) =
delete;
3957#ifndef GENERATOR_FILE
3971 template <
typename T>
3972 T
mask (
unsigned int,
bool);
3974 template <
typename T>
3977 template <
typename T>
3980 unsigned int mask (HOST_WIDE_INT *,
unsigned int,
bool,
unsigned int);
3981 unsigned int shifted_mask (HOST_WIDE_INT *,
unsigned int,
unsigned int,
3982 bool,
unsigned int);
3983 unsigned int from_array (HOST_WIDE_INT *,
const HOST_WIDE_INT *,
3984 unsigned int,
unsigned int,
bool);
4020template <
typename T>
4027 width, negate_p, wi::int_traits <T>::precision));
4034template <
typename T>
4040 unsigned int prec = wi::int_traits <T>::precision;
4041 unsigned int est_len
4042 = result.needs_write_val_arg
4043 ? ((start + (width > prec - start ? prec - start : width))
4045 result.set_len (
shifted_mask (result.write_val (est_len), start, width,
4052template <
typename T>
4068 overflow = suboverflow;
4069 else if (overflow != suboverflow)
void gt_pch_nx(bbitmap< N > *)
Definition bbitmap.h:226
void gt_ggc_mx(bbitmap< N > *)
Definition bbitmap.h:220
Definition wide-int.h:1353
static unsigned int
Definition wide-int.h:1371
static unsigned bool
Definition wide-int.h:1372
static FIXED_WIDE_INT(N) from(const wide_int_ref &
HOST_WIDE_INT * write_val(unsigned int)
Definition wide-int.h:1426
fixed_wide_int_storage()=default
const HOST_WIDE_INT * get_val() const
Definition wide-int.h:1412
unsigned int get_precision() const
Definition wide-int.h:1405
void set_len(unsigned int, bool=false)
Definition wide-int.h:1433
HOST_WIDE_INT val[WIDE_INT_MAX_HWIS(N)]
Definition wide-int.h:1355
static FIXED_WIDE_INT(N) from_array(const HOST_WIDE_INT *
unsigned int len
Definition wide-int.h:1356
static signop
Definition wide-int.h:1370
unsigned int get_len() const
Definition wide-int.h:1419
Definition wide-int.h:776
HOST_WIDE_INT to_shwi() const
Definition wide-int.h:874
generic_wide_int()
Definition wide-int.h:842
static const bool is_sign_extended
Definition wide-int.h:836
HOST_WIDE_INT elt(unsigned int) const
Definition wide-int.h:972
static const bool needs_write_val_arg
Definition wide-int.h:838
void dump() const
Definition wide-int.h:1009
unsigned HOST_WIDE_INT to_uhwi() const
Definition wide-int.h:898
unsigned HOST_WIDE_INT ulow() const
Definition wide-int.h:955
unsigned HOST_WIDE_INT to_uhwi(unsigned int) const
Definition wide-int.h:887
HOST_WIDE_INT to_shwi(unsigned int) const
Definition wide-int.h:863
unsigned HOST_WIDE_INT uhigh() const
Definition wide-int.h:964
generic_wide_int(const T &)
Definition wide-int.h:846
HOST_WIDE_INT to_short_addr() const
Definition wide-int.h:909
HOST_WIDE_INT sext_elt(unsigned int) const
Definition wide-int.h:984
generic_wide_int(const T &, unsigned int)
Definition wide-int.h:853
HOST_WIDE_INT shigh() const
Definition wide-int.h:946
HOST_WIDE_INT sign_mask() const
Definition wide-int.h:917
HOST_WIDE_INT slow() const
Definition wide-int.h:937
Definition wide-int.h:1712
void set_len(unsigned int, bool=false)
Definition wide-int.h:1822
trailing_wide_int_storage(unsigned int, unsigned short *, HOST_WIDE_INT *)
Definition wide-int.h:1791
const HOST_WIDE_INT * get_val() const
Definition wide-int.h:1810
unsigned int m_precision
Definition wide-int.h:1716
trailing_wide_int_storage & operator=(const T &)
Definition wide-int.h:1832
unsigned int get_len() const
Definition wide-int.h:1798
unsigned int get_precision() const
Definition wide-int.h:1804
HOST_WIDE_INT * write_val(unsigned int)
Definition wide-int.h:1816
HOST_WIDE_INT * m_val
Definition wide-int.h:1723
unsigned short * m_len
Definition wide-int.h:1719
Definition wide-int.h:1965
signop sgn
Definition wide-int.h:1971
hwi_with_prec()
Definition wide-int.h:1967
unsigned int precision
Definition wide-int.h:1970
HOST_WIDE_INT val
Definition wide-int.h:1969
Definition wide-int.h:707
unsigned int precision
Definition wide-int.h:714
unsigned int len
Definition wide-int.h:713
storage_ref()
Definition wide-int.h:709
unsigned int get_len() const
Definition wide-int.h:732
const HOST_WIDE_INT * get_val() const
Definition wide-int.h:744
storage_ref(const HOST_WIDE_INT *, unsigned int, unsigned int)
const HOST_WIDE_INT * val
Definition wide-int.h:712
unsigned int get_precision() const
Definition wide-int.h:738
Definition wide-int.h:1058
HOST_WIDE_INT scratch[2]
Definition wide-int.h:1062
wide_int_ref_storage()
Definition wide-int.h:1065
Definition wide-int.h:1126
static wide_int create(unsigned int)
Definition wide-int.h:1313
const HOST_WIDE_INT * get_val() const
Definition wide-int.h:1258
wide_int_storage()
Definition wide-int.h:1177
static wide_int from(const wide_int_ref &, unsigned int, signop)
Definition wide-int.h:1289
~wide_int_storage()
Definition wide-int.h:1206
unsigned int get_precision() const
Definition wide-int.h:1252
unsigned int len
Definition wide-int.h:1133
void set_len(unsigned int, bool=false)
Definition wide-int.h:1276
unsigned int get_len() const
Definition wide-int.h:1264
HOST_WIDE_INT * write_val(unsigned int)
Definition wide-int.h:1270
union wide_int_storage::@332066064303330275027227150040015331132257367372 u
wide_int_storage & operator=(const wide_int_storage &)
Definition wide-int.h:1213
static wide_int from_array(const HOST_WIDE_INT *, unsigned int, unsigned int, bool=true)
Definition wide-int.h:1302
unsigned int precision
Definition wide-int.h:1134
Definition wide-int.h:1489
void set_len(unsigned int, bool=false)
Definition wide-int.h:1644
static unsigned bool
Definition wide-int.h:1517
const HOST_WIDE_INT * get_val() const
Definition wide-int.h:1613
union widest_int_storage::@161345252340175325254017364252252150142051207163 u
widest_int_storage()
Definition wide-int.h:1538
widest_int_storage & operator=(const widest_int_storage &)
Definition wide-int.h:1572
~widest_int_storage()
Definition wide-int.h:1564
static WIDEST_INT(N) from(const wide_int_ref &
unsigned int get_precision() const
Definition wide-int.h:1606
unsigned int len
Definition wide-int.h:1496
static signop
Definition wide-int.h:1515
unsigned int get_len() const
Definition wide-int.h:1620
HOST_WIDE_INT * write_val(unsigned int)
Definition wide-int.h:1627
#define GTY(x)
Definition coretypes.h:41
void(*) gt_pointer_operator(void *, void *, void *)
Definition coretypes.h:477
#define CHAR_BIT
Definition genautomata.cc:120
#define N
Definition gensupport.cc:202
#define HOST_WIDE_INT_1U
Definition hwint.h:53
#define HOST_WIDE_INT_PRINT_HEX
Definition hwint.h:96
HOST_WIDE_INT sext_hwi(HOST_WIDE_INT src, unsigned int prec)
Definition hwint.h:292
#define HOST_WIDE_INT_MAX
Definition hwint.h:258
#define HOST_BITS_PER_WIDE_INT
Definition hwint.h:36
unsigned HOST_WIDE_INT zext_hwi(unsigned HOST_WIDE_INT src, unsigned int prec)
Definition hwint.h:319
#define HOST_WIDE_INT_UC(X)
Definition hwint.h:49
Definition double-int.h:439
BINARY_FUNCTION udiv_ceil(const T1 &, const T2 &)
bool lts_p_large(const HOST_WIDE_INT *, unsigned int, unsigned int, const HOST_WIDE_INT *, unsigned int)
Definition wide-int.cc:479
unsigned int or_not_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:1067
int ctz(const wide_int_ref &)
Definition wide-int.cc:2230
BINARY_FUNCTION umod_trunc(const T1 &, const T2 &)
BINARY_FUNCTION umul(const T1 &, const T2 &, overflow_type *)
bool multiple_of_p(const T1 &, const T2 &, signop)
Definition wide-int.h:3545
BINARY_FUNCTION udiv_floor(const T1 &, const T2 &)
wide_int shifted_mask(unsigned int, unsigned int, bool, unsigned int)
Definition wide-int.h:4001
unsigned int get_binary_precision(const T1 &, const T2 &)
Definition wide-int.h:2173
poly_int< N, hwi_with_prec > uhwi(const poly_int< N, unsigned HOST_WIDE_INT > &a, unsigned int precision)
Definition poly-int.h:733
UNARY_FUNCTION ext(const T &, unsigned int, signop)
precision_type
Definition wide-int.h:387
@ INL_CONST_PRECISION
Definition wide-int.h:398
@ VAR_PRECISION
Definition wide-int.h:394
@ CONST_PRECISION
Definition wide-int.h:402
@ FLEXIBLE_PRECISION
Definition wide-int.h:391
wide_int min_value(machine_mode, signop)
Definition rtl.h:2380
unsigned int or_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:1009
wide_int mask(unsigned int, bool, unsigned int)
Definition wide-int.h:3990
unsigned int set_bit_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int)
Definition wide-int.cc:699
unsigned int bswap_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:735
BINARY_FUNCTION div_trunc(const T1 &, const T2 &, signop, overflow_type *=0)
UNARY_PREDICATE neg_p(const T &, signop=SIGNED)
int cmps(const T1 &, const T2 &)
Definition wide-int.h:2442
BINARY_FUNCTION umod_floor(const T1 &, const T2 &)
BINARY_PREDICATE le_p(const T1 &, const T2 &, signop)
unsigned int lrshift_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int, unsigned int)
Definition wide-int.cc:2119
SHIFT_FUNCTION rrotate(const T1 &, const T2 &, unsigned int=0)
BINARY_FUNCTION div_ceil(const T1 &, const T2 &, signop, overflow_type *=0)
BINARY_FUNCTION sdiv_floor(const T1 &, const T2 &)
UNARY_PREDICATE fits_shwi_p(const T &)
HOST_WIDE_INT sign_mask(const T &)
Definition wide-int.h:2235
int clrsb(const wide_int_ref &)
Definition wide-int.cc:2202
UNARY_FUNCTION zext(const T &, unsigned int)
unsigned int xor_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:1125
BINARY_FUNCTION div_floor(const T1 &, const T2 &, signop, overflow_type *=0)
wide_int round_up_for_mask(const wide_int &, const wide_int &)
Definition wide-int.cc:2341
SHIFT_FUNCTION rshift(const T1 &, const T2 &, signop sgn)
SHIFT_FUNCTION arshift(const T1 &, const T2 &)
unsigned HOST_WIDE_INT extract_uhwi(const T &, unsigned int, unsigned int)
Definition wide-int.h:3766
BINARY_FUNCTION div_round(const T1 &, const T2 &, signop, overflow_type *=0)
BINARY_FUNCTION umax(const T1 &, const T2 &)
BINARY_FUNCTION smin(const T1 &, const T2 &)
bool only_sign_bit_p(const wide_int_ref &, unsigned int)
Definition wide-int.cc:2294
bool eq_p_large(const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:449
BINARY_FUNCTION bit_and_not(const T1 &, const T2 &)
unsigned int from_array(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, bool=true)
Definition wide-int.cc:143
BINARY_FUNCTION sub(const T1 &, const T2 &)
BINARY_FUNCTION mod_round(const T1 &, const T2 &, signop, overflow_type *=0)
BINARY_FUNCTION smod_trunc(const T1 &, const T2 &)
UNARY_FUNCTION bitreverse(const T &)
UNARY_FUNCTION set_bit(const T &, unsigned int)
unsigned int min_precision(const T &, signop)
Definition wide-int.h:3793
int cmpu(const T1 &, const T2 &)
Definition wide-int.h:2479
BINARY_PREDICATE ges_p(const T1 &, const T2 &)
BINARY_FUNCTION mod_ceil(const T1 &, const T2 &, signop, overflow_type *=0)
UNARY_FUNCTION neg(const T &)
int exact_log2(const wide_int_ref &)
Definition wide-int.cc:2246
wide_int from_buffer(const unsigned char *, unsigned int)
Definition wide-int.cc:156
BINARY_FUNCTION mul_high(const T1 &, const T2 &, signop)
hwi_with_prec minus_one(unsigned int)
Definition wide-int.h:2009
unsigned int arshift_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int, unsigned int)
Definition wide-int.cc:2153
hwi_with_prec zero(unsigned int)
Definition wide-int.h:2016
SHIFT_FUNCTION lrotate(const T1 &, const T2 &, unsigned int=0)
unsigned int and_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:894
int ffs(const wide_int_ref &)
Definition wide-int.cc:2286
int floor_log2(const wide_int_ref &)
Definition wide-int.cc:2278
BINARY_PREDICATE lt_p(const T1 &, const T2 &, signop)
unsigned int divmod_internal(HOST_WIDE_INT *, unsigned int *, HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int, signop, overflow_type *)
Definition wide-int.cc:1837
BINARY_FUNCTION bit_or(const T1 &, const T2 &)
BINARY_PREDICATE les_p(const T1 &, const T2 &)
unsigned int get_precision(const T &)
Definition wide-int.h:2164
unsigned int and_not_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:951
BINARY_FUNCTION bit_xor(const T1 &, const T2 &)
int cmpu_large(const HOST_WIDE_INT *, unsigned int, unsigned int, const HOST_WIDE_INT *, unsigned int)
Definition wide-int.cc:581
unsigned int bitreverse_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int)
Definition wide-int.cc:769
hwi_with_prec two(unsigned int)
Definition wide-int.h:2030
UNARY_FUNCTION bswap(const T &)
unsigned int add_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int, signop, overflow_type *)
Definition wide-int.cc:1171
unsigned int lshift_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int)
Definition wide-int.cc:2052
Ca unsigned int precision
Definition poly-int.h:746
BINARY_PREDICATE ge_p(const T1 &, const T2 &, signop)
static void accumulate_overflow(overflow_type &, overflow_type)
Definition wide-int.h:4062
BINARY_PREDICATE lts_p(const T1 &, const T2 &)
BINARY_FUNCTION bit_and(const T1 &, const T2 &)
UNARY_FUNCTION abs(const T &)
wide_int insert(const wide_int &x, const wide_int &y, unsigned int, unsigned int)
Definition wide-int.cc:669
unsigned int sub_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int, signop, overflow_type *)
Definition wide-int.cc:1637
BINARY_FUNCTION smul(const T1 &, const T2 &, overflow_type *)
Ca & a
Definition poly-int.h:745
UNARY_FUNCTION bit_not(const T &)
BINARY_PREDICATE geu_p(const T1 &, const T2 &)
wide_int max_value(machine_mode, signop)
Definition rtl.h:2388
UNARY_PREDICATE fits_uhwi_p(const T &)
unsigned int force_to_size(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int, signop sgn)
Definition wide-int.cc:364
int cmps_large(const HOST_WIDE_INT *, unsigned int, unsigned int, const HOST_WIDE_INT *, unsigned int)
Definition wide-int.cc:517
BINARY_FUNCTION mul(const T1 &, const T2 &)
wide_int round_down_for_mask(const wide_int &, const wide_int &)
Definition wide-int.cc:2315
BINARY_FUNCTION gcd(const T1 &, const T2 &, signop=UNSIGNED)
void to_mpz(const wide_int_ref &, mpz_t, signop)
Definition wide-int.cc:206
unsigned int mul_internal(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, const HOST_WIDE_INT *, unsigned int, unsigned int, signop, overflow_type *, bool)
Definition wide-int.cc:1325
BINARY_PREDICATE gts_p(const T1 &, const T2 &)
BINARY_FUNCTION umin(const T1 &, const T2 &)
void copy(T1 &, const T2 &)
Definition wide-int.h:2182
SHIFT_FUNCTION lrshift(const T1 &, const T2 &)
BINARY_PREDICATE gt_p(const T1 &, const T2 &, signop)
wide_int mod_inv(const wide_int &a, const wide_int &b)
Definition wide-int.cc:2374
BINARY_PREDICATE gtu_p(const T1 &, const T2 &)
UNARY_FUNCTION sext(const T &, unsigned int)
SHIFT_FUNCTION lshift(const T1 &, const T2 &)
int clz(const wide_int_ref &)
Definition wide-int.cc:2177
BINARY_FUNCTION udiv_trunc(const T1 &, const T2 &)
BINARY_PREDICATE ltu_p(const T1 &, const T2 &)
int cmp(const T1 &, const T2 &, signop)
Definition wide-int.h:2521
BINARY_FUNCTION bit_or_not(const T1 &, const T2 &)
BINARY_FUNCTION divmod_trunc(const T1 &, const T2 &, signop, WI_BINARY_RESULT(T1, T2) *)
BINARY_FUNCTION add(const T1 &, const T2 &)
BINARY_PREDICATE ne_p(const T1 &, const T2 &)
BINARY_PREDICATE leu_p(const T1 &, const T2 &)
int parity(const wide_int_ref &)
Definition wide-int.h:3758
unsigned int zext_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int)
Definition wide-int.cc:640
BINARY_FUNCTION smax(const T1 &, const T2 &)
BINARY_FUNCTION mod_trunc(const T1 &, const T2 &, signop, overflow_type *=0)
BINARY_FUNCTION min(const T1 &, const T2 &, signop)
i
Definition poly-int.h:750
bool ltu_p_large(const HOST_WIDE_INT *, unsigned int, unsigned int, const HOST_WIDE_INT *, unsigned int)
Definition wide-int.cc:554
BINARY_FUNCTION sdiv_trunc(const T1 &, const T2 &)
overflow_type
Definition wide-int.h:377
@ OVF_UNKNOWN
Definition wide-int.h:383
@ OVF_NONE
Definition wide-int.h:378
@ OVF_UNDERFLOW
Definition wide-int.h:379
@ OVF_OVERFLOW
Definition wide-int.h:380
BINARY_PREDICATE eq_p(const T1 &, const T2 &)
int popcount(const wide_int_ref &)
Definition wide-int.cc:1605
BINARY_FUNCTION mod_floor(const T1 &, const T2 &, signop, overflow_type *=0)
hwi_with_prec one(unsigned int)
Definition wide-int.h:2023
wide_int set_bit_in_zero(unsigned int, unsigned int)
Definition wide-int.h:4013
unsigned int sext_large(HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int, unsigned int, unsigned int)
Definition wide-int.cc:613
BINARY_FUNCTION max(const T1 &, const T2 &, signop)
poly_int< N, hwi_with_prec > shwi(const poly_int< N, HOST_WIDE_INT > &a, unsigned int precision)
Definition poly-int.h:721
i
Definition poly-int.h:776
Ca const poly_int< N, Cb > & b
Definition poly-int.h:771
signop
Definition signop.h:28
@ UNSIGNED
Definition signop.h:30
@ SIGNED
Definition signop.h:29
Definition wide-int.h:1758
static size_t extra_size(unsigned int precision, unsigned int num_elements=N)
Definition wide-int.h:1875
trailing_wide_int operator[](unsigned int)
Definition wide-int.h:1855
size_t extra_size() const
Definition wide-int.h:1786
unsigned char m_num_elements
Definition wide-int.h:1767
unsigned short m_len[N]
Definition wide-int.h:1770
unsigned short m_max_len
Definition wide-int.h:1764
HOST_WIDE_INT m_val[1]
Definition wide-int.h:1774
unsigned int num_elements() const
Definition wide-int.h:1781
unsigned short m_precision
Definition wide-int.h:1761
typedef WIDE_INT_REF_FOR(trailing_wide_int_storage) const _reference
void set_precision(unsigned int precision, unsigned int num_elements=N)
Definition wide-int.h:1843
unsigned int get_precision() const
Definition wide-int.h:1780
result_type operator_result
Definition wide-int.h:533
STATIC_ASSERT(int_traits< T1 >::precision==int_traits< T2 >::precision)
result_type signed_shift_result_type
Definition wide-int.h:535
bool signed_predicate_result
Definition wide-int.h:536
bool predicate_result
Definition wide-int.h:534
generic_wide_int< widest_int_storage< int_traits< T1 >::precision > > result_type
Definition wide-int.h:532
bool signed_predicate_result
Definition wide-int.h:510
result_type signed_shift_result_type
Definition wide-int.h:509
bool predicate_result
Definition wide-int.h:508
result_type operator_result
Definition wide-int.h:507
generic_wide_int< widest_int_storage< int_traits< T1 >::precision > > result_type
Definition wide-int.h:506
result_type signed_shift_result_type
Definition wide-int.h:477
bool signed_predicate_result
Definition wide-int.h:478
bool predicate_result
Definition wide-int.h:476
generic_wide_int< widest_int_storage< int_traits< T2 >::precision > > result_type
Definition wide-int.h:474
result_type operator_result
Definition wide-int.h:475
widest_int result_type
Definition wide-int.h:445
bool signed_predicate_result
Definition wide-int.h:467
result_type operator_result
Definition wide-int.h:464
result_type signed_shift_result_type
Definition wide-int.h:466
generic_wide_int< fixed_wide_int_storage< int_traits< T2 >::precision > > result_type
Definition wide-int.h:463
bool predicate_result
Definition wide-int.h:465
wide_int result_type
Definition wide-int.h:452
result_type operator_result
Definition wide-int.h:453
bool predicate_result
Definition wide-int.h:454
result_type signed_shift_result_type
Definition wide-int.h:498
bool signed_predicate_result
Definition wide-int.h:499
result_type operator_result
Definition wide-int.h:496
generic_wide_int< fixed_wide_int_storage< int_traits< T1 >::precision > > result_type
Definition wide-int.h:495
bool predicate_result
Definition wide-int.h:497
bool predicate_result
Definition wide-int.h:522
result_type signed_shift_result_type
Definition wide-int.h:523
generic_wide_int< fixed_wide_int_storage< int_traits< T1 >::precision > > result_type
Definition wide-int.h:520
bool signed_predicate_result
Definition wide-int.h:524
result_type operator_result
Definition wide-int.h:521
STATIC_ASSERT(int_traits< T1 >::precision==int_traits< T2 >::precision)
bool predicate_result
Definition wide-int.h:486
wide_int result_type
Definition wide-int.h:484
result_type operator_result
Definition wide-int.h:485
bool predicate_result
Definition wide-int.h:544
result_type operator_result
Definition wide-int.h:543
wide_int result_type
Definition wide-int.h:542
Definition wide-int.h:435
static const bool needs_write_val_arg
Definition wide-int.h:1383
static const bool is_sign_extended
Definition wide-int.h:1382
static const bool host_dependent_precision
Definition wide-int.h:1381
static FIXED_WIDE_INT(N) get_binary_result(const T1 &
static const unsigned int precision
Definition wide-int.h:1384
static const T2 &static unsigned int get_binary_precision(const T1 &, const T2 &)
static enum precision_type precision_type
Definition wide-int.h:1380
static wi::storage_ref decompose(HOST_WIDE_INT *, unsigned int, const generic_wide_int< storage > &)
Definition wide-int.h:1046
static unsigned int get_precision(const generic_wide_int< storage > &)
Definition wide-int.h:1038
static enum precision_type precision_type
Definition wide-int.h:2064
static unsigned int get_precision(const wi::hwi_with_prec &)
Definition wide-int.h:2077
static const bool is_sign_extended
Definition wide-int.h:2068
static const bool host_dependent_precision
Definition wide-int.h:2067
static const bool needs_write_val_arg
Definition wide-int.h:2069
static wi::storage_ref decompose(HOST_WIDE_INT *, unsigned int, const wi::hwi_with_prec &)
Definition wide-int.h:2084
static const bool is_sign_extended
Definition wide-int.h:1110
static const bool host_dependent_precision
Definition wide-int.h:1109
static const bool needs_write_val_arg
Definition wide-int.h:1111
static enum precision_type precision_type
Definition wide-int.h:1108
static const bool needs_write_val_arg
Definition wide-int.h:1169
static const bool host_dependent_precision
Definition wide-int.h:1167
static enum precision_type precision_type
Definition wide-int.h:1165
static const bool is_sign_extended
Definition wide-int.h:1168
static unsigned int get_binary_precision(const T1 &, const T2 &)
Definition wide-int.h:1338
static wide_int get_binary_result(const T1 &, const T2 &)
Definition wide-int.h:1325
static const bool needs_write_val_arg
Definition wide-int.h:1528
static const bool host_dependent_precision
Definition wide-int.h:1526
static enum precision_type precision_type
Definition wide-int.h:1525
static WIDEST_INT(N) get_binary_result(const T1 &
static const bool is_sign_extended
Definition wide-int.h:1527
static const unsigned int precision
Definition wide-int.h:1529
static const T2 &static unsigned int get_binary_precision(const T1 &, const T2 &)
Definition wide-int.h:427
static hwi_with_prec zero(const T &)
Definition wide-int.h:2041
static int zero(const T &)
Definition wide-int.h:2042
Definition wide-int.h:3943
Definition wide-int.h:3944
Definition wide-int.h:1895
static const bool is_sign_extended
Definition wide-int.h:1898
static const bool host_dependent_precision
Definition wide-int.h:1897
static wi::storage_ref decompose(HOST_WIDE_INT *, unsigned int, T)
Definition wide-int.h:1914
static const bool needs_write_val_arg
Definition wide-int.h:1899
static unsigned int get_precision(T)
Definition wide-int.h:1907
static enum precision_type precision_type
Definition wide-int.h:1896
#define gcc_assert(EXPR)
Definition system.h:772
#define CEIL(x, y)
Definition system.h:403
#define IN_RANGE(VALUE, LOWER, UPPER)
Definition system.h:327
#define STATIC_CONSTANT_P(X)
Definition system.h:815
#define UNLIKELY(x)
Definition system.h:721
#define STATIC_ASSERT(X)
Definition system.h:822
#define gcc_checking_assert(EXPR)
Definition system.h:779
#define MAX(X, Y)
Definition system.h:400
#define LIKELY(x)
Definition system.h:720
generic_wide_int< widest_int_storage< WIDEST_INT_MAX_PRECISION > > widest_int
Definition wide-int.h:345
#define WIDEST_INT(N)
Definition wide-int.h:1484
#define UNARY_PREDICATE
Definition wide-int.h:560
#define ASSIGNMENT_OPERATOR(OP, F)
Definition wide-int.h:805
#define SHIFT_FUNCTION
Definition wide-int.h:568
#define WIDE_INT_REF_FOR(T)
Definition wide-int.h:362
generic_wide_int< wide_int_ref_storage< false > > wide_int_ref
Definition wide-int.h:353
generic_wide_int< widest_int_storage< WIDEST_INT_MAX_PRECISION *2 > > widest2_int
Definition wide-int.h:346
generic_wide_int< trailing_wide_int_storage > trailing_wide_int
Definition wide-int.h:1739
#define WI_SIGNED_SHIFT_RESULT(T1, T2)
Definition wide-int.h:299
#define WIDE_INT_MAX_ELTS
Definition wide-int.h:252
#define BINARY_OPERATOR(OP, F)
Definition wide-int.h:3832
#define ADDR_MAX_PRECISION
Definition wide-int.h:276
#define SIGNED_BINARY_PREDICATE(OP, F)
Definition wide-int.h:3801
#define INCDEC_OPERATOR(OP, DELTA)
Definition wide-int.h:814
#define WI_BINARY_RESULT(T1, T2)
Definition wide-int.h:289
#define WI_UNARY_RESULT_VAR(RESULT, VAL, T, X)
Definition wide-int.h:329
#define BINARY_FUNCTION
Definition wide-int.h:566
#define SHIFT_ASSIGNMENT_OPERATOR(OP, OP2)
Definition wide-int.h:810
generic_wide_int< wide_int_storage > wide_int
Definition wide-int.h:343
const T2 & y
Definition wide-int.h:3868
#define FIXED_WIDE_INT(N)
Definition wide-int.h:340
#define WI_BINARY_RESULT_VAR(RESULT, VAL, T1, X, T2, Y)
Definition wide-int.h:323
STATIC_ASSERT(WIDE_INT_MAX_INL_ELTS< WIDE_INT_MAX_ELTS)
#define BINARY_PREDICATE
Definition wide-int.h:564
#define WIDE_INT_MAX_INL_ELTS
Definition wide-int.h:243
#define UNARY_OPERATOR(OP, F)
Definition wide-int.h:3816
#define WIDE_INT_MAX_INL_PRECISION
Definition wide-int.h:247
#define WI_UNARY_RESULT(T)
Definition wide-int.h:315
#define SHIFT_OPERATOR(OP, F)
Definition wide-int.h:3840
#define WIDE_INT_MAX_HWIS(PRECISION)
Definition wide-int.h:284
#define UNARY_FUNCTION
Definition wide-int.h:562