1 /* Operations with very long integers.  -*- C++ -*-
2    Copyright (C) 2012-2018 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #ifndef WIDE_INT_H
21 #define WIDE_INT_H
22 
23 /* wide-int.[cc|h] implements a class that efficiently performs
24    mathematical operations on finite precision integers.  wide_ints
25    are designed to be transient - they are not for long term storage
26    of values.  There is tight integration between wide_ints and the
27    other longer storage GCC representations (rtl and tree).
28 
29    The actual precision of a wide_int depends on the flavor.  There
30    are three predefined flavors:
31 
32      1) wide_int (the default).  This flavor does the math in the
33      precision of its input arguments.  It is assumed (and checked)
34      that the precisions of the operands and results are consistent.
35      This is the most efficient flavor.  It is not possible to examine
36      bits above the precision that has been specified.  Because of
37      this, the default flavor has semantics that are simple to
38      understand and in general model the underlying hardware that the
39      compiler is targetted for.
40 
41      This flavor must be used at the RTL level of gcc because there
42      is, in general, not enough information in the RTL representation
43      to extend a value beyond the precision specified in the mode.
44 
45      This flavor should also be used at the TREE and GIMPLE levels of
46      the compiler except for the circumstances described in the
47      descriptions of the other two flavors.
48 
49      The default wide_int representation does not contain any
50      information inherent about signedness of the represented value,
51      so it can be used to represent both signed and unsigned numbers.
52      For operations where the results depend on signedness (full width
53      multiply, division, shifts, comparisons, and operations that need
54      overflow detected), the signedness must be specified separately.
55 
56      2) offset_int.  This is a fixed-precision integer that can hold
57      any address offset, measured in either bits or bytes, with at
58      least one extra sign bit.  At the moment the maximum address
59      size GCC supports is 64 bits.  With 8-bit bytes and an extra
60      sign bit, offset_int therefore needs to have at least 68 bits
61      of precision.  We round this up to 128 bits for efficiency.
62      Values of type T are converted to this precision by sign- or
63      zero-extending them based on the signedness of T.
64 
65      The extra sign bit means that offset_int is effectively a signed
66      128-bit integer, i.e. it behaves like int128_t.
67 
68      Since the values are logically signed, there is no need to
69      distinguish between signed and unsigned operations.  Sign-sensitive
70      comparison operators <, <=, > and >= are therefore supported.
71      Shift operators << and >> are also supported, with >> being
72      an _arithmetic_ right shift.
73 
74      [ Note that, even though offset_int is effectively int128_t,
75        it can still be useful to use unsigned comparisons like
76        wi::leu_p (a, b) as a more efficient short-hand for
77        "a >= 0 && a <= b". ]
78 
79      3) widest_int.  This representation is an approximation of
80      infinite precision math.  However, it is not really infinite
81      precision math as in the GMP library.  It is really finite
82      precision math where the precision is 4 times the size of the
83      largest integer that the target port can represent.
84 
85      Like offset_int, widest_int is wider than all the values that
86      it needs to represent, so the integers are logically signed.
87      Sign-sensitive comparison operators <, <=, > and >= are supported,
88      as are << and >>.
89 
90      There are several places in the GCC where this should/must be used:
91 
92      * Code that does induction variable optimizations.  This code
93        works with induction variables of many different types at the
94        same time.  Because of this, it ends up doing many different
95        calculations where the operands are not compatible types.  The
96        widest_int makes this easy, because it provides a field where
97        nothing is lost when converting from any variable,
98 
99      * There are a small number of passes that currently use the
100        widest_int that should use the default.  These should be
101        changed.
102 
103    There are surprising features of offset_int and widest_int
104    that the users should be careful about:
105 
106      1) Shifts and rotations are just weird.  You have to specify a
107      precision in which the shift or rotate is to happen in.  The bits
108      above this precision are zeroed.  While this is what you
109      want, it is clearly non obvious.
110 
111      2) Larger precision math sometimes does not produce the same
112      answer as would be expected for doing the math at the proper
113      precision.  In particular, a multiply followed by a divide will
114      produce a different answer if the first product is larger than
115      what can be represented in the input precision.
116 
117    The offset_int and the widest_int flavors are more expensive
118    than the default wide int, so in addition to the caveats with these
119    two, the default is the prefered representation.
120 
121    All three flavors of wide_int are represented as a vector of
122    HOST_WIDE_INTs.  The default and widest_int vectors contain enough elements
123    to hold a value of MAX_BITSIZE_MODE_ANY_INT bits.  offset_int contains only
124    enough elements to hold ADDR_MAX_PRECISION bits.  The values are stored
125    in the vector with the least significant HOST_BITS_PER_WIDE_INT bits
126    in element 0.
127 
128    The default wide_int contains three fields: the vector (VAL),
129    the precision and a length (LEN).  The length is the number of HWIs
130    needed to represent the value.  widest_int and offset_int have a
131    constant precision that cannot be changed, so they only store the
132    VAL and LEN fields.
133 
134    Since most integers used in a compiler are small values, it is
135    generally profitable to use a representation of the value that is
136    as small as possible.  LEN is used to indicate the number of
137    elements of the vector that are in use.  The numbers are stored as
138    sign extended numbers as a means of compression.  Leading
139    HOST_WIDE_INTs that contain strings of either -1 or 0 are removed
140    as long as they can be reconstructed from the top bit that is being
141    represented.
142 
143    The precision and length of a wide_int are always greater than 0.
144    Any bits in a wide_int above the precision are sign-extended from the
145    most significant bit.  For example, a 4-bit value 0x8 is represented as
146    VAL = { 0xf...fff8 }.  However, as an optimization, we allow other integer
147    constants to be represented with undefined bits above the precision.
148    This allows INTEGER_CSTs to be pre-extended according to TYPE_SIGN,
149    so that the INTEGER_CST representation can be used both in TYPE_PRECISION
150    and in wider precisions.
151 
152    There are constructors to create the various forms of wide_int from
153    trees, rtl and constants.  For trees the options are:
154 
155 	     tree t = ...;
156 	     wi::to_wide (t)     // Treat T as a wide_int
157 	     wi::to_offset (t)   // Treat T as an offset_int
158 	     wi::to_widest (t)   // Treat T as a widest_int
159 
160    All three are light-weight accessors that should have no overhead
161    in release builds.  If it is useful for readability reasons to
162    store the result in a temporary variable, the preferred method is:
163 
164 	     wi::tree_to_wide_ref twide = wi::to_wide (t);
165 	     wi::tree_to_offset_ref toffset = wi::to_offset (t);
166 	     wi::tree_to_widest_ref twidest = wi::to_widest (t);
167 
168    To make an rtx into a wide_int, you have to pair it with a mode.
169    The canonical way to do this is with rtx_mode_t as in:
170 
171 	     rtx r = ...
172 	     wide_int x = rtx_mode_t (r, mode);
173 
174    Similarly, a wide_int can only be constructed from a host value if
175    the target precision is given explicitly, such as in:
176 
177 	     wide_int x = wi::shwi (c, prec); // sign-extend C if necessary
178 	     wide_int y = wi::uhwi (c, prec); // zero-extend C if necessary
179 
180    However, offset_int and widest_int have an inherent precision and so
181    can be initialized directly from a host value:
182 
183 	     offset_int x = (int) c;          // sign-extend C
184 	     widest_int x = (unsigned int) c; // zero-extend C
185 
186    It is also possible to do arithmetic directly on rtx_mode_ts and
187    constants.  For example:
188 
189 	     wi::add (r1, r2);    // add equal-sized rtx_mode_ts r1 and r2
190 	     wi::add (r1, 1);     // add 1 to rtx_mode_t r1
191 	     wi::lshift (1, 100); // 1 << 100 as a widest_int
192 
193    Many binary operations place restrictions on the combinations of inputs,
194    using the following rules:
195 
196    - {rtx, wide_int} op {rtx, wide_int} -> wide_int
197        The inputs must be the same precision.  The result is a wide_int
198        of the same precision
199 
200    - {rtx, wide_int} op (un)signed HOST_WIDE_INT -> wide_int
201      (un)signed HOST_WIDE_INT op {rtx, wide_int} -> wide_int
202        The HOST_WIDE_INT is extended or truncated to the precision of
203        the other input.  The result is a wide_int of the same precision
204        as that input.
205 
206    - (un)signed HOST_WIDE_INT op (un)signed HOST_WIDE_INT -> widest_int
207        The inputs are extended to widest_int precision and produce a
208        widest_int result.
209 
210    - offset_int op offset_int -> offset_int
211      offset_int op (un)signed HOST_WIDE_INT -> offset_int
212      (un)signed HOST_WIDE_INT op offset_int -> offset_int
213 
214    - widest_int op widest_int -> widest_int
215      widest_int op (un)signed HOST_WIDE_INT -> widest_int
216      (un)signed HOST_WIDE_INT op widest_int -> widest_int
217 
218    Other combinations like:
219 
220    - widest_int op offset_int and
221    - wide_int op offset_int
222 
223    are not allowed.  The inputs should instead be extended or truncated
224    so that they match.
225 
226    The inputs to comparison functions like wi::eq_p and wi::lts_p
227    follow the same compatibility rules, although their return types
228    are different.  Unary functions on X produce the same result as
229    a binary operation X + X.  Shift functions X op Y also produce
230    the same result as X + X; the precision of the shift amount Y
231    can be arbitrarily different from X.  */
232 
233 /* The MAX_BITSIZE_MODE_ANY_INT is automatically generated by a very
234    early examination of the target's mode file.  The WIDE_INT_MAX_ELTS
235    can accomodate at least 1 more bit so that unsigned numbers of that
236    mode can be represented as a signed value.  Note that it is still
237    possible to create fixed_wide_ints that have precisions greater than
238    MAX_BITSIZE_MODE_ANY_INT.  This can be useful when representing a
239    double-width multiplication result, for example.  */
240 #define WIDE_INT_MAX_ELTS \
241   ((MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT) / HOST_BITS_PER_WIDE_INT)
242 
243 #define WIDE_INT_MAX_PRECISION (WIDE_INT_MAX_ELTS * HOST_BITS_PER_WIDE_INT)
244 
245 /* This is the max size of any pointer on any machine.  It does not
246    seem to be as easy to sniff this out of the machine description as
247    it is for MAX_BITSIZE_MODE_ANY_INT since targets may support
248    multiple address sizes and may have different address sizes for
249    different address spaces.  However, currently the largest pointer
250    on any platform is 64 bits.  When that changes, then it is likely
251    that a target hook should be defined so that targets can make this
252    value larger for those targets.  */
253 #define ADDR_MAX_BITSIZE 64
254 
255 /* This is the internal precision used when doing any address
256    arithmetic.  The '4' is really 3 + 1.  Three of the bits are for
257    the number of extra bits needed to do bit addresses and the other bit
258    is to allow everything to be signed without loosing any precision.
259    Then everything is rounded up to the next HWI for efficiency.  */
260 #define ADDR_MAX_PRECISION \
261   ((ADDR_MAX_BITSIZE + 4 + HOST_BITS_PER_WIDE_INT - 1) \
262    & ~(HOST_BITS_PER_WIDE_INT - 1))
263 
264 /* The number of HWIs needed to store an offset_int.  */
265 #define OFFSET_INT_ELTS (ADDR_MAX_PRECISION / HOST_BITS_PER_WIDE_INT)
266 
267 /* The type of result produced by a binary operation on types T1 and T2.
268    Defined purely for brevity.  */
269 #define WI_BINARY_RESULT(T1, T2) \
270   typename wi::binary_traits <T1, T2>::result_type
271 
272 /* Likewise for binary operators, which excludes the case in which neither
273    T1 nor T2 is a wide-int-based type.  */
274 #define WI_BINARY_OPERATOR_RESULT(T1, T2) \
275   typename wi::binary_traits <T1, T2>::operator_result
276 
277 /* The type of result produced by T1 << T2.  Leads to substitution failure
278    if the operation isn't supported.  Defined purely for brevity.  */
279 #define WI_SIGNED_SHIFT_RESULT(T1, T2) \
280   typename wi::binary_traits <T1, T2>::signed_shift_result_type
281 
282 /* The type of result produced by a sign-agnostic binary predicate on
283    types T1 and T2.  This is bool if wide-int operations make sense for
284    T1 and T2 and leads to substitution failure otherwise.  */
285 #define WI_BINARY_PREDICATE_RESULT(T1, T2) \
286   typename wi::binary_traits <T1, T2>::predicate_result
287 
288 /* The type of result produced by a signed binary predicate on types T1 and T2.
289    This is bool if signed comparisons make sense for T1 and T2 and leads to
290    substitution failure otherwise.  */
291 #define WI_SIGNED_BINARY_PREDICATE_RESULT(T1, T2) \
292   typename wi::binary_traits <T1, T2>::signed_predicate_result
293 
294 /* The type of result produced by a unary operation on type T.  */
295 #define WI_UNARY_RESULT(T) \
296   typename wi::binary_traits <T, T>::result_type
297 
298 /* Define a variable RESULT to hold the result of a binary operation on
299    X and Y, which have types T1 and T2 respectively.  Define VAL to
300    point to the blocks of RESULT.  Once the user of the macro has
301    filled in VAL, it should call RESULT.set_len to set the number
302    of initialized blocks.  */
303 #define WI_BINARY_RESULT_VAR(RESULT, VAL, T1, X, T2, Y) \
304   WI_BINARY_RESULT (T1, T2) RESULT = \
305     wi::int_traits <WI_BINARY_RESULT (T1, T2)>::get_binary_result (X, Y); \
306   HOST_WIDE_INT *VAL = RESULT.write_val ()
307 
308 /* Similar for the result of a unary operation on X, which has type T.  */
309 #define WI_UNARY_RESULT_VAR(RESULT, VAL, T, X) \
310   WI_UNARY_RESULT (T) RESULT = \
311     wi::int_traits <WI_UNARY_RESULT (T)>::get_binary_result (X, X); \
312   HOST_WIDE_INT *VAL = RESULT.write_val ()
313 
314 template <typename T> class generic_wide_int;
315 template <int N> class fixed_wide_int_storage;
316 class wide_int_storage;
317 
318 /* An N-bit integer.  Until we can use typedef templates, use this instead.  */
319 #define FIXED_WIDE_INT(N) \
320   generic_wide_int < fixed_wide_int_storage <N> >
321 
322 typedef generic_wide_int <wide_int_storage> wide_int;
323 typedef FIXED_WIDE_INT (ADDR_MAX_PRECISION) offset_int;
324 typedef FIXED_WIDE_INT (WIDE_INT_MAX_PRECISION) widest_int;
325 
326 /* wi::storage_ref can be a reference to a primitive type,
327    so this is the conservatively-correct setting.  */
328 template <bool SE, bool HDP = true>
329 struct wide_int_ref_storage;
330 
331 typedef generic_wide_int <wide_int_ref_storage <false> > wide_int_ref;
332 
333 /* This can be used instead of wide_int_ref if the referenced value is
334    known to have type T.  It carries across properties of T's representation,
335    such as whether excess upper bits in a HWI are defined, and can therefore
336    help avoid redundant work.
337 
338    The macro could be replaced with a template typedef, once we're able
339    to use those.  */
340 #define WIDE_INT_REF_FOR(T) \
341   generic_wide_int \
342     <wide_int_ref_storage <wi::int_traits <T>::is_sign_extended, \
343 			   wi::int_traits <T>::host_dependent_precision> >
344 
345 namespace wi
346 {
347   /* Classifies an integer based on its precision.  */
348   enum precision_type {
349     /* The integer has both a precision and defined signedness.  This allows
350        the integer to be converted to any width, since we know whether to fill
351        any extra bits with zeros or signs.  */
352     FLEXIBLE_PRECISION,
353 
354     /* The integer has a variable precision but no defined signedness.  */
355     VAR_PRECISION,
356 
357     /* The integer has a constant precision (known at GCC compile time)
358        and is signed.  */
359     CONST_PRECISION
360   };
361 
362   /* This class, which has no default implementation, is expected to
363      provide the following members:
364 
365      static const enum precision_type precision_type;
366        Classifies the type of T.
367 
368      static const unsigned int precision;
369        Only defined if precision_type == CONST_PRECISION.  Specifies the
370        precision of all integers of type T.
371 
372      static const bool host_dependent_precision;
373        True if the precision of T depends (or can depend) on the host.
374 
375      static unsigned int get_precision (const T &x)
376        Return the number of bits in X.
377 
378      static wi::storage_ref *decompose (HOST_WIDE_INT *scratch,
379 					unsigned int precision, const T &x)
380        Decompose X as a PRECISION-bit integer, returning the associated
381        wi::storage_ref.  SCRATCH is available as scratch space if needed.
382        The routine should assert that PRECISION is acceptable.  */
383   template <typename T> struct int_traits;
384 
385   /* This class provides a single type, result_type, which specifies the
386      type of integer produced by a binary operation whose inputs have
387      types T1 and T2.  The definition should be symmetric.  */
388   template <typename T1, typename T2,
389 	    enum precision_type P1 = int_traits <T1>::precision_type,
390 	    enum precision_type P2 = int_traits <T2>::precision_type>
391   struct binary_traits;
392 
393   /* Specify the result type for each supported combination of binary
394      inputs.  Note that CONST_PRECISION and VAR_PRECISION cannot be
395      mixed, in order to give stronger type checking.  When both inputs
396      are CONST_PRECISION, they must have the same precision.  */
397   template <typename T1, typename T2>
398   struct binary_traits <T1, T2, FLEXIBLE_PRECISION, FLEXIBLE_PRECISION>
399   {
400     typedef widest_int result_type;
401     /* Don't define operators for this combination.  */
402   };
403 
404   template <typename T1, typename T2>
405   struct binary_traits <T1, T2, FLEXIBLE_PRECISION, VAR_PRECISION>
406   {
407     typedef wide_int result_type;
408     typedef result_type operator_result;
409     typedef bool predicate_result;
410   };
411 
412   template <typename T1, typename T2>
413   struct binary_traits <T1, T2, FLEXIBLE_PRECISION, CONST_PRECISION>
414   {
415     /* Spelled out explicitly (rather than through FIXED_WIDE_INT)
416        so as not to confuse gengtype.  */
417     typedef generic_wide_int < fixed_wide_int_storage
418 			       <int_traits <T2>::precision> > result_type;
419     typedef result_type operator_result;
420     typedef bool predicate_result;
421     typedef result_type signed_shift_result_type;
422     typedef bool signed_predicate_result;
423   };
424 
425   template <typename T1, typename T2>
426   struct binary_traits <T1, T2, VAR_PRECISION, FLEXIBLE_PRECISION>
427   {
428     typedef wide_int result_type;
429     typedef result_type operator_result;
430     typedef bool predicate_result;
431   };
432 
433   template <typename T1, typename T2>
434   struct binary_traits <T1, T2, CONST_PRECISION, FLEXIBLE_PRECISION>
435   {
436     /* Spelled out explicitly (rather than through FIXED_WIDE_INT)
437        so as not to confuse gengtype.  */
438     typedef generic_wide_int < fixed_wide_int_storage
439 			       <int_traits <T1>::precision> > result_type;
440     typedef result_type operator_result;
441     typedef bool predicate_result;
442     typedef result_type signed_shift_result_type;
443     typedef bool signed_predicate_result;
444   };
445 
446   template <typename T1, typename T2>
447   struct binary_traits <T1, T2, CONST_PRECISION, CONST_PRECISION>
448   {
449     STATIC_ASSERT (int_traits <T1>::precision == int_traits <T2>::precision);
450     /* Spelled out explicitly (rather than through FIXED_WIDE_INT)
451        so as not to confuse gengtype.  */
452     typedef generic_wide_int < fixed_wide_int_storage
453 			       <int_traits <T1>::precision> > result_type;
454     typedef result_type operator_result;
455     typedef bool predicate_result;
456     typedef result_type signed_shift_result_type;
457     typedef bool signed_predicate_result;
458   };
459 
460   template <typename T1, typename T2>
461   struct binary_traits <T1, T2, VAR_PRECISION, VAR_PRECISION>
462   {
463     typedef wide_int result_type;
464     typedef result_type operator_result;
465     typedef bool predicate_result;
466   };
467 }
468 
469 /* Public functions for querying and operating on integers.  */
470 namespace wi
471 {
472   template <typename T>
473   unsigned int get_precision (const T &);
474 
475   template <typename T1, typename T2>
476   unsigned int get_binary_precision (const T1 &, const T2 &);
477 
478   template <typename T1, typename T2>
479   void copy (T1 &, const T2 &);
480 
481 #define UNARY_PREDICATE \
482   template <typename T> bool
483 #define UNARY_FUNCTION \
484   template <typename T> WI_UNARY_RESULT (T)
485 #define BINARY_PREDICATE \
486   template <typename T1, typename T2> bool
487 #define BINARY_FUNCTION \
488   template <typename T1, typename T2> WI_BINARY_RESULT (T1, T2)
489 #define SHIFT_FUNCTION \
490   template <typename T1, typename T2> WI_UNARY_RESULT (T1)
491 
492   UNARY_PREDICATE fits_shwi_p (const T &);
493   UNARY_PREDICATE fits_uhwi_p (const T &);
494   UNARY_PREDICATE neg_p (const T &, signop = SIGNED);
495 
496   template <typename T>
497   HOST_WIDE_INT sign_mask (const T &);
498 
499   BINARY_PREDICATE eq_p (const T1 &, const T2 &);
500   BINARY_PREDICATE ne_p (const T1 &, const T2 &);
501   BINARY_PREDICATE lt_p (const T1 &, const T2 &, signop);
502   BINARY_PREDICATE lts_p (const T1 &, const T2 &);
503   BINARY_PREDICATE ltu_p (const T1 &, const T2 &);
504   BINARY_PREDICATE le_p (const T1 &, const T2 &, signop);
505   BINARY_PREDICATE les_p (const T1 &, const T2 &);
506   BINARY_PREDICATE leu_p (const T1 &, const T2 &);
507   BINARY_PREDICATE gt_p (const T1 &, const T2 &, signop);
508   BINARY_PREDICATE gts_p (const T1 &, const T2 &);
509   BINARY_PREDICATE gtu_p (const T1 &, const T2 &);
510   BINARY_PREDICATE ge_p (const T1 &, const T2 &, signop);
511   BINARY_PREDICATE ges_p (const T1 &, const T2 &);
512   BINARY_PREDICATE geu_p (const T1 &, const T2 &);
513 
514   template <typename T1, typename T2>
515   int cmp (const T1 &, const T2 &, signop);
516 
517   template <typename T1, typename T2>
518   int cmps (const T1 &, const T2 &);
519 
520   template <typename T1, typename T2>
521   int cmpu (const T1 &, const T2 &);
522 
523   UNARY_FUNCTION bit_not (const T &);
524   UNARY_FUNCTION neg (const T &);
525   UNARY_FUNCTION neg (const T &, bool *);
526   UNARY_FUNCTION abs (const T &);
527   UNARY_FUNCTION ext (const T &, unsigned int, signop);
528   UNARY_FUNCTION sext (const T &, unsigned int);
529   UNARY_FUNCTION zext (const T &, unsigned int);
530   UNARY_FUNCTION set_bit (const T &, unsigned int);
531 
532   BINARY_FUNCTION min (const T1 &, const T2 &, signop);
533   BINARY_FUNCTION smin (const T1 &, const T2 &);
534   BINARY_FUNCTION umin (const T1 &, const T2 &);
535   BINARY_FUNCTION max (const T1 &, const T2 &, signop);
536   BINARY_FUNCTION smax (const T1 &, const T2 &);
537   BINARY_FUNCTION umax (const T1 &, const T2 &);
538 
539   BINARY_FUNCTION bit_and (const T1 &, const T2 &);
540   BINARY_FUNCTION bit_and_not (const T1 &, const T2 &);
541   BINARY_FUNCTION bit_or (const T1 &, const T2 &);
542   BINARY_FUNCTION bit_or_not (const T1 &, const T2 &);
543   BINARY_FUNCTION bit_xor (const T1 &, const T2 &);
544   BINARY_FUNCTION add (const T1 &, const T2 &);
545   BINARY_FUNCTION add (const T1 &, const T2 &, signop, bool *);
546   BINARY_FUNCTION sub (const T1 &, const T2 &);
547   BINARY_FUNCTION sub (const T1 &, const T2 &, signop, bool *);
548   BINARY_FUNCTION mul (const T1 &, const T2 &);
549   BINARY_FUNCTION mul (const T1 &, const T2 &, signop, bool *);
550   BINARY_FUNCTION smul (const T1 &, const T2 &, bool *);
551   BINARY_FUNCTION umul (const T1 &, const T2 &, bool *);
552   BINARY_FUNCTION mul_high (const T1 &, const T2 &, signop);
553   BINARY_FUNCTION div_trunc (const T1 &, const T2 &, signop, bool * = 0);
554   BINARY_FUNCTION sdiv_trunc (const T1 &, const T2 &);
555   BINARY_FUNCTION udiv_trunc (const T1 &, const T2 &);
556   BINARY_FUNCTION div_floor (const T1 &, const T2 &, signop, bool * = 0);
557   BINARY_FUNCTION udiv_floor (const T1 &, const T2 &);
558   BINARY_FUNCTION sdiv_floor (const T1 &, const T2 &);
559   BINARY_FUNCTION div_ceil (const T1 &, const T2 &, signop, bool * = 0);
560   BINARY_FUNCTION udiv_ceil (const T1 &, const T2 &);
561   BINARY_FUNCTION div_round (const T1 &, const T2 &, signop, bool * = 0);
562   BINARY_FUNCTION divmod_trunc (const T1 &, const T2 &, signop,
563 				WI_BINARY_RESULT (T1, T2) *);
564   BINARY_FUNCTION gcd (const T1 &, const T2 &, signop = UNSIGNED);
565   BINARY_FUNCTION mod_trunc (const T1 &, const T2 &, signop, bool * = 0);
566   BINARY_FUNCTION smod_trunc (const T1 &, const T2 &);
567   BINARY_FUNCTION umod_trunc (const T1 &, const T2 &);
568   BINARY_FUNCTION mod_floor (const T1 &, const T2 &, signop, bool * = 0);
569   BINARY_FUNCTION umod_floor (const T1 &, const T2 &);
570   BINARY_FUNCTION mod_ceil (const T1 &, const T2 &, signop, bool * = 0);
571   BINARY_FUNCTION mod_round (const T1 &, const T2 &, signop, bool * = 0);
572 
573   template <typename T1, typename T2>
574   bool multiple_of_p (const T1 &, const T2 &, signop);
575 
576   template <typename T1, typename T2>
577   bool multiple_of_p (const T1 &, const T2 &, signop,
578 		      WI_BINARY_RESULT (T1, T2) *);
579 
580   SHIFT_FUNCTION lshift (const T1 &, const T2 &);
581   SHIFT_FUNCTION lrshift (const T1 &, const T2 &);
582   SHIFT_FUNCTION arshift (const T1 &, const T2 &);
583   SHIFT_FUNCTION rshift (const T1 &, const T2 &, signop sgn);
584   SHIFT_FUNCTION lrotate (const T1 &, const T2 &, unsigned int = 0);
585   SHIFT_FUNCTION rrotate (const T1 &, const T2 &, unsigned int = 0);
586 
587 #undef SHIFT_FUNCTION
588 #undef BINARY_PREDICATE
589 #undef BINARY_FUNCTION
590 #undef UNARY_PREDICATE
591 #undef UNARY_FUNCTION
592 
593   bool only_sign_bit_p (const wide_int_ref &, unsigned int);
594   bool only_sign_bit_p (const wide_int_ref &);
595   int clz (const wide_int_ref &);
596   int clrsb (const wide_int_ref &);
597   int ctz (const wide_int_ref &);
598   int exact_log2 (const wide_int_ref &);
599   int floor_log2 (const wide_int_ref &);
600   int ffs (const wide_int_ref &);
601   int popcount (const wide_int_ref &);
602   int parity (const wide_int_ref &);
603 
604   template <typename T>
605   unsigned HOST_WIDE_INT extract_uhwi (const T &, unsigned int, unsigned int);
606 
607   template <typename T>
608   unsigned int min_precision (const T &, signop);
609 }
610 
611 namespace wi
612 {
613   /* Contains the components of a decomposed integer for easy, direct
614      access.  */
615   struct storage_ref
616   {
617     storage_ref () {}
618     storage_ref (const HOST_WIDE_INT *, unsigned int, unsigned int);
619 
620     const HOST_WIDE_INT *val;
621     unsigned int len;
622     unsigned int precision;
623 
624     /* Provide enough trappings for this class to act as storage for
625        generic_wide_int.  */
626     unsigned int get_len () const;
627     unsigned int get_precision () const;
628     const HOST_WIDE_INT *get_val () const;
629   };
630 }
631 
632 inline::wi::storage_ref::storage_ref (const HOST_WIDE_INT *val_in,
633 				      unsigned int len_in,
634 				      unsigned int precision_in)
635   : val (val_in), len (len_in), precision (precision_in)
636 {
637 }
638 
639 inline unsigned int
640 wi::storage_ref::get_len () const
641 {
642   return len;
643 }
644 
645 inline unsigned int
646 wi::storage_ref::get_precision () const
647 {
648   return precision;
649 }
650 
651 inline const HOST_WIDE_INT *
652 wi::storage_ref::get_val () const
653 {
654   return val;
655 }
656 
657 /* This class defines an integer type using the storage provided by the
658    template argument.  The storage class must provide the following
659    functions:
660 
661    unsigned int get_precision () const
662      Return the number of bits in the integer.
663 
664    HOST_WIDE_INT *get_val () const
665      Return a pointer to the array of blocks that encodes the integer.
666 
667    unsigned int get_len () const
668      Return the number of blocks in get_val ().  If this is smaller
669      than the number of blocks implied by get_precision (), the
670      remaining blocks are sign extensions of block get_len () - 1.
671 
672    Although not required by generic_wide_int itself, writable storage
673    classes can also provide the following functions:
674 
675    HOST_WIDE_INT *write_val ()
676      Get a modifiable version of get_val ()
677 
678    unsigned int set_len (unsigned int len)
679      Set the value returned by get_len () to LEN.  */
680 template <typename storage>
681 class GTY(()) generic_wide_int : public storage
682 {
683 public:
684   generic_wide_int ();
685 
686   template <typename T>
687   generic_wide_int (const T &);
688 
689   template <typename T>
690   generic_wide_int (const T &, unsigned int);
691 
692   /* Conversions.  */
693   HOST_WIDE_INT to_shwi (unsigned int) const;
694   HOST_WIDE_INT to_shwi () const;
695   unsigned HOST_WIDE_INT to_uhwi (unsigned int) const;
696   unsigned HOST_WIDE_INT to_uhwi () const;
697   HOST_WIDE_INT to_short_addr () const;
698 
699   /* Public accessors for the interior of a wide int.  */
700   HOST_WIDE_INT sign_mask () const;
701   HOST_WIDE_INT elt (unsigned int) const;
702   unsigned HOST_WIDE_INT ulow () const;
703   unsigned HOST_WIDE_INT uhigh () const;
704   HOST_WIDE_INT slow () const;
705   HOST_WIDE_INT shigh () const;
706 
707   template <typename T>
708   generic_wide_int &operator = (const T &);
709 
710 #define ASSIGNMENT_OPERATOR(OP, F) \
711   template <typename T> \
712     generic_wide_int &OP (const T &c) { return (*this = wi::F (*this, c)); }
713 
714 /* Restrict these to cases where the shift operator is defined.  */
715 #define SHIFT_ASSIGNMENT_OPERATOR(OP, OP2) \
716   template <typename T> \
717     generic_wide_int &OP (const T &c) { return (*this = *this OP2 c); }
718 
719 #define INCDEC_OPERATOR(OP, DELTA) \
720   generic_wide_int &OP () { *this += DELTA; return *this; }
721 
722   ASSIGNMENT_OPERATOR (operator &=, bit_and)
723   ASSIGNMENT_OPERATOR (operator |=, bit_or)
724   ASSIGNMENT_OPERATOR (operator ^=, bit_xor)
725   ASSIGNMENT_OPERATOR (operator +=, add)
726   ASSIGNMENT_OPERATOR (operator -=, sub)
727   ASSIGNMENT_OPERATOR (operator *=, mul)
728   ASSIGNMENT_OPERATOR (operator <<=, lshift)
729   SHIFT_ASSIGNMENT_OPERATOR (operator >>=, >>)
730   INCDEC_OPERATOR (operator ++, 1)
731   INCDEC_OPERATOR (operator --, -1)
732 
733 #undef SHIFT_ASSIGNMENT_OPERATOR
734 #undef ASSIGNMENT_OPERATOR
735 #undef INCDEC_OPERATOR
736 
737   /* Debugging functions.  */
738   void dump () const;
739 
740   static const bool is_sign_extended
741     = wi::int_traits <generic_wide_int <storage> >::is_sign_extended;
742 };
743 
744 template <typename storage>
745 inline generic_wide_int <storage>::generic_wide_int () {}
746 
747 template <typename storage>
748 template <typename T>
749 inline generic_wide_int <storage>::generic_wide_int (const T &x)
750   : storage (x)
751 {
752 }
753 
754 template <typename storage>
755 template <typename T>
756 inline generic_wide_int <storage>::generic_wide_int (const T &x,
757 						     unsigned int precision)
758   : storage (x, precision)
759 {
760 }
761 
762 /* Return THIS as a signed HOST_WIDE_INT, sign-extending from PRECISION.
763    If THIS does not fit in PRECISION, the information is lost.  */
764 template <typename storage>
765 inline HOST_WIDE_INT
766 generic_wide_int <storage>::to_shwi (unsigned int precision) const
767 {
768   if (precision < HOST_BITS_PER_WIDE_INT)
769     return sext_hwi (this->get_val ()[0], precision);
770   else
771     return this->get_val ()[0];
772 }
773 
774 /* Return THIS as a signed HOST_WIDE_INT, in its natural precision.  */
775 template <typename storage>
776 inline HOST_WIDE_INT
777 generic_wide_int <storage>::to_shwi () const
778 {
779   if (is_sign_extended)
780     return this->get_val ()[0];
781   else
782     return to_shwi (this->get_precision ());
783 }
784 
785 /* Return THIS as an unsigned HOST_WIDE_INT, zero-extending from
786    PRECISION.  If THIS does not fit in PRECISION, the information
787    is lost.  */
788 template <typename storage>
789 inline unsigned HOST_WIDE_INT
790 generic_wide_int <storage>::to_uhwi (unsigned int precision) const
791 {
792   if (precision < HOST_BITS_PER_WIDE_INT)
793     return zext_hwi (this->get_val ()[0], precision);
794   else
795     return this->get_val ()[0];
796 }
797 
798 /* Return THIS as an signed HOST_WIDE_INT, in its natural precision.  */
799 template <typename storage>
800 inline unsigned HOST_WIDE_INT
801 generic_wide_int <storage>::to_uhwi () const
802 {
803   return to_uhwi (this->get_precision ());
804 }
805 
806 /* TODO: The compiler is half converted from using HOST_WIDE_INT to
807    represent addresses to using offset_int to represent addresses.
808    We use to_short_addr at the interface from new code to old,
809    unconverted code.  */
810 template <typename storage>
811 inline HOST_WIDE_INT
812 generic_wide_int <storage>::to_short_addr () const
813 {
814   return this->get_val ()[0];
815 }
816 
817 /* Return the implicit value of blocks above get_len ().  */
818 template <typename storage>
819 inline HOST_WIDE_INT
820 generic_wide_int <storage>::sign_mask () const
821 {
822   unsigned int len = this->get_len ();
823   unsigned HOST_WIDE_INT high = this->get_val ()[len - 1];
824   if (!is_sign_extended)
825     {
826       unsigned int precision = this->get_precision ();
827       int excess = len * HOST_BITS_PER_WIDE_INT - precision;
828       if (excess > 0)
829 	high <<= excess;
830     }
831   return (HOST_WIDE_INT) (high) < 0 ? -1 : 0;
832 }
833 
834 /* Return the signed value of the least-significant explicitly-encoded
835    block.  */
836 template <typename storage>
837 inline HOST_WIDE_INT
838 generic_wide_int <storage>::slow () const
839 {
840   return this->get_val ()[0];
841 }
842 
843 /* Return the signed value of the most-significant explicitly-encoded
844    block.  */
845 template <typename storage>
846 inline HOST_WIDE_INT
847 generic_wide_int <storage>::shigh () const
848 {
849   return this->get_val ()[this->get_len () - 1];
850 }
851 
852 /* Return the unsigned value of the least-significant
853    explicitly-encoded block.  */
854 template <typename storage>
855 inline unsigned HOST_WIDE_INT
856 generic_wide_int <storage>::ulow () const
857 {
858   return this->get_val ()[0];
859 }
860 
861 /* Return the unsigned value of the most-significant
862    explicitly-encoded block.  */
863 template <typename storage>
864 inline unsigned HOST_WIDE_INT
865 generic_wide_int <storage>::uhigh () const
866 {
867   return this->get_val ()[this->get_len () - 1];
868 }
869 
870 /* Return block I, which might be implicitly or explicit encoded.  */
871 template <typename storage>
872 inline HOST_WIDE_INT
873 generic_wide_int <storage>::elt (unsigned int i) const
874 {
875   if (i >= this->get_len ())
876     return sign_mask ();
877   else
878     return this->get_val ()[i];
879 }
880 
881 template <typename storage>
882 template <typename T>
883 inline generic_wide_int <storage> &
884 generic_wide_int <storage>::operator = (const T &x)
885 {
886   storage::operator = (x);
887   return *this;
888 }
889 
890 /* Dump the contents of the integer to stderr, for debugging.  */
891 template <typename storage>
892 void
893 generic_wide_int <storage>::dump () const
894 {
895   unsigned int len = this->get_len ();
896   const HOST_WIDE_INT *val = this->get_val ();
897   unsigned int precision = this->get_precision ();
898   fprintf (stderr, "[");
899   if (len * HOST_BITS_PER_WIDE_INT < precision)
900     fprintf (stderr, "...,");
901   for (unsigned int i = 0; i < len - 1; ++i)
902     fprintf (stderr, HOST_WIDE_INT_PRINT_HEX ",", val[len - 1 - i]);
903   fprintf (stderr, HOST_WIDE_INT_PRINT_HEX "], precision = %d\n",
904 	   val[0], precision);
905 }
906 
907 namespace wi
908 {
909   template <typename storage>
910   struct int_traits < generic_wide_int <storage> >
911     : public wi::int_traits <storage>
912   {
913     static unsigned int get_precision (const generic_wide_int <storage> &);
914     static wi::storage_ref decompose (HOST_WIDE_INT *, unsigned int,
915 				      const generic_wide_int <storage> &);
916   };
917 }
918 
919 template <typename storage>
920 inline unsigned int
921 wi::int_traits < generic_wide_int <storage> >::
922 get_precision (const generic_wide_int <storage> &x)
923 {
924   return x.get_precision ();
925 }
926 
927 template <typename storage>
928 inline wi::storage_ref
929 wi::int_traits < generic_wide_int <storage> >::
930 decompose (HOST_WIDE_INT *, unsigned int precision,
931 	   const generic_wide_int <storage> &x)
932 {
933   gcc_checking_assert (precision == x.get_precision ());
934   return wi::storage_ref (x.get_val (), x.get_len (), precision);
935 }
936 
937 /* Provide the storage for a wide_int_ref.  This acts like a read-only
938    wide_int, with the optimization that VAL is normally a pointer to
939    another integer's storage, so that no array copy is needed.  */
940 template <bool SE, bool HDP>
941 struct wide_int_ref_storage : public wi::storage_ref
942 {
943 private:
944   /* Scratch space that can be used when decomposing the original integer.
945      It must live as long as this object.  */
946   HOST_WIDE_INT scratch[2];
947 
948 public:
949   wide_int_ref_storage () {}
950 
951   wide_int_ref_storage (const wi::storage_ref &);
952 
953   template <typename T>
954   wide_int_ref_storage (const T &);
955 
956   template <typename T>
957   wide_int_ref_storage (const T &, unsigned int);
958 };
959 
960 /* Create a reference from an existing reference.  */
961 template <bool SE, bool HDP>
962 inline wide_int_ref_storage <SE, HDP>::
963 wide_int_ref_storage (const wi::storage_ref &x)
964   : storage_ref (x)
965 {}
966 
967 /* Create a reference to integer X in its natural precision.  Note
968    that the natural precision is host-dependent for primitive
969    types.  */
970 template <bool SE, bool HDP>
971 template <typename T>
972 inline wide_int_ref_storage <SE, HDP>::wide_int_ref_storage (const T &x)
973   : storage_ref (wi::int_traits <T>::decompose (scratch,
974 						wi::get_precision (x), x))
975 {
976 }
977 
978 /* Create a reference to integer X in precision PRECISION.  */
979 template <bool SE, bool HDP>
980 template <typename T>
981 inline wide_int_ref_storage <SE, HDP>::
982 wide_int_ref_storage (const T &x, unsigned int precision)
983   : storage_ref (wi::int_traits <T>::decompose (scratch, precision, x))
984 {
985 }
986 
987 namespace wi
988 {
989   template <bool SE, bool HDP>
990   struct int_traits <wide_int_ref_storage <SE, HDP> >
991   {
992     static const enum precision_type precision_type = VAR_PRECISION;
993     static const bool host_dependent_precision = HDP;
994     static const bool is_sign_extended = SE;
995   };
996 }
997 
998 namespace wi
999 {
1000   unsigned int force_to_size (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1001 			      unsigned int, unsigned int, unsigned int,
1002 			      signop sgn);
1003   unsigned int from_array (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1004 			   unsigned int, unsigned int, bool = true);
1005 }
1006 
1007 /* The storage used by wide_int.  */
1008 class GTY(()) wide_int_storage
1009 {
1010 private:
1011   HOST_WIDE_INT val[WIDE_INT_MAX_ELTS];
1012   unsigned int len;
1013   unsigned int precision;
1014 
1015 public:
1016   wide_int_storage ();
1017   template <typename T>
1018   wide_int_storage (const T &);
1019 
1020   /* The standard generic_wide_int storage methods.  */
1021   unsigned int get_precision () const;
1022   const HOST_WIDE_INT *get_val () const;
1023   unsigned int get_len () const;
1024   HOST_WIDE_INT *write_val ();
1025   void set_len (unsigned int, bool = false);
1026 
1027   template <typename T>
1028   wide_int_storage &operator = (const T &);
1029 
1030   static wide_int from (const wide_int_ref &, unsigned int, signop);
1031   static wide_int from_array (const HOST_WIDE_INT *, unsigned int,
1032 			      unsigned int, bool = true);
1033   static wide_int create (unsigned int);
1034 
1035   /* FIXME: target-dependent, so should disappear.  */
1036   wide_int bswap () const;
1037 };
1038 
1039 namespace wi
1040 {
1041   template <>
1042   struct int_traits <wide_int_storage>
1043   {
1044     static const enum precision_type precision_type = VAR_PRECISION;
1045     /* Guaranteed by a static assert in the wide_int_storage constructor.  */
1046     static const bool host_dependent_precision = false;
1047     static const bool is_sign_extended = true;
1048     template <typename T1, typename T2>
1049     static wide_int get_binary_result (const T1 &, const T2 &);
1050   };
1051 }
1052 
1053 inline wide_int_storage::wide_int_storage () {}
1054 
1055 /* Initialize the storage from integer X, in its natural precision.
1056    Note that we do not allow integers with host-dependent precision
1057    to become wide_ints; wide_ints must always be logically independent
1058    of the host.  */
1059 template <typename T>
1060 inline wide_int_storage::wide_int_storage (const T &x)
1061 {
1062   { STATIC_ASSERT (!wi::int_traits<T>::host_dependent_precision); }
1063   { STATIC_ASSERT (wi::int_traits<T>::precision_type != wi::CONST_PRECISION); }
1064   WIDE_INT_REF_FOR (T) xi (x);
1065   precision = xi.precision;
1066   wi::copy (*this, xi);
1067 }
1068 
1069 template <typename T>
1070 inline wide_int_storage&
1071 wide_int_storage::operator = (const T &x)
1072 {
1073   { STATIC_ASSERT (!wi::int_traits<T>::host_dependent_precision); }
1074   { STATIC_ASSERT (wi::int_traits<T>::precision_type != wi::CONST_PRECISION); }
1075   WIDE_INT_REF_FOR (T) xi (x);
1076   precision = xi.precision;
1077   wi::copy (*this, xi);
1078   return *this;
1079 }
1080 
1081 inline unsigned int
1082 wide_int_storage::get_precision () const
1083 {
1084   return precision;
1085 }
1086 
1087 inline const HOST_WIDE_INT *
1088 wide_int_storage::get_val () const
1089 {
1090   return val;
1091 }
1092 
1093 inline unsigned int
1094 wide_int_storage::get_len () const
1095 {
1096   return len;
1097 }
1098 
1099 inline HOST_WIDE_INT *
1100 wide_int_storage::write_val ()
1101 {
1102   return val;
1103 }
1104 
1105 inline void
1106 wide_int_storage::set_len (unsigned int l, bool is_sign_extended)
1107 {
1108   len = l;
1109   if (!is_sign_extended && len * HOST_BITS_PER_WIDE_INT > precision)
1110     val[len - 1] = sext_hwi (val[len - 1],
1111 			     precision % HOST_BITS_PER_WIDE_INT);
1112 }
1113 
1114 /* Treat X as having signedness SGN and convert it to a PRECISION-bit
1115    number.  */
1116 inline wide_int
1117 wide_int_storage::from (const wide_int_ref &x, unsigned int precision,
1118 			signop sgn)
1119 {
1120   wide_int result = wide_int::create (precision);
1121   result.set_len (wi::force_to_size (result.write_val (), x.val, x.len,
1122 				     x.precision, precision, sgn));
1123   return result;
1124 }
1125 
1126 /* Create a wide_int from the explicit block encoding given by VAL and
1127    LEN.  PRECISION is the precision of the integer.  NEED_CANON_P is
1128    true if the encoding may have redundant trailing blocks.  */
1129 inline wide_int
1130 wide_int_storage::from_array (const HOST_WIDE_INT *val, unsigned int len,
1131 			      unsigned int precision, bool need_canon_p)
1132 {
1133   wide_int result = wide_int::create (precision);
1134   result.set_len (wi::from_array (result.write_val (), val, len, precision,
1135 				  need_canon_p));
1136   return result;
1137 }
1138 
1139 /* Return an uninitialized wide_int with precision PRECISION.  */
1140 inline wide_int
1141 wide_int_storage::create (unsigned int precision)
1142 {
1143   wide_int x;
1144   x.precision = precision;
1145   return x;
1146 }
1147 
1148 template <typename T1, typename T2>
1149 inline wide_int
1150 wi::int_traits <wide_int_storage>::get_binary_result (const T1 &x, const T2 &y)
1151 {
1152   /* This shouldn't be used for two flexible-precision inputs.  */
1153   STATIC_ASSERT (wi::int_traits <T1>::precision_type != FLEXIBLE_PRECISION
1154 		 || wi::int_traits <T2>::precision_type != FLEXIBLE_PRECISION);
1155   if (wi::int_traits <T1>::precision_type == FLEXIBLE_PRECISION)
1156     return wide_int::create (wi::get_precision (y));
1157   else
1158     return wide_int::create (wi::get_precision (x));
1159 }
1160 
1161 /* The storage used by FIXED_WIDE_INT (N).  */
1162 template <int N>
1163 class GTY(()) fixed_wide_int_storage
1164 {
1165 private:
1166   HOST_WIDE_INT val[(N + HOST_BITS_PER_WIDE_INT + 1) / HOST_BITS_PER_WIDE_INT];
1167   unsigned int len;
1168 
1169 public:
1170   fixed_wide_int_storage ();
1171   template <typename T>
1172   fixed_wide_int_storage (const T &);
1173 
1174   /* The standard generic_wide_int storage methods.  */
1175   unsigned int get_precision () const;
1176   const HOST_WIDE_INT *get_val () const;
1177   unsigned int get_len () const;
1178   HOST_WIDE_INT *write_val ();
1179   void set_len (unsigned int, bool = false);
1180 
1181   static FIXED_WIDE_INT (N) from (const wide_int_ref &, signop);
1182   static FIXED_WIDE_INT (N) from_array (const HOST_WIDE_INT *, unsigned int,
1183 					bool = true);
1184 };
1185 
1186 namespace wi
1187 {
1188   template <int N>
1189   struct int_traits < fixed_wide_int_storage <N> >
1190   {
1191     static const enum precision_type precision_type = CONST_PRECISION;
1192     static const bool host_dependent_precision = false;
1193     static const bool is_sign_extended = true;
1194     static const unsigned int precision = N;
1195     template <typename T1, typename T2>
1196     static FIXED_WIDE_INT (N) get_binary_result (const T1 &, const T2 &);
1197   };
1198 }
1199 
1200 template <int N>
1201 inline fixed_wide_int_storage <N>::fixed_wide_int_storage () {}
1202 
1203 /* Initialize the storage from integer X, in precision N.  */
1204 template <int N>
1205 template <typename T>
1206 inline fixed_wide_int_storage <N>::fixed_wide_int_storage (const T &x)
1207 {
1208   /* Check for type compatibility.  We don't want to initialize a
1209      fixed-width integer from something like a wide_int.  */
1210   WI_BINARY_RESULT (T, FIXED_WIDE_INT (N)) *assertion ATTRIBUTE_UNUSED;
1211   wi::copy (*this, WIDE_INT_REF_FOR (T) (x, N));
1212 }
1213 
1214 template <int N>
1215 inline unsigned int
1216 fixed_wide_int_storage <N>::get_precision () const
1217 {
1218   return N;
1219 }
1220 
1221 template <int N>
1222 inline const HOST_WIDE_INT *
1223 fixed_wide_int_storage <N>::get_val () const
1224 {
1225   return val;
1226 }
1227 
1228 template <int N>
1229 inline unsigned int
1230 fixed_wide_int_storage <N>::get_len () const
1231 {
1232   return len;
1233 }
1234 
1235 template <int N>
1236 inline HOST_WIDE_INT *
1237 fixed_wide_int_storage <N>::write_val ()
1238 {
1239   return val;
1240 }
1241 
1242 template <int N>
1243 inline void
1244 fixed_wide_int_storage <N>::set_len (unsigned int l, bool)
1245 {
1246   len = l;
1247   /* There are no excess bits in val[len - 1].  */
1248   STATIC_ASSERT (N % HOST_BITS_PER_WIDE_INT == 0);
1249 }
1250 
1251 /* Treat X as having signedness SGN and convert it to an N-bit number.  */
1252 template <int N>
1253 inline FIXED_WIDE_INT (N)
1254 fixed_wide_int_storage <N>::from (const wide_int_ref &x, signop sgn)
1255 {
1256   FIXED_WIDE_INT (N) result;
1257   result.set_len (wi::force_to_size (result.write_val (), x.val, x.len,
1258 				     x.precision, N, sgn));
1259   return result;
1260 }
1261 
1262 /* Create a FIXED_WIDE_INT (N) from the explicit block encoding given by
1263    VAL and LEN.  NEED_CANON_P is true if the encoding may have redundant
1264    trailing blocks.  */
1265 template <int N>
1266 inline FIXED_WIDE_INT (N)
1267 fixed_wide_int_storage <N>::from_array (const HOST_WIDE_INT *val,
1268 					unsigned int len,
1269 					bool need_canon_p)
1270 {
1271   FIXED_WIDE_INT (N) result;
1272   result.set_len (wi::from_array (result.write_val (), val, len,
1273 				  N, need_canon_p));
1274   return result;
1275 }
1276 
1277 template <int N>
1278 template <typename T1, typename T2>
1279 inline FIXED_WIDE_INT (N)
1280 wi::int_traits < fixed_wide_int_storage <N> >::
1281 get_binary_result (const T1 &, const T2 &)
1282 {
1283   return FIXED_WIDE_INT (N) ();
1284 }
1285 
1286 /* A reference to one element of a trailing_wide_ints structure.  */
1287 class trailing_wide_int_storage
1288 {
1289 private:
1290   /* The precision of the integer, which is a fixed property of the
1291      parent trailing_wide_ints.  */
1292   unsigned int m_precision;
1293 
1294   /* A pointer to the length field.  */
1295   unsigned char *m_len;
1296 
1297   /* A pointer to the HWI array.  There are enough elements to hold all
1298      values of precision M_PRECISION.  */
1299   HOST_WIDE_INT *m_val;
1300 
1301 public:
1302   trailing_wide_int_storage (unsigned int, unsigned char *, HOST_WIDE_INT *);
1303 
1304   /* The standard generic_wide_int storage methods.  */
1305   unsigned int get_len () const;
1306   unsigned int get_precision () const;
1307   const HOST_WIDE_INT *get_val () const;
1308   HOST_WIDE_INT *write_val ();
1309   void set_len (unsigned int, bool = false);
1310 
1311   template <typename T>
1312   trailing_wide_int_storage &operator = (const T &);
1313 };
1314 
1315 typedef generic_wide_int <trailing_wide_int_storage> trailing_wide_int;
1316 
1317 /* trailing_wide_int behaves like a wide_int.  */
1318 namespace wi
1319 {
1320   template <>
1321   struct int_traits <trailing_wide_int_storage>
1322     : public int_traits <wide_int_storage> {};
1323 }
1324 
1325 /* An array of N wide_int-like objects that can be put at the end of
1326    a variable-sized structure.  Use extra_size to calculate how many
1327    bytes beyond the sizeof need to be allocated.  Use set_precision
1328    to initialize the structure.  */
1329 template <int N>
1330 class GTY((user)) trailing_wide_ints
1331 {
1332 private:
1333   /* The shared precision of each number.  */
1334   unsigned short m_precision;
1335 
1336   /* The shared maximum length of each number.  */
1337   unsigned char m_max_len;
1338 
1339   /* The current length of each number.  */
1340   unsigned char m_len[N];
1341 
1342   /* The variable-length part of the structure, which always contains
1343      at least one HWI.  Element I starts at index I * M_MAX_LEN.  */
1344   HOST_WIDE_INT m_val[1];
1345 
1346 public:
1347   typedef WIDE_INT_REF_FOR (trailing_wide_int_storage) const_reference;
1348 
1349   void set_precision (unsigned int);
1350   unsigned int get_precision () const { return m_precision; }
1351   trailing_wide_int operator [] (unsigned int);
1352   const_reference operator [] (unsigned int) const;
1353   static size_t extra_size (unsigned int);
1354   size_t extra_size () const { return extra_size (m_precision); }
1355 };
1356 
1357 inline trailing_wide_int_storage::
1358 trailing_wide_int_storage (unsigned int precision, unsigned char *len,
1359 			   HOST_WIDE_INT *val)
1360   : m_precision (precision), m_len (len), m_val (val)
1361 {
1362 }
1363 
1364 inline unsigned int
1365 trailing_wide_int_storage::get_len () const
1366 {
1367   return *m_len;
1368 }
1369 
1370 inline unsigned int
1371 trailing_wide_int_storage::get_precision () const
1372 {
1373   return m_precision;
1374 }
1375 
1376 inline const HOST_WIDE_INT *
1377 trailing_wide_int_storage::get_val () const
1378 {
1379   return m_val;
1380 }
1381 
1382 inline HOST_WIDE_INT *
1383 trailing_wide_int_storage::write_val ()
1384 {
1385   return m_val;
1386 }
1387 
1388 inline void
1389 trailing_wide_int_storage::set_len (unsigned int len, bool is_sign_extended)
1390 {
1391   *m_len = len;
1392   if (!is_sign_extended && len * HOST_BITS_PER_WIDE_INT > m_precision)
1393     m_val[len - 1] = sext_hwi (m_val[len - 1],
1394 			       m_precision % HOST_BITS_PER_WIDE_INT);
1395 }
1396 
1397 template <typename T>
1398 inline trailing_wide_int_storage &
1399 trailing_wide_int_storage::operator = (const T &x)
1400 {
1401   WIDE_INT_REF_FOR (T) xi (x, m_precision);
1402   wi::copy (*this, xi);
1403   return *this;
1404 }
1405 
1406 /* Initialize the structure and record that all elements have precision
1407    PRECISION.  */
1408 template <int N>
1409 inline void
1410 trailing_wide_ints <N>::set_precision (unsigned int precision)
1411 {
1412   m_precision = precision;
1413   m_max_len = ((precision + HOST_BITS_PER_WIDE_INT - 1)
1414 	       / HOST_BITS_PER_WIDE_INT);
1415 }
1416 
1417 /* Return a reference to element INDEX.  */
1418 template <int N>
1419 inline trailing_wide_int
1420 trailing_wide_ints <N>::operator [] (unsigned int index)
1421 {
1422   return trailing_wide_int_storage (m_precision, &m_len[index],
1423 				    &m_val[index * m_max_len]);
1424 }
1425 
1426 template <int N>
1427 inline typename trailing_wide_ints <N>::const_reference
1428 trailing_wide_ints <N>::operator [] (unsigned int index) const
1429 {
1430   return wi::storage_ref (&m_val[index * m_max_len],
1431 			  m_len[index], m_precision);
1432 }
1433 
1434 /* Return how many extra bytes need to be added to the end of the structure
1435    in order to handle N wide_ints of precision PRECISION.  */
1436 template <int N>
1437 inline size_t
1438 trailing_wide_ints <N>::extra_size (unsigned int precision)
1439 {
1440   unsigned int max_len = ((precision + HOST_BITS_PER_WIDE_INT - 1)
1441 			  / HOST_BITS_PER_WIDE_INT);
1442   return (N * max_len - 1) * sizeof (HOST_WIDE_INT);
1443 }
1444 
1445 /* This macro is used in structures that end with a trailing_wide_ints field
1446    called FIELD.  It declares get_NAME() and set_NAME() methods to access
1447    element I of FIELD.  */
1448 #define TRAILING_WIDE_INT_ACCESSOR(NAME, FIELD, I) \
1449   trailing_wide_int get_##NAME () { return FIELD[I]; } \
1450   template <typename T> void set_##NAME (const T &x) { FIELD[I] = x; }
1451 
1452 namespace wi
1453 {
1454   /* Implementation of int_traits for primitive integer types like "int".  */
1455   template <typename T, bool signed_p>
1456   struct primitive_int_traits
1457   {
1458     static const enum precision_type precision_type = FLEXIBLE_PRECISION;
1459     static const bool host_dependent_precision = true;
1460     static const bool is_sign_extended = true;
1461     static unsigned int get_precision (T);
1462     static wi::storage_ref decompose (HOST_WIDE_INT *, unsigned int, T);
1463   };
1464 }
1465 
1466 template <typename T, bool signed_p>
1467 inline unsigned int
1468 wi::primitive_int_traits <T, signed_p>::get_precision (T)
1469 {
1470   return sizeof (T) * CHAR_BIT;
1471 }
1472 
1473 template <typename T, bool signed_p>
1474 inline wi::storage_ref
1475 wi::primitive_int_traits <T, signed_p>::decompose (HOST_WIDE_INT *scratch,
1476 						   unsigned int precision, T x)
1477 {
1478   scratch[0] = x;
1479   if (signed_p || scratch[0] >= 0 || precision <= HOST_BITS_PER_WIDE_INT)
1480     return wi::storage_ref (scratch, 1, precision);
1481   scratch[1] = 0;
1482   return wi::storage_ref (scratch, 2, precision);
1483 }
1484 
1485 /* Allow primitive C types to be used in wi:: routines.  */
1486 namespace wi
1487 {
1488   template <>
1489   struct int_traits <unsigned char>
1490     : public primitive_int_traits <unsigned char, false> {};
1491 
1492   template <>
1493   struct int_traits <unsigned short>
1494     : public primitive_int_traits <unsigned short, false> {};
1495 
1496   template <>
1497   struct int_traits <int>
1498     : public primitive_int_traits <int, true> {};
1499 
1500   template <>
1501   struct int_traits <unsigned int>
1502     : public primitive_int_traits <unsigned int, false> {};
1503 
1504   template <>
1505   struct int_traits <long>
1506     : public primitive_int_traits <long, true> {};
1507 
1508   template <>
1509   struct int_traits <unsigned long>
1510     : public primitive_int_traits <unsigned long, false> {};
1511 
1512 #if defined HAVE_LONG_LONG
1513   template <>
1514   struct int_traits <long long>
1515     : public primitive_int_traits <long long, true> {};
1516 
1517   template <>
1518   struct int_traits <unsigned long long>
1519     : public primitive_int_traits <unsigned long long, false> {};
1520 #endif
1521 }
1522 
1523 namespace wi
1524 {
1525   /* Stores HWI-sized integer VAL, treating it as having signedness SGN
1526      and precision PRECISION.  */
1527   struct hwi_with_prec
1528   {
1529     hwi_with_prec () {}
1530     hwi_with_prec (HOST_WIDE_INT, unsigned int, signop);
1531     HOST_WIDE_INT val;
1532     unsigned int precision;
1533     signop sgn;
1534   };
1535 
1536   hwi_with_prec shwi (HOST_WIDE_INT, unsigned int);
1537   hwi_with_prec uhwi (unsigned HOST_WIDE_INT, unsigned int);
1538 
1539   hwi_with_prec minus_one (unsigned int);
1540   hwi_with_prec zero (unsigned int);
1541   hwi_with_prec one (unsigned int);
1542   hwi_with_prec two (unsigned int);
1543 }
1544 
1545 inline wi::hwi_with_prec::hwi_with_prec (HOST_WIDE_INT v, unsigned int p,
1546 					 signop s)
1547   : precision (p), sgn (s)
1548 {
1549   if (precision < HOST_BITS_PER_WIDE_INT)
1550     val = sext_hwi (v, precision);
1551   else
1552     val = v;
1553 }
1554 
1555 /* Return a signed integer that has value VAL and precision PRECISION.  */
1556 inline wi::hwi_with_prec
1557 wi::shwi (HOST_WIDE_INT val, unsigned int precision)
1558 {
1559   return hwi_with_prec (val, precision, SIGNED);
1560 }
1561 
1562 /* Return an unsigned integer that has value VAL and precision PRECISION.  */
1563 inline wi::hwi_with_prec
1564 wi::uhwi (unsigned HOST_WIDE_INT val, unsigned int precision)
1565 {
1566   return hwi_with_prec (val, precision, UNSIGNED);
1567 }
1568 
1569 /* Return a wide int of -1 with precision PRECISION.  */
1570 inline wi::hwi_with_prec
1571 wi::minus_one (unsigned int precision)
1572 {
1573   return wi::shwi (-1, precision);
1574 }
1575 
1576 /* Return a wide int of 0 with precision PRECISION.  */
1577 inline wi::hwi_with_prec
1578 wi::zero (unsigned int precision)
1579 {
1580   return wi::shwi (0, precision);
1581 }
1582 
1583 /* Return a wide int of 1 with precision PRECISION.  */
1584 inline wi::hwi_with_prec
1585 wi::one (unsigned int precision)
1586 {
1587   return wi::shwi (1, precision);
1588 }
1589 
1590 /* Return a wide int of 2 with precision PRECISION.  */
1591 inline wi::hwi_with_prec
1592 wi::two (unsigned int precision)
1593 {
1594   return wi::shwi (2, precision);
1595 }
1596 
1597 namespace wi
1598 {
1599   /* ints_for<T>::zero (X) returns a zero that, when asssigned to a T,
1600      gives that T the same precision as X.  */
1601   template<typename T, precision_type = int_traits<T>::precision_type>
1602   struct ints_for
1603   {
1604     static int zero (const T &) { return 0; }
1605   };
1606 
1607   template<typename T>
1608   struct ints_for<T, VAR_PRECISION>
1609   {
1610     static hwi_with_prec zero (const T &);
1611   };
1612 }
1613 
1614 template<typename T>
1615 inline wi::hwi_with_prec
1616 wi::ints_for<T, wi::VAR_PRECISION>::zero (const T &x)
1617 {
1618   return wi::zero (wi::get_precision (x));
1619 }
1620 
1621 namespace wi
1622 {
1623   template <>
1624   struct int_traits <wi::hwi_with_prec>
1625   {
1626     static const enum precision_type precision_type = VAR_PRECISION;
1627     /* hwi_with_prec has an explicitly-given precision, rather than the
1628        precision of HOST_WIDE_INT.  */
1629     static const bool host_dependent_precision = false;
1630     static const bool is_sign_extended = true;
1631     static unsigned int get_precision (const wi::hwi_with_prec &);
1632     static wi::storage_ref decompose (HOST_WIDE_INT *, unsigned int,
1633 				      const wi::hwi_with_prec &);
1634   };
1635 }
1636 
1637 inline unsigned int
1638 wi::int_traits <wi::hwi_with_prec>::get_precision (const wi::hwi_with_prec &x)
1639 {
1640   return x.precision;
1641 }
1642 
1643 inline wi::storage_ref
1644 wi::int_traits <wi::hwi_with_prec>::
1645 decompose (HOST_WIDE_INT *scratch, unsigned int precision,
1646 	   const wi::hwi_with_prec &x)
1647 {
1648   gcc_checking_assert (precision == x.precision);
1649   scratch[0] = x.val;
1650   if (x.sgn == SIGNED || x.val >= 0 || precision <= HOST_BITS_PER_WIDE_INT)
1651     return wi::storage_ref (scratch, 1, precision);
1652   scratch[1] = 0;
1653   return wi::storage_ref (scratch, 2, precision);
1654 }
1655 
1656 /* Private functions for handling large cases out of line.  They take
1657    individual length and array parameters because that is cheaper for
1658    the inline caller than constructing an object on the stack and
1659    passing a reference to it.  (Although many callers use wide_int_refs,
1660    we generally want those to be removed by SRA.)  */
1661 namespace wi
1662 {
1663   bool eq_p_large (const HOST_WIDE_INT *, unsigned int,
1664 		   const HOST_WIDE_INT *, unsigned int, unsigned int);
1665   bool lts_p_large (const HOST_WIDE_INT *, unsigned int, unsigned int,
1666 		    const HOST_WIDE_INT *, unsigned int);
1667   bool ltu_p_large (const HOST_WIDE_INT *, unsigned int, unsigned int,
1668 		    const HOST_WIDE_INT *, unsigned int);
1669   int cmps_large (const HOST_WIDE_INT *, unsigned int, unsigned int,
1670 		  const HOST_WIDE_INT *, unsigned int);
1671   int cmpu_large (const HOST_WIDE_INT *, unsigned int, unsigned int,
1672 		  const HOST_WIDE_INT *, unsigned int);
1673   unsigned int sext_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1674 			   unsigned int,
1675 			   unsigned int, unsigned int);
1676   unsigned int zext_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1677 			   unsigned int,
1678 			   unsigned int, unsigned int);
1679   unsigned int set_bit_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1680 			      unsigned int, unsigned int, unsigned int);
1681   unsigned int lshift_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1682 			     unsigned int, unsigned int, unsigned int);
1683   unsigned int lrshift_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1684 			      unsigned int, unsigned int, unsigned int,
1685 			      unsigned int);
1686   unsigned int arshift_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1687 			      unsigned int, unsigned int, unsigned int,
1688 			      unsigned int);
1689   unsigned int and_large (HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int,
1690 			  const HOST_WIDE_INT *, unsigned int, unsigned int);
1691   unsigned int and_not_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1692 			      unsigned int, const HOST_WIDE_INT *,
1693 			      unsigned int, unsigned int);
1694   unsigned int or_large (HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int,
1695 			 const HOST_WIDE_INT *, unsigned int, unsigned int);
1696   unsigned int or_not_large (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1697 			     unsigned int, const HOST_WIDE_INT *,
1698 			     unsigned int, unsigned int);
1699   unsigned int xor_large (HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int,
1700 			  const HOST_WIDE_INT *, unsigned int, unsigned int);
1701   unsigned int add_large (HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int,
1702 			  const HOST_WIDE_INT *, unsigned int, unsigned int,
1703 			  signop, bool *);
1704   unsigned int sub_large (HOST_WIDE_INT *, const HOST_WIDE_INT *, unsigned int,
1705 			  const HOST_WIDE_INT *, unsigned int, unsigned int,
1706 			  signop, bool *);
1707   unsigned int mul_internal (HOST_WIDE_INT *, const HOST_WIDE_INT *,
1708 			     unsigned int, const HOST_WIDE_INT *,
1709 			     unsigned int, unsigned int, signop, bool *,
1710 			     bool);
1711   unsigned int divmod_internal (HOST_WIDE_INT *, unsigned int *,
1712 				HOST_WIDE_INT *, const HOST_WIDE_INT *,
1713 				unsigned int, unsigned int,
1714 				const HOST_WIDE_INT *,
1715 				unsigned int, unsigned int,
1716 				signop, bool *);
1717 }
1718 
1719 /* Return the number of bits that integer X can hold.  */
1720 template <typename T>
1721 inline unsigned int
1722 wi::get_precision (const T &x)
1723 {
1724   return wi::int_traits <T>::get_precision (x);
1725 }
1726 
1727 /* Return the number of bits that the result of a binary operation can
1728    hold when the input operands are X and Y.  */
1729 template <typename T1, typename T2>
1730 inline unsigned int
1731 wi::get_binary_precision (const T1 &x, const T2 &y)
1732 {
1733   return get_precision (wi::int_traits <WI_BINARY_RESULT (T1, T2)>::
1734 			get_binary_result (x, y));
1735 }
1736 
1737 /* Copy the contents of Y to X, but keeping X's current precision.  */
1738 template <typename T1, typename T2>
1739 inline void
1740 wi::copy (T1 &x, const T2 &y)
1741 {
1742   HOST_WIDE_INT *xval = x.write_val ();
1743   const HOST_WIDE_INT *yval = y.get_val ();
1744   unsigned int len = y.get_len ();
1745   unsigned int i = 0;
1746   do
1747     xval[i] = yval[i];
1748   while (++i < len);
1749   x.set_len (len, y.is_sign_extended);
1750 }
1751 
1752 /* Return true if X fits in a HOST_WIDE_INT with no loss of precision.  */
1753 template <typename T>
1754 inline bool
1755 wi::fits_shwi_p (const T &x)
1756 {
1757   WIDE_INT_REF_FOR (T) xi (x);
1758   return xi.len == 1;
1759 }
1760 
1761 /* Return true if X fits in an unsigned HOST_WIDE_INT with no loss of
1762    precision.  */
1763 template <typename T>
1764 inline bool
1765 wi::fits_uhwi_p (const T &x)
1766 {
1767   WIDE_INT_REF_FOR (T) xi (x);
1768   if (xi.precision <= HOST_BITS_PER_WIDE_INT)
1769     return true;
1770   if (xi.len == 1)
1771     return xi.slow () >= 0;
1772   return xi.len == 2 && xi.uhigh () == 0;
1773 }
1774 
1775 /* Return true if X is negative based on the interpretation of SGN.
1776    For UNSIGNED, this is always false.  */
1777 template <typename T>
1778 inline bool
1779 wi::neg_p (const T &x, signop sgn)
1780 {
1781   WIDE_INT_REF_FOR (T) xi (x);
1782   if (sgn == UNSIGNED)
1783     return false;
1784   return xi.sign_mask () < 0;
1785 }
1786 
1787 /* Return -1 if the top bit of X is set and 0 if the top bit is clear.  */
1788 template <typename T>
1789 inline HOST_WIDE_INT
1790 wi::sign_mask (const T &x)
1791 {
1792   WIDE_INT_REF_FOR (T) xi (x);
1793   return xi.sign_mask ();
1794 }
1795 
1796 /* Return true if X == Y.  X and Y must be binary-compatible.  */
1797 template <typename T1, typename T2>
1798 inline bool
1799 wi::eq_p (const T1 &x, const T2 &y)
1800 {
1801   unsigned int precision = get_binary_precision (x, y);
1802   WIDE_INT_REF_FOR (T1) xi (x, precision);
1803   WIDE_INT_REF_FOR (T2) yi (y, precision);
1804   if (xi.is_sign_extended && yi.is_sign_extended)
1805     {
1806       /* This case reduces to array equality.  */
1807       if (xi.len != yi.len)
1808 	return false;
1809       unsigned int i = 0;
1810       do
1811 	if (xi.val[i] != yi.val[i])
1812 	  return false;
1813       while (++i != xi.len);
1814       return true;
1815     }
1816   if (__builtin_expect (yi.len == 1, true))
1817     {
1818       /* XI is only equal to YI if it too has a single HWI.  */
1819       if (xi.len != 1)
1820 	return false;
1821       /* Excess bits in xi.val[0] will be signs or zeros, so comparisons
1822 	 with 0 are simple.  */
1823       if (STATIC_CONSTANT_P (yi.val[0] == 0))
1824 	return xi.val[0] == 0;
1825       /* Otherwise flush out any excess bits first.  */
1826       unsigned HOST_WIDE_INT diff = xi.val[0] ^ yi.val[0];
1827       int excess = HOST_BITS_PER_WIDE_INT - precision;
1828       if (excess > 0)
1829 	diff <<= excess;
1830       return diff == 0;
1831     }
1832   return eq_p_large (xi.val, xi.len, yi.val, yi.len, precision);
1833 }
1834 
1835 /* Return true if X != Y.  X and Y must be binary-compatible.  */
1836 template <typename T1, typename T2>
1837 inline bool
1838 wi::ne_p (const T1 &x, const T2 &y)
1839 {
1840   return !eq_p (x, y);
1841 }
1842 
1843 /* Return true if X < Y when both are treated as signed values.  */
1844 template <typename T1, typename T2>
1845 inline bool
1846 wi::lts_p (const T1 &x, const T2 &y)
1847 {
1848   unsigned int precision = get_binary_precision (x, y);
1849   WIDE_INT_REF_FOR (T1) xi (x, precision);
1850   WIDE_INT_REF_FOR (T2) yi (y, precision);
1851   /* We optimize x < y, where y is 64 or fewer bits.  */
1852   if (wi::fits_shwi_p (yi))
1853     {
1854       /* Make lts_p (x, 0) as efficient as wi::neg_p (x).  */
1855       if (STATIC_CONSTANT_P (yi.val[0] == 0))
1856 	return neg_p (xi);
1857       /* If x fits directly into a shwi, we can compare directly.  */
1858       if (wi::fits_shwi_p (xi))
1859 	return xi.to_shwi () < yi.to_shwi ();
1860       /* If x doesn't fit and is negative, then it must be more
1861 	 negative than any value in y, and hence smaller than y.  */
1862       if (neg_p (xi))
1863 	return true;
1864       /* If x is positive, then it must be larger than any value in y,
1865 	 and hence greater than y.  */
1866       return false;
1867     }
1868   /* Optimize the opposite case, if it can be detected at compile time.  */
1869   if (STATIC_CONSTANT_P (xi.len == 1))
1870     /* If YI is negative it is lower than the least HWI.
1871        If YI is positive it is greater than the greatest HWI.  */
1872     return !neg_p (yi);
1873   return lts_p_large (xi.val, xi.len, precision, yi.val, yi.len);
1874 }
1875 
1876 /* Return true if X < Y when both are treated as unsigned values.  */
1877 template <typename T1, typename T2>
1878 inline bool
1879 wi::ltu_p (const T1 &x, const T2 &y)
1880 {
1881   unsigned int precision = get_binary_precision (x, y);
1882   WIDE_INT_REF_FOR (T1) xi (x, precision);
1883   WIDE_INT_REF_FOR (T2) yi (y, precision);
1884   /* Optimize comparisons with constants.  */
1885   if (STATIC_CONSTANT_P (yi.len == 1 && yi.val[0] >= 0))
1886     return xi.len == 1 && xi.to_uhwi () < (unsigned HOST_WIDE_INT) yi.val[0];
1887   if (STATIC_CONSTANT_P (xi.len == 1 && xi.val[0] >= 0))
1888     return yi.len != 1 || yi.to_uhwi () > (unsigned HOST_WIDE_INT) xi.val[0];
1889   /* Optimize the case of two HWIs.  The HWIs are implicitly sign-extended
1890      for precisions greater than HOST_BITS_WIDE_INT, but sign-extending both
1891      values does not change the result.  */
1892   if (__builtin_expect (xi.len + yi.len == 2, true))
1893     {
1894       unsigned HOST_WIDE_INT xl = xi.to_uhwi ();
1895       unsigned HOST_WIDE_INT yl = yi.to_uhwi ();
1896       return xl < yl;
1897     }
1898   return ltu_p_large (xi.val, xi.len, precision, yi.val, yi.len);
1899 }
1900 
1901 /* Return true if X < Y.  Signedness of X and Y is indicated by SGN.  */
1902 template <typename T1, typename T2>
1903 inline bool
1904 wi::lt_p (const T1 &x, const T2 &y, signop sgn)
1905 {
1906   if (sgn == SIGNED)
1907     return lts_p (x, y);
1908   else
1909     return ltu_p (x, y);
1910 }
1911 
1912 /* Return true if X <= Y when both are treated as signed values.  */
1913 template <typename T1, typename T2>
1914 inline bool
1915 wi::les_p (const T1 &x, const T2 &y)
1916 {
1917   return !lts_p (y, x);
1918 }
1919 
1920 /* Return true if X <= Y when both are treated as unsigned values.  */
1921 template <typename T1, typename T2>
1922 inline bool
1923 wi::leu_p (const T1 &x, const T2 &y)
1924 {
1925   return !ltu_p (y, x);
1926 }
1927 
1928 /* Return true if X <= Y.  Signedness of X and Y is indicated by SGN.  */
1929 template <typename T1, typename T2>
1930 inline bool
1931 wi::le_p (const T1 &x, const T2 &y, signop sgn)
1932 {
1933   if (sgn == SIGNED)
1934     return les_p (x, y);
1935   else
1936     return leu_p (x, y);
1937 }
1938 
1939 /* Return true if X > Y when both are treated as signed values.  */
1940 template <typename T1, typename T2>
1941 inline bool
1942 wi::gts_p (const T1 &x, const T2 &y)
1943 {
1944   return lts_p (y, x);
1945 }
1946 
1947 /* Return true if X > Y when both are treated as unsigned values.  */
1948 template <typename T1, typename T2>
1949 inline bool
1950 wi::gtu_p (const T1 &x, const T2 &y)
1951 {
1952   return ltu_p (y, x);
1953 }
1954 
1955 /* Return true if X > Y.  Signedness of X and Y is indicated by SGN.  */
1956 template <typename T1, typename T2>
1957 inline bool
1958 wi::gt_p (const T1 &x, const T2 &y, signop sgn)
1959 {
1960   if (sgn == SIGNED)
1961     return gts_p (x, y);
1962   else
1963     return gtu_p (x, y);
1964 }
1965 
1966 /* Return true if X >= Y when both are treated as signed values.  */
1967 template <typename T1, typename T2>
1968 inline bool
1969 wi::ges_p (const T1 &x, const T2 &y)
1970 {
1971   return !lts_p (x, y);
1972 }
1973 
1974 /* Return true if X >= Y when both are treated as unsigned values.  */
1975 template <typename T1, typename T2>
1976 inline bool
1977 wi::geu_p (const T1 &x, const T2 &y)
1978 {
1979   return !ltu_p (x, y);
1980 }
1981 
1982 /* Return true if X >= Y.  Signedness of X and Y is indicated by SGN.  */
1983 template <typename T1, typename T2>
1984 inline bool
1985 wi::ge_p (const T1 &x, const T2 &y, signop sgn)
1986 {
1987   if (sgn == SIGNED)
1988     return ges_p (x, y);
1989   else
1990     return geu_p (x, y);
1991 }
1992 
1993 /* Return -1 if X < Y, 0 if X == Y and 1 if X > Y.  Treat both X and Y
1994    as signed values.  */
1995 template <typename T1, typename T2>
1996 inline int
1997 wi::cmps (const T1 &x, const T2 &y)
1998 {
1999   unsigned int precision = get_binary_precision (x, y);
2000   WIDE_INT_REF_FOR (T1) xi (x, precision);
2001   WIDE_INT_REF_FOR (T2) yi (y, precision);
2002   if (wi::fits_shwi_p (yi))
2003     {
2004       /* Special case for comparisons with 0.  */
2005       if (STATIC_CONSTANT_P (yi.val[0] == 0))
2006 	return neg_p (xi) ? -1 : !(xi.len == 1 && xi.val[0] == 0);
2007       /* If x fits into a signed HWI, we can compare directly.  */
2008       if (wi::fits_shwi_p (xi))
2009 	{
2010 	  HOST_WIDE_INT xl = xi.to_shwi ();
2011 	  HOST_WIDE_INT yl = yi.to_shwi ();
2012 	  return xl < yl ? -1 : xl > yl;
2013 	}
2014       /* If x doesn't fit and is negative, then it must be more
2015 	 negative than any signed HWI, and hence smaller than y.  */
2016       if (neg_p (xi))
2017 	return -1;
2018       /* If x is positive, then it must be larger than any signed HWI,
2019 	 and hence greater than y.  */
2020       return 1;
2021     }
2022   /* Optimize the opposite case, if it can be detected at compile time.  */
2023   if (STATIC_CONSTANT_P (xi.len == 1))
2024     /* If YI is negative it is lower than the least HWI.
2025        If YI is positive it is greater than the greatest HWI.  */
2026     return neg_p (yi) ? 1 : -1;
2027   return cmps_large (xi.val, xi.len, precision, yi.val, yi.len);
2028 }
2029 
2030 /* Return -1 if X < Y, 0 if X == Y and 1 if X > Y.  Treat both X and Y
2031    as unsigned values.  */
2032 template <typename T1, typename T2>
2033 inline int
2034 wi::cmpu (const T1 &x, const T2 &y)
2035 {
2036   unsigned int precision = get_binary_precision (x, y);
2037   WIDE_INT_REF_FOR (T1) xi (x, precision);
2038   WIDE_INT_REF_FOR (T2) yi (y, precision);
2039   /* Optimize comparisons with constants.  */
2040   if (STATIC_CONSTANT_P (yi.len == 1 && yi.val[0] >= 0))
2041     {
2042       /* If XI doesn't fit in a HWI then it must be larger than YI.  */
2043       if (xi.len != 1)
2044 	return 1;
2045       /* Otherwise compare directly.  */
2046       unsigned HOST_WIDE_INT xl = xi.to_uhwi ();
2047       unsigned HOST_WIDE_INT yl = yi.val[0];
2048       return xl < yl ? -1 : xl > yl;
2049     }
2050   if (STATIC_CONSTANT_P (xi.len == 1 && xi.val[0] >= 0))
2051     {
2052       /* If YI doesn't fit in a HWI then it must be larger than XI.  */
2053       if (yi.len != 1)
2054 	return -1;
2055       /* Otherwise compare directly.  */
2056       unsigned HOST_WIDE_INT xl = xi.val[0];
2057       unsigned HOST_WIDE_INT yl = yi.to_uhwi ();
2058       return xl < yl ? -1 : xl > yl;
2059     }
2060   /* Optimize the case of two HWIs.  The HWIs are implicitly sign-extended
2061      for precisions greater than HOST_BITS_WIDE_INT, but sign-extending both
2062      values does not change the result.  */
2063   if (__builtin_expect (xi.len + yi.len == 2, true))
2064     {
2065       unsigned HOST_WIDE_INT xl = xi.to_uhwi ();
2066       unsigned HOST_WIDE_INT yl = yi.to_uhwi ();
2067       return xl < yl ? -1 : xl > yl;
2068     }
2069   return cmpu_large (xi.val, xi.len, precision, yi.val, yi.len);
2070 }
2071 
2072 /* Return -1 if X < Y, 0 if X == Y and 1 if X > Y.  Signedness of
2073    X and Y indicated by SGN.  */
2074 template <typename T1, typename T2>
2075 inline int
2076 wi::cmp (const T1 &x, const T2 &y, signop sgn)
2077 {
2078   if (sgn == SIGNED)
2079     return cmps (x, y);
2080   else
2081     return cmpu (x, y);
2082 }
2083 
2084 /* Return ~x.  */
2085 template <typename T>
2086 inline WI_UNARY_RESULT (T)
2087 wi::bit_not (const T &x)
2088 {
2089   WI_UNARY_RESULT_VAR (result, val, T, x);
2090   WIDE_INT_REF_FOR (T) xi (x, get_precision (result));
2091   for (unsigned int i = 0; i < xi.len; ++i)
2092     val[i] = ~xi.val[i];
2093   result.set_len (xi.len);
2094   return result;
2095 }
2096 
2097 /* Return -x.  */
2098 template <typename T>
2099 inline WI_UNARY_RESULT (T)
2100 wi::neg (const T &x)
2101 {
2102   return sub (0, x);
2103 }
2104 
2105 /* Return -x.  Indicate in *OVERFLOW if X is the minimum signed value.  */
2106 template <typename T>
2107 inline WI_UNARY_RESULT (T)
2108 wi::neg (const T &x, bool *overflow)
2109 {
2110   *overflow = only_sign_bit_p (x);
2111   return sub (0, x);
2112 }
2113 
2114 /* Return the absolute value of x.  */
2115 template <typename T>
2116 inline WI_UNARY_RESULT (T)
2117 wi::abs (const T &x)
2118 {
2119   return neg_p (x) ? neg (x) : WI_UNARY_RESULT (T) (x);
2120 }
2121 
2122 /* Return the result of sign-extending the low OFFSET bits of X.  */
2123 template <typename T>
2124 inline WI_UNARY_RESULT (T)
2125 wi::sext (const T &x, unsigned int offset)
2126 {
2127   WI_UNARY_RESULT_VAR (result, val, T, x);
2128   unsigned int precision = get_precision (result);
2129   WIDE_INT_REF_FOR (T) xi (x, precision);
2130 
2131   if (offset <= HOST_BITS_PER_WIDE_INT)
2132     {
2133       val[0] = sext_hwi (xi.ulow (), offset);
2134       result.set_len (1, true);
2135     }
2136   else
2137     result.set_len (sext_large (val, xi.val, xi.len, precision, offset));
2138   return result;
2139 }
2140 
2141 /* Return the result of zero-extending the low OFFSET bits of X.  */
2142 template <typename T>
2143 inline WI_UNARY_RESULT (T)
2144 wi::zext (const T &x, unsigned int offset)
2145 {
2146   WI_UNARY_RESULT_VAR (result, val, T, x);
2147   unsigned int precision = get_precision (result);
2148   WIDE_INT_REF_FOR (T) xi (x, precision);
2149 
2150   /* This is not just an optimization, it is actually required to
2151      maintain canonization.  */
2152   if (offset >= precision)
2153     {
2154       wi::copy (result, xi);
2155       return result;
2156     }
2157 
2158   /* In these cases we know that at least the top bit will be clear,
2159      so no sign extension is necessary.  */
2160   if (offset < HOST_BITS_PER_WIDE_INT)
2161     {
2162       val[0] = zext_hwi (xi.ulow (), offset);
2163       result.set_len (1, true);
2164     }
2165   else
2166     result.set_len (zext_large (val, xi.val, xi.len, precision, offset), true);
2167   return result;
2168 }
2169 
2170 /* Return the result of extending the low OFFSET bits of X according to
2171    signedness SGN.  */
2172 template <typename T>
2173 inline WI_UNARY_RESULT (T)
2174 wi::ext (const T &x, unsigned int offset, signop sgn)
2175 {
2176   return sgn == SIGNED ? sext (x, offset) : zext (x, offset);
2177 }
2178 
2179 /* Return an integer that represents X | (1 << bit).  */
2180 template <typename T>
2181 inline WI_UNARY_RESULT (T)
2182 wi::set_bit (const T &x, unsigned int bit)
2183 {
2184   WI_UNARY_RESULT_VAR (result, val, T, x);
2185   unsigned int precision = get_precision (result);
2186   WIDE_INT_REF_FOR (T) xi (x, precision);
2187   if (precision <= HOST_BITS_PER_WIDE_INT)
2188     {
2189       val[0] = xi.ulow () | (HOST_WIDE_INT_1U << bit);
2190       result.set_len (1);
2191     }
2192   else
2193     result.set_len (set_bit_large (val, xi.val, xi.len, precision, bit));
2194   return result;
2195 }
2196 
2197 /* Return the mininum of X and Y, treating them both as having
2198    signedness SGN.  */
2199 template <typename T1, typename T2>
2200 inline WI_BINARY_RESULT (T1, T2)
2201 wi::min (const T1 &x, const T2 &y, signop sgn)
2202 {
2203   WI_BINARY_RESULT_VAR (result, val ATTRIBUTE_UNUSED, T1, x, T2, y);
2204   unsigned int precision = get_precision (result);
2205   if (wi::le_p (x, y, sgn))
2206     wi::copy (result, WIDE_INT_REF_FOR (T1) (x, precision));
2207   else
2208     wi::copy (result, WIDE_INT_REF_FOR (T2) (y, precision));
2209   return result;
2210 }
2211 
2212 /* Return the minimum of X and Y, treating both as signed values.  */
2213 template <typename T1, typename T2>
2214 inline WI_BINARY_RESULT (T1, T2)
2215 wi::smin (const T1 &x, const T2 &y)
2216 {
2217   return wi::min (x, y, SIGNED);
2218 }
2219 
2220 /* Return the minimum of X and Y, treating both as unsigned values.  */
2221 template <typename T1, typename T2>
2222 inline WI_BINARY_RESULT (T1, T2)
2223 wi::umin (const T1 &x, const T2 &y)
2224 {
2225   return wi::min (x, y, UNSIGNED);
2226 }
2227 
2228 /* Return the maxinum of X and Y, treating them both as having
2229    signedness SGN.  */
2230 template <typename T1, typename T2>
2231 inline WI_BINARY_RESULT (T1, T2)
2232 wi::max (const T1 &x, const T2 &y, signop sgn)
2233 {
2234   WI_BINARY_RESULT_VAR (result, val ATTRIBUTE_UNUSED, T1, x, T2, y);
2235   unsigned int precision = get_precision (result);
2236   if (wi::ge_p (x, y, sgn))
2237     wi::copy (result, WIDE_INT_REF_FOR (T1) (x, precision));
2238   else
2239     wi::copy (result, WIDE_INT_REF_FOR (T2) (y, precision));
2240   return result;
2241 }
2242 
2243 /* Return the maximum of X and Y, treating both as signed values.  */
2244 template <typename T1, typename T2>
2245 inline WI_BINARY_RESULT (T1, T2)
2246 wi::smax (const T1 &x, const T2 &y)
2247 {
2248   return wi::max (x, y, SIGNED);
2249 }
2250 
2251 /* Return the maximum of X and Y, treating both as unsigned values.  */
2252 template <typename T1, typename T2>
2253 inline WI_BINARY_RESULT (T1, T2)
2254 wi::umax (const T1 &x, const T2 &y)
2255 {
2256   return wi::max (x, y, UNSIGNED);
2257 }
2258 
2259 /* Return X & Y.  */
2260 template <typename T1, typename T2>
2261 inline WI_BINARY_RESULT (T1, T2)
2262 wi::bit_and (const T1 &x, const T2 &y)
2263 {
2264   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2265   unsigned int precision = get_precision (result);
2266   WIDE_INT_REF_FOR (T1) xi (x, precision);
2267   WIDE_INT_REF_FOR (T2) yi (y, precision);
2268   bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2269   if (__builtin_expect (xi.len + yi.len == 2, true))
2270     {
2271       val[0] = xi.ulow () & yi.ulow ();
2272       result.set_len (1, is_sign_extended);
2273     }
2274   else
2275     result.set_len (and_large (val, xi.val, xi.len, yi.val, yi.len,
2276 			       precision), is_sign_extended);
2277   return result;
2278 }
2279 
2280 /* Return X & ~Y.  */
2281 template <typename T1, typename T2>
2282 inline WI_BINARY_RESULT (T1, T2)
2283 wi::bit_and_not (const T1 &x, const T2 &y)
2284 {
2285   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2286   unsigned int precision = get_precision (result);
2287   WIDE_INT_REF_FOR (T1) xi (x, precision);
2288   WIDE_INT_REF_FOR (T2) yi (y, precision);
2289   bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2290   if (__builtin_expect (xi.len + yi.len == 2, true))
2291     {
2292       val[0] = xi.ulow () & ~yi.ulow ();
2293       result.set_len (1, is_sign_extended);
2294     }
2295   else
2296     result.set_len (and_not_large (val, xi.val, xi.len, yi.val, yi.len,
2297 				   precision), is_sign_extended);
2298   return result;
2299 }
2300 
2301 /* Return X | Y.  */
2302 template <typename T1, typename T2>
2303 inline WI_BINARY_RESULT (T1, T2)
2304 wi::bit_or (const T1 &x, const T2 &y)
2305 {
2306   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2307   unsigned int precision = get_precision (result);
2308   WIDE_INT_REF_FOR (T1) xi (x, precision);
2309   WIDE_INT_REF_FOR (T2) yi (y, precision);
2310   bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2311   if (__builtin_expect (xi.len + yi.len == 2, true))
2312     {
2313       val[0] = xi.ulow () | yi.ulow ();
2314       result.set_len (1, is_sign_extended);
2315     }
2316   else
2317     result.set_len (or_large (val, xi.val, xi.len,
2318 			      yi.val, yi.len, precision), is_sign_extended);
2319   return result;
2320 }
2321 
2322 /* Return X | ~Y.  */
2323 template <typename T1, typename T2>
2324 inline WI_BINARY_RESULT (T1, T2)
2325 wi::bit_or_not (const T1 &x, const T2 &y)
2326 {
2327   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2328   unsigned int precision = get_precision (result);
2329   WIDE_INT_REF_FOR (T1) xi (x, precision);
2330   WIDE_INT_REF_FOR (T2) yi (y, precision);
2331   bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2332   if (__builtin_expect (xi.len + yi.len == 2, true))
2333     {
2334       val[0] = xi.ulow () | ~yi.ulow ();
2335       result.set_len (1, is_sign_extended);
2336     }
2337   else
2338     result.set_len (or_not_large (val, xi.val, xi.len, yi.val, yi.len,
2339 				  precision), is_sign_extended);
2340   return result;
2341 }
2342 
2343 /* Return X ^ Y.  */
2344 template <typename T1, typename T2>
2345 inline WI_BINARY_RESULT (T1, T2)
2346 wi::bit_xor (const T1 &x, const T2 &y)
2347 {
2348   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2349   unsigned int precision = get_precision (result);
2350   WIDE_INT_REF_FOR (T1) xi (x, precision);
2351   WIDE_INT_REF_FOR (T2) yi (y, precision);
2352   bool is_sign_extended = xi.is_sign_extended && yi.is_sign_extended;
2353   if (__builtin_expect (xi.len + yi.len == 2, true))
2354     {
2355       val[0] = xi.ulow () ^ yi.ulow ();
2356       result.set_len (1, is_sign_extended);
2357     }
2358   else
2359     result.set_len (xor_large (val, xi.val, xi.len,
2360 			       yi.val, yi.len, precision), is_sign_extended);
2361   return result;
2362 }
2363 
2364 /* Return X + Y.  */
2365 template <typename T1, typename T2>
2366 inline WI_BINARY_RESULT (T1, T2)
2367 wi::add (const T1 &x, const T2 &y)
2368 {
2369   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2370   unsigned int precision = get_precision (result);
2371   WIDE_INT_REF_FOR (T1) xi (x, precision);
2372   WIDE_INT_REF_FOR (T2) yi (y, precision);
2373   if (precision <= HOST_BITS_PER_WIDE_INT)
2374     {
2375       val[0] = xi.ulow () + yi.ulow ();
2376       result.set_len (1);
2377     }
2378   /* If the precision is known at compile time to be greater than
2379      HOST_BITS_PER_WIDE_INT, we can optimize the single-HWI case
2380      knowing that (a) all bits in those HWIs are significant and
2381      (b) the result has room for at least two HWIs.  This provides
2382      a fast path for things like offset_int and widest_int.
2383 
2384      The STATIC_CONSTANT_P test prevents this path from being
2385      used for wide_ints.  wide_ints with precisions greater than
2386      HOST_BITS_PER_WIDE_INT are relatively rare and there's not much
2387      point handling them inline.  */
2388   else if (STATIC_CONSTANT_P (precision > HOST_BITS_PER_WIDE_INT)
2389 	   && __builtin_expect (xi.len + yi.len == 2, true))
2390     {
2391       unsigned HOST_WIDE_INT xl = xi.ulow ();
2392       unsigned HOST_WIDE_INT yl = yi.ulow ();
2393       unsigned HOST_WIDE_INT resultl = xl + yl;
2394       val[0] = resultl;
2395       val[1] = (HOST_WIDE_INT) resultl < 0 ? 0 : -1;
2396       result.set_len (1 + (((resultl ^ xl) & (resultl ^ yl))
2397 			   >> (HOST_BITS_PER_WIDE_INT - 1)));
2398     }
2399   else
2400     result.set_len (add_large (val, xi.val, xi.len,
2401 			       yi.val, yi.len, precision,
2402 			       UNSIGNED, 0));
2403   return result;
2404 }
2405 
2406 /* Return X + Y.  Treat X and Y as having the signednes given by SGN
2407    and indicate in *OVERFLOW whether the operation overflowed.  */
2408 template <typename T1, typename T2>
2409 inline WI_BINARY_RESULT (T1, T2)
2410 wi::add (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2411 {
2412   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2413   unsigned int precision = get_precision (result);
2414   WIDE_INT_REF_FOR (T1) xi (x, precision);
2415   WIDE_INT_REF_FOR (T2) yi (y, precision);
2416   if (precision <= HOST_BITS_PER_WIDE_INT)
2417     {
2418       unsigned HOST_WIDE_INT xl = xi.ulow ();
2419       unsigned HOST_WIDE_INT yl = yi.ulow ();
2420       unsigned HOST_WIDE_INT resultl = xl + yl;
2421       if (sgn == SIGNED)
2422 	*overflow = (((resultl ^ xl) & (resultl ^ yl))
2423 		     >> (precision - 1)) & 1;
2424       else
2425 	*overflow = ((resultl << (HOST_BITS_PER_WIDE_INT - precision))
2426 		     < (xl << (HOST_BITS_PER_WIDE_INT - precision)));
2427       val[0] = resultl;
2428       result.set_len (1);
2429     }
2430   else
2431     result.set_len (add_large (val, xi.val, xi.len,
2432 			       yi.val, yi.len, precision,
2433 			       sgn, overflow));
2434   return result;
2435 }
2436 
2437 /* Return X - Y.  */
2438 template <typename T1, typename T2>
2439 inline WI_BINARY_RESULT (T1, T2)
2440 wi::sub (const T1 &x, const T2 &y)
2441 {
2442   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2443   unsigned int precision = get_precision (result);
2444   WIDE_INT_REF_FOR (T1) xi (x, precision);
2445   WIDE_INT_REF_FOR (T2) yi (y, precision);
2446   if (precision <= HOST_BITS_PER_WIDE_INT)
2447     {
2448       val[0] = xi.ulow () - yi.ulow ();
2449       result.set_len (1);
2450     }
2451   /* If the precision is known at compile time to be greater than
2452      HOST_BITS_PER_WIDE_INT, we can optimize the single-HWI case
2453      knowing that (a) all bits in those HWIs are significant and
2454      (b) the result has room for at least two HWIs.  This provides
2455      a fast path for things like offset_int and widest_int.
2456 
2457      The STATIC_CONSTANT_P test prevents this path from being
2458      used for wide_ints.  wide_ints with precisions greater than
2459      HOST_BITS_PER_WIDE_INT are relatively rare and there's not much
2460      point handling them inline.  */
2461   else if (STATIC_CONSTANT_P (precision > HOST_BITS_PER_WIDE_INT)
2462 	   && __builtin_expect (xi.len + yi.len == 2, true))
2463     {
2464       unsigned HOST_WIDE_INT xl = xi.ulow ();
2465       unsigned HOST_WIDE_INT yl = yi.ulow ();
2466       unsigned HOST_WIDE_INT resultl = xl - yl;
2467       val[0] = resultl;
2468       val[1] = (HOST_WIDE_INT) resultl < 0 ? 0 : -1;
2469       result.set_len (1 + (((resultl ^ xl) & (xl ^ yl))
2470 			   >> (HOST_BITS_PER_WIDE_INT - 1)));
2471     }
2472   else
2473     result.set_len (sub_large (val, xi.val, xi.len,
2474 			       yi.val, yi.len, precision,
2475 			       UNSIGNED, 0));
2476   return result;
2477 }
2478 
2479 /* Return X - Y.  Treat X and Y as having the signednes given by SGN
2480    and indicate in *OVERFLOW whether the operation overflowed.  */
2481 template <typename T1, typename T2>
2482 inline WI_BINARY_RESULT (T1, T2)
2483 wi::sub (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2484 {
2485   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2486   unsigned int precision = get_precision (result);
2487   WIDE_INT_REF_FOR (T1) xi (x, precision);
2488   WIDE_INT_REF_FOR (T2) yi (y, precision);
2489   if (precision <= HOST_BITS_PER_WIDE_INT)
2490     {
2491       unsigned HOST_WIDE_INT xl = xi.ulow ();
2492       unsigned HOST_WIDE_INT yl = yi.ulow ();
2493       unsigned HOST_WIDE_INT resultl = xl - yl;
2494       if (sgn == SIGNED)
2495 	*overflow = (((xl ^ yl) & (resultl ^ xl)) >> (precision - 1)) & 1;
2496       else
2497 	*overflow = ((resultl << (HOST_BITS_PER_WIDE_INT - precision))
2498 		     > (xl << (HOST_BITS_PER_WIDE_INT - precision)));
2499       val[0] = resultl;
2500       result.set_len (1);
2501     }
2502   else
2503     result.set_len (sub_large (val, xi.val, xi.len,
2504 			       yi.val, yi.len, precision,
2505 			       sgn, overflow));
2506   return result;
2507 }
2508 
2509 /* Return X * Y.  */
2510 template <typename T1, typename T2>
2511 inline WI_BINARY_RESULT (T1, T2)
2512 wi::mul (const T1 &x, const T2 &y)
2513 {
2514   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2515   unsigned int precision = get_precision (result);
2516   WIDE_INT_REF_FOR (T1) xi (x, precision);
2517   WIDE_INT_REF_FOR (T2) yi (y, precision);
2518   if (precision <= HOST_BITS_PER_WIDE_INT)
2519     {
2520       val[0] = xi.ulow () * yi.ulow ();
2521       result.set_len (1);
2522     }
2523   else
2524     result.set_len (mul_internal (val, xi.val, xi.len, yi.val, yi.len,
2525 				  precision, UNSIGNED, 0, false));
2526   return result;
2527 }
2528 
2529 /* Return X * Y.  Treat X and Y as having the signednes given by SGN
2530    and indicate in *OVERFLOW whether the operation overflowed.  */
2531 template <typename T1, typename T2>
2532 inline WI_BINARY_RESULT (T1, T2)
2533 wi::mul (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2534 {
2535   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2536   unsigned int precision = get_precision (result);
2537   WIDE_INT_REF_FOR (T1) xi (x, precision);
2538   WIDE_INT_REF_FOR (T2) yi (y, precision);
2539   result.set_len (mul_internal (val, xi.val, xi.len,
2540 				yi.val, yi.len, precision,
2541 				sgn, overflow, false));
2542   return result;
2543 }
2544 
2545 /* Return X * Y, treating both X and Y as signed values.  Indicate in
2546    *OVERFLOW whether the operation overflowed.  */
2547 template <typename T1, typename T2>
2548 inline WI_BINARY_RESULT (T1, T2)
2549 wi::smul (const T1 &x, const T2 &y, bool *overflow)
2550 {
2551   return mul (x, y, SIGNED, overflow);
2552 }
2553 
2554 /* Return X * Y, treating both X and Y as unsigned values.  Indicate in
2555    *OVERFLOW whether the operation overflowed.  */
2556 template <typename T1, typename T2>
2557 inline WI_BINARY_RESULT (T1, T2)
2558 wi::umul (const T1 &x, const T2 &y, bool *overflow)
2559 {
2560   return mul (x, y, UNSIGNED, overflow);
2561 }
2562 
2563 /* Perform a widening multiplication of X and Y, extending the values
2564    according to SGN, and return the high part of the result.  */
2565 template <typename T1, typename T2>
2566 inline WI_BINARY_RESULT (T1, T2)
2567 wi::mul_high (const T1 &x, const T2 &y, signop sgn)
2568 {
2569   WI_BINARY_RESULT_VAR (result, val, T1, x, T2, y);
2570   unsigned int precision = get_precision (result);
2571   WIDE_INT_REF_FOR (T1) xi (x, precision);
2572   WIDE_INT_REF_FOR (T2) yi (y, precision);
2573   result.set_len (mul_internal (val, xi.val, xi.len,
2574 				yi.val, yi.len, precision,
2575 				sgn, 0, true));
2576   return result;
2577 }
2578 
2579 /* Return X / Y, rouding towards 0.  Treat X and Y as having the
2580    signedness given by SGN.  Indicate in *OVERFLOW if the result
2581    overflows.  */
2582 template <typename T1, typename T2>
2583 inline WI_BINARY_RESULT (T1, T2)
2584 wi::div_trunc (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2585 {
2586   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2587   unsigned int precision = get_precision (quotient);
2588   WIDE_INT_REF_FOR (T1) xi (x, precision);
2589   WIDE_INT_REF_FOR (T2) yi (y);
2590 
2591   quotient.set_len (divmod_internal (quotient_val, 0, 0, xi.val, xi.len,
2592 				     precision,
2593 				     yi.val, yi.len, yi.precision,
2594 				     sgn, overflow));
2595   return quotient;
2596 }
2597 
2598 /* Return X / Y, rouding towards 0.  Treat X and Y as signed values.  */
2599 template <typename T1, typename T2>
2600 inline WI_BINARY_RESULT (T1, T2)
2601 wi::sdiv_trunc (const T1 &x, const T2 &y)
2602 {
2603   return div_trunc (x, y, SIGNED);
2604 }
2605 
2606 /* Return X / Y, rouding towards 0.  Treat X and Y as unsigned values.  */
2607 template <typename T1, typename T2>
2608 inline WI_BINARY_RESULT (T1, T2)
2609 wi::udiv_trunc (const T1 &x, const T2 &y)
2610 {
2611   return div_trunc (x, y, UNSIGNED);
2612 }
2613 
2614 /* Return X / Y, rouding towards -inf.  Treat X and Y as having the
2615    signedness given by SGN.  Indicate in *OVERFLOW if the result
2616    overflows.  */
2617 template <typename T1, typename T2>
2618 inline WI_BINARY_RESULT (T1, T2)
2619 wi::div_floor (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2620 {
2621   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2622   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2623   unsigned int precision = get_precision (quotient);
2624   WIDE_INT_REF_FOR (T1) xi (x, precision);
2625   WIDE_INT_REF_FOR (T2) yi (y);
2626 
2627   unsigned int remainder_len;
2628   quotient.set_len (divmod_internal (quotient_val,
2629 				     &remainder_len, remainder_val,
2630 				     xi.val, xi.len, precision,
2631 				     yi.val, yi.len, yi.precision, sgn,
2632 				     overflow));
2633   remainder.set_len (remainder_len);
2634   if (wi::neg_p (x, sgn) != wi::neg_p (y, sgn) && remainder != 0)
2635     return quotient - 1;
2636   return quotient;
2637 }
2638 
2639 /* Return X / Y, rouding towards -inf.  Treat X and Y as signed values.  */
2640 template <typename T1, typename T2>
2641 inline WI_BINARY_RESULT (T1, T2)
2642 wi::sdiv_floor (const T1 &x, const T2 &y)
2643 {
2644   return div_floor (x, y, SIGNED);
2645 }
2646 
2647 /* Return X / Y, rouding towards -inf.  Treat X and Y as unsigned values.  */
2648 /* ??? Why do we have both this and udiv_trunc.  Aren't they the same?  */
2649 template <typename T1, typename T2>
2650 inline WI_BINARY_RESULT (T1, T2)
2651 wi::udiv_floor (const T1 &x, const T2 &y)
2652 {
2653   return div_floor (x, y, UNSIGNED);
2654 }
2655 
2656 /* Return X / Y, rouding towards +inf.  Treat X and Y as having the
2657    signedness given by SGN.  Indicate in *OVERFLOW if the result
2658    overflows.  */
2659 template <typename T1, typename T2>
2660 inline WI_BINARY_RESULT (T1, T2)
2661 wi::div_ceil (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2662 {
2663   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2664   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2665   unsigned int precision = get_precision (quotient);
2666   WIDE_INT_REF_FOR (T1) xi (x, precision);
2667   WIDE_INT_REF_FOR (T2) yi (y);
2668 
2669   unsigned int remainder_len;
2670   quotient.set_len (divmod_internal (quotient_val,
2671 				     &remainder_len, remainder_val,
2672 				     xi.val, xi.len, precision,
2673 				     yi.val, yi.len, yi.precision, sgn,
2674 				     overflow));
2675   remainder.set_len (remainder_len);
2676   if (wi::neg_p (x, sgn) == wi::neg_p (y, sgn) && remainder != 0)
2677     return quotient + 1;
2678   return quotient;
2679 }
2680 
2681 /* Return X / Y, rouding towards +inf.  Treat X and Y as unsigned values.  */
2682 template <typename T1, typename T2>
2683 inline WI_BINARY_RESULT (T1, T2)
2684 wi::udiv_ceil (const T1 &x, const T2 &y)
2685 {
2686   return div_ceil (x, y, UNSIGNED);
2687 }
2688 
2689 /* Return X / Y, rouding towards nearest with ties away from zero.
2690    Treat X and Y as having the signedness given by SGN.  Indicate
2691    in *OVERFLOW if the result overflows.  */
2692 template <typename T1, typename T2>
2693 inline WI_BINARY_RESULT (T1, T2)
2694 wi::div_round (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2695 {
2696   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2697   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2698   unsigned int precision = get_precision (quotient);
2699   WIDE_INT_REF_FOR (T1) xi (x, precision);
2700   WIDE_INT_REF_FOR (T2) yi (y);
2701 
2702   unsigned int remainder_len;
2703   quotient.set_len (divmod_internal (quotient_val,
2704 				     &remainder_len, remainder_val,
2705 				     xi.val, xi.len, precision,
2706 				     yi.val, yi.len, yi.precision, sgn,
2707 				     overflow));
2708   remainder.set_len (remainder_len);
2709 
2710   if (remainder != 0)
2711     {
2712       if (sgn == SIGNED)
2713 	{
2714 	  WI_BINARY_RESULT (T1, T2) abs_remainder = wi::abs (remainder);
2715 	  if (wi::geu_p (abs_remainder, wi::sub (wi::abs (y), abs_remainder)))
2716 	    {
2717 	      if (wi::neg_p (x, sgn) != wi::neg_p (y, sgn))
2718 		return quotient - 1;
2719 	      else
2720 		return quotient + 1;
2721 	    }
2722 	}
2723       else
2724 	{
2725 	  if (wi::geu_p (remainder, wi::sub (y, remainder)))
2726 	    return quotient + 1;
2727 	}
2728     }
2729   return quotient;
2730 }
2731 
2732 /* Return X / Y, rouding towards 0.  Treat X and Y as having the
2733    signedness given by SGN.  Store the remainder in *REMAINDER_PTR.  */
2734 template <typename T1, typename T2>
2735 inline WI_BINARY_RESULT (T1, T2)
2736 wi::divmod_trunc (const T1 &x, const T2 &y, signop sgn,
2737 		  WI_BINARY_RESULT (T1, T2) *remainder_ptr)
2738 {
2739   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2740   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2741   unsigned int precision = get_precision (quotient);
2742   WIDE_INT_REF_FOR (T1) xi (x, precision);
2743   WIDE_INT_REF_FOR (T2) yi (y);
2744 
2745   unsigned int remainder_len;
2746   quotient.set_len (divmod_internal (quotient_val,
2747 				     &remainder_len, remainder_val,
2748 				     xi.val, xi.len, precision,
2749 				     yi.val, yi.len, yi.precision, sgn, 0));
2750   remainder.set_len (remainder_len);
2751 
2752   *remainder_ptr = remainder;
2753   return quotient;
2754 }
2755 
2756 /* Compute the greatest common divisor of two numbers A and B using
2757    Euclid's algorithm.  */
2758 template <typename T1, typename T2>
2759 inline WI_BINARY_RESULT (T1, T2)
2760 wi::gcd (const T1 &a, const T2 &b, signop sgn)
2761 {
2762   T1 x, y, z;
2763 
2764   x = wi::abs (a);
2765   y = wi::abs (b);
2766 
2767   while (gt_p (x, 0, sgn))
2768     {
2769       z = mod_trunc (y, x, sgn);
2770       y = x;
2771       x = z;
2772     }
2773 
2774   return y;
2775 }
2776 
2777 /* Compute X / Y, rouding towards 0, and return the remainder.
2778    Treat X and Y as having the signedness given by SGN.  Indicate
2779    in *OVERFLOW if the division overflows.  */
2780 template <typename T1, typename T2>
2781 inline WI_BINARY_RESULT (T1, T2)
2782 wi::mod_trunc (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2783 {
2784   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2785   unsigned int precision = get_precision (remainder);
2786   WIDE_INT_REF_FOR (T1) xi (x, precision);
2787   WIDE_INT_REF_FOR (T2) yi (y);
2788 
2789   unsigned int remainder_len;
2790   divmod_internal (0, &remainder_len, remainder_val,
2791 		   xi.val, xi.len, precision,
2792 		   yi.val, yi.len, yi.precision, sgn, overflow);
2793   remainder.set_len (remainder_len);
2794 
2795   return remainder;
2796 }
2797 
2798 /* Compute X / Y, rouding towards 0, and return the remainder.
2799    Treat X and Y as signed values.  */
2800 template <typename T1, typename T2>
2801 inline WI_BINARY_RESULT (T1, T2)
2802 wi::smod_trunc (const T1 &x, const T2 &y)
2803 {
2804   return mod_trunc (x, y, SIGNED);
2805 }
2806 
2807 /* Compute X / Y, rouding towards 0, and return the remainder.
2808    Treat X and Y as unsigned values.  */
2809 template <typename T1, typename T2>
2810 inline WI_BINARY_RESULT (T1, T2)
2811 wi::umod_trunc (const T1 &x, const T2 &y)
2812 {
2813   return mod_trunc (x, y, UNSIGNED);
2814 }
2815 
2816 /* Compute X / Y, rouding towards -inf, and return the remainder.
2817    Treat X and Y as having the signedness given by SGN.  Indicate
2818    in *OVERFLOW if the division overflows.  */
2819 template <typename T1, typename T2>
2820 inline WI_BINARY_RESULT (T1, T2)
2821 wi::mod_floor (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2822 {
2823   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2824   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2825   unsigned int precision = get_precision (quotient);
2826   WIDE_INT_REF_FOR (T1) xi (x, precision);
2827   WIDE_INT_REF_FOR (T2) yi (y);
2828 
2829   unsigned int remainder_len;
2830   quotient.set_len (divmod_internal (quotient_val,
2831 				     &remainder_len, remainder_val,
2832 				     xi.val, xi.len, precision,
2833 				     yi.val, yi.len, yi.precision, sgn,
2834 				     overflow));
2835   remainder.set_len (remainder_len);
2836 
2837   if (wi::neg_p (x, sgn) != wi::neg_p (y, sgn) && remainder != 0)
2838     return remainder + y;
2839   return remainder;
2840 }
2841 
2842 /* Compute X / Y, rouding towards -inf, and return the remainder.
2843    Treat X and Y as unsigned values.  */
2844 /* ??? Why do we have both this and umod_trunc.  Aren't they the same?  */
2845 template <typename T1, typename T2>
2846 inline WI_BINARY_RESULT (T1, T2)
2847 wi::umod_floor (const T1 &x, const T2 &y)
2848 {
2849   return mod_floor (x, y, UNSIGNED);
2850 }
2851 
2852 /* Compute X / Y, rouding towards +inf, and return the remainder.
2853    Treat X and Y as having the signedness given by SGN.  Indicate
2854    in *OVERFLOW if the division overflows.  */
2855 template <typename T1, typename T2>
2856 inline WI_BINARY_RESULT (T1, T2)
2857 wi::mod_ceil (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2858 {
2859   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2860   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2861   unsigned int precision = get_precision (quotient);
2862   WIDE_INT_REF_FOR (T1) xi (x, precision);
2863   WIDE_INT_REF_FOR (T2) yi (y);
2864 
2865   unsigned int remainder_len;
2866   quotient.set_len (divmod_internal (quotient_val,
2867 				     &remainder_len, remainder_val,
2868 				     xi.val, xi.len, precision,
2869 				     yi.val, yi.len, yi.precision, sgn,
2870 				     overflow));
2871   remainder.set_len (remainder_len);
2872 
2873   if (wi::neg_p (x, sgn) == wi::neg_p (y, sgn) && remainder != 0)
2874     return remainder - y;
2875   return remainder;
2876 }
2877 
2878 /* Compute X / Y, rouding towards nearest with ties away from zero,
2879    and return the remainder.  Treat X and Y as having the signedness
2880    given by SGN.  Indicate in *OVERFLOW if the division overflows.  */
2881 template <typename T1, typename T2>
2882 inline WI_BINARY_RESULT (T1, T2)
2883 wi::mod_round (const T1 &x, const T2 &y, signop sgn, bool *overflow)
2884 {
2885   WI_BINARY_RESULT_VAR (quotient, quotient_val, T1, x, T2, y);
2886   WI_BINARY_RESULT_VAR (remainder, remainder_val, T1, x, T2, y);
2887   unsigned int precision = get_precision (quotient);
2888   WIDE_INT_REF_FOR (T1) xi (x, precision);
2889   WIDE_INT_REF_FOR (T2) yi (y);
2890 
2891   unsigned int remainder_len;
2892   quotient.set_len (divmod_internal (quotient_val,
2893 				     &remainder_len, remainder_val,
2894 				     xi.val, xi.len, precision,
2895 				     yi.val, yi.len, yi.precision, sgn,
2896 				     overflow));
2897   remainder.set_len (remainder_len);
2898 
2899   if (remainder != 0)
2900     {
2901       if (sgn == SIGNED)
2902 	{
2903 	  WI_BINARY_RESULT (T1, T2) abs_remainder = wi::abs (remainder);
2904 	  if (wi::geu_p (abs_remainder, wi::sub (wi::abs (y), abs_remainder)))
2905 	    {
2906 	      if (wi::neg_p (x, sgn) != wi::neg_p (y, sgn))
2907 		return remainder + y;
2908 	      else
2909 		return remainder - y;
2910 	    }
2911 	}
2912       else
2913 	{
2914 	  if (wi::geu_p (remainder, wi::sub (y, remainder)))
2915 	    return remainder - y;
2916 	}
2917     }
2918   return remainder;
2919 }
2920 
2921 /* Return true if X is a multiple of Y.  Treat X and Y as having the
2922    signedness given by SGN.  */
2923 template <typename T1, typename T2>
2924 inline bool
2925 wi::multiple_of_p (const T1 &x, const T2 &y, signop sgn)
2926 {
2927   return wi::mod_trunc (x, y, sgn) == 0;
2928 }
2929 
2930 /* Return true if X is a multiple of Y, storing X / Y in *RES if so.
2931    Treat X and Y as having the signedness given by SGN.  */
2932 template <typename T1, typename T2>
2933 inline bool
2934 wi::multiple_of_p (const T1 &x, const T2 &y, signop sgn,
2935 		   WI_BINARY_RESULT (T1, T2) *res)
2936 {
2937   WI_BINARY_RESULT (T1, T2) remainder;
2938   WI_BINARY_RESULT (T1, T2) quotient
2939     = divmod_trunc (x, y, sgn, &remainder);
2940   if (remainder == 0)
2941     {
2942       *res = quotient;
2943       return true;
2944     }
2945   return false;
2946 }
2947 
2948 /* Return X << Y.  Return 0 if Y is greater than or equal to
2949    the precision of X.  */
2950 template <typename T1, typename T2>
2951 inline WI_UNARY_RESULT (T1)
2952 wi::lshift (const T1 &x, const T2 &y)
2953 {
2954   WI_UNARY_RESULT_VAR (result, val, T1, x);
2955   unsigned int precision = get_precision (result);
2956   WIDE_INT_REF_FOR (T1) xi (x, precision);
2957   WIDE_INT_REF_FOR (T2) yi (y);
2958   /* Handle the simple cases quickly.   */
2959   if (geu_p (yi, precision))
2960     {
2961       val[0] = 0;
2962       result.set_len (1);
2963     }
2964   else
2965     {
2966       unsigned int shift = yi.to_uhwi ();
2967       /* For fixed-precision integers like offset_int and widest_int,
2968 	 handle the case where the shift value is constant and the
2969 	 result is a single nonnegative HWI (meaning that we don't
2970 	 need to worry about val[1]).  This is particularly common
2971 	 for converting a byte count to a bit count.
2972 
2973 	 For variable-precision integers like wide_int, handle HWI
2974 	 and sub-HWI integers inline.  */
2975       if (STATIC_CONSTANT_P (xi.precision > HOST_BITS_PER_WIDE_INT)
2976 	  ? (STATIC_CONSTANT_P (shift < HOST_BITS_PER_WIDE_INT - 1)
2977 	     && xi.len == 1
2978 	     && xi.val[0] <= (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT)
2979 					      HOST_WIDE_INT_MAX >> shift))
2980 	  : precision <= HOST_BITS_PER_WIDE_INT)
2981 	{
2982 	  val[0] = xi.ulow () << shift;
2983 	  result.set_len (1);
2984 	}
2985       else
2986 	result.set_len (lshift_large (val, xi.val, xi.len,
2987 				      precision, shift));
2988     }
2989   return result;
2990 }
2991 
2992 /* Return X >> Y, using a logical shift.  Return 0 if Y is greater than
2993    or equal to the precision of X.  */
2994 template <typename T1, typename T2>
2995 inline WI_UNARY_RESULT (T1)
2996 wi::lrshift (const T1 &x, const T2 &y)
2997 {
2998   WI_UNARY_RESULT_VAR (result, val, T1, x);
2999   /* Do things in the precision of the input rather than the output,
3000      since the result can be no larger than that.  */
3001   WIDE_INT_REF_FOR (T1) xi (x);
3002   WIDE_INT_REF_FOR (T2) yi (y);
3003   /* Handle the simple cases quickly.   */
3004   if (geu_p (yi, xi.precision))
3005     {
3006       val[0] = 0;
3007       result.set_len (1);
3008     }
3009   else
3010     {
3011       unsigned int shift = yi.to_uhwi ();
3012       /* For fixed-precision integers like offset_int and widest_int,
3013 	 handle the case where the shift value is constant and the
3014 	 shifted value is a single nonnegative HWI (meaning that all
3015 	 bits above the HWI are zero).  This is particularly common
3016 	 for converting a bit count to a byte count.
3017 
3018 	 For variable-precision integers like wide_int, handle HWI
3019 	 and sub-HWI integers inline.  */
3020       if (STATIC_CONSTANT_P (xi.precision > HOST_BITS_PER_WIDE_INT)
3021 	  ? (shift < HOST_BITS_PER_WIDE_INT
3022 	     && xi.len == 1
3023 	     && xi.val[0] >= 0)
3024 	  : xi.precision <= HOST_BITS_PER_WIDE_INT)
3025 	{
3026 	  val[0] = xi.to_uhwi () >> shift;
3027 	  result.set_len (1);
3028 	}
3029       else
3030 	result.set_len (lrshift_large (val, xi.val, xi.len, xi.precision,
3031 				       get_precision (result), shift));
3032     }
3033   return result;
3034 }
3035 
3036 /* Return X >> Y, using an arithmetic shift.  Return a sign mask if
3037    Y is greater than or equal to the precision of X.  */
3038 template <typename T1, typename T2>
3039 inline WI_UNARY_RESULT (T1)
3040 wi::arshift (const T1 &x, const T2 &y)
3041 {
3042   WI_UNARY_RESULT_VAR (result, val, T1, x);
3043   /* Do things in the precision of the input rather than the output,
3044      since the result can be no larger than that.  */
3045   WIDE_INT_REF_FOR (T1) xi (x);
3046   WIDE_INT_REF_FOR (T2) yi (y);
3047   /* Handle the simple cases quickly.   */
3048   if (geu_p (yi, xi.precision))
3049     {
3050       val[0] = sign_mask (x);
3051       result.set_len (1);
3052     }
3053   else
3054     {
3055       unsigned int shift = yi.to_uhwi ();
3056       if (xi.precision <= HOST_BITS_PER_WIDE_INT)
3057 	{
3058 	  val[0] = sext_hwi (xi.ulow () >> shift, xi.precision - shift);
3059 	  result.set_len (1, true);
3060 	}
3061       else
3062 	result.set_len (arshift_large (val, xi.val, xi.len, xi.precision,
3063 				       get_precision (result), shift));
3064     }
3065   return result;
3066 }
3067 
3068 /* Return X >> Y, using an arithmetic shift if SGN is SIGNED and a
3069    logical shift otherwise.  */
3070 template <typename T1, typename T2>
3071 inline WI_UNARY_RESULT (T1)
3072 wi::rshift (const T1 &x, const T2 &y, signop sgn)
3073 {
3074   if (sgn == UNSIGNED)
3075     return lrshift (x, y);
3076   else
3077     return arshift (x, y);
3078 }
3079 
3080 /* Return the result of rotating the low WIDTH bits of X left by Y
3081    bits and zero-extending the result.  Use a full-width rotate if
3082    WIDTH is zero.  */
3083 template <typename T1, typename T2>
3084 WI_UNARY_RESULT (T1)
3085 wi::lrotate (const T1 &x, const T2 &y, unsigned int width)
3086 {
3087   unsigned int precision = get_binary_precision (x, x);
3088   if (width == 0)
3089     width = precision;
3090   WI_UNARY_RESULT (T2) ymod = umod_trunc (y, width);
3091   WI_UNARY_RESULT (T1) left = wi::lshift (x, ymod);
3092   WI_UNARY_RESULT (T1) right = wi::lrshift (x, wi::sub (width, ymod));
3093   if (width != precision)
3094     return wi::zext (left, width) | wi::zext (right, width);
3095   return left | right;
3096 }
3097 
3098 /* Return the result of rotating the low WIDTH bits of X right by Y
3099    bits and zero-extending the result.  Use a full-width rotate if
3100    WIDTH is zero.  */
3101 template <typename T1, typename T2>
3102 WI_UNARY_RESULT (T1)
3103 wi::rrotate (const T1 &x, const T2 &y, unsigned int width)
3104 {
3105   unsigned int precision = get_binary_precision (x, x);
3106   if (width == 0)
3107     width = precision;
3108   WI_UNARY_RESULT (T2) ymod = umod_trunc (y, width);
3109   WI_UNARY_RESULT (T1) right = wi::lrshift (x, ymod);
3110   WI_UNARY_RESULT (T1) left = wi::lshift (x, wi::sub (width, ymod));
3111   if (width != precision)
3112     return wi::zext (left, width) | wi::zext (right, width);
3113   return left | right;
3114 }
3115 
3116 /* Return 0 if the number of 1s in X is even and 1 if the number of 1s
3117    is odd.  */
3118 inline int
3119 wi::parity (const wide_int_ref &x)
3120 {
3121   return popcount (x) & 1;
3122 }
3123 
3124 /* Extract WIDTH bits from X, starting at BITPOS.  */
3125 template <typename T>
3126 inline unsigned HOST_WIDE_INT
3127 wi::extract_uhwi (const T &x, unsigned int bitpos, unsigned int width)
3128 {
3129   unsigned precision = get_precision (x);
3130   if (precision < bitpos + width)
3131     precision = bitpos + width;
3132   WIDE_INT_REF_FOR (T) xi (x, precision);
3133 
3134   /* Handle this rare case after the above, so that we assert about
3135      bogus BITPOS values.  */
3136   if (width == 0)
3137     return 0;
3138 
3139   unsigned int start = bitpos / HOST_BITS_PER_WIDE_INT;
3140   unsigned int shift = bitpos % HOST_BITS_PER_WIDE_INT;
3141   unsigned HOST_WIDE_INT res = xi.elt (start);
3142   res >>= shift;
3143   if (shift + width > HOST_BITS_PER_WIDE_INT)
3144     {
3145       unsigned HOST_WIDE_INT upper = xi.elt (start + 1);
3146       res |= upper << (-shift % HOST_BITS_PER_WIDE_INT);
3147     }
3148   return zext_hwi (res, width);
3149 }
3150 
3151 /* Return the minimum precision needed to store X with sign SGN.  */
3152 template <typename T>
3153 inline unsigned int
3154 wi::min_precision (const T &x, signop sgn)
3155 {
3156   if (sgn == SIGNED)
3157     return get_precision (x) - clrsb (x);
3158   else
3159     return get_precision (x) - clz (x);
3160 }
3161 
3162 #define SIGNED_BINARY_PREDICATE(OP, F)			\
3163   template <typename T1, typename T2>			\
3164     inline WI_SIGNED_BINARY_PREDICATE_RESULT (T1, T2)	\
3165     OP (const T1 &x, const T2 &y)			\
3166     {							\
3167       return wi::F (x, y);				\
3168     }
3169 
3170 SIGNED_BINARY_PREDICATE (operator <, lts_p)
3171 SIGNED_BINARY_PREDICATE (operator <=, les_p)
3172 SIGNED_BINARY_PREDICATE (operator >, gts_p)
3173 SIGNED_BINARY_PREDICATE (operator >=, ges_p)
3174 
3175 #undef SIGNED_BINARY_PREDICATE
3176 
3177 #define UNARY_OPERATOR(OP, F) \
3178   template<typename T> \
3179   WI_UNARY_RESULT (generic_wide_int<T>) \
3180   OP (const generic_wide_int<T> &x) \
3181   { \
3182     return wi::F (x); \
3183   }
3184 
3185 #define BINARY_PREDICATE(OP, F) \
3186   template<typename T1, typename T2> \
3187   WI_BINARY_PREDICATE_RESULT (T1, T2) \
3188   OP (const T1 &x, const T2 &y) \
3189   { \
3190     return wi::F (x, y); \
3191   }
3192 
3193 #define BINARY_OPERATOR(OP, F) \
3194   template<typename T1, typename T2> \
3195   WI_BINARY_OPERATOR_RESULT (T1, T2) \
3196   OP (const T1 &x, const T2 &y) \
3197   { \
3198     return wi::F (x, y); \
3199   }
3200 
3201 #define SHIFT_OPERATOR(OP, F) \
3202   template<typename T1, typename T2> \
3203   WI_BINARY_OPERATOR_RESULT (T1, T1) \
3204   OP (const T1 &x, const T2 &y) \
3205   { \
3206     return wi::F (x, y); \
3207   }
3208 
3209 UNARY_OPERATOR (operator ~, bit_not)
3210 UNARY_OPERATOR (operator -, neg)
3211 BINARY_PREDICATE (operator ==, eq_p)
3212 BINARY_PREDICATE (operator !=, ne_p)
3213 BINARY_OPERATOR (operator &, bit_and)
3214 BINARY_OPERATOR (operator |, bit_or)
3215 BINARY_OPERATOR (operator ^, bit_xor)
3216 BINARY_OPERATOR (operator +, add)
3217 BINARY_OPERATOR (operator -, sub)
3218 BINARY_OPERATOR (operator *, mul)
3219 SHIFT_OPERATOR (operator <<, lshift)
3220 
3221 #undef UNARY_OPERATOR
3222 #undef BINARY_PREDICATE
3223 #undef BINARY_OPERATOR
3224 #undef SHIFT_OPERATOR
3225 
3226 template <typename T1, typename T2>
3227 inline WI_SIGNED_SHIFT_RESULT (T1, T2)
3228 operator >> (const T1 &x, const T2 &y)
3229 {
3230   return wi::arshift (x, y);
3231 }
3232 
3233 template <typename T1, typename T2>
3234 inline WI_SIGNED_SHIFT_RESULT (T1, T2)
3235 operator / (const T1 &x, const T2 &y)
3236 {
3237   return wi::sdiv_trunc (x, y);
3238 }
3239 
3240 template <typename T1, typename T2>
3241 inline WI_SIGNED_SHIFT_RESULT (T1, T2)
3242 operator % (const T1 &x, const T2 &y)
3243 {
3244   return wi::smod_trunc (x, y);
3245 }
3246 
3247 template<typename T>
3248 void
3249 gt_ggc_mx (generic_wide_int <T> *)
3250 {
3251 }
3252 
3253 template<typename T>
3254 void
3255 gt_pch_nx (generic_wide_int <T> *)
3256 {
3257 }
3258 
3259 template<typename T>
3260 void
3261 gt_pch_nx (generic_wide_int <T> *, void (*) (void *, void *), void *)
3262 {
3263 }
3264 
3265 template<int N>
3266 void
3267 gt_ggc_mx (trailing_wide_ints <N> *)
3268 {
3269 }
3270 
3271 template<int N>
3272 void
3273 gt_pch_nx (trailing_wide_ints <N> *)
3274 {
3275 }
3276 
3277 template<int N>
3278 void
3279 gt_pch_nx (trailing_wide_ints <N> *, void (*) (void *, void *), void *)
3280 {
3281 }
3282 
3283 namespace wi
3284 {
3285   /* Used for overloaded functions in which the only other acceptable
3286      scalar type is a pointer.  It stops a plain 0 from being treated
3287      as a null pointer.  */
3288   struct never_used1 {};
3289   struct never_used2 {};
3290 
3291   wide_int min_value (unsigned int, signop);
3292   wide_int min_value (never_used1 *);
3293   wide_int min_value (never_used2 *);
3294   wide_int max_value (unsigned int, signop);
3295   wide_int max_value (never_used1 *);
3296   wide_int max_value (never_used2 *);
3297 
3298   /* FIXME: this is target dependent, so should be elsewhere.
3299      It also seems to assume that CHAR_BIT == BITS_PER_UNIT.  */
3300   wide_int from_buffer (const unsigned char *, unsigned int);
3301 
3302 #ifndef GENERATOR_FILE
3303   void to_mpz (const wide_int_ref &, mpz_t, signop);
3304 #endif
3305 
3306   wide_int mask (unsigned int, bool, unsigned int);
3307   wide_int shifted_mask (unsigned int, unsigned int, bool, unsigned int);
3308   wide_int set_bit_in_zero (unsigned int, unsigned int);
3309   wide_int insert (const wide_int &x, const wide_int &y, unsigned int,
3310 		   unsigned int);
3311   wide_int round_down_for_mask (const wide_int &, const wide_int &);
3312   wide_int round_up_for_mask (const wide_int &, const wide_int &);
3313 
3314   template <typename T>
3315   T mask (unsigned int, bool);
3316 
3317   template <typename T>
3318   T shifted_mask (unsigned int, unsigned int, bool);
3319 
3320   template <typename T>
3321   T set_bit_in_zero (unsigned int);
3322 
3323   unsigned int mask (HOST_WIDE_INT *, unsigned int, bool, unsigned int);
3324   unsigned int shifted_mask (HOST_WIDE_INT *, unsigned int, unsigned int,
3325 			     bool, unsigned int);
3326   unsigned int from_array (HOST_WIDE_INT *, const HOST_WIDE_INT *,
3327 			   unsigned int, unsigned int, bool);
3328 }
3329 
3330 /* Return a PRECISION-bit integer in which the low WIDTH bits are set
3331    and the other bits are clear, or the inverse if NEGATE_P.  */
3332 inline wide_int
3333 wi::mask (unsigned int width, bool negate_p, unsigned int precision)
3334 {
3335   wide_int result = wide_int::create (precision);
3336   result.set_len (mask (result.write_val (), width, negate_p, precision));
3337   return result;
3338 }
3339 
3340 /* Return a PRECISION-bit integer in which the low START bits are clear,
3341    the next WIDTH bits are set, and the other bits are clear,
3342    or the inverse if NEGATE_P.  */
3343 inline wide_int
3344 wi::shifted_mask (unsigned int start, unsigned int width, bool negate_p,
3345 		  unsigned int precision)
3346 {
3347   wide_int result = wide_int::create (precision);
3348   result.set_len (shifted_mask (result.write_val (), start, width, negate_p,
3349 				precision));
3350   return result;
3351 }
3352 
3353 /* Return a PRECISION-bit integer in which bit BIT is set and all the
3354    others are clear.  */
3355 inline wide_int
3356 wi::set_bit_in_zero (unsigned int bit, unsigned int precision)
3357 {
3358   return shifted_mask (bit, 1, false, precision);
3359 }
3360 
3361 /* Return an integer of type T in which the low WIDTH bits are set
3362    and the other bits are clear, or the inverse if NEGATE_P.  */
3363 template <typename T>
3364 inline T
3365 wi::mask (unsigned int width, bool negate_p)
3366 {
3367   STATIC_ASSERT (wi::int_traits<T>::precision);
3368   T result;
3369   result.set_len (mask (result.write_val (), width, negate_p,
3370 			wi::int_traits <T>::precision));
3371   return result;
3372 }
3373 
3374 /* Return an integer of type T in which the low START bits are clear,
3375    the next WIDTH bits are set, and the other bits are clear, or the
3376    inverse if NEGATE_P.  */
3377 template <typename T>
3378 inline T
3379 wi::shifted_mask (unsigned int start, unsigned int width, bool negate_p)
3380 {
3381   STATIC_ASSERT (wi::int_traits<T>::precision);
3382   T result;
3383   result.set_len (shifted_mask (result.write_val (), start, width,
3384 				negate_p,
3385 				wi::int_traits <T>::precision));
3386   return result;
3387 }
3388 
3389 /* Return an integer of type T in which bit BIT is set and all the
3390    others are clear.  */
3391 template <typename T>
3392 inline T
3393 wi::set_bit_in_zero (unsigned int bit)
3394 {
3395   return shifted_mask <T> (bit, 1, false);
3396 }
3397 
3398 #endif /* WIDE_INT_H */
3399