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