1 /* Operations on HOST_WIDE_INT.
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "diagnostic-core.h"
26 #if GCC_VERSION < 3004
28 /* The functions clz_hwi, ctz_hwi, ffs_hwi, floor_log2 and exact_log2
29 are defined as inline functions in hwint.h if GCC_VERSION >= 3004.
30 The definitions here are used for older versions of GCC and non-GCC
31 bootstrap compilers. */
33 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
34 If X is 0, return -1. */
37 floor_log2 (unsigned HOST_WIDE_INT x
)
44 if (HOST_BITS_PER_WIDE_INT
> 64)
45 if (x
>= (unsigned HOST_WIDE_INT
) 1 << (t
+ 64))
47 if (HOST_BITS_PER_WIDE_INT
> 32)
48 if (x
>= ((unsigned HOST_WIDE_INT
) 1) << (t
+ 32))
50 if (x
>= ((unsigned HOST_WIDE_INT
) 1) << (t
+ 16))
52 if (x
>= ((unsigned HOST_WIDE_INT
) 1) << (t
+ 8))
54 if (x
>= ((unsigned HOST_WIDE_INT
) 1) << (t
+ 4))
56 if (x
>= ((unsigned HOST_WIDE_INT
) 1) << (t
+ 2))
58 if (x
>= ((unsigned HOST_WIDE_INT
) 1) << (t
+ 1))
64 /* Return the logarithm of X, base 2, considering X unsigned,
65 if X is a power of 2. Otherwise, returns -1. */
68 exact_log2 (unsigned HOST_WIDE_INT x
)
72 return floor_log2 (x
);
75 /* Given X, an unsigned number, return the number of least significant bits
76 that are zero. When X == 0, the result is the word size. */
79 ctz_hwi (unsigned HOST_WIDE_INT x
)
81 return x
? floor_log2 (x
& -x
) : HOST_BITS_PER_WIDE_INT
;
84 /* Similarly for most significant bits. */
87 clz_hwi (unsigned HOST_WIDE_INT x
)
89 return HOST_BITS_PER_WIDE_INT
- 1 - floor_log2(x
);
92 /* Similar to ctz_hwi, except that the least significant bit is numbered
93 starting from 1, and X == 0 yields 0. */
96 ffs_hwi (unsigned HOST_WIDE_INT x
)
98 return 1 + floor_log2 (x
& -x
);
101 #endif /* GCC_VERSION < 3004 */
103 /* Compute the absolute value of X. */
106 abs_hwi (HOST_WIDE_INT x
)
108 gcc_checking_assert (x
!= HOST_WIDE_INT_MIN
);
109 return x
>= 0 ? x
: -x
;
112 /* Compute the greatest common divisor of two numbers A and B using
113 Euclid's algorithm. */
116 gcd (HOST_WIDE_INT a
, HOST_WIDE_INT b
)
118 HOST_WIDE_INT x
, y
, z
;
133 /* For X and Y positive integers, return X multiplied by Y and check
134 that the result does not overflow. */
137 pos_mul_hwi (HOST_WIDE_INT x
, HOST_WIDE_INT y
)
140 gcc_checking_assert ((HOST_WIDE_INT_MAX
) / x
>= y
);
145 /* Return X multiplied by Y and check that the result does not
149 mul_hwi (HOST_WIDE_INT x
, HOST_WIDE_INT y
)
151 gcc_checking_assert (x
!= HOST_WIDE_INT_MIN
152 && y
!= HOST_WIDE_INT_MIN
);
157 return pos_mul_hwi (x
, y
);
159 return -pos_mul_hwi (x
, -y
);
163 return -pos_mul_hwi (-x
, y
);
165 return pos_mul_hwi (-x
, -y
);
168 /* Compute the least common multiple of two numbers A and B . */
171 least_common_multiple (HOST_WIDE_INT a
, HOST_WIDE_INT b
)
173 return mul_hwi (abs_hwi (a
) / gcd (a
, b
), abs_hwi (b
));