GCC Middle and Back End API Reference
double-int.h
Go to the documentation of this file.
1 /* Operations with long integers.
2  Copyright (C) 2006-2013 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 DOUBLE_INT_H
21 #define DOUBLE_INT_H
22 
23 /* A large integer is currently represented as a pair of HOST_WIDE_INTs.
24  It therefore represents a number with precision of
25  2 * HOST_BITS_PER_WIDE_INT bits (it is however possible that the
26  internal representation will change, if numbers with greater precision
27  are needed, so the users should not rely on it). The representation does
28  not contain any information about signedness of the represented value, so
29  it can be used to represent both signed and unsigned numbers. For
30  operations where the results depend on signedness (division, comparisons),
31  it must be specified separately. For each such operation, there are three
32  versions of the function -- double_int_op, that takes an extra UNS argument
33  giving the signedness of the values, and double_int_sop and double_int_uop
34  that stand for its specializations for signed and unsigned values.
35 
36  You may also represent with numbers in smaller precision using double_int.
37  You however need to use double_int_ext (that fills in the bits of the
38  number over the prescribed precision with zeros or with the sign bit) before
39  operations that do not perform arithmetics modulo 2^precision (comparisons,
40  division), and possibly before storing the results, if you want to keep
41  them in some canonical form). In general, the signedness of double_int_ext
42  should match the signedness of the operation.
43 
44  ??? The components of double_int differ in signedness mostly for
45  historical reasons (they replace an older structure used to represent
46  numbers with precision higher than HOST_WIDE_INT). It might be less
47  confusing to have them both signed or both unsigned. */
48 
49 struct double_int
50 {
51  /* Normally, we would define constructors to create instances.
52  Two things prevent us from doing so.
53  First, defining a constructor makes the class non-POD in C++03,
54  and we certainly want double_int to be a POD.
55  Second, the GCC conding conventions prefer explicit conversion,
56  and explicit conversion operators are not available until C++11. */
57 
58  static double_int from_uhwi (unsigned HOST_WIDE_INT cst);
59  static double_int from_shwi (HOST_WIDE_INT cst);
61 
62  /* Construct from a fuffer of length LEN. BUFFER will be read according
63  to byte endianess and word endianess. */
64  static double_int from_buffer (const unsigned char *buffer, int len);
65 
66  /* No copy assignment operator or destructor to keep the type a POD. */
67 
68  /* There are some special value-creation static member functions. */
69 
70  static double_int mask (unsigned prec);
71  static double_int max_value (unsigned int prec, bool uns);
72  static double_int min_value (unsigned int prec, bool uns);
73 
74  /* The following functions are mutating operations. */
75 
76  double_int &operator ++ (); // prefix
77  double_int &operator -- (); // prefix
84 
85  /* The following functions are non-mutating operations. */
86 
87  /* Conversion functions. */
88 
89  HOST_WIDE_INT to_shwi () const;
90  unsigned HOST_WIDE_INT to_uhwi () const;
91 
92  /* Conversion query functions. */
93 
94  bool fits_uhwi () const;
95  bool fits_shwi () const;
96  bool fits_hwi (bool uns) const;
97 
98  /* Attribute query functions. */
99 
100  int trailing_zeros () const;
101  int popcount () const;
102 
103  /* Arithmetic query operations. */
104 
105  bool multiple_of (double_int, bool, double_int *) const;
106 
107  /* Arithmetic operation functions. */
108 
109  /* The following operations perform arithmetics modulo 2^precision, so you
110  do not need to call .ext between them, even if you are representing
111  numbers with precision less than HOST_BITS_PER_DOUBLE_INT bits. */
112 
113  double_int set_bit (unsigned) const;
114  double_int mul_with_sign (double_int, bool unsigned_p, bool *overflow) const;
115  double_int wide_mul_with_sign (double_int, bool unsigned_p,
116  double_int *higher, bool *overflow) const;
117  double_int add_with_sign (double_int, bool unsigned_p, bool *overflow) const;
118  double_int sub_with_overflow (double_int, bool *overflow) const;
119  double_int neg_with_overflow (bool *overflow) const;
120 
124  double_int operator - () const;
125  double_int operator ~ () const;
129  double_int and_not (double_int) const;
130 
132  double_int lshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const;
134  double_int rshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const;
135  double_int alshift (HOST_WIDE_INT count, unsigned int prec) const;
136  double_int arshift (HOST_WIDE_INT count, unsigned int prec) const;
137  double_int llshift (HOST_WIDE_INT count, unsigned int prec) const;
138  double_int lrshift (HOST_WIDE_INT count, unsigned int prec) const;
139  double_int lrotate (HOST_WIDE_INT count, unsigned int prec) const;
140  double_int rrotate (HOST_WIDE_INT count, unsigned int prec) const;
141 
142  /* You must ensure that double_int::ext is called on the operands
143  of the following operations, if the precision of the numbers
144  is less than HOST_BITS_PER_DOUBLE_INT bits. */
145 
146  double_int div (double_int, bool, unsigned) const;
147  double_int sdiv (double_int, unsigned) const;
148  double_int udiv (double_int, unsigned) const;
149  double_int mod (double_int, bool, unsigned) const;
150  double_int smod (double_int, unsigned) const;
151  double_int umod (double_int, unsigned) const;
152  double_int divmod_with_overflow (double_int, bool, unsigned,
153  double_int *, bool *) const;
154  double_int divmod (double_int, bool, unsigned, double_int *) const;
155  double_int sdivmod (double_int, unsigned, double_int *) const;
156  double_int udivmod (double_int, unsigned, double_int *) const;
157 
158  /* Precision control functions. */
159 
160  double_int ext (unsigned prec, bool uns) const;
161  double_int zext (unsigned prec) const;
162  double_int sext (unsigned prec) const;
163 
164  /* Comparative functions. */
165 
166  bool is_zero () const;
167  bool is_one () const;
168  bool is_minus_one () const;
169  bool is_negative () const;
170 
171  int cmp (double_int b, bool uns) const;
172  int ucmp (double_int b) const;
173  int scmp (double_int b) const;
174 
175  bool ult (double_int b) const;
176  bool ule (double_int b) const;
177  bool ugt (double_int b) const;
178  bool slt (double_int b) const;
179  bool sle (double_int b) const;
180  bool sgt (double_int b) const;
181 
182  double_int max (double_int b, bool uns);
185 
186  double_int min (double_int b, bool uns);
189 
190  bool operator == (double_int cst2) const;
191  bool operator != (double_int cst2) const;
192 
193  /* Please migrate away from using these member variables publicly. */
194 
195  unsigned HOST_WIDE_INT low;
197 
198 };
199 
200 #define HOST_BITS_PER_DOUBLE_INT (2 * HOST_BITS_PER_WIDE_INT)
201 
202 /* Constructors and conversions. */
203 
204 /* Constructs double_int from integer CST. The bits over the precision of
205  HOST_WIDE_INT are filled with the sign bit. */
206 
207 inline double_int
209 {
210  double_int r;
211  r.low = (unsigned HOST_WIDE_INT) cst;
212  r.high = cst < 0 ? -1 : 0;
213  return r;
214 }
215 
216 /* Some useful constants. */
217 /* FIXME(crowl): Maybe remove after converting callers?
218  The problem is that a named constant would not be as optimizable,
219  while the functional syntax is more verbose. */
220 
221 #define double_int_minus_one (double_int::from_shwi (-1))
222 #define double_int_zero (double_int::from_shwi (0))
223 #define double_int_one (double_int::from_shwi (1))
224 #define double_int_two (double_int::from_shwi (2))
225 #define double_int_ten (double_int::from_shwi (10))
226 
227 /* Constructs double_int from unsigned integer CST. The bits over the
228  precision of HOST_WIDE_INT are filled with zeros. */
229 
230 inline double_int
232 {
233  double_int r;
234  r.low = cst;
235  r.high = 0;
236  return r;
237 }
238 
239 inline double_int
241 {
242  double_int r;
243  r.low = low;
244  r.high = high;
245  return r;
246 }
247 
248 inline double_int &
250 {
251  *this += double_int_one;
252  return *this;
253 }
255 inline double_int &
257 {
258  *this -= double_int_one;
259  return *this;
260 }
261 
262 inline double_int &
264 {
265  *this = *this & b;
266  return *this;
267 }
268 
269 inline double_int &
271 {
272  *this = *this ^ b;
273  return *this;
274 }
275 
276 inline double_int &
278 {
279  *this = *this | b;
280  return *this;
281 }
282 
283 /* Returns value of CST as a signed number. CST must satisfy
284  double_int::fits_signed. */
285 
287 double_int::to_shwi () const
288 {
289  return (HOST_WIDE_INT) low;
290 }
291 
292 /* Returns value of CST as an unsigned number. CST must satisfy
293  double_int::fits_unsigned. */
294 
295 inline unsigned HOST_WIDE_INT
296 double_int::to_uhwi () const
297 {
298  return low;
299 }
301 /* Returns true if CST fits in unsigned HOST_WIDE_INT. */
302 
303 inline bool
304 double_int::fits_uhwi () const
305 {
306  return high == 0;
307 }
308 
309 /* Logical operations. */
310 
311 /* Returns ~A. */
312 
313 inline double_int
315 {
316  double_int result;
317  result.low = ~low;
318  result.high = ~high;
319  return result;
320 }
322 /* Returns A | B. */
323 
324 inline double_int
326 {
327  double_int result;
328  result.low = low | b.low;
329  result.high = high | b.high;
330  return result;
331 }
332 
333 /* Returns A & B. */
334 
335 inline double_int
337 {
338  double_int result;
339  result.low = low & b.low;
340  result.high = high & b.high;
341  return result;
342 }
343 
344 /* Returns A & ~B. */
345 
346 inline double_int
348 {
349  double_int result;
350  result.low = low & ~b.low;
351  result.high = high & ~b.high;
352  return result;
353 }
355 /* Returns A ^ B. */
356 
357 inline double_int
359 {
360  double_int result;
361  result.low = low ^ b.low;
362  result.high = high ^ b.high;
363  return result;
364 }
365 
366 void dump_double_int (FILE *, double_int, bool);
367 
368 #define ALL_ONES (~((unsigned HOST_WIDE_INT) 0))
369 
370 /* The operands of the following comparison functions must be processed
371  with double_int_ext, if their precision is less than
372  HOST_BITS_PER_DOUBLE_INT bits. */
373 
374 /* Returns true if CST is zero. */
375 
376 inline bool
377 double_int::is_zero () const
378 {
379  return low == 0 && high == 0;
380 }
381 
382 /* Returns true if CST is one. */
383 
384 inline bool
385 double_int::is_one () const
386 {
387  return low == 1 && high == 0;
388 }
389 
390 /* Returns true if CST is minus one. */
391 
392 inline bool
394 {
395  return low == ALL_ONES && high == -1;
396 }
397 
398 /* Returns true if CST is negative. */
399 
400 inline bool
402 {
403  return high < 0;
404 }
405 
406 /* Returns true if CST1 == CST2. */
407 
408 inline bool
410 {
411  return low == cst2.low && high == cst2.high;
412 }
413 
414 /* Returns true if CST1 != CST2. */
415 
416 inline bool
418 {
419  return low != cst2.low || high != cst2.high;
420 }
421 
422 /* Return number of set bits of CST. */
423 
424 inline int
425 double_int::popcount () const
426 {
427  return popcount_hwi (high) + popcount_hwi (low);
428 }
430 
431 #ifndef GENERATOR_FILE
432 /* Conversion to and from GMP integer representations. */
433 
434 void mpz_set_double_int (mpz_t, double_int, bool);
436 #endif
437 
438 #endif /* DOUBLE_INT_H */