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