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