Home | History | Annotate | Line # | Download | only in gcc
      1 /* Operations with very long integers.
      2    Copyright (C) 2012-2024 Free Software Foundation, Inc.
      3    Contributed by Kenneth Zadeck <zadeck (at) naturalbridge.com>
      4 
      5 This file is part of GCC.
      6 
      7 GCC is free software; you can redistribute it and/or modify it
      8 under the terms of the GNU General Public License as published by the
      9 Free Software Foundation; either version 3, or (at your option) any
     10 later version.
     11 
     12 GCC is distributed in the hope that it will be useful, but WITHOUT
     13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15 for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with GCC; see the file COPYING3.  If not see
     19 <http://www.gnu.org/licenses/>.  */
     20 
     21 #include "config.h"
     22 #include "system.h"
     23 #include "coretypes.h"
     24 #include "tm.h"
     25 #include "tree.h"
     26 #include "selftest.h"
     27 
     28 
     29 #define HOST_BITS_PER_HALF_WIDE_INT 32
     30 #if HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_LONG
     31 # define HOST_HALF_WIDE_INT long
     32 #elif HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_INT
     33 # define HOST_HALF_WIDE_INT int
     34 #else
     35 #error Please add support for HOST_HALF_WIDE_INT
     36 #endif
     37 
     38 #define W_TYPE_SIZE HOST_BITS_PER_WIDE_INT
     39 /* Do not include longlong.h when compiler is clang-based. See PR61146.  */
     40 #if GCC_VERSION >= 3000 && (W_TYPE_SIZE == 32 || defined (__SIZEOF_INT128__)) && !defined(__clang__)
     41 typedef unsigned HOST_HALF_WIDE_INT UHWtype;
     42 typedef unsigned HOST_WIDE_INT UWtype;
     43 typedef unsigned int UQItype __attribute__ ((mode (QI)));
     44 typedef unsigned int USItype __attribute__ ((mode (SI)));
     45 typedef unsigned int UDItype __attribute__ ((mode (DI)));
     46 #if W_TYPE_SIZE == 32
     47 typedef unsigned int UDWtype __attribute__ ((mode (DI)));
     48 #else
     49 typedef unsigned int UDWtype __attribute__ ((mode (TI)));
     50 #endif
     51 #include "longlong.h"
     52 #endif
     53 
     54 static const HOST_WIDE_INT zeros[1] = {};
     55 
     56 /*
     57  * Internal utilities.
     58  */
     59 
     60 /* Quantities to deal with values that hold half of a wide int.  Used
     61    in multiply and divide.  */
     62 #define HALF_INT_MASK ((HOST_WIDE_INT_1 << HOST_BITS_PER_HALF_WIDE_INT) - 1)
     63 
     64 #define BLOCK_OF(TARGET) ((TARGET) / HOST_BITS_PER_WIDE_INT)
     65 #define BLOCKS_NEEDED(PREC) (PREC ? CEIL (PREC, HOST_BITS_PER_WIDE_INT) : 1)
     66 #define SIGN_MASK(X) ((HOST_WIDE_INT) (X) < 0 ? -1 : 0)
     67 
     68 /* Return the value a VAL[I] if I < LEN, otherwise, return 0 or -1
     69    based on the top existing bit of VAL. */
     70 
     71 static unsigned HOST_WIDE_INT
     72 safe_uhwi (const HOST_WIDE_INT *val, unsigned int len, unsigned int i)
     73 {
     74   return i < len ? val[i] : val[len - 1] < 0 ? HOST_WIDE_INT_M1 : 0;
     75 }
     76 
     77 /* Convert the integer in VAL to canonical form, returning its new length.
     78    LEN is the number of blocks currently in VAL and PRECISION is the number
     79    of bits in the integer it represents.
     80 
     81    This function only changes the representation, not the value.  */
     82 static unsigned int
     83 canonize (HOST_WIDE_INT *val, unsigned int len, unsigned int precision)
     84 {
     85   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
     86   HOST_WIDE_INT top;
     87   int i;
     88 
     89   if (len > blocks_needed)
     90     len = blocks_needed;
     91 
     92   if (len == 1)
     93     return len;
     94 
     95   top = val[len - 1];
     96   if (len * HOST_BITS_PER_WIDE_INT > precision)
     97     val[len - 1] = top = sext_hwi (top, precision % HOST_BITS_PER_WIDE_INT);
     98   if (top != 0 && top != HOST_WIDE_INT_M1)
     99     return len;
    100 
    101   /* At this point we know that the top is either 0 or -1.  Find the
    102      first block that is not a copy of this.  */
    103   for (i = len - 2; i >= 0; i--)
    104     {
    105       HOST_WIDE_INT x = val[i];
    106       if (x != top)
    107 	{
    108 	  if (SIGN_MASK (x) == top)
    109 	    return i + 1;
    110 
    111 	  /* We need an extra block because the top bit block i does
    112 	     not match the extension.  */
    113 	  return i + 2;
    114 	}
    115     }
    116 
    117   /* The number is 0 or -1.  */
    118   return 1;
    119 }
    120 
    121 /* VAL[0] is the unsigned result of an operation.  Canonize it by adding
    122    another 0 block if needed, and return number of blocks needed.  */
    123 
    124 static inline unsigned int
    125 canonize_uhwi (HOST_WIDE_INT *val, unsigned int precision)
    126 {
    127   if (val[0] < 0 && precision > HOST_BITS_PER_WIDE_INT)
    128     {
    129       val[1] = 0;
    130       return 2;
    131     }
    132   return 1;
    133 }
    134 
    135 /*
    136  * Conversion routines in and out of wide_int.
    137  */
    138 
    139 /* Copy XLEN elements from XVAL to VAL.  If NEED_CANON, canonize the
    140    result for an integer with precision PRECISION.  Return the length
    141    of VAL (after any canonization).  */
    142 unsigned int
    143 wi::from_array (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    144 		unsigned int xlen, unsigned int precision, bool need_canon)
    145 {
    146   for (unsigned i = 0; i < xlen; i++)
    147     val[i] = xval[i];
    148   return need_canon ? canonize (val, xlen, precision) : xlen;
    149 }
    150 
    151 /* Construct a wide int from a buffer of length LEN.  BUFFER will be
    152    read according to byte endianness and word endianness of the target.
    153    Only the lower BUFFER_LEN bytes of the result are set; the remaining
    154    high bytes are cleared.  */
    155 wide_int
    156 wi::from_buffer (const unsigned char *buffer, unsigned int buffer_len)
    157 {
    158   unsigned int precision = buffer_len * BITS_PER_UNIT;
    159   wide_int result = wide_int::create (precision);
    160   unsigned int words = buffer_len / UNITS_PER_WORD;
    161 
    162   /* We have to clear all the bits ourself, as we merely or in values
    163      below.  */
    164   unsigned int len = BLOCKS_NEEDED (precision);
    165   HOST_WIDE_INT *val = result.write_val (0);
    166   for (unsigned int i = 0; i < len; ++i)
    167     val[i] = 0;
    168 
    169   for (unsigned int byte = 0; byte < buffer_len; byte++)
    170     {
    171       unsigned int offset;
    172       unsigned int index;
    173       unsigned int bitpos = byte * BITS_PER_UNIT;
    174       unsigned HOST_WIDE_INT value;
    175 
    176       if (buffer_len > UNITS_PER_WORD)
    177 	{
    178 	  unsigned int word = byte / UNITS_PER_WORD;
    179 
    180 	  if (WORDS_BIG_ENDIAN)
    181 	    word = (words - 1) - word;
    182 
    183 	  offset = word * UNITS_PER_WORD;
    184 
    185 	  if (BYTES_BIG_ENDIAN)
    186 	    offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
    187 	  else
    188 	    offset += byte % UNITS_PER_WORD;
    189 	}
    190       else
    191 	offset = BYTES_BIG_ENDIAN ? (buffer_len - 1) - byte : byte;
    192 
    193       value = (unsigned HOST_WIDE_INT) buffer[offset];
    194 
    195       index = bitpos / HOST_BITS_PER_WIDE_INT;
    196       val[index] |= value << (bitpos % HOST_BITS_PER_WIDE_INT);
    197     }
    198 
    199   result.set_len (canonize (val, len, precision));
    200 
    201   return result;
    202 }
    203 
    204 /* Sets RESULT from X, the sign is taken according to SGN.  */
    205 void
    206 wi::to_mpz (const wide_int_ref &x, mpz_t result, signop sgn)
    207 {
    208   int len = x.get_len ();
    209   const HOST_WIDE_INT *v = x.get_val ();
    210   int excess = len * HOST_BITS_PER_WIDE_INT - x.get_precision ();
    211 
    212   if (wi::neg_p (x, sgn))
    213     {
    214       /* We use ones complement to avoid -x80..0 edge case that -
    215 	 won't work on.  */
    216       HOST_WIDE_INT *t = XALLOCAVEC (HOST_WIDE_INT, len);
    217       for (int i = 0; i < len; i++)
    218 	t[i] = ~v[i];
    219       if (excess > 0)
    220 	t[len - 1] = (unsigned HOST_WIDE_INT) t[len - 1] << excess >> excess;
    221       mpz_import (result, len, -1, sizeof (HOST_WIDE_INT), 0, 0, t);
    222       mpz_com (result, result);
    223     }
    224   else if (excess > 0)
    225     {
    226       HOST_WIDE_INT *t = XALLOCAVEC (HOST_WIDE_INT, len);
    227       for (int i = 0; i < len - 1; i++)
    228 	t[i] = v[i];
    229       t[len - 1] = (unsigned HOST_WIDE_INT) v[len - 1] << excess >> excess;
    230       mpz_import (result, len, -1, sizeof (HOST_WIDE_INT), 0, 0, t);
    231     }
    232   else if (excess < 0 && wi::neg_p (x))
    233     {
    234       int extra = CEIL (-excess, HOST_BITS_PER_WIDE_INT);
    235       HOST_WIDE_INT *t = XALLOCAVEC (HOST_WIDE_INT, len + extra);
    236       for (int i = 0; i < len; i++)
    237 	t[i] = v[i];
    238       for (int i = 0; i < extra; i++)
    239 	t[len + i] = -1;
    240       excess = (-excess) % HOST_BITS_PER_WIDE_INT;
    241       if (excess)
    242 	t[len + extra - 1] = (HOST_WIDE_INT_1U << excess) - 1;
    243       mpz_import (result, len + extra, -1, sizeof (HOST_WIDE_INT), 0, 0, t);
    244     }
    245   else
    246     mpz_import (result, len, -1, sizeof (HOST_WIDE_INT), 0, 0, v);
    247 }
    248 
    249 /* Returns X converted to TYPE.  If WRAP is true, then out-of-range
    250    values of VAL will be wrapped; otherwise, they will be set to the
    251    appropriate minimum or maximum TYPE bound.  */
    252 wide_int
    253 wi::from_mpz (const_tree type, mpz_t x, bool wrap)
    254 {
    255   size_t count, numb;
    256   unsigned int prec = TYPE_PRECISION (type);
    257   wide_int res = wide_int::create (prec);
    258 
    259   if (!wrap)
    260     {
    261       mpz_t min, max;
    262 
    263       mpz_init (min);
    264       mpz_init (max);
    265       get_type_static_bounds (type, min, max);
    266 
    267       if (mpz_cmp (x, min) < 0)
    268 	mpz_set (x, min);
    269       else if (mpz_cmp (x, max) > 0)
    270 	mpz_set (x, max);
    271 
    272       mpz_clear (min);
    273       mpz_clear (max);
    274     }
    275 
    276   /* Determine the number of unsigned HOST_WIDE_INTs that are required
    277      for representing the absolute value.  The code to calculate count is
    278      extracted from the GMP manual, section "Integer Import and Export":
    279      http://gmplib.org/manual/Integer-Import-and-Export.html  */
    280   numb = CHAR_BIT * sizeof (HOST_WIDE_INT);
    281   count = CEIL (mpz_sizeinbase (x, 2), numb);
    282   HOST_WIDE_INT *val = res.write_val (0);
    283   /* Read the absolute value.
    284 
    285      Write directly to the wide_int storage if possible, otherwise leave
    286      GMP to allocate the memory for us.  It might be slightly more efficient
    287      to use mpz_tdiv_r_2exp for the latter case, but the situation is
    288      pathological and it seems safer to operate on the original mpz value
    289      in all cases.  */
    290   void *valres = mpz_export (count <= WIDE_INT_MAX_INL_ELTS ? val : 0,
    291 			     &count, -1, sizeof (HOST_WIDE_INT), 0, 0, x);
    292   if (count < 1)
    293     {
    294       val[0] = 0;
    295       count = 1;
    296     }
    297   count = MIN (count, BLOCKS_NEEDED (prec));
    298   if (valres != val)
    299     {
    300       memcpy (val, valres, count * sizeof (HOST_WIDE_INT));
    301       free (valres);
    302     }
    303   /* Zero-extend the absolute value to PREC bits.  */
    304   if (count < BLOCKS_NEEDED (prec) && val[count - 1] < 0)
    305     val[count++] = 0;
    306   else
    307     count = canonize (val, count, prec);
    308   res.set_len (count);
    309 
    310   if (mpz_sgn (x) < 0)
    311     res = -res;
    312 
    313   return res;
    314 }
    315 
    316 /*
    317  * Largest and smallest values in a mode.
    318  */
    319 
    320 /* Return the largest SGNed number that is representable in PRECISION bits.
    321 
    322    TODO: There is still code from the double_int era that trys to
    323    make up for the fact that double int's could not represent the
    324    min and max values of all types.  This code should be removed
    325    because the min and max values can always be represented in
    326    wide_ints and int-csts.  */
    327 wide_int
    328 wi::max_value (unsigned int precision, signop sgn)
    329 {
    330   gcc_checking_assert (precision != 0);
    331   if (sgn == UNSIGNED)
    332     /* The unsigned max is just all ones.  */
    333     return shwi (-1, precision);
    334   else
    335     /* The signed max is all ones except the top bit.  This must be
    336        explicitly represented.  */
    337     return mask (precision - 1, false, precision);
    338 }
    339 
    340 /* Return the largest SGNed number that is representable in PRECISION bits.  */
    341 wide_int
    342 wi::min_value (unsigned int precision, signop sgn)
    343 {
    344   gcc_checking_assert (precision != 0);
    345   if (sgn == UNSIGNED)
    346     return uhwi (0, precision);
    347   else
    348     /* The signed min is all zeros except the top bit.  This must be
    349        explicitly represented.  */
    350     return wi::set_bit_in_zero (precision - 1, precision);
    351 }
    352 
    353 /*
    354  * Public utilities.
    355  */
    356 
    357 /* Convert the number represented by XVAL, XLEN and XPRECISION, which has
    358    signedness SGN, to an integer that has PRECISION bits.  Store the blocks
    359    in VAL and return the number of blocks used.
    360 
    361    This function can handle both extension (PRECISION > XPRECISION)
    362    and truncation (PRECISION < XPRECISION).  */
    363 unsigned int
    364 wi::force_to_size (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    365 		   unsigned int xlen, unsigned int xprecision,
    366 		   unsigned int precision, signop sgn)
    367 {
    368   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
    369   unsigned int len = blocks_needed < xlen ? blocks_needed : xlen;
    370   for (unsigned i = 0; i < len; i++)
    371     val[i] = xval[i];
    372 
    373   if (precision > xprecision)
    374     {
    375       unsigned int small_xprecision = xprecision % HOST_BITS_PER_WIDE_INT;
    376 
    377       /* Expanding.  */
    378       if (sgn == UNSIGNED)
    379 	{
    380 	  if (small_xprecision && len == BLOCKS_NEEDED (xprecision))
    381 	    val[len - 1] = zext_hwi (val[len - 1], small_xprecision);
    382 	  else if (val[len - 1] < 0)
    383 	    {
    384 	      while (len < BLOCKS_NEEDED (xprecision))
    385 		val[len++] = -1;
    386 	      if (small_xprecision)
    387 		val[len - 1] = zext_hwi (val[len - 1], small_xprecision);
    388 	      else
    389 		val[len++] = 0;
    390 	    }
    391 	}
    392       else
    393 	{
    394 	  if (small_xprecision && len == BLOCKS_NEEDED (xprecision))
    395 	    val[len - 1] = sext_hwi (val[len - 1], small_xprecision);
    396 	}
    397     }
    398   len = canonize (val, len, precision);
    399 
    400   return len;
    401 }
    402 
    403 /* This function hides the fact that we cannot rely on the bits beyond
    404    the precision.  This issue comes up in the relational comparisions
    405    where we do allow comparisons of values of different precisions.  */
    406 static inline HOST_WIDE_INT
    407 selt (const HOST_WIDE_INT *a, unsigned int len,
    408       unsigned int blocks_needed, unsigned int small_prec,
    409       unsigned int index, signop sgn)
    410 {
    411   HOST_WIDE_INT val;
    412   if (index < len)
    413     val = a[index];
    414   else if (index < blocks_needed || sgn == SIGNED)
    415     /* Signed or within the precision.  */
    416     val = SIGN_MASK (a[len - 1]);
    417   else
    418     /* Unsigned extension beyond the precision. */
    419     val = 0;
    420 
    421   if (small_prec && index == blocks_needed - 1)
    422     return (sgn == SIGNED
    423 	    ? sext_hwi (val, small_prec)
    424 	    : zext_hwi (val, small_prec));
    425   else
    426     return val;
    427 }
    428 
    429 /* Find the highest bit represented in a wide int.  This will in
    430    general have the same value as the sign bit.  */
    431 static inline HOST_WIDE_INT
    432 top_bit_of (const HOST_WIDE_INT *a, unsigned int len, unsigned int prec)
    433 {
    434   int excess = len * HOST_BITS_PER_WIDE_INT - prec;
    435   unsigned HOST_WIDE_INT val = a[len - 1];
    436   if (excess > 0)
    437     val <<= excess;
    438   return val >> (HOST_BITS_PER_WIDE_INT - 1);
    439 }
    440 
    441 /*
    442  * Comparisons, note that only equality is an operator.  The other
    443  * comparisons cannot be operators since they are inherently signed or
    444  * unsigned and C++ has no such operators.
    445  */
    446 
    447 /* Return true if OP0 == OP1.  */
    448 bool
    449 wi::eq_p_large (const HOST_WIDE_INT *op0, unsigned int op0len,
    450 		const HOST_WIDE_INT *op1, unsigned int op1len,
    451 		unsigned int prec)
    452 {
    453   int l0 = op0len - 1;
    454   unsigned int small_prec = prec & (HOST_BITS_PER_WIDE_INT - 1);
    455 
    456   if (op0len != op1len)
    457     return false;
    458 
    459   if (op0len == BLOCKS_NEEDED (prec) && small_prec)
    460     {
    461       /* It does not matter if we zext or sext here, we just have to
    462 	 do both the same way.  */
    463       if (zext_hwi (op0 [l0], small_prec) != zext_hwi (op1 [l0], small_prec))
    464 	return false;
    465       l0--;
    466     }
    467 
    468   while (l0 >= 0)
    469     if (op0[l0] != op1[l0])
    470       return false;
    471     else
    472       l0--;
    473 
    474   return true;
    475 }
    476 
    477 /* Return true if OP0 < OP1 using signed comparisons.  */
    478 bool
    479 wi::lts_p_large (const HOST_WIDE_INT *op0, unsigned int op0len,
    480 		 unsigned int precision,
    481 		 const HOST_WIDE_INT *op1, unsigned int op1len)
    482 {
    483   HOST_WIDE_INT s0, s1;
    484   unsigned HOST_WIDE_INT u0, u1;
    485   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
    486   unsigned int small_prec = precision & (HOST_BITS_PER_WIDE_INT - 1);
    487   int l = MAX (op0len - 1, op1len - 1);
    488 
    489   /* Only the top block is compared as signed.  The rest are unsigned
    490      comparisons.  */
    491   s0 = selt (op0, op0len, blocks_needed, small_prec, l, SIGNED);
    492   s1 = selt (op1, op1len, blocks_needed, small_prec, l, SIGNED);
    493   if (s0 < s1)
    494     return true;
    495   if (s0 > s1)
    496     return false;
    497 
    498   l--;
    499   while (l >= 0)
    500     {
    501       u0 = selt (op0, op0len, blocks_needed, small_prec, l, SIGNED);
    502       u1 = selt (op1, op1len, blocks_needed, small_prec, l, SIGNED);
    503 
    504       if (u0 < u1)
    505 	return true;
    506       if (u0 > u1)
    507 	return false;
    508       l--;
    509     }
    510 
    511   return false;
    512 }
    513 
    514 /* Returns -1 if OP0 < OP1, 0 if OP0 == OP1 and 1 if OP0 > OP1 using
    515    signed compares.  */
    516 int
    517 wi::cmps_large (const HOST_WIDE_INT *op0, unsigned int op0len,
    518 		unsigned int precision,
    519 		const HOST_WIDE_INT *op1, unsigned int op1len)
    520 {
    521   HOST_WIDE_INT s0, s1;
    522   unsigned HOST_WIDE_INT u0, u1;
    523   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
    524   unsigned int small_prec = precision & (HOST_BITS_PER_WIDE_INT - 1);
    525   int l = MAX (op0len - 1, op1len - 1);
    526 
    527   /* Only the top block is compared as signed.  The rest are unsigned
    528      comparisons.  */
    529   s0 = selt (op0, op0len, blocks_needed, small_prec, l, SIGNED);
    530   s1 = selt (op1, op1len, blocks_needed, small_prec, l, SIGNED);
    531   if (s0 < s1)
    532     return -1;
    533   if (s0 > s1)
    534     return 1;
    535 
    536   l--;
    537   while (l >= 0)
    538     {
    539       u0 = selt (op0, op0len, blocks_needed, small_prec, l, SIGNED);
    540       u1 = selt (op1, op1len, blocks_needed, small_prec, l, SIGNED);
    541 
    542       if (u0 < u1)
    543 	return -1;
    544       if (u0 > u1)
    545 	return 1;
    546       l--;
    547     }
    548 
    549   return 0;
    550 }
    551 
    552 /* Return true if OP0 < OP1 using unsigned comparisons.  */
    553 bool
    554 wi::ltu_p_large (const HOST_WIDE_INT *op0, unsigned int op0len,
    555 		 unsigned int precision,
    556 		 const HOST_WIDE_INT *op1, unsigned int op1len)
    557 {
    558   unsigned HOST_WIDE_INT x0;
    559   unsigned HOST_WIDE_INT x1;
    560   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
    561   unsigned int small_prec = precision & (HOST_BITS_PER_WIDE_INT - 1);
    562   int l = MAX (op0len - 1, op1len - 1);
    563 
    564   while (l >= 0)
    565     {
    566       x0 = selt (op0, op0len, blocks_needed, small_prec, l, UNSIGNED);
    567       x1 = selt (op1, op1len, blocks_needed, small_prec, l, UNSIGNED);
    568       if (x0 < x1)
    569 	return true;
    570       if (x0 > x1)
    571 	return false;
    572       l--;
    573     }
    574 
    575   return false;
    576 }
    577 
    578 /* Returns -1 if OP0 < OP1, 0 if OP0 == OP1 and 1 if OP0 > OP1 using
    579    unsigned compares.  */
    580 int
    581 wi::cmpu_large (const HOST_WIDE_INT *op0, unsigned int op0len,
    582 		unsigned int precision,
    583 		const HOST_WIDE_INT *op1, unsigned int op1len)
    584 {
    585   unsigned HOST_WIDE_INT x0;
    586   unsigned HOST_WIDE_INT x1;
    587   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
    588   unsigned int small_prec = precision & (HOST_BITS_PER_WIDE_INT - 1);
    589   int l = MAX (op0len - 1, op1len - 1);
    590 
    591   while (l >= 0)
    592     {
    593       x0 = selt (op0, op0len, blocks_needed, small_prec, l, UNSIGNED);
    594       x1 = selt (op1, op1len, blocks_needed, small_prec, l, UNSIGNED);
    595       if (x0 < x1)
    596 	return -1;
    597       if (x0 > x1)
    598 	return 1;
    599       l--;
    600     }
    601 
    602   return 0;
    603 }
    604 
    605 /*
    606  * Extension.
    607  */
    608 
    609 /* Sign-extend the number represented by XVAL and XLEN into VAL,
    610    starting at OFFSET.  Return the number of blocks in VAL.  Both XVAL
    611    and VAL have PRECISION bits.  */
    612 unsigned int
    613 wi::sext_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    614 		unsigned int xlen, unsigned int precision, unsigned int offset)
    615 {
    616   unsigned int len = offset / HOST_BITS_PER_WIDE_INT;
    617   /* Extending beyond the precision is a no-op.  If we have only stored
    618      OFFSET bits or fewer, the rest are already signs.  */
    619   if (offset >= precision || len >= xlen)
    620     {
    621       for (unsigned i = 0; i < xlen; ++i)
    622 	val[i] = xval[i];
    623       return xlen;
    624     }
    625   unsigned int suboffset = offset % HOST_BITS_PER_WIDE_INT;
    626   for (unsigned int i = 0; i < len; i++)
    627     val[i] = xval[i];
    628   if (suboffset > 0)
    629     {
    630       val[len] = sext_hwi (xval[len], suboffset);
    631       len += 1;
    632     }
    633   return canonize (val, len, precision);
    634 }
    635 
    636 /* Zero-extend the number represented by XVAL and XLEN into VAL,
    637    starting at OFFSET.  Return the number of blocks in VAL.  Both XVAL
    638    and VAL have PRECISION bits.  */
    639 unsigned int
    640 wi::zext_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    641 		unsigned int xlen, unsigned int precision, unsigned int offset)
    642 {
    643   unsigned int len = offset / HOST_BITS_PER_WIDE_INT;
    644   /* Extending beyond the precision is a no-op.  If we have only stored
    645      OFFSET bits or fewer, and the upper stored bit is zero, then there
    646      is nothing to do.  */
    647   if (offset >= precision || (len >= xlen && xval[xlen - 1] >= 0))
    648     {
    649       for (unsigned i = 0; i < xlen; ++i)
    650 	val[i] = xval[i];
    651       return xlen;
    652     }
    653   unsigned int suboffset = offset % HOST_BITS_PER_WIDE_INT;
    654   for (unsigned int i = 0; i < len; i++)
    655     val[i] = i < xlen ? xval[i] : -1;
    656   if (suboffset > 0)
    657     val[len] = zext_hwi (len < xlen ? xval[len] : -1, suboffset);
    658   else
    659     val[len] = 0;
    660   return canonize (val, len + 1, precision);
    661 }
    662 
    663 /*
    664  * Masking, inserting, shifting, rotating.
    665  */
    666 
    667 /* Insert WIDTH bits from Y into X starting at START.  */
    668 wide_int
    669 wi::insert (const wide_int &x, const wide_int &y, unsigned int start,
    670 	    unsigned int width)
    671 {
    672   wide_int result;
    673   wide_int mask;
    674   wide_int tmp;
    675 
    676   unsigned int precision = x.get_precision ();
    677   if (start >= precision)
    678     return x;
    679 
    680   gcc_checking_assert (precision >= width);
    681 
    682   if (start + width >= precision)
    683     width = precision - start;
    684 
    685   mask = wi::shifted_mask (start, width, false, precision);
    686   tmp = wi::lshift (wide_int::from (y, precision, UNSIGNED), start);
    687   result = tmp & mask;
    688 
    689   tmp = wi::bit_and_not (x, mask);
    690   result = result | tmp;
    691 
    692   return result;
    693 }
    694 
    695 /* Copy the number represented by XVAL and XLEN into VAL, setting bit BIT.
    696    Return the number of blocks in VAL.  Both XVAL and VAL have PRECISION
    697    bits.  */
    698 unsigned int
    699 wi::set_bit_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    700 		   unsigned int xlen, unsigned int precision, unsigned int bit)
    701 {
    702   unsigned int block = bit / HOST_BITS_PER_WIDE_INT;
    703   unsigned int subbit = bit % HOST_BITS_PER_WIDE_INT;
    704 
    705   if (block + 1 >= xlen)
    706     {
    707       /* The operation either affects the last current block or needs
    708 	 a new block.  */
    709       unsigned int len = block + 1;
    710       for (unsigned int i = 0; i < len; i++)
    711 	val[i] = safe_uhwi (xval, xlen, i);
    712       val[block] |= HOST_WIDE_INT_1U << subbit;
    713 
    714       /* If the bit we just set is at the msb of the block, make sure
    715 	 that any higher bits are zeros.  */
    716       if (bit + 1 < precision && subbit == HOST_BITS_PER_WIDE_INT - 1)
    717 	{
    718 	  val[len++] = 0;
    719 	  return len;
    720 	}
    721       return canonize (val, len, precision);
    722     }
    723   else
    724     {
    725       for (unsigned int i = 0; i < xlen; i++)
    726 	val[i] = xval[i];
    727       val[block] |= HOST_WIDE_INT_1U << subbit;
    728       return canonize (val, xlen, precision);
    729     }
    730 }
    731 
    732 /* Byte swap the integer represented by XVAL and XLEN into VAL.  Return
    733    the number of blocks in VAL.  Both XVAL and VAL have PRECISION bits.  */
    734 unsigned int
    735 wi::bswap_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    736 		 unsigned int xlen, unsigned int precision)
    737 {
    738   unsigned int s, len = BLOCKS_NEEDED (precision);
    739 
    740   /* This is not a well defined operation if the precision is not a
    741      multiple of 8.  */
    742   gcc_assert ((precision & 0x7) == 0);
    743 
    744   memset (val, 0, sizeof (unsigned HOST_WIDE_INT) * len);
    745 
    746   /* Only swap the bytes that are not the padding.  */
    747   for (s = 0; s < precision; s += 8)
    748     {
    749       unsigned int d = precision - s - 8;
    750       unsigned HOST_WIDE_INT byte;
    751 
    752       unsigned int block = s / HOST_BITS_PER_WIDE_INT;
    753       unsigned int offset = s & (HOST_BITS_PER_WIDE_INT - 1);
    754 
    755       byte = (safe_uhwi (xval, xlen, block) >> offset) & 0xff;
    756 
    757       block = d / HOST_BITS_PER_WIDE_INT;
    758       offset = d & (HOST_BITS_PER_WIDE_INT - 1);
    759 
    760       val[block] |= byte << offset;
    761     }
    762 
    763   return canonize (val, len, precision);
    764 }
    765 
    766 /* Bitreverse the integer represented by XVAL and LEN into VAL.  Return
    767    the number of blocks in VAL.  Both XVAL and VAL have PRECISION bits.  */
    768 unsigned int
    769 wi::bitreverse_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
    770 		      unsigned int len, unsigned int precision)
    771 {
    772   unsigned int i, s;
    773 
    774   for (i = 0; i < len; i++)
    775     val[i] = 0;
    776 
    777   for (s = 0; s < precision; s++)
    778     {
    779       unsigned int block = s / HOST_BITS_PER_WIDE_INT;
    780       unsigned int offset = s & (HOST_BITS_PER_WIDE_INT - 1);
    781       if (((safe_uhwi (xval, len, block) >> offset) & 1) != 0)
    782 	{
    783 	  unsigned int d = (precision - 1) - s;
    784 	  block = d / HOST_BITS_PER_WIDE_INT;
    785 	  offset = d & (HOST_BITS_PER_WIDE_INT - 1);
    786 	  val[block] |= HOST_WIDE_INT_1U << offset;
    787 	}
    788     }
    789 
    790   return canonize (val, len, precision);
    791 }
    792 
    793 /* Fill VAL with a mask where the lower WIDTH bits are ones and the bits
    794    above that up to PREC are zeros.  The result is inverted if NEGATE
    795    is true.  Return the number of blocks in VAL.  */
    796 unsigned int
    797 wi::mask (HOST_WIDE_INT *val, unsigned int width, bool negate,
    798 	  unsigned int prec)
    799 {
    800   if (width >= prec)
    801     {
    802       val[0] = negate ? 0 : -1;
    803       return 1;
    804     }
    805   else if (width == 0)
    806     {
    807       val[0] = negate ? -1 : 0;
    808       return 1;
    809     }
    810 
    811   unsigned int i = 0;
    812   while (i < width / HOST_BITS_PER_WIDE_INT)
    813     val[i++] = negate ? 0 : -1;
    814 
    815   unsigned int shift = width & (HOST_BITS_PER_WIDE_INT - 1);
    816   if (shift != 0)
    817     {
    818       HOST_WIDE_INT last = (HOST_WIDE_INT_1U << shift) - 1;
    819       val[i++] = negate ? ~last : last;
    820     }
    821   else
    822     val[i++] = negate ? -1 : 0;
    823 
    824   return i;
    825 }
    826 
    827 /* Fill VAL with a mask where the lower START bits are zeros, the next WIDTH
    828    bits are ones, and the bits above that up to PREC are zeros.  The result
    829    is inverted if NEGATE is true.  Return the number of blocks in VAL.  */
    830 unsigned int
    831 wi::shifted_mask (HOST_WIDE_INT *val, unsigned int start, unsigned int width,
    832 		  bool negate, unsigned int prec)
    833 {
    834   if (start >= prec || width == 0)
    835     {
    836       val[0] = negate ? -1 : 0;
    837       return 1;
    838     }
    839 
    840   if (width > prec - start)
    841     width = prec - start;
    842   unsigned int end = start + width;
    843 
    844   unsigned int i = 0;
    845   while (i < start / HOST_BITS_PER_WIDE_INT)
    846     val[i++] = negate ? -1 : 0;
    847 
    848   unsigned int shift = start & (HOST_BITS_PER_WIDE_INT - 1);
    849   if (shift)
    850     {
    851       HOST_WIDE_INT block = (HOST_WIDE_INT_1U << shift) - 1;
    852       shift += width;
    853       if (shift < HOST_BITS_PER_WIDE_INT)
    854 	{
    855 	  /* case 000111000 */
    856 	  block = (HOST_WIDE_INT_1U << shift) - block - 1;
    857 	  val[i++] = negate ? ~block : block;
    858 	  return i;
    859 	}
    860       else
    861 	/* ...111000 */
    862 	val[i++] = negate ? block : ~block;
    863     }
    864 
    865   if (end >= prec)
    866     {
    867       if (!shift)
    868 	val[i++] = negate ? 0 : -1;
    869       return i;
    870     }
    871 
    872   while (i < end / HOST_BITS_PER_WIDE_INT)
    873     /* 1111111 */
    874     val[i++] = negate ? 0 : -1;
    875 
    876   shift = end & (HOST_BITS_PER_WIDE_INT - 1);
    877   if (shift != 0)
    878     {
    879       /* 000011111 */
    880       HOST_WIDE_INT block = (HOST_WIDE_INT_1U << shift) - 1;
    881       val[i++] = negate ? ~block : block;
    882     }
    883   else
    884     val[i++] = negate ? -1 : 0;
    885 
    886   return i;
    887 }
    888 
    889 /*
    890  * logical operations.
    891  */
    892 
    893 /* Set VAL to OP0 & OP1.  Return the number of blocks used.  */
    894 unsigned int
    895 wi::and_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
    896 	       unsigned int op0len, const HOST_WIDE_INT *op1,
    897 	       unsigned int op1len, unsigned int prec)
    898 {
    899   int l0 = op0len - 1;
    900   int l1 = op1len - 1;
    901   bool need_canon = true;
    902 
    903   unsigned int len = MAX (op0len, op1len);
    904   if (l0 > l1)
    905     {
    906       HOST_WIDE_INT op1mask = -top_bit_of (op1, op1len, prec);
    907       if (op1mask == 0)
    908 	{
    909 	  l0 = l1;
    910 	  len = l1 + 1;
    911 	}
    912       else
    913 	{
    914 	  need_canon = false;
    915 	  while (l0 > l1)
    916 	    {
    917 	      val[l0] = op0[l0];
    918 	      l0--;
    919 	    }
    920 	}
    921     }
    922   else if (l1 > l0)
    923     {
    924       HOST_WIDE_INT op0mask = -top_bit_of (op0, op0len, prec);
    925       if (op0mask == 0)
    926 	len = l0 + 1;
    927       else
    928 	{
    929 	  need_canon = false;
    930 	  while (l1 > l0)
    931 	    {
    932 	      val[l1] = op1[l1];
    933 	      l1--;
    934 	    }
    935 	}
    936     }
    937 
    938   while (l0 >= 0)
    939     {
    940       val[l0] = op0[l0] & op1[l0];
    941       l0--;
    942     }
    943 
    944   if (need_canon)
    945     len = canonize (val, len, prec);
    946 
    947   return len;
    948 }
    949 
    950 /* Set VAL to OP0 & ~OP1.  Return the number of blocks used.  */
    951 unsigned int
    952 wi::and_not_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
    953 		   unsigned int op0len, const HOST_WIDE_INT *op1,
    954 		   unsigned int op1len, unsigned int prec)
    955 {
    956   wide_int result;
    957   int l0 = op0len - 1;
    958   int l1 = op1len - 1;
    959   bool need_canon = true;
    960 
    961   unsigned int len = MAX (op0len, op1len);
    962   if (l0 > l1)
    963     {
    964       HOST_WIDE_INT op1mask = -top_bit_of (op1, op1len, prec);
    965       if (op1mask != 0)
    966 	{
    967 	  l0 = l1;
    968 	  len = l1 + 1;
    969 	}
    970       else
    971 	{
    972 	  need_canon = false;
    973 	  while (l0 > l1)
    974 	    {
    975 	      val[l0] = op0[l0];
    976 	      l0--;
    977 	    }
    978 	}
    979     }
    980   else if (l1 > l0)
    981     {
    982       HOST_WIDE_INT op0mask = -top_bit_of (op0, op0len, prec);
    983       if (op0mask == 0)
    984 	len = l0 + 1;
    985       else
    986 	{
    987 	  need_canon = false;
    988 	  while (l1 > l0)
    989 	    {
    990 	      val[l1] = ~op1[l1];
    991 	      l1--;
    992 	    }
    993 	}
    994     }
    995 
    996   while (l0 >= 0)
    997     {
    998       val[l0] = op0[l0] & ~op1[l0];
    999       l0--;
   1000     }
   1001 
   1002   if (need_canon)
   1003     len = canonize (val, len, prec);
   1004 
   1005   return len;
   1006 }
   1007 
   1008 /* Set VAL to OP0 | OP1.  Return the number of blocks used.  */
   1009 unsigned int
   1010 wi::or_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
   1011 	      unsigned int op0len, const HOST_WIDE_INT *op1,
   1012 	      unsigned int op1len, unsigned int prec)
   1013 {
   1014   wide_int result;
   1015   int l0 = op0len - 1;
   1016   int l1 = op1len - 1;
   1017   bool need_canon = true;
   1018 
   1019   unsigned int len = MAX (op0len, op1len);
   1020   if (l0 > l1)
   1021     {
   1022       HOST_WIDE_INT op1mask = -top_bit_of (op1, op1len, prec);
   1023       if (op1mask != 0)
   1024 	{
   1025 	  l0 = l1;
   1026 	  len = l1 + 1;
   1027 	}
   1028       else
   1029 	{
   1030 	  need_canon = false;
   1031 	  while (l0 > l1)
   1032 	    {
   1033 	      val[l0] = op0[l0];
   1034 	      l0--;
   1035 	    }
   1036 	}
   1037     }
   1038   else if (l1 > l0)
   1039     {
   1040       HOST_WIDE_INT op0mask = -top_bit_of (op0, op0len, prec);
   1041       if (op0mask != 0)
   1042 	len = l0 + 1;
   1043       else
   1044 	{
   1045 	  need_canon = false;
   1046 	  while (l1 > l0)
   1047 	    {
   1048 	      val[l1] = op1[l1];
   1049 	      l1--;
   1050 	    }
   1051 	}
   1052     }
   1053 
   1054   while (l0 >= 0)
   1055     {
   1056       val[l0] = op0[l0] | op1[l0];
   1057       l0--;
   1058     }
   1059 
   1060   if (need_canon)
   1061     len = canonize (val, len, prec);
   1062 
   1063   return len;
   1064 }
   1065 
   1066 /* Set VAL to OP0 | ~OP1.  Return the number of blocks used.  */
   1067 unsigned int
   1068 wi::or_not_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
   1069 		  unsigned int op0len, const HOST_WIDE_INT *op1,
   1070 		  unsigned int op1len, unsigned int prec)
   1071 {
   1072   wide_int result;
   1073   int l0 = op0len - 1;
   1074   int l1 = op1len - 1;
   1075   bool need_canon = true;
   1076 
   1077   unsigned int len = MAX (op0len, op1len);
   1078   if (l0 > l1)
   1079     {
   1080       HOST_WIDE_INT op1mask = -top_bit_of (op1, op1len, prec);
   1081       if (op1mask == 0)
   1082 	{
   1083 	  l0 = l1;
   1084 	  len = l1 + 1;
   1085 	}
   1086       else
   1087 	{
   1088 	  need_canon = false;
   1089 	  while (l0 > l1)
   1090 	    {
   1091 	      val[l0] = op0[l0];
   1092 	      l0--;
   1093 	    }
   1094 	}
   1095     }
   1096   else if (l1 > l0)
   1097     {
   1098       HOST_WIDE_INT op0mask = -top_bit_of (op0, op0len, prec);
   1099       if (op0mask != 0)
   1100 	len = l0 + 1;
   1101       else
   1102 	{
   1103 	  need_canon = false;
   1104 	  while (l1 > l0)
   1105 	    {
   1106 	      val[l1] = ~op1[l1];
   1107 	      l1--;
   1108 	    }
   1109 	}
   1110     }
   1111 
   1112   while (l0 >= 0)
   1113     {
   1114       val[l0] = op0[l0] | ~op1[l0];
   1115       l0--;
   1116     }
   1117 
   1118   if (need_canon)
   1119     len = canonize (val, len, prec);
   1120 
   1121   return len;
   1122 }
   1123 
   1124 /* Set VAL to OP0 ^ OP1.  Return the number of blocks used.  */
   1125 unsigned int
   1126 wi::xor_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
   1127 	       unsigned int op0len, const HOST_WIDE_INT *op1,
   1128 	       unsigned int op1len, unsigned int prec)
   1129 {
   1130   wide_int result;
   1131   int l0 = op0len - 1;
   1132   int l1 = op1len - 1;
   1133 
   1134   unsigned int len = MAX (op0len, op1len);
   1135   if (l0 > l1)
   1136     {
   1137       HOST_WIDE_INT op1mask = -top_bit_of (op1, op1len, prec);
   1138       while (l0 > l1)
   1139 	{
   1140 	  val[l0] = op0[l0] ^ op1mask;
   1141 	  l0--;
   1142 	}
   1143     }
   1144 
   1145   if (l1 > l0)
   1146     {
   1147       HOST_WIDE_INT op0mask = -top_bit_of (op0, op0len, prec);
   1148       while (l1 > l0)
   1149 	{
   1150 	  val[l1] = op0mask ^ op1[l1];
   1151 	  l1--;
   1152 	}
   1153     }
   1154 
   1155   while (l0 >= 0)
   1156     {
   1157       val[l0] = op0[l0] ^ op1[l0];
   1158       l0--;
   1159     }
   1160 
   1161   return canonize (val, len, prec);
   1162 }
   1163 
   1164 /*
   1165  * math
   1166  */
   1167 
   1168 /* Set VAL to OP0 + OP1.  If OVERFLOW is nonnull, record in *OVERFLOW
   1169    whether the result overflows when OP0 and OP1 are treated as having
   1170    signedness SGN.  Return the number of blocks in VAL.  */
   1171 unsigned int
   1172 wi::add_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
   1173 	       unsigned int op0len, const HOST_WIDE_INT *op1,
   1174 	       unsigned int op1len, unsigned int prec,
   1175 	       signop sgn, wi::overflow_type *overflow)
   1176 {
   1177   unsigned HOST_WIDE_INT o0 = 0;
   1178   unsigned HOST_WIDE_INT o1 = 0;
   1179   unsigned HOST_WIDE_INT x = 0;
   1180   unsigned HOST_WIDE_INT carry = 0;
   1181   unsigned HOST_WIDE_INT old_carry = 0;
   1182   unsigned HOST_WIDE_INT mask0, mask1;
   1183   unsigned int i;
   1184 
   1185   unsigned int len = MAX (op0len, op1len);
   1186   mask0 = -top_bit_of (op0, op0len, prec);
   1187   mask1 = -top_bit_of (op1, op1len, prec);
   1188   /* Add all of the explicitly defined elements.  */
   1189 
   1190   for (i = 0; i < len; i++)
   1191     {
   1192       o0 = i < op0len ? (unsigned HOST_WIDE_INT) op0[i] : mask0;
   1193       o1 = i < op1len ? (unsigned HOST_WIDE_INT) op1[i] : mask1;
   1194       x = o0 + o1 + carry;
   1195       val[i] = x;
   1196       old_carry = carry;
   1197       carry = carry == 0 ? x < o0 : x <= o0;
   1198     }
   1199 
   1200   if (len * HOST_BITS_PER_WIDE_INT < prec)
   1201     {
   1202       val[len] = mask0 + mask1 + carry;
   1203       len++;
   1204       if (overflow)
   1205 	*overflow
   1206 	  = (sgn == UNSIGNED && carry) ? wi::OVF_OVERFLOW : wi::OVF_NONE;
   1207     }
   1208   else if (overflow)
   1209     {
   1210       unsigned int shift = -prec % HOST_BITS_PER_WIDE_INT;
   1211       if (sgn == SIGNED)
   1212 	{
   1213 	  unsigned HOST_WIDE_INT x = (val[len - 1] ^ o0) & (val[len - 1] ^ o1);
   1214 	  if ((HOST_WIDE_INT) (x << shift) < 0)
   1215 	    {
   1216 	      if (o0 > (unsigned HOST_WIDE_INT) val[len - 1])
   1217 		*overflow = wi::OVF_UNDERFLOW;
   1218 	      else if (o0 < (unsigned HOST_WIDE_INT) val[len - 1])
   1219 		*overflow = wi::OVF_OVERFLOW;
   1220 	      else
   1221 		*overflow = wi::OVF_NONE;
   1222 	    }
   1223 	  else
   1224 	    *overflow = wi::OVF_NONE;
   1225 	}
   1226       else
   1227 	{
   1228 	  /* Put the MSB of X and O0 and in the top of the HWI.  */
   1229 	  x <<= shift;
   1230 	  o0 <<= shift;
   1231 	  if (old_carry)
   1232 	    *overflow = (x <= o0) ? wi::OVF_OVERFLOW : wi::OVF_NONE;
   1233 	  else
   1234 	    *overflow = (x < o0) ? wi::OVF_OVERFLOW : wi::OVF_NONE;
   1235 	}
   1236     }
   1237 
   1238   return canonize (val, len, prec);
   1239 }
   1240 
   1241 /* Subroutines of the multiplication and division operations.  Unpack
   1242    the first IN_LEN HOST_WIDE_INTs in INPUT into 2 * IN_LEN
   1243    HOST_HALF_WIDE_INTs of RESULT.  The rest of RESULT is filled by
   1244    uncompressing the top bit of INPUT[IN_LEN - 1].  */
   1245 static void
   1246 wi_unpack (unsigned HOST_HALF_WIDE_INT *result, const HOST_WIDE_INT *input,
   1247 	   unsigned int in_len, unsigned int out_len,
   1248 	   unsigned int prec, signop sgn)
   1249 {
   1250   unsigned int i;
   1251   unsigned int j = 0;
   1252   unsigned int small_prec = prec & (HOST_BITS_PER_WIDE_INT - 1);
   1253   unsigned int blocks_needed = BLOCKS_NEEDED (prec);
   1254   HOST_WIDE_INT mask;
   1255 
   1256   if (sgn == SIGNED)
   1257     {
   1258       mask = -top_bit_of ((const HOST_WIDE_INT *) input, in_len, prec);
   1259       mask &= HALF_INT_MASK;
   1260     }
   1261   else
   1262     mask = 0;
   1263 
   1264   for (i = 0; i < blocks_needed - 1; i++)
   1265     {
   1266       HOST_WIDE_INT x = safe_uhwi (input, in_len, i);
   1267       result[j++] = x;
   1268       result[j++] = x >> HOST_BITS_PER_HALF_WIDE_INT;
   1269     }
   1270 
   1271   HOST_WIDE_INT x = safe_uhwi (input, in_len, i);
   1272   if (small_prec)
   1273     {
   1274       if (sgn == SIGNED)
   1275 	x = sext_hwi (x, small_prec);
   1276       else
   1277 	x = zext_hwi (x, small_prec);
   1278     }
   1279   result[j++] = x;
   1280   result[j++] = x >> HOST_BITS_PER_HALF_WIDE_INT;
   1281 
   1282   /* Smear the sign bit.  */
   1283   while (j < out_len)
   1284     result[j++] = mask;
   1285 }
   1286 
   1287 /* The inverse of wi_unpack.  IN_LEN is the number of input
   1288    blocks and PRECISION is the precision of the result.  Return the
   1289    number of blocks in the canonicalized result.  */
   1290 static unsigned int
   1291 wi_pack (HOST_WIDE_INT *result,
   1292 	 const unsigned HOST_HALF_WIDE_INT *input,
   1293 	 unsigned int in_len, unsigned int precision)
   1294 {
   1295   unsigned int i = 0;
   1296   unsigned int j = 0;
   1297   unsigned int blocks_needed = BLOCKS_NEEDED (precision);
   1298 
   1299   while (i + 1 < in_len)
   1300     {
   1301       result[j++] = ((unsigned HOST_WIDE_INT) input[i]
   1302 		     | ((unsigned HOST_WIDE_INT) input[i + 1]
   1303 			<< HOST_BITS_PER_HALF_WIDE_INT));
   1304       i += 2;
   1305     }
   1306 
   1307   /* Handle the case where in_len is odd.   For this we zero extend.  */
   1308   if (in_len & 1)
   1309     result[j++] = (unsigned HOST_WIDE_INT) input[i];
   1310   else if (j < blocks_needed)
   1311     result[j++] = 0;
   1312   return canonize (result, j, precision);
   1313 }
   1314 
   1315 /* Multiply Op1 by Op2.  If HIGH is set, only the upper half of the
   1316    result is returned.
   1317 
   1318    If HIGH is not set, throw away the upper half after the check is
   1319    made to see if it overflows.  Unfortunately there is no better way
   1320    to check for overflow than to do this.  If OVERFLOW is nonnull,
   1321    record in *OVERFLOW whether the result overflowed.  SGN controls
   1322    the signedness and is used to check overflow or if HIGH is set.
   1323 
   1324    NOTE: Overflow type for signed overflow is not yet implemented.  */
   1325 unsigned int
   1326 wi::mul_internal (HOST_WIDE_INT *val, const HOST_WIDE_INT *op1val,
   1327 		  unsigned int op1len, const HOST_WIDE_INT *op2val,
   1328 		  unsigned int op2len, unsigned int prec, signop sgn,
   1329 		  wi::overflow_type *overflow, bool high)
   1330 {
   1331   unsigned HOST_WIDE_INT o0, o1, k, t;
   1332   unsigned int i;
   1333   unsigned int j;
   1334 
   1335   /* If the top level routine did not really pass in an overflow, then
   1336      just make sure that we never attempt to set it.  */
   1337   bool needs_overflow = (overflow != 0);
   1338   if (needs_overflow)
   1339     *overflow = wi::OVF_NONE;
   1340 
   1341   wide_int_ref op1 = wi::storage_ref (op1val, op1len, prec);
   1342   wide_int_ref op2 = wi::storage_ref (op2val, op2len, prec);
   1343 
   1344   /* This is a surprisingly common case, so do it first.  */
   1345   if (op1 == 0 || op2 == 0)
   1346     {
   1347       val[0] = 0;
   1348       return 1;
   1349     }
   1350 
   1351 #ifdef umul_ppmm
   1352   if (sgn == UNSIGNED)
   1353     {
   1354       /* If the inputs are single HWIs and the output has room for at
   1355 	 least two HWIs, we can use umul_ppmm directly.  */
   1356       if (prec >= HOST_BITS_PER_WIDE_INT * 2
   1357 	  && wi::fits_uhwi_p (op1)
   1358 	  && wi::fits_uhwi_p (op2))
   1359 	{
   1360 	  /* This case never overflows.  */
   1361 	  if (high)
   1362 	    {
   1363 	      val[0] = 0;
   1364 	      return 1;
   1365 	    }
   1366 	  umul_ppmm (val[1], val[0], op1.ulow (), op2.ulow ());
   1367 	  if (val[1] < 0 && prec > HOST_BITS_PER_WIDE_INT * 2)
   1368 	    {
   1369 	      val[2] = 0;
   1370 	      return 3;
   1371 	    }
   1372 	  return 1 + (val[1] != 0 || val[0] < 0);
   1373 	}
   1374       /* Likewise if the output is a full single HWI, except that the
   1375 	 upper HWI of the result is only used for determining overflow.
   1376 	 (We handle this case inline when overflow isn't needed.)  */
   1377       else if (prec == HOST_BITS_PER_WIDE_INT)
   1378 	{
   1379 	  unsigned HOST_WIDE_INT upper;
   1380 	  umul_ppmm (upper, val[0], op1.ulow (), op2.ulow ());
   1381 	  if (needs_overflow)
   1382 	    /* Unsigned overflow can only be +OVERFLOW.  */
   1383 	    *overflow = (upper != 0) ? wi::OVF_OVERFLOW : wi::OVF_NONE;
   1384 	  if (high)
   1385 	    val[0] = upper;
   1386 	  return 1;
   1387 	}
   1388     }
   1389 #endif
   1390 
   1391   /* Handle multiplications by 1.  */
   1392   if (op1 == 1)
   1393     {
   1394       if (high)
   1395 	{
   1396 	  val[0] = wi::neg_p (op2, sgn) ? -1 : 0;
   1397 	  return 1;
   1398 	}
   1399       for (i = 0; i < op2len; i++)
   1400 	val[i] = op2val[i];
   1401       return op2len;
   1402     }
   1403   if (op2 == 1)
   1404     {
   1405       if (high)
   1406 	{
   1407 	  val[0] = wi::neg_p (op1, sgn) ? -1 : 0;
   1408 	  return 1;
   1409 	}
   1410       for (i = 0; i < op1len; i++)
   1411 	val[i] = op1val[i];
   1412       return op1len;
   1413     }
   1414 
   1415   /* If we need to check for overflow, we can only do half wide
   1416      multiplies quickly because we need to look at the top bits to
   1417      check for the overflow.  */
   1418   if ((high || needs_overflow)
   1419       && (prec <= HOST_BITS_PER_HALF_WIDE_INT))
   1420     {
   1421       unsigned HOST_WIDE_INT r;
   1422 
   1423       if (sgn == SIGNED)
   1424 	{
   1425 	  o0 = op1.to_shwi ();
   1426 	  o1 = op2.to_shwi ();
   1427 	}
   1428       else
   1429 	{
   1430 	  o0 = op1.to_uhwi ();
   1431 	  o1 = op2.to_uhwi ();
   1432 	}
   1433 
   1434       r = o0 * o1;
   1435       if (needs_overflow)
   1436 	{
   1437 	  if (sgn == SIGNED)
   1438 	    {
   1439 	      if ((HOST_WIDE_INT) r != sext_hwi (r, prec))
   1440 		/* FIXME: Signed overflow type is not implemented yet.  */
   1441 		*overflow = OVF_UNKNOWN;
   1442 	    }
   1443 	  else
   1444 	    {
   1445 	      if ((r >> prec) != 0)
   1446 		/* Unsigned overflow can only be +OVERFLOW.  */
   1447 		*overflow = OVF_OVERFLOW;
   1448 	    }
   1449 	}
   1450       val[0] = high ? r >> prec : r;
   1451       return 1;
   1452     }
   1453 
   1454   /* The sizes here are scaled to support a 2x WIDE_INT_MAX_INL_PRECISION by 2x
   1455      WIDE_INT_MAX_INL_PRECISION yielding a 4x WIDE_INT_MAX_INL_PRECISION
   1456      result.  */
   1457 
   1458   unsigned HOST_HALF_WIDE_INT
   1459     ubuf[4 * WIDE_INT_MAX_INL_PRECISION / HOST_BITS_PER_HALF_WIDE_INT];
   1460   unsigned HOST_HALF_WIDE_INT
   1461     vbuf[4 * WIDE_INT_MAX_INL_PRECISION / HOST_BITS_PER_HALF_WIDE_INT];
   1462   /* The '2' in 'R' is because we are internally doing a full
   1463      multiply.  */
   1464   unsigned HOST_HALF_WIDE_INT
   1465     rbuf[2 * 4 * WIDE_INT_MAX_INL_PRECISION / HOST_BITS_PER_HALF_WIDE_INT];
   1466   const HOST_WIDE_INT mask
   1467     = (HOST_WIDE_INT_1 << HOST_BITS_PER_HALF_WIDE_INT) - 1;
   1468   unsigned HOST_HALF_WIDE_INT *u = ubuf;
   1469   unsigned HOST_HALF_WIDE_INT *v = vbuf;
   1470   unsigned HOST_HALF_WIDE_INT *r = rbuf;
   1471 
   1472   if (!high)
   1473     prec = MIN ((op1len + op2len + 1) * HOST_BITS_PER_WIDE_INT, prec);
   1474   unsigned int blocks_needed = BLOCKS_NEEDED (prec);
   1475   unsigned int half_blocks_needed = blocks_needed * 2;
   1476   if (UNLIKELY (prec > WIDE_INT_MAX_INL_PRECISION))
   1477     {
   1478       unsigned HOST_HALF_WIDE_INT *buf
   1479 	= XALLOCAVEC (unsigned HOST_HALF_WIDE_INT, 4 * half_blocks_needed);
   1480       u = buf;
   1481       v = u + half_blocks_needed;
   1482       r = v + half_blocks_needed;
   1483     }
   1484 
   1485   /* We do unsigned mul and then correct it.  */
   1486   wi_unpack (u, op1val, op1len, half_blocks_needed, prec, UNSIGNED);
   1487   wi_unpack (v, op2val, op2len, half_blocks_needed, prec, UNSIGNED);
   1488 
   1489   /* The 2 is for a full mult.  */
   1490   memset (r, 0, half_blocks_needed * 2
   1491 	  * HOST_BITS_PER_HALF_WIDE_INT / CHAR_BIT);
   1492 
   1493   for (j = 0; j < half_blocks_needed; j++)
   1494     {
   1495       k = 0;
   1496       for (i = 0; i < half_blocks_needed; i++)
   1497 	{
   1498 	  t = ((unsigned HOST_WIDE_INT)u[i] * (unsigned HOST_WIDE_INT)v[j]
   1499 	       + r[i + j] + k);
   1500 	  r[i + j] = t & HALF_INT_MASK;
   1501 	  k = t >> HOST_BITS_PER_HALF_WIDE_INT;
   1502 	}
   1503       r[j + half_blocks_needed] = k;
   1504     }
   1505 
   1506   unsigned int shift;
   1507   if ((high || needs_overflow) && (shift = prec % HOST_BITS_PER_WIDE_INT) != 0)
   1508     {
   1509       /* The high or needs_overflow code assumes that the high bits
   1510 	 only appear from r[half_blocks_needed] up to
   1511 	 r[half_blocks_needed * 2 - 1].  If prec is not a multiple
   1512 	 of HOST_BITS_PER_WIDE_INT, shift the bits above prec up
   1513 	 to make that code simple.  */
   1514       if (shift == HOST_BITS_PER_HALF_WIDE_INT)
   1515 	memmove (&r[half_blocks_needed], &r[half_blocks_needed - 1],
   1516 		 sizeof (r[0]) * half_blocks_needed);
   1517       else
   1518 	{
   1519 	  unsigned int skip = shift < HOST_BITS_PER_HALF_WIDE_INT;
   1520 	  if (!skip)
   1521 	    shift -= HOST_BITS_PER_HALF_WIDE_INT;
   1522 	  for (i = 2 * half_blocks_needed - 1; i >= half_blocks_needed; i--)
   1523 	    r[i] = ((r[i - skip] << (-shift % HOST_BITS_PER_HALF_WIDE_INT))
   1524 		    | (r[i - skip - 1] >> shift));
   1525 	}
   1526     }
   1527 
   1528   /* We did unsigned math above.  For signed we must adjust the
   1529      product (assuming we need to see that).  */
   1530   if (sgn == SIGNED && (high || needs_overflow))
   1531     {
   1532       unsigned HOST_WIDE_INT b;
   1533       if (wi::neg_p (op1))
   1534 	{
   1535 	  b = 0;
   1536 	  for (i = 0; i < half_blocks_needed; i++)
   1537 	    {
   1538 	      t = (unsigned HOST_WIDE_INT)r[i + half_blocks_needed]
   1539 		- (unsigned HOST_WIDE_INT)v[i] - b;
   1540 	      r[i + half_blocks_needed] = t & HALF_INT_MASK;
   1541 	      b = t >> (HOST_BITS_PER_WIDE_INT - 1);
   1542 	    }
   1543 	}
   1544       if (wi::neg_p (op2))
   1545 	{
   1546 	  b = 0;
   1547 	  for (i = 0; i < half_blocks_needed; i++)
   1548 	    {
   1549 	      t = (unsigned HOST_WIDE_INT)r[i + half_blocks_needed]
   1550 		- (unsigned HOST_WIDE_INT)u[i] - b;
   1551 	      r[i + half_blocks_needed] = t & HALF_INT_MASK;
   1552 	      b = t >> (HOST_BITS_PER_WIDE_INT - 1);
   1553 	    }
   1554 	}
   1555     }
   1556 
   1557   if (needs_overflow)
   1558     {
   1559       HOST_WIDE_INT top;
   1560 
   1561       /* For unsigned, overflow is true if any of the top bits are set.
   1562 	 For signed, overflow is true if any of the top bits are not equal
   1563 	 to the sign bit.  */
   1564       if (sgn == UNSIGNED)
   1565 	top = 0;
   1566       else
   1567 	{
   1568 	  top = r[half_blocks_needed - 1
   1569 		  - ((-prec % HOST_BITS_PER_WIDE_INT)
   1570 		     >= HOST_BITS_PER_HALF_WIDE_INT)];
   1571 	  top = SIGN_MASK (((unsigned HOST_WIDE_INT) top)
   1572 			   << (HOST_BITS_PER_WIDE_INT / 2
   1573 			       + (-prec % HOST_BITS_PER_HALF_WIDE_INT)));
   1574 	  top &= mask;
   1575 	}
   1576 
   1577       unsigned int end = half_blocks_needed * 2;
   1578       shift = prec % HOST_BITS_PER_WIDE_INT;
   1579       if (shift)
   1580 	{
   1581 	  /* For overflow checking only look at the first prec bits
   1582 	     starting with r[half_blocks_needed].  */
   1583 	  if (shift <= HOST_BITS_PER_HALF_WIDE_INT)
   1584 	    --end;
   1585 	  shift %= HOST_BITS_PER_HALF_WIDE_INT;
   1586 	  if (shift)
   1587 	    {
   1588 	      if (top)
   1589 		r[end - 1] |= ((~(unsigned HOST_HALF_WIDE_INT) 0) << shift);
   1590 	      else
   1591 		r[end - 1] &= (((unsigned HOST_HALF_WIDE_INT) 1) << shift) - 1;
   1592 	    }
   1593 	}
   1594       for (i = half_blocks_needed; i < end; i++)
   1595 	if (((HOST_WIDE_INT)(r[i] & mask)) != top)
   1596 	  /* FIXME: Signed overflow type is not implemented yet.  */
   1597 	  *overflow = (sgn == UNSIGNED) ? wi::OVF_OVERFLOW : wi::OVF_UNKNOWN;
   1598     }
   1599 
   1600   int r_offset = high ? half_blocks_needed : 0;
   1601   return wi_pack (val, &r[r_offset], half_blocks_needed, prec);
   1602 }
   1603 
   1604 /* Compute the population count of X.  */
   1605 int
   1606 wi::popcount (const wide_int_ref &x)
   1607 {
   1608   unsigned int i;
   1609   int count;
   1610 
   1611   /* The high order block is special if it is the last block and the
   1612      precision is not an even multiple of HOST_BITS_PER_WIDE_INT.  We
   1613      have to clear out any ones above the precision before doing
   1614      popcount on this block.  */
   1615   count = x.precision - x.len * HOST_BITS_PER_WIDE_INT;
   1616   unsigned int stop = x.len;
   1617   if (count < 0)
   1618     {
   1619       count = popcount_hwi (x.uhigh () << -count);
   1620       stop -= 1;
   1621     }
   1622   else
   1623     {
   1624       if (x.sign_mask () >= 0)
   1625 	count = 0;
   1626     }
   1627 
   1628   for (i = 0; i < stop; ++i)
   1629     count += popcount_hwi (x.val[i]);
   1630 
   1631   return count;
   1632 }
   1633 
   1634 /* Set VAL to OP0 - OP1.  If OVERFLOW is nonnull, record in *OVERFLOW
   1635    whether the result overflows when OP0 and OP1 are treated as having
   1636    signedness SGN.  Return the number of blocks in VAL.  */
   1637 unsigned int
   1638 wi::sub_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *op0,
   1639 	       unsigned int op0len, const HOST_WIDE_INT *op1,
   1640 	       unsigned int op1len, unsigned int prec,
   1641 	       signop sgn, wi::overflow_type *overflow)
   1642 {
   1643   unsigned HOST_WIDE_INT o0 = 0;
   1644   unsigned HOST_WIDE_INT o1 = 0;
   1645   unsigned HOST_WIDE_INT x = 0;
   1646   /* We implement subtraction as an in place negate and add.  Negation
   1647      is just inversion and add 1, so we can do the add of 1 by just
   1648      starting the borrow in of the first element at 1.  */
   1649   unsigned HOST_WIDE_INT borrow = 0;
   1650   unsigned HOST_WIDE_INT old_borrow = 0;
   1651 
   1652   unsigned HOST_WIDE_INT mask0, mask1;
   1653   unsigned int i;
   1654 
   1655   unsigned int len = MAX (op0len, op1len);
   1656   mask0 = -top_bit_of (op0, op0len, prec);
   1657   mask1 = -top_bit_of (op1, op1len, prec);
   1658 
   1659   /* Subtract all of the explicitly defined elements.  */
   1660   for (i = 0; i < len; i++)
   1661     {
   1662       o0 = i < op0len ? (unsigned HOST_WIDE_INT)op0[i] : mask0;
   1663       o1 = i < op1len ? (unsigned HOST_WIDE_INT)op1[i] : mask1;
   1664       x = o0 - o1 - borrow;
   1665       val[i] = x;
   1666       old_borrow = borrow;
   1667       borrow = borrow == 0 ? o0 < o1 : o0 <= o1;
   1668     }
   1669 
   1670   if (len * HOST_BITS_PER_WIDE_INT < prec)
   1671     {
   1672       val[len] = mask0 - mask1 - borrow;
   1673       len++;
   1674       if (overflow)
   1675 	*overflow = (sgn == UNSIGNED && borrow) ? OVF_UNDERFLOW : OVF_NONE;
   1676     }
   1677   else if (overflow)
   1678     {
   1679       unsigned int shift = -prec % HOST_BITS_PER_WIDE_INT;
   1680       if (sgn == SIGNED)
   1681 	{
   1682 	  unsigned HOST_WIDE_INT x = (o0 ^ o1) & (val[len - 1] ^ o0);
   1683 	  if ((HOST_WIDE_INT) (x << shift) < 0)
   1684 	    {
   1685 	      if (o0 > o1)
   1686 		*overflow = OVF_UNDERFLOW;
   1687 	      else if (o0 < o1)
   1688 		*overflow = OVF_OVERFLOW;
   1689 	      else
   1690 		*overflow = OVF_NONE;
   1691 	    }
   1692 	  else
   1693 	    *overflow = OVF_NONE;
   1694 	}
   1695       else
   1696 	{
   1697 	  /* Put the MSB of X and O0 and in the top of the HWI.  */
   1698 	  x <<= shift;
   1699 	  o0 <<= shift;
   1700 	  if (old_borrow)
   1701 	    *overflow = (x >= o0) ? OVF_UNDERFLOW : OVF_NONE;
   1702 	  else
   1703 	    *overflow = (x > o0) ? OVF_UNDERFLOW : OVF_NONE;
   1704 	}
   1705     }
   1706 
   1707   return canonize (val, len, prec);
   1708 }
   1709 
   1710 
   1711 /*
   1712  * Division and Mod
   1713  */
   1714 
   1715 /* Compute B_QUOTIENT and B_REMAINDER from B_DIVIDEND/B_DIVISOR.  The
   1716    algorithm is a small modification of the algorithm in Hacker's
   1717    Delight by Warren, which itself is a small modification of Knuth's
   1718    algorithm.  M is the number of significant elements of U however
   1719    there needs to be at least one extra element of B_DIVIDEND
   1720    allocated, N is the number of elements of B_DIVISOR.
   1721    Return new value for N.  */
   1722 static int
   1723 divmod_internal_2 (unsigned HOST_HALF_WIDE_INT *b_quotient,
   1724 		   unsigned HOST_HALF_WIDE_INT *b_remainder,
   1725 		   unsigned HOST_HALF_WIDE_INT *b_dividend,
   1726 		   unsigned HOST_HALF_WIDE_INT *b_divisor,
   1727 		   int m, int n)
   1728 {
   1729   /* The "digits" are a HOST_HALF_WIDE_INT which the size of half of a
   1730      HOST_WIDE_INT and stored in the lower bits of each word.  This
   1731      algorithm should work properly on both 32 and 64 bit
   1732      machines.  */
   1733   unsigned HOST_WIDE_INT b = HOST_WIDE_INT_1U << HOST_BITS_PER_HALF_WIDE_INT;
   1734   unsigned HOST_WIDE_INT qhat;   /* Estimate of quotient digit.  */
   1735   unsigned HOST_WIDE_INT rhat;   /* A remainder.  */
   1736   unsigned HOST_WIDE_INT p;      /* Product of two digits.  */
   1737   HOST_WIDE_INT t, k;
   1738   int i, j, s;
   1739 
   1740   /* Single digit divisor.  */
   1741   if (n == 1)
   1742     {
   1743       k = 0;
   1744       for (j = m - 1; j >= 0; j--)
   1745 	{
   1746 	  b_quotient[j] = (k * b + b_dividend[j])/b_divisor[0];
   1747 	  k = ((k * b + b_dividend[j])
   1748 	       - ((unsigned HOST_WIDE_INT)b_quotient[j]
   1749 		  * (unsigned HOST_WIDE_INT)b_divisor[0]));
   1750 	}
   1751       b_remainder[0] = k;
   1752       return 1;
   1753     }
   1754 
   1755   s = clz_hwi (b_divisor[n-1]) - HOST_BITS_PER_HALF_WIDE_INT; /* CHECK clz */
   1756 
   1757   if (s)
   1758     {
   1759       /* Normalize B_DIVIDEND and B_DIVISOR.  Unlike the published
   1760 	 algorithm, we can overwrite b_dividend and b_divisor, so we do
   1761 	 that.  */
   1762       for (i = n - 1; i > 0; i--)
   1763 	b_divisor[i] = (b_divisor[i] << s)
   1764 	  | (b_divisor[i-1] >> (HOST_BITS_PER_HALF_WIDE_INT - s));
   1765       b_divisor[0] = b_divisor[0] << s;
   1766 
   1767       b_dividend[m] = b_dividend[m-1] >> (HOST_BITS_PER_HALF_WIDE_INT - s);
   1768       for (i = m - 1; i > 0; i--)
   1769 	b_dividend[i] = (b_dividend[i] << s)
   1770 	  | (b_dividend[i-1] >> (HOST_BITS_PER_HALF_WIDE_INT - s));
   1771       b_dividend[0] = b_dividend[0] << s;
   1772     }
   1773 
   1774   /* Main loop.  */
   1775   for (j = m - n; j >= 0; j--)
   1776     {
   1777       qhat = (b_dividend[j+n] * b + b_dividend[j+n-1]) / b_divisor[n-1];
   1778       rhat = (b_dividend[j+n] * b + b_dividend[j+n-1]) - qhat * b_divisor[n-1];
   1779     again:
   1780       if (qhat >= b || qhat * b_divisor[n-2] > b * rhat + b_dividend[j+n-2])
   1781 	{
   1782 	  qhat -= 1;
   1783 	  rhat += b_divisor[n-1];
   1784 	  if (rhat < b)
   1785 	    goto again;
   1786 	}
   1787 
   1788       /* Multiply and subtract.  */
   1789       k = 0;
   1790       for (i = 0; i < n; i++)
   1791 	{
   1792 	  p = qhat * b_divisor[i];
   1793 	  t = b_dividend[i+j] - k - (p & HALF_INT_MASK);
   1794 	  b_dividend[i + j] = t;
   1795 	  k = ((p >> HOST_BITS_PER_HALF_WIDE_INT)
   1796 	       - (t >> HOST_BITS_PER_HALF_WIDE_INT));
   1797 	}
   1798       t = b_dividend[j+n] - k;
   1799       b_dividend[j+n] = t;
   1800 
   1801       b_quotient[j] = qhat;
   1802       if (t < 0)
   1803 	{
   1804 	  b_quotient[j] -= 1;
   1805 	  k = 0;
   1806 	  for (i = 0; i < n; i++)
   1807 	    {
   1808 	      t = (HOST_WIDE_INT)b_dividend[i+j] + b_divisor[i] + k;
   1809 	      b_dividend[i+j] = t;
   1810 	      k = t >> HOST_BITS_PER_HALF_WIDE_INT;
   1811 	    }
   1812 	  b_dividend[j+n] += k;
   1813 	}
   1814     }
   1815   /* If N > M, the main loop was skipped, quotient will be 0 and
   1816      we can't copy more than M half-limbs into the remainder, as they
   1817      aren't present in b_dividend (which has .  */
   1818   n = MIN (n, m);
   1819   if (s)
   1820     for (i = 0; i < n; i++)
   1821       b_remainder[i] = (b_dividend[i] >> s)
   1822 	| (b_dividend[i+1] << (HOST_BITS_PER_HALF_WIDE_INT - s));
   1823   else
   1824     for (i = 0; i < n; i++)
   1825       b_remainder[i] = b_dividend[i];
   1826   return n;
   1827 }
   1828 
   1829 
   1830 /* Divide DIVIDEND by DIVISOR, which have signedness SGN, and truncate
   1831    the result.  If QUOTIENT is nonnull, store the value of the quotient
   1832    there and return the number of blocks in it.  The return value is
   1833    not defined otherwise.  If REMAINDER is nonnull, store the value
   1834    of the remainder there and store the number of blocks in
   1835    *REMAINDER_LEN.  If OFLOW is not null, store in *OFLOW whether
   1836    the division overflowed.  */
   1837 unsigned int
   1838 wi::divmod_internal (HOST_WIDE_INT *quotient, unsigned int *remainder_len,
   1839 		     HOST_WIDE_INT *remainder,
   1840 		     const HOST_WIDE_INT *dividend_val,
   1841 		     unsigned int dividend_len, unsigned int dividend_prec,
   1842 		     const HOST_WIDE_INT *divisor_val, unsigned int divisor_len,
   1843 		     unsigned int divisor_prec, signop sgn,
   1844 		     wi::overflow_type *oflow)
   1845 {
   1846   unsigned int m, n;
   1847   bool dividend_neg = false;
   1848   bool divisor_neg = false;
   1849   bool overflow = false;
   1850   wide_int neg_dividend, neg_divisor;
   1851 
   1852   wide_int_ref dividend = wi::storage_ref (dividend_val, dividend_len,
   1853 					   dividend_prec);
   1854   wide_int_ref divisor = wi::storage_ref (divisor_val, divisor_len,
   1855 					  divisor_prec);
   1856   if (divisor == 0)
   1857     overflow = true;
   1858 
   1859   /* The smallest signed number / -1 causes overflow.  The dividend_len
   1860      check is for speed rather than correctness.  */
   1861   if (sgn == SIGNED
   1862       && dividend_len == BLOCKS_NEEDED (dividend_prec)
   1863       && divisor == -1
   1864       && wi::only_sign_bit_p (dividend))
   1865     overflow = true;
   1866 
   1867   /* Handle the overflow cases.  Viewed as unsigned value, the quotient of
   1868      (signed min / -1) has the same representation as the orignal dividend.
   1869      We have traditionally made division by zero act as division by one,
   1870      so there too we use the original dividend.  */
   1871   if (overflow)
   1872     {
   1873       if (remainder)
   1874 	{
   1875 	  *remainder_len = 1;
   1876 	  remainder[0] = 0;
   1877 	}
   1878       if (oflow)
   1879 	*oflow = OVF_OVERFLOW;
   1880       if (quotient)
   1881 	for (unsigned int i = 0; i < dividend_len; ++i)
   1882 	  quotient[i] = dividend_val[i];
   1883       return dividend_len;
   1884     }
   1885 
   1886   if (oflow)
   1887     *oflow = OVF_NONE;
   1888 
   1889   /* Do it on the host if you can.  */
   1890   if (sgn == SIGNED
   1891       && wi::fits_shwi_p (dividend)
   1892       && wi::fits_shwi_p (divisor))
   1893     {
   1894       HOST_WIDE_INT o0 = dividend.to_shwi ();
   1895       HOST_WIDE_INT o1 = divisor.to_shwi ();
   1896 
   1897       if (o0 == HOST_WIDE_INT_MIN && o1 == -1)
   1898 	{
   1899 	  gcc_checking_assert (dividend_prec > HOST_BITS_PER_WIDE_INT);
   1900 	  if (quotient)
   1901 	    {
   1902 	      quotient[0] = HOST_WIDE_INT_MIN;
   1903 	      quotient[1] = 0;
   1904 	    }
   1905 	  if (remainder)
   1906 	    {
   1907 	      remainder[0] = 0;
   1908 	      *remainder_len = 1;
   1909 	    }
   1910 	  return 2;
   1911 	}
   1912       else
   1913 	{
   1914 	  if (quotient)
   1915 	    quotient[0] = o0 / o1;
   1916 	  if (remainder)
   1917 	    {
   1918 	      remainder[0] = o0 % o1;
   1919 	      *remainder_len = 1;
   1920 	    }
   1921 	  return 1;
   1922 	}
   1923     }
   1924 
   1925   if (sgn == UNSIGNED
   1926       && wi::fits_uhwi_p (dividend)
   1927       && wi::fits_uhwi_p (divisor))
   1928     {
   1929       unsigned HOST_WIDE_INT o0 = dividend.to_uhwi ();
   1930       unsigned HOST_WIDE_INT o1 = divisor.to_uhwi ();
   1931       unsigned int quotient_len = 1;
   1932 
   1933       if (quotient)
   1934 	{
   1935 	  quotient[0] = o0 / o1;
   1936 	  quotient_len = canonize_uhwi (quotient, dividend_prec);
   1937 	}
   1938       if (remainder)
   1939 	{
   1940 	  remainder[0] = o0 % o1;
   1941 	  *remainder_len = canonize_uhwi (remainder, dividend_prec);
   1942 	}
   1943       return quotient_len;
   1944     }
   1945 
   1946   /* Make the divisor and dividend positive and remember what we
   1947      did.  */
   1948   if (sgn == SIGNED)
   1949     {
   1950       if (wi::neg_p (dividend))
   1951 	{
   1952 	  neg_dividend = -dividend;
   1953 	  dividend = neg_dividend;
   1954 	  dividend_neg = true;
   1955 	}
   1956       if (wi::neg_p (divisor))
   1957 	{
   1958 	  neg_divisor = -divisor;
   1959 	  divisor = neg_divisor;
   1960 	  divisor_neg = true;
   1961 	}
   1962     }
   1963 
   1964   unsigned HOST_HALF_WIDE_INT
   1965     b_quotient_buf[4 * WIDE_INT_MAX_INL_PRECISION
   1966 		   / HOST_BITS_PER_HALF_WIDE_INT];
   1967   unsigned HOST_HALF_WIDE_INT
   1968     b_remainder_buf[4 * WIDE_INT_MAX_INL_PRECISION
   1969 		    / HOST_BITS_PER_HALF_WIDE_INT];
   1970   unsigned HOST_HALF_WIDE_INT
   1971     b_dividend_buf[(4 * WIDE_INT_MAX_INL_PRECISION
   1972 		    / HOST_BITS_PER_HALF_WIDE_INT) + 1];
   1973   unsigned HOST_HALF_WIDE_INT
   1974     b_divisor_buf[4 * WIDE_INT_MAX_INL_PRECISION
   1975 		  / HOST_BITS_PER_HALF_WIDE_INT];
   1976   unsigned HOST_HALF_WIDE_INT *b_quotient = b_quotient_buf;
   1977   unsigned HOST_HALF_WIDE_INT *b_remainder = b_remainder_buf;
   1978   unsigned HOST_HALF_WIDE_INT *b_dividend = b_dividend_buf;
   1979   unsigned HOST_HALF_WIDE_INT *b_divisor = b_divisor_buf;
   1980 
   1981   if (sgn == SIGNED || dividend_val[dividend_len - 1] >= 0)
   1982     dividend_prec = MIN ((dividend_len + 1) * HOST_BITS_PER_WIDE_INT,
   1983 			 dividend_prec);
   1984   if (sgn == SIGNED || divisor_val[divisor_len - 1] >= 0)
   1985     divisor_prec = MIN (divisor_len * HOST_BITS_PER_WIDE_INT, divisor_prec);
   1986   unsigned int dividend_blocks_needed = 2 * BLOCKS_NEEDED (dividend_prec);
   1987   unsigned int divisor_blocks_needed = 2 * BLOCKS_NEEDED (divisor_prec);
   1988   if (UNLIKELY (dividend_prec > WIDE_INT_MAX_INL_PRECISION)
   1989       || UNLIKELY (divisor_prec > WIDE_INT_MAX_INL_PRECISION))
   1990     {
   1991       unsigned HOST_HALF_WIDE_INT *buf
   1992 	= XALLOCAVEC (unsigned HOST_HALF_WIDE_INT,
   1993 		      3 * dividend_blocks_needed + 1
   1994 		      + divisor_blocks_needed);
   1995       b_quotient = buf;
   1996       b_remainder = b_quotient + dividend_blocks_needed;
   1997       b_dividend = b_remainder + dividend_blocks_needed;
   1998       b_divisor = b_dividend + dividend_blocks_needed + 1;
   1999       memset (b_quotient, 0,
   2000 	      dividend_blocks_needed * sizeof (HOST_HALF_WIDE_INT));
   2001     }
   2002   wi_unpack (b_dividend, dividend.get_val (), dividend.get_len (),
   2003 	     dividend_blocks_needed, dividend_prec, UNSIGNED);
   2004   wi_unpack (b_divisor, divisor.get_val (), divisor.get_len (),
   2005 	     divisor_blocks_needed, divisor_prec, UNSIGNED);
   2006 
   2007   m = dividend_blocks_needed;
   2008   b_dividend[m] = 0;
   2009   while (m > 1 && b_dividend[m - 1] == 0)
   2010     m--;
   2011 
   2012   n = divisor_blocks_needed;
   2013   while (n > 1 && b_divisor[n - 1] == 0)
   2014     n--;
   2015 
   2016   if (b_quotient == b_quotient_buf)
   2017     memset (b_quotient_buf, 0, sizeof (b_quotient_buf));
   2018 
   2019   n = divmod_internal_2 (b_quotient, b_remainder, b_dividend, b_divisor, m, n);
   2020 
   2021   unsigned int quotient_len = 0;
   2022   if (quotient)
   2023     {
   2024       quotient_len = wi_pack (quotient, b_quotient, m, dividend_prec);
   2025       /* The quotient is neg if exactly one of the divisor or dividend is
   2026 	 neg.  */
   2027       if (dividend_neg != divisor_neg)
   2028 	quotient_len = wi::sub_large (quotient, zeros, 1, quotient,
   2029 				      quotient_len, dividend_prec,
   2030 				      UNSIGNED, 0);
   2031     }
   2032 
   2033   if (remainder)
   2034     {
   2035       *remainder_len = wi_pack (remainder, b_remainder, n, dividend_prec);
   2036       /* The remainder is always the same sign as the dividend.  */
   2037       if (dividend_neg)
   2038 	*remainder_len = wi::sub_large (remainder, zeros, 1, remainder,
   2039 					*remainder_len, dividend_prec,
   2040 					UNSIGNED, 0);
   2041     }
   2042 
   2043   return quotient_len;
   2044 }
   2045 
   2046 /*
   2047  * Shifting, rotating and extraction.
   2048  */
   2049 
   2050 /* Left shift XVAL by SHIFT and store the result in VAL.  Return the
   2051    number of blocks in VAL.  Both XVAL and VAL have PRECISION bits.  */
   2052 unsigned int
   2053 wi::lshift_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
   2054 		  unsigned int xlen, unsigned int precision,
   2055 		  unsigned int shift)
   2056 {
   2057   /* Split the shift into a whole-block shift and a subblock shift.  */
   2058   unsigned int skip = shift / HOST_BITS_PER_WIDE_INT;
   2059   unsigned int small_shift = shift % HOST_BITS_PER_WIDE_INT;
   2060 
   2061   /* The whole-block shift fills with zeros.  */
   2062   unsigned int len = BLOCKS_NEEDED (precision);
   2063   len = MIN (xlen + skip + 1, len);
   2064   for (unsigned int i = 0; i < skip; ++i)
   2065     val[i] = 0;
   2066 
   2067   /* It's easier to handle the simple block case specially.  */
   2068   if (small_shift == 0)
   2069     for (unsigned int i = skip; i < len; ++i)
   2070       val[i] = safe_uhwi (xval, xlen, i - skip);
   2071   else
   2072     {
   2073       /* The first unfilled output block is a left shift of the first
   2074 	 block in XVAL.  The other output blocks contain bits from two
   2075 	 consecutive input blocks.  */
   2076       unsigned HOST_WIDE_INT carry = 0;
   2077       for (unsigned int i = skip; i < len; ++i)
   2078 	{
   2079 	  unsigned HOST_WIDE_INT x = safe_uhwi (xval, xlen, i - skip);
   2080 	  val[i] = (x << small_shift) | carry;
   2081 	  carry = x >> (-small_shift % HOST_BITS_PER_WIDE_INT);
   2082 	}
   2083     }
   2084   return canonize (val, len, precision);
   2085 }
   2086 
   2087 /* Right shift XVAL by SHIFT and store the result in VAL.  LEN is the
   2088    number of blocks in VAL.  The input has XPRECISION bits and the
   2089    output has XPRECISION - SHIFT bits.  */
   2090 static void
   2091 rshift_large_common (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
   2092 		     unsigned int xlen, unsigned int shift, unsigned int len)
   2093 {
   2094   /* Split the shift into a whole-block shift and a subblock shift.  */
   2095   unsigned int skip = shift / HOST_BITS_PER_WIDE_INT;
   2096   unsigned int small_shift = shift % HOST_BITS_PER_WIDE_INT;
   2097 
   2098   /* It's easier to handle the simple block case specially.  */
   2099   if (small_shift == 0)
   2100     for (unsigned int i = 0; i < len; ++i)
   2101       val[i] = safe_uhwi (xval, xlen, i + skip);
   2102   else
   2103     {
   2104       /* Each output block but the last is a combination of two input blocks.
   2105 	 The last block is a right shift of the last block in XVAL.  */
   2106       unsigned HOST_WIDE_INT curr = safe_uhwi (xval, xlen, skip);
   2107       for (unsigned int i = 0; i < len; ++i)
   2108 	{
   2109 	  val[i] = curr >> small_shift;
   2110 	  curr = safe_uhwi (xval, xlen, i + skip + 1);
   2111 	  val[i] |= curr << (-small_shift % HOST_BITS_PER_WIDE_INT);
   2112 	}
   2113     }
   2114 }
   2115 
   2116 /* Logically right shift XVAL by SHIFT and store the result in VAL.
   2117    Return the number of blocks in VAL.  XVAL has XPRECISION bits and
   2118    VAL has PRECISION bits.  */
   2119 unsigned int
   2120 wi::lrshift_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
   2121 		   unsigned int xlen, unsigned int xprecision,
   2122 		   unsigned int precision, unsigned int shift)
   2123 {
   2124   /* Work out how many blocks are needed to store the significant bits
   2125      (excluding the upper zeros or signs).  */
   2126   unsigned int blocks_needed = BLOCKS_NEEDED (xprecision - shift);
   2127   unsigned int len = blocks_needed;
   2128   if (len > xlen && xval[xlen - 1] >= 0)
   2129     len = xlen;
   2130 
   2131   rshift_large_common (val, xval, xlen, shift, len);
   2132 
   2133   /* The value we just created has precision XPRECISION - SHIFT.
   2134      Zero-extend it to wider precisions.  */
   2135   if (precision > xprecision - shift && len == blocks_needed)
   2136     {
   2137       unsigned int small_prec = (xprecision - shift) % HOST_BITS_PER_WIDE_INT;
   2138       if (small_prec)
   2139 	val[len - 1] = zext_hwi (val[len - 1], small_prec);
   2140       else if (val[len - 1] < 0)
   2141 	{
   2142 	  /* Add a new block with a zero. */
   2143 	  val[len++] = 0;
   2144 	  return len;
   2145 	}
   2146     }
   2147   return canonize (val, len, precision);
   2148 }
   2149 
   2150 /* Arithmetically right shift XVAL by SHIFT and store the result in VAL.
   2151    Return the number of blocks in VAL.  XVAL has XPRECISION bits and
   2152    VAL has PRECISION bits.  */
   2153 unsigned int
   2154 wi::arshift_large (HOST_WIDE_INT *val, const HOST_WIDE_INT *xval,
   2155 		   unsigned int xlen, unsigned int xprecision,
   2156 		   unsigned int precision, unsigned int shift)
   2157 {
   2158   /* Work out how many blocks are needed to store the significant bits
   2159      (excluding the upper zeros or signs).  */
   2160   unsigned int blocks_needed = BLOCKS_NEEDED (xprecision - shift);
   2161   unsigned int len = MIN (xlen, blocks_needed);
   2162 
   2163   rshift_large_common (val, xval, xlen, shift, len);
   2164 
   2165   /* The value we just created has precision XPRECISION - SHIFT.
   2166      Sign-extend it to wider types.  */
   2167   if (precision > xprecision - shift && len == blocks_needed)
   2168     {
   2169       unsigned int small_prec = (xprecision - shift) % HOST_BITS_PER_WIDE_INT;
   2170       if (small_prec)
   2171 	val[len - 1] = sext_hwi (val[len - 1], small_prec);
   2172     }
   2173   return canonize (val, len, precision);
   2174 }
   2175 
   2176 /* Return the number of leading (upper) zeros in X.  */
   2177 int
   2178 wi::clz (const wide_int_ref &x)
   2179 {
   2180   if (x.sign_mask () < 0)
   2181     /* The upper bit is set, so there are no leading zeros.  */
   2182     return 0;
   2183 
   2184   /* Calculate how many bits there above the highest represented block.  */
   2185   int count = x.precision - x.len * HOST_BITS_PER_WIDE_INT;
   2186 
   2187   unsigned HOST_WIDE_INT high = x.uhigh ();
   2188   if (count < 0)
   2189     /* The upper -COUNT bits of HIGH are not part of the value.
   2190        Clear them out.  */
   2191     high = (high << -count) >> -count;
   2192 
   2193   /* We don't need to look below HIGH.  Either HIGH is nonzero,
   2194      or the top bit of the block below is nonzero; clz_hwi is
   2195      HOST_BITS_PER_WIDE_INT in the latter case.  */
   2196   return count + clz_hwi (high);
   2197 }
   2198 
   2199 /* Return the number of redundant sign bits in X.  (That is, the number
   2200    of bits immediately below the sign bit that have the same value as
   2201    the sign bit.)  */
   2202 int
   2203 wi::clrsb (const wide_int_ref &x)
   2204 {
   2205   /* Calculate how many bits there above the highest represented block.  */
   2206   int count = x.precision - x.len * HOST_BITS_PER_WIDE_INT;
   2207 
   2208   unsigned HOST_WIDE_INT high = x.uhigh ();
   2209   unsigned HOST_WIDE_INT mask = -1;
   2210   if (count < 0)
   2211     {
   2212       /* The upper -COUNT bits of HIGH are not part of the value.
   2213 	 Clear them from both MASK and HIGH.  */
   2214       mask >>= -count;
   2215       high &= mask;
   2216     }
   2217 
   2218   /* If the top bit is 1, count the number of leading 1s.  If the top
   2219      bit is zero, count the number of leading zeros.  */
   2220   if (high > mask / 2)
   2221     high ^= mask;
   2222 
   2223   /* There are no sign bits below the top block, so we don't need to look
   2224      beyond HIGH.  Note that clz_hwi is HOST_BITS_PER_WIDE_INT when
   2225      HIGH is 0.  */
   2226   return count + clz_hwi (high) - 1;
   2227 }
   2228 
   2229 /* Return the number of trailing (lower) zeros in X.  */
   2230 int
   2231 wi::ctz (const wide_int_ref &x)
   2232 {
   2233   if (x.len == 1 && x.ulow () == 0)
   2234     return x.precision;
   2235 
   2236   /* Having dealt with the zero case, there must be a block with a
   2237      nonzero bit.  We don't care about the bits above the first 1.  */
   2238   unsigned int i = 0;
   2239   while (x.val[i] == 0)
   2240     ++i;
   2241   return i * HOST_BITS_PER_WIDE_INT + ctz_hwi (x.val[i]);
   2242 }
   2243 
   2244 /* If X is an exact power of 2, return the base-2 logarithm, otherwise
   2245    return -1.  */
   2246 int
   2247 wi::exact_log2 (const wide_int_ref &x)
   2248 {
   2249   /* Reject cases where there are implicit -1 blocks above HIGH.  */
   2250   if (x.len * HOST_BITS_PER_WIDE_INT < x.precision && x.sign_mask () < 0)
   2251     return -1;
   2252 
   2253   /* Set CRUX to the index of the entry that should be nonzero.
   2254      If the top block is zero then the next lowest block (if any)
   2255      must have the high bit set.  */
   2256   unsigned int crux = x.len - 1;
   2257   if (crux > 0 && x.val[crux] == 0)
   2258     crux -= 1;
   2259 
   2260   /* Check that all lower blocks are zero.  */
   2261   for (unsigned int i = 0; i < crux; ++i)
   2262     if (x.val[i] != 0)
   2263       return -1;
   2264 
   2265   /* Get a zero-extended form of block CRUX.  */
   2266   unsigned HOST_WIDE_INT hwi = x.val[crux];
   2267   if ((crux + 1) * HOST_BITS_PER_WIDE_INT > x.precision)
   2268     hwi = zext_hwi (hwi, x.precision % HOST_BITS_PER_WIDE_INT);
   2269 
   2270   /* Now it's down to whether HWI is a power of 2.  */
   2271   int res = ::exact_log2 (hwi);
   2272   if (res >= 0)
   2273     res += crux * HOST_BITS_PER_WIDE_INT;
   2274   return res;
   2275 }
   2276 
   2277 /* Return the base-2 logarithm of X, rounding down.  Return -1 if X is 0.  */
   2278 int
   2279 wi::floor_log2 (const wide_int_ref &x)
   2280 {
   2281   return x.precision - 1 - clz (x);
   2282 }
   2283 
   2284 /* Return the index of the first (lowest) set bit in X, counting from 1.
   2285    Return 0 if X is 0.  */
   2286 int
   2287 wi::ffs (const wide_int_ref &x)
   2288 {
   2289   return eq_p (x, 0) ? 0 : ctz (x) + 1;
   2290 }
   2291 
   2292 /* Return true if sign-extending X to have precision PRECISION would give
   2293    the minimum signed value at that precision.  */
   2294 bool
   2295 wi::only_sign_bit_p (const wide_int_ref &x, unsigned int precision)
   2296 {
   2297   return ctz (x) + 1 == int (precision);
   2298 }
   2299 
   2300 /* Return true if X represents the minimum signed value.  */
   2301 bool
   2302 wi::only_sign_bit_p (const wide_int_ref &x)
   2303 {
   2304   return only_sign_bit_p (x, x.precision);
   2305 }
   2306 
   2307 /* Return VAL if VAL has no bits set outside MASK.  Otherwise round VAL
   2308    down to the previous value that has no bits set outside MASK.
   2309    This rounding wraps for signed values if VAL is negative and
   2310    the top bit of MASK is clear.
   2311 
   2312    For example, round_down_for_mask (6, 0xf1) would give 1 and
   2313    round_down_for_mask (24, 0xf1) would give 17.  */
   2314 
   2315 wide_int
   2316 wi::round_down_for_mask (const wide_int &val, const wide_int &mask)
   2317 {
   2318   /* Get the bits in VAL that are outside the mask.  */
   2319   wide_int extra_bits = wi::bit_and_not (val, mask);
   2320   if (extra_bits == 0)
   2321     return val;
   2322 
   2323   /* Get a mask that includes the top bit in EXTRA_BITS and is all 1s
   2324      below that bit.  */
   2325   unsigned int precision = val.get_precision ();
   2326   wide_int lower_mask = wi::mask (precision - wi::clz (extra_bits),
   2327 				  false, precision);
   2328 
   2329   /* Clear the bits that aren't in MASK, but ensure that all bits
   2330      in MASK below the top cleared bit are set.  */
   2331   return (val & mask) | (mask & lower_mask);
   2332 }
   2333 
   2334 /* Return VAL if VAL has no bits set outside MASK.  Otherwise round VAL
   2335    up to the next value that has no bits set outside MASK.  The rounding
   2336    wraps if there are no suitable values greater than VAL.
   2337 
   2338    For example, round_up_for_mask (6, 0xf1) would give 16 and
   2339    round_up_for_mask (24, 0xf1) would give 32.  */
   2340 
   2341 wide_int
   2342 wi::round_up_for_mask (const wide_int &val, const wide_int &mask)
   2343 {
   2344   /* Get the bits in VAL that are outside the mask.  */
   2345   wide_int extra_bits = wi::bit_and_not (val, mask);
   2346   if (extra_bits == 0)
   2347     return val;
   2348 
   2349   /* Get a mask that is all 1s above the top bit in EXTRA_BITS.  */
   2350   unsigned int precision = val.get_precision ();
   2351   wide_int upper_mask = wi::mask (precision - wi::clz (extra_bits),
   2352 				  true, precision);
   2353 
   2354   /* Get the bits of the mask that are above the top bit in EXTRA_BITS.  */
   2355   upper_mask &= mask;
   2356 
   2357   /* Conceptually we need to:
   2358 
   2359      - clear bits of VAL outside UPPER_MASK
   2360      - add the lowest bit in UPPER_MASK to VAL (or add 0 if UPPER_MASK is 0)
   2361      - propagate the carry through the bits of VAL in UPPER_MASK
   2362 
   2363      If (~VAL & UPPER_MASK) is nonzero, the carry eventually
   2364      reaches that bit and the process leaves all lower bits clear.
   2365      If (~VAL & UPPER_MASK) is zero then the result is also zero.  */
   2366   wide_int tmp = wi::bit_and_not (upper_mask, val);
   2367 
   2368   return (val | tmp) & -tmp;
   2369 }
   2370 
   2371 /* Compute the modular multiplicative inverse of A modulo B
   2372    using extended Euclid's algorithm.  Assumes A and B are coprime,
   2373    and that A and B have the same precision.  */
   2374 wide_int
   2375 wi::mod_inv (const wide_int &a, const wide_int &b)
   2376 {
   2377   /* Verify the assumption.  */
   2378   gcc_checking_assert (wi::eq_p (wi::gcd (a, b), 1));
   2379 
   2380   unsigned int p = a.get_precision () + 1;
   2381   gcc_checking_assert (b.get_precision () + 1 == p);
   2382   wide_int c = wide_int::from (a, p, UNSIGNED);
   2383   wide_int d = wide_int::from (b, p, UNSIGNED);
   2384   wide_int x0 = wide_int::from (0, p, UNSIGNED);
   2385   wide_int x1 = wide_int::from (1, p, UNSIGNED);
   2386 
   2387   if (wi::eq_p (b, 1))
   2388     return wide_int::from (1, p, UNSIGNED);
   2389 
   2390   while (wi::gt_p (c, 1, UNSIGNED))
   2391     {
   2392       wide_int t = d;
   2393       wide_int q = wi::divmod_trunc (c, d, UNSIGNED, &d);
   2394       c = t;
   2395       wide_int s = x0;
   2396       x0 = wi::sub (x1, wi::mul (q, x0));
   2397       x1 = s;
   2398     }
   2399   if (wi::lt_p (x1, 0, SIGNED))
   2400     x1 += d;
   2401   return x1;
   2402 }
   2403 
   2404 /*
   2405  * Private utilities.
   2406  */
   2407 
   2408 void gt_ggc_mx (widest_int *) { }
   2409 void gt_pch_nx (widest_int *, void (*) (void *, void *), void *) { }
   2410 void gt_pch_nx (widest_int *) { }
   2411 
   2412 template void wide_int::dump () const;
   2413 template void generic_wide_int <wide_int_ref_storage <false> >::dump () const;
   2414 template void generic_wide_int <wide_int_ref_storage <true> >::dump () const;
   2415 template void offset_int::dump () const;
   2416 template void widest_int::dump () const;
   2417 
   2418 /* We could add all the above ::dump variants here, but wide_int and
   2419    widest_int should handle the common cases.  Besides, you can always
   2420    call the dump method directly.  */
   2421 
   2422 DEBUG_FUNCTION void
   2423 debug (const wide_int &ref)
   2424 {
   2425   ref.dump ();
   2426 }
   2427 
   2428 DEBUG_FUNCTION void
   2429 debug (const wide_int *ptr)
   2430 {
   2431   if (ptr)
   2432     debug (*ptr);
   2433   else
   2434     fprintf (stderr, "<nil>\n");
   2435 }
   2436 
   2437 DEBUG_FUNCTION void
   2438 debug (const widest_int &ref)
   2439 {
   2440   ref.dump ();
   2441 }
   2442 
   2443 DEBUG_FUNCTION void
   2444 debug (const widest_int *ptr)
   2445 {
   2446   if (ptr)
   2447     debug (*ptr);
   2448   else
   2449     fprintf (stderr, "<nil>\n");
   2450 }
   2451 
   2452 #if CHECKING_P
   2453 
   2454 namespace selftest {
   2455 
   2456 /* Selftests for wide ints.  We run these multiple times, once per type.  */
   2457 
   2458 /* Helper function for building a test value.  */
   2459 
   2460 template <class VALUE_TYPE>
   2461 static VALUE_TYPE
   2462 from_int (int i);
   2463 
   2464 /* Specializations of the fixture for each wide-int type.  */
   2465 
   2466 /* Specialization for VALUE_TYPE == wide_int.  */
   2467 
   2468 template <>
   2469 wide_int
   2470 from_int (int i)
   2471 {
   2472   return wi::shwi (i, 32);
   2473 }
   2474 
   2475 /* Specialization for VALUE_TYPE == offset_int.  */
   2476 
   2477 template <>
   2478 offset_int
   2479 from_int (int i)
   2480 {
   2481   return offset_int (i);
   2482 }
   2483 
   2484 /* Specialization for VALUE_TYPE == widest_int.  */
   2485 
   2486 template <>
   2487 widest_int
   2488 from_int (int i)
   2489 {
   2490   return widest_int (i);
   2491 }
   2492 
   2493 /* Verify that print_dec (WI, ..., SGN) gives the expected string
   2494    representation (using base 10).  */
   2495 
   2496 static void
   2497 assert_deceq (const char *expected, const wide_int_ref &wi, signop sgn)
   2498 {
   2499   char buf[WIDE_INT_PRINT_BUFFER_SIZE], *p = buf;
   2500   unsigned len;
   2501   if (print_dec_buf_size (wi, sgn, &len))
   2502     p = XALLOCAVEC (char, len);
   2503   print_dec (wi, p, sgn);
   2504   ASSERT_STREQ (expected, p);
   2505 }
   2506 
   2507 /* Likewise for base 16.  */
   2508 
   2509 static void
   2510 assert_hexeq (const char *expected, const wide_int_ref &wi)
   2511 {
   2512   char buf[WIDE_INT_PRINT_BUFFER_SIZE], *p = buf;
   2513   unsigned len;
   2514   if (print_hex_buf_size (wi, &len))
   2515     p = XALLOCAVEC (char, len);
   2516   print_hex (wi, p);
   2517   ASSERT_STREQ (expected, p);
   2518 }
   2519 
   2520 /* Test cases.  */
   2521 
   2522 /* Verify that print_dec and print_hex work for VALUE_TYPE.  */
   2523 
   2524 template <class VALUE_TYPE>
   2525 static void
   2526 test_printing ()
   2527 {
   2528   VALUE_TYPE a = from_int<VALUE_TYPE> (42);
   2529   assert_deceq ("42", a, SIGNED);
   2530   assert_hexeq ("0x2a", a);
   2531   assert_hexeq ("0x1fffffffffffffffff", wi::shwi (-1, 69));
   2532   assert_hexeq ("0xffffffffffffffff", wi::mask (64, false, 69));
   2533   assert_hexeq ("0xffffffffffffffff", wi::mask <widest_int> (64, false));
   2534   if (WIDE_INT_MAX_INL_PRECISION > 128)
   2535     {
   2536       assert_hexeq ("0x20000000000000000fffffffffffffffe",
   2537 		    wi::lshift (1, 129) + wi::lshift (1, 64) - 2);
   2538       assert_hexeq ("0x200000000000004000123456789abcdef",
   2539 		    wi::lshift (1, 129) + wi::lshift (1, 74)
   2540 		    + wi::lshift (0x1234567, 32) + 0x89abcdef);
   2541     }
   2542 }
   2543 
   2544 /* Verify that various operations work correctly for VALUE_TYPE,
   2545    unary and binary, using both function syntax, and
   2546    overloaded-operators.  */
   2547 
   2548 template <class VALUE_TYPE>
   2549 static void
   2550 test_ops ()
   2551 {
   2552   VALUE_TYPE a = from_int<VALUE_TYPE> (7);
   2553   VALUE_TYPE b = from_int<VALUE_TYPE> (3);
   2554 
   2555   /* Using functions.  */
   2556   assert_deceq ("-7", wi::neg (a), SIGNED);
   2557   assert_deceq ("10", wi::add (a, b), SIGNED);
   2558   assert_deceq ("4", wi::sub (a, b), SIGNED);
   2559   assert_deceq ("-4", wi::sub (b, a), SIGNED);
   2560   assert_deceq ("21", wi::mul (a, b), SIGNED);
   2561 
   2562   /* Using operators.  */
   2563   assert_deceq ("-7", -a, SIGNED);
   2564   assert_deceq ("10", a + b, SIGNED);
   2565   assert_deceq ("4", a - b, SIGNED);
   2566   assert_deceq ("-4", b - a, SIGNED);
   2567   assert_deceq ("21", a * b, SIGNED);
   2568 }
   2569 
   2570 /* Verify that various comparisons work correctly for VALUE_TYPE.  */
   2571 
   2572 template <class VALUE_TYPE>
   2573 static void
   2574 test_comparisons ()
   2575 {
   2576   VALUE_TYPE a = from_int<VALUE_TYPE> (7);
   2577   VALUE_TYPE b = from_int<VALUE_TYPE> (3);
   2578 
   2579   /* == */
   2580   ASSERT_TRUE (wi::eq_p (a, a));
   2581   ASSERT_FALSE (wi::eq_p (a, b));
   2582 
   2583   /* != */
   2584   ASSERT_TRUE (wi::ne_p (a, b));
   2585   ASSERT_FALSE (wi::ne_p (a, a));
   2586 
   2587   /* < */
   2588   ASSERT_FALSE (wi::lts_p (a, a));
   2589   ASSERT_FALSE (wi::lts_p (a, b));
   2590   ASSERT_TRUE (wi::lts_p (b, a));
   2591 
   2592   /* <= */
   2593   ASSERT_TRUE (wi::les_p (a, a));
   2594   ASSERT_FALSE (wi::les_p (a, b));
   2595   ASSERT_TRUE (wi::les_p (b, a));
   2596 
   2597   /* > */
   2598   ASSERT_FALSE (wi::gts_p (a, a));
   2599   ASSERT_TRUE (wi::gts_p (a, b));
   2600   ASSERT_FALSE (wi::gts_p (b, a));
   2601 
   2602   /* >= */
   2603   ASSERT_TRUE (wi::ges_p (a, a));
   2604   ASSERT_TRUE (wi::ges_p (a, b));
   2605   ASSERT_FALSE (wi::ges_p (b, a));
   2606 
   2607   /* comparison */
   2608   ASSERT_EQ (-1, wi::cmps (b, a));
   2609   ASSERT_EQ (0, wi::cmps (a, a));
   2610   ASSERT_EQ (1, wi::cmps (a, b));
   2611 }
   2612 
   2613 /* Run all of the selftests, using the given VALUE_TYPE.  */
   2614 
   2615 template <class VALUE_TYPE>
   2616 static void run_all_wide_int_tests ()
   2617 {
   2618   test_printing <VALUE_TYPE> ();
   2619   test_ops <VALUE_TYPE> ();
   2620   test_comparisons <VALUE_TYPE> ();
   2621 }
   2622 
   2623 /* Test overflow conditions.  */
   2624 
   2625 static void
   2626 test_overflow ()
   2627 {
   2628   static int precs[] = { 31, 32, 33, 63, 64, 65, 127, 128 };
   2629   static int offsets[] = { 16, 1, 0 };
   2630   for (unsigned int i = 0; i < ARRAY_SIZE (precs); ++i)
   2631     for (unsigned int j = 0; j < ARRAY_SIZE (offsets); ++j)
   2632       {
   2633 	int prec = precs[i];
   2634 	int offset = offsets[j];
   2635 	wi::overflow_type overflow;
   2636 	wide_int sum, diff;
   2637 
   2638 	sum = wi::add (wi::max_value (prec, UNSIGNED) - offset, 1,
   2639 		       UNSIGNED, &overflow);
   2640 	ASSERT_EQ (sum, -offset);
   2641 	ASSERT_EQ (overflow != wi::OVF_NONE, offset == 0);
   2642 
   2643 	sum = wi::add (1, wi::max_value (prec, UNSIGNED) - offset,
   2644 		       UNSIGNED, &overflow);
   2645 	ASSERT_EQ (sum, -offset);
   2646 	ASSERT_EQ (overflow != wi::OVF_NONE, offset == 0);
   2647 
   2648 	diff = wi::sub (wi::max_value (prec, UNSIGNED) - offset,
   2649 			wi::max_value (prec, UNSIGNED),
   2650 			UNSIGNED, &overflow);
   2651 	ASSERT_EQ (diff, -offset);
   2652 	ASSERT_EQ (overflow != wi::OVF_NONE, offset != 0);
   2653 
   2654 	diff = wi::sub (wi::max_value (prec, UNSIGNED) - offset,
   2655 			wi::max_value (prec, UNSIGNED) - 1,
   2656 			UNSIGNED, &overflow);
   2657 	ASSERT_EQ (diff, 1 - offset);
   2658 	ASSERT_EQ (overflow != wi::OVF_NONE, offset > 1);
   2659     }
   2660 }
   2661 
   2662 /* Test the round_{down,up}_for_mask functions.  */
   2663 
   2664 static void
   2665 test_round_for_mask ()
   2666 {
   2667   unsigned int prec = 18;
   2668   ASSERT_EQ (17, wi::round_down_for_mask (wi::shwi (17, prec),
   2669 					  wi::shwi (0xf1, prec)));
   2670   ASSERT_EQ (17, wi::round_up_for_mask (wi::shwi (17, prec),
   2671 					wi::shwi (0xf1, prec)));
   2672 
   2673   ASSERT_EQ (1, wi::round_down_for_mask (wi::shwi (6, prec),
   2674 					 wi::shwi (0xf1, prec)));
   2675   ASSERT_EQ (16, wi::round_up_for_mask (wi::shwi (6, prec),
   2676 					wi::shwi (0xf1, prec)));
   2677 
   2678   ASSERT_EQ (17, wi::round_down_for_mask (wi::shwi (24, prec),
   2679 					  wi::shwi (0xf1, prec)));
   2680   ASSERT_EQ (32, wi::round_up_for_mask (wi::shwi (24, prec),
   2681 					wi::shwi (0xf1, prec)));
   2682 
   2683   ASSERT_EQ (0x011, wi::round_down_for_mask (wi::shwi (0x22, prec),
   2684 					     wi::shwi (0x111, prec)));
   2685   ASSERT_EQ (0x100, wi::round_up_for_mask (wi::shwi (0x22, prec),
   2686 					   wi::shwi (0x111, prec)));
   2687 
   2688   ASSERT_EQ (100, wi::round_down_for_mask (wi::shwi (101, prec),
   2689 					   wi::shwi (0xfc, prec)));
   2690   ASSERT_EQ (104, wi::round_up_for_mask (wi::shwi (101, prec),
   2691 					 wi::shwi (0xfc, prec)));
   2692 
   2693   ASSERT_EQ (0x2bc, wi::round_down_for_mask (wi::shwi (0x2c2, prec),
   2694 					     wi::shwi (0xabc, prec)));
   2695   ASSERT_EQ (0x800, wi::round_up_for_mask (wi::shwi (0x2c2, prec),
   2696 					   wi::shwi (0xabc, prec)));
   2697 
   2698   ASSERT_EQ (0xabc, wi::round_down_for_mask (wi::shwi (0xabd, prec),
   2699 					     wi::shwi (0xabc, prec)));
   2700   ASSERT_EQ (0, wi::round_up_for_mask (wi::shwi (0xabd, prec),
   2701 				       wi::shwi (0xabc, prec)));
   2702 
   2703   ASSERT_EQ (0xabc, wi::round_down_for_mask (wi::shwi (0x1000, prec),
   2704 					     wi::shwi (0xabc, prec)));
   2705   ASSERT_EQ (0, wi::round_up_for_mask (wi::shwi (0x1000, prec),
   2706 				       wi::shwi (0xabc, prec)));
   2707 }
   2708 
   2709 /* Run all of the selftests within this file, for all value types.  */
   2710 
   2711 void
   2712 wide_int_cc_tests ()
   2713 {
   2714   run_all_wide_int_tests <wide_int> ();
   2715   run_all_wide_int_tests <offset_int> ();
   2716   run_all_wide_int_tests <widest_int> ();
   2717   test_overflow ();
   2718   test_round_for_mask ();
   2719   ASSERT_EQ (wi::mask (128, false, 128),
   2720 	     wi::shifted_mask (0, 128, false, 128));
   2721   ASSERT_EQ (wi::mask (128, true, 128),
   2722 	     wi::shifted_mask (0, 128, true, 128));
   2723   ASSERT_EQ (wi::multiple_of_p (from_int <widest_int> (1),
   2724 				from_int <widest_int> (-128), UNSIGNED),
   2725 	     false);
   2726 }
   2727 
   2728 } // namespace selftest
   2729 #endif /* CHECKING_P */
   2730