Mercurial > hg > CbC > CbC_gcc
annotate gcc/double-int.h @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
0 | 1 /* Operations with long integers. |
145 | 2 Copyright (C) 2006-2020 Free Software Foundation, Inc. |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
3 |
0 | 4 This file is part of GCC. |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
5 |
0 | 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. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
10 |
0 | 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. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
15 |
0 | 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 | |
111 | 49 struct double_int |
0 | 50 { |
111 | 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); | |
60 static double_int from_pair (HOST_WIDE_INT high, unsigned HOST_WIDE_INT low); | |
61 | |
62 /* Construct from a fuffer of length LEN. BUFFER will be read according | |
63 to byte endianness and word endianness. */ | |
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 | |
78 double_int &operator *= (double_int); | |
79 double_int &operator += (double_int); | |
80 double_int &operator -= (double_int); | |
81 double_int &operator &= (double_int); | |
82 double_int &operator ^= (double_int); | |
83 double_int &operator |= (double_int); | |
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 | |
121 double_int operator * (double_int) const; | |
122 double_int operator + (double_int) const; | |
123 double_int operator - (double_int) const; | |
124 double_int operator - () const; | |
125 double_int operator ~ () const; | |
126 double_int operator & (double_int) const; | |
127 double_int operator | (double_int) const; | |
128 double_int operator ^ (double_int) const; | |
129 double_int and_not (double_int) const; | |
130 | |
131 double_int lshift (HOST_WIDE_INT count) const; | |
132 double_int lshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const; | |
133 double_int rshift (HOST_WIDE_INT count) 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); | |
183 double_int smax (double_int b); | |
184 double_int umax (double_int b); | |
185 | |
186 double_int min (double_int b, bool uns); | |
187 double_int smin (double_int b); | |
188 double_int umin (double_int b); | |
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 | |
0 | 195 unsigned HOST_WIDE_INT low; |
196 HOST_WIDE_INT high; | |
111 | 197 |
198 }; | |
0 | 199 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
200 #define HOST_BITS_PER_DOUBLE_INT (2 * HOST_BITS_PER_WIDE_INT) |
0 | 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 | |
111 | 207 inline double_int |
208 double_int::from_shwi (HOST_WIDE_INT cst) | |
0 | 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. */ | |
111 | 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. */ | |
0 | 220 |
111 | 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)) | |
0 | 226 |
227 /* Constructs double_int from unsigned integer CST. The bits over the | |
228 precision of HOST_WIDE_INT are filled with zeros. */ | |
229 | |
111 | 230 inline double_int |
231 double_int::from_uhwi (unsigned HOST_WIDE_INT cst) | |
0 | 232 { |
233 double_int r; | |
234 r.low = cst; | |
235 r.high = 0; | |
111 | 236 return r; |
237 } | |
0 | 238 |
111 | 239 inline double_int |
240 double_int::from_pair (HOST_WIDE_INT high, unsigned HOST_WIDE_INT low) | |
241 { | |
242 double_int r; | |
243 r.low = low; | |
244 r.high = high; | |
0 | 245 return r; |
246 } | |
247 | |
111 | 248 inline double_int & |
249 double_int::operator ++ () | |
250 { | |
251 *this += double_int_one; | |
252 return *this; | |
253 } | |
254 | |
255 inline double_int & | |
256 double_int::operator -- () | |
257 { | |
258 *this -= double_int_one; | |
259 return *this; | |
260 } | |
261 | |
262 inline double_int & | |
263 double_int::operator &= (double_int b) | |
264 { | |
265 *this = *this & b; | |
266 return *this; | |
267 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
268 |
111 | 269 inline double_int & |
270 double_int::operator ^= (double_int b) | |
271 { | |
272 *this = *this ^ b; | |
273 return *this; | |
274 } | |
275 | |
276 inline double_int & | |
277 double_int::operator |= (double_int b) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
278 { |
111 | 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 | |
286 inline HOST_WIDE_INT | |
287 double_int::to_shwi () const | |
288 { | |
289 return (HOST_WIDE_INT) low; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
290 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
291 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
292 /* Returns value of CST as an unsigned number. CST must satisfy |
111 | 293 double_int::fits_unsigned. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
294 |
111 | 295 inline unsigned HOST_WIDE_INT |
296 double_int::to_uhwi () const | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
297 { |
111 | 298 return low; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
299 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
300 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
301 /* Returns true if CST fits in unsigned HOST_WIDE_INT. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
302 |
111 | 303 inline bool |
304 double_int::fits_uhwi () const | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
305 { |
111 | 306 return high == 0; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
307 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
308 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
309 /* Logical operations. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
310 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
311 /* Returns ~A. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
312 |
111 | 313 inline double_int |
314 double_int::operator ~ () const | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
315 { |
111 | 316 double_int result; |
317 result.low = ~low; | |
318 result.high = ~high; | |
319 return result; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
320 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
321 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
322 /* Returns A | B. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
323 |
111 | 324 inline double_int |
325 double_int::operator | (double_int b) const | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
326 { |
111 | 327 double_int result; |
328 result.low = low | b.low; | |
329 result.high = high | b.high; | |
330 return result; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
331 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
332 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
333 /* Returns A & B. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
334 |
111 | 335 inline double_int |
336 double_int::operator & (double_int b) const | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
337 { |
111 | 338 double_int result; |
339 result.low = low & b.low; | |
340 result.high = high & b.high; | |
341 return result; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
342 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
343 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
344 /* Returns A & ~B. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
345 |
111 | 346 inline double_int |
347 double_int::and_not (double_int b) const | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
348 { |
111 | 349 double_int result; |
350 result.low = low & ~b.low; | |
351 result.high = high & ~b.high; | |
352 return result; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
353 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
354 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
355 /* Returns A ^ B. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
356 |
111 | 357 inline double_int |
358 double_int::operator ^ (double_int b) const | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
359 { |
111 | 360 double_int result; |
361 result.low = low ^ b.low; | |
362 result.high = high ^ b.high; | |
363 return result; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
364 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
365 |
0 | 366 void dump_double_int (FILE *, double_int, bool); |
367 | |
111 | 368 #define ALL_ONES HOST_WIDE_INT_M1U |
0 | 369 |
370 /* The operands of the following comparison functions must be processed | |
371 with double_int_ext, if their precision is less than | |
111 | 372 HOST_BITS_PER_DOUBLE_INT bits. */ |
0 | 373 |
374 /* Returns true if CST is zero. */ | |
375 | |
111 | 376 inline bool |
377 double_int::is_zero () const | |
0 | 378 { |
111 | 379 return low == 0 && high == 0; |
0 | 380 } |
381 | |
382 /* Returns true if CST is one. */ | |
383 | |
111 | 384 inline bool |
385 double_int::is_one () const | |
0 | 386 { |
111 | 387 return low == 1 && high == 0; |
0 | 388 } |
389 | |
390 /* Returns true if CST is minus one. */ | |
391 | |
111 | 392 inline bool |
393 double_int::is_minus_one () const | |
0 | 394 { |
111 | 395 return low == ALL_ONES && high == -1; |
396 } | |
397 | |
398 /* Returns true if CST is negative. */ | |
399 | |
400 inline bool | |
401 double_int::is_negative () const | |
402 { | |
403 return high < 0; | |
0 | 404 } |
405 | |
406 /* Returns true if CST1 == CST2. */ | |
407 | |
111 | 408 inline bool |
409 double_int::operator == (double_int cst2) const | |
0 | 410 { |
111 | 411 return low == cst2.low && high == cst2.high; |
0 | 412 } |
413 | |
111 | 414 /* Returns true if CST1 != CST2. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
415 |
111 | 416 inline bool |
417 double_int::operator != (double_int cst2) const | |
418 { | |
419 return low != cst2.low || high != cst2.high; | |
420 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
421 |
111 | 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 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
429 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
430 |
0 | 431 #ifndef GENERATOR_FILE |
432 /* Conversion to and from GMP integer representations. */ | |
433 | |
434 void mpz_set_double_int (mpz_t, double_int, bool); | |
435 double_int mpz_get_double_int (const_tree, mpz_t, bool); | |
436 #endif | |
437 | |
111 | 438 namespace wi |
439 { | |
440 template <> | |
441 struct int_traits <double_int> | |
442 { | |
443 static const enum precision_type precision_type = CONST_PRECISION; | |
444 static const bool host_dependent_precision = true; | |
445 static const unsigned int precision = HOST_BITS_PER_DOUBLE_INT; | |
446 static unsigned int get_precision (const double_int &); | |
447 static wi::storage_ref decompose (HOST_WIDE_INT *, unsigned int, | |
448 const double_int &); | |
449 }; | |
450 } | |
451 | |
452 inline unsigned int | |
453 wi::int_traits <double_int>::get_precision (const double_int &) | |
454 { | |
455 return precision; | |
456 } | |
457 | |
458 inline wi::storage_ref | |
459 wi::int_traits <double_int>::decompose (HOST_WIDE_INT *scratch, unsigned int p, | |
460 const double_int &x) | |
461 { | |
462 gcc_checking_assert (precision == p); | |
463 scratch[0] = x.low; | |
464 if ((x.high == 0 && scratch[0] >= 0) || (x.high == -1 && scratch[0] < 0)) | |
465 return wi::storage_ref (scratch, 1, precision); | |
466 scratch[1] = x.high; | |
467 return wi::storage_ref (scratch, 2, precision); | |
468 } | |
469 | |
0 | 470 #endif /* DOUBLE_INT_H */ |