xref: /dflybsd-src/contrib/gcc-8.0/gcc/hwint.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* HOST_WIDE_INT definitions for the GNU compiler.
2*38fd1498Szrj    Copyright (C) 1998-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj    This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj    Provide definitions for macros which depend on HOST_BITS_PER_INT
7*38fd1498Szrj    and HOST_BITS_PER_LONG.  */
8*38fd1498Szrj 
9*38fd1498Szrj #ifndef GCC_HWINT_H
10*38fd1498Szrj #define GCC_HWINT_H
11*38fd1498Szrj 
12*38fd1498Szrj /* This describes the machine the compiler is hosted on.  */
13*38fd1498Szrj #define HOST_BITS_PER_CHAR  CHAR_BIT
14*38fd1498Szrj #define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT)
15*38fd1498Szrj #define HOST_BITS_PER_INT   (CHAR_BIT * SIZEOF_INT)
16*38fd1498Szrj #define HOST_BITS_PER_LONG  (CHAR_BIT * SIZEOF_LONG)
17*38fd1498Szrj #define HOST_BITS_PER_PTR   (CHAR_BIT * SIZEOF_VOID_P)
18*38fd1498Szrj 
19*38fd1498Szrj /* The string that should be inserted into a printf style format to
20*38fd1498Szrj    indicate a "long" operand.  */
21*38fd1498Szrj #ifndef HOST_LONG_FORMAT
22*38fd1498Szrj #define HOST_LONG_FORMAT "l"
23*38fd1498Szrj #endif
24*38fd1498Szrj 
25*38fd1498Szrj /* The string that should be inserted into a printf style format to
26*38fd1498Szrj    indicate a "long long" operand.  */
27*38fd1498Szrj #ifndef HOST_LONG_LONG_FORMAT
28*38fd1498Szrj #define HOST_LONG_LONG_FORMAT "ll"
29*38fd1498Szrj #endif
30*38fd1498Szrj 
31*38fd1498Szrj /* If HAVE_LONG_LONG and SIZEOF_LONG_LONG aren't defined, but
32*38fd1498Szrj    GCC_VERSION >= 3000, assume this is the second or later stage of a
33*38fd1498Szrj    bootstrap, we do have long long, and it's 64 bits.  (This is
34*38fd1498Szrj    required by C99; we do have some ports that violate that assumption
35*38fd1498Szrj    but they're all cross-compile-only.)  Just in case, force a
36*38fd1498Szrj    constraint violation if that assumption is incorrect.  */
37*38fd1498Szrj #if !defined HAVE_LONG_LONG
38*38fd1498Szrj # if GCC_VERSION >= 3000
39*38fd1498Szrj #  define HAVE_LONG_LONG 1
40*38fd1498Szrj #  define SIZEOF_LONG_LONG 8
41*38fd1498Szrj extern char sizeof_long_long_must_be_8[sizeof (long long) == 8 ? 1 : -1];
42*38fd1498Szrj # endif
43*38fd1498Szrj #endif
44*38fd1498Szrj 
45*38fd1498Szrj #ifdef HAVE_LONG_LONG
46*38fd1498Szrj # define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG)
47*38fd1498Szrj #endif
48*38fd1498Szrj 
49*38fd1498Szrj /* Set HOST_WIDE_INT, this should be always 64 bits.
50*38fd1498Szrj    The underlying type is matched to that of int64_t and assumed
51*38fd1498Szrj    to be either long or long long.  */
52*38fd1498Szrj 
53*38fd1498Szrj #define HOST_BITS_PER_WIDE_INT 64
54*38fd1498Szrj #if INT64_T_IS_LONG
55*38fd1498Szrj #   define HOST_WIDE_INT long
56*38fd1498Szrj #   define HOST_WIDE_INT_C(X) X ## L
57*38fd1498Szrj #else
58*38fd1498Szrj # if HOST_BITS_PER_LONGLONG == 64
59*38fd1498Szrj #   define HOST_WIDE_INT long long
60*38fd1498Szrj #   define HOST_WIDE_INT_C(X) X ## LL
61*38fd1498Szrj # else
62*38fd1498Szrj    #error "Unable to find a suitable type for HOST_WIDE_INT"
63*38fd1498Szrj # endif
64*38fd1498Szrj #endif
65*38fd1498Szrj 
66*38fd1498Szrj #define HOST_WIDE_INT_UC(X) HOST_WIDE_INT_C (X ## U)
67*38fd1498Szrj #define HOST_WIDE_INT_0 HOST_WIDE_INT_C (0)
68*38fd1498Szrj #define HOST_WIDE_INT_0U HOST_WIDE_INT_UC (0)
69*38fd1498Szrj #define HOST_WIDE_INT_1 HOST_WIDE_INT_C (1)
70*38fd1498Szrj #define HOST_WIDE_INT_1U HOST_WIDE_INT_UC (1)
71*38fd1498Szrj #define HOST_WIDE_INT_M1 HOST_WIDE_INT_C (-1)
72*38fd1498Szrj #define HOST_WIDE_INT_M1U HOST_WIDE_INT_UC (-1)
73*38fd1498Szrj 
74*38fd1498Szrj /* This is a magic identifier which allows GCC to figure out the type
75*38fd1498Szrj    of HOST_WIDE_INT for %wd specifier checks.  You must issue this
76*38fd1498Szrj    typedef before using the __asm_fprintf__ format attribute.  */
77*38fd1498Szrj typedef HOST_WIDE_INT __gcc_host_wide_int__;
78*38fd1498Szrj 
79*38fd1498Szrj /* Provide C99 <inttypes.h> style format definitions for 64bits.  */
80*38fd1498Szrj #ifndef HAVE_INTTYPES_H
81*38fd1498Szrj #if INT64_T_IS_LONG
82*38fd1498Szrj # define GCC_PRI64 HOST_LONG_FORMAT
83*38fd1498Szrj #else
84*38fd1498Szrj # define GCC_PRI64 HOST_LONG_LONG_FORMAT
85*38fd1498Szrj #endif
86*38fd1498Szrj #undef PRId64
87*38fd1498Szrj #define PRId64 GCC_PRI64 "d"
88*38fd1498Szrj #undef PRIi64
89*38fd1498Szrj #define PRIi64 GCC_PRI64 "i"
90*38fd1498Szrj #undef PRIo64
91*38fd1498Szrj #define PRIo64 GCC_PRI64 "o"
92*38fd1498Szrj #undef PRIu64
93*38fd1498Szrj #define PRIu64 GCC_PRI64 "u"
94*38fd1498Szrj #undef PRIx64
95*38fd1498Szrj #define PRIx64 GCC_PRI64 "x"
96*38fd1498Szrj #undef PRIX64
97*38fd1498Szrj #define PRIX64 GCC_PRI64 "X"
98*38fd1498Szrj #endif
99*38fd1498Szrj 
100*38fd1498Szrj /* Various printf format strings for HOST_WIDE_INT.  */
101*38fd1498Szrj 
102*38fd1498Szrj #if INT64_T_IS_LONG
103*38fd1498Szrj # define HOST_WIDE_INT_PRINT HOST_LONG_FORMAT
104*38fd1498Szrj # define HOST_WIDE_INT_PRINT_C "L"
105*38fd1498Szrj #else
106*38fd1498Szrj # define HOST_WIDE_INT_PRINT HOST_LONG_LONG_FORMAT
107*38fd1498Szrj # define HOST_WIDE_INT_PRINT_C "LL"
108*38fd1498Szrj #endif
109*38fd1498Szrj 
110*38fd1498Szrj #define HOST_WIDE_INT_PRINT_DEC "%" PRId64
111*38fd1498Szrj #define HOST_WIDE_INT_PRINT_DEC_C "%" PRId64 HOST_WIDE_INT_PRINT_C
112*38fd1498Szrj #define HOST_WIDE_INT_PRINT_UNSIGNED "%" PRIu64
113*38fd1498Szrj #define HOST_WIDE_INT_PRINT_HEX "%#" PRIx64
114*38fd1498Szrj #define HOST_WIDE_INT_PRINT_HEX_PURE "%" PRIx64
115*38fd1498Szrj #define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%" PRIx64 "%016" PRIx64
116*38fd1498Szrj #define HOST_WIDE_INT_PRINT_PADDED_HEX "%016" PRIx64
117*38fd1498Szrj 
118*38fd1498Szrj /* Define HOST_WIDEST_FAST_INT to the widest integer type supported
119*38fd1498Szrj    efficiently in hardware.  (That is, the widest integer type that fits
120*38fd1498Szrj    in a hardware register.)  Normally this is "long" but on some hosts it
121*38fd1498Szrj    should be "long long" or "__int64".  This is no convenient way to
122*38fd1498Szrj    autodetect this, so such systems must set a flag in config.host; see there
123*38fd1498Szrj    for details.  */
124*38fd1498Szrj 
125*38fd1498Szrj #ifdef USE_LONG_LONG_FOR_WIDEST_FAST_INT
126*38fd1498Szrj #  ifdef HAVE_LONG_LONG
127*38fd1498Szrj #    define HOST_WIDEST_FAST_INT long long
128*38fd1498Szrj #    define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONGLONG
129*38fd1498Szrj #  else
130*38fd1498Szrj #    error "Your host said it wanted to use long long but that does not exist"
131*38fd1498Szrj #  endif
132*38fd1498Szrj #else
133*38fd1498Szrj #  define HOST_WIDEST_FAST_INT long
134*38fd1498Szrj #  define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONG
135*38fd1498Szrj #endif
136*38fd1498Szrj 
137*38fd1498Szrj /* Inline functions operating on HOST_WIDE_INT.  */
138*38fd1498Szrj 
139*38fd1498Szrj /* Return X with all but the lowest bit masked off.  */
140*38fd1498Szrj 
141*38fd1498Szrj static inline unsigned HOST_WIDE_INT
least_bit_hwi(unsigned HOST_WIDE_INT x)142*38fd1498Szrj least_bit_hwi (unsigned HOST_WIDE_INT x)
143*38fd1498Szrj {
144*38fd1498Szrj   return (x & -x);
145*38fd1498Szrj }
146*38fd1498Szrj 
147*38fd1498Szrj /* True if X is zero or a power of two.  */
148*38fd1498Szrj 
149*38fd1498Szrj static inline bool
pow2_or_zerop(unsigned HOST_WIDE_INT x)150*38fd1498Szrj pow2_or_zerop (unsigned HOST_WIDE_INT x)
151*38fd1498Szrj {
152*38fd1498Szrj   return least_bit_hwi (x) == x;
153*38fd1498Szrj }
154*38fd1498Szrj 
155*38fd1498Szrj /* True if X is a power of two.  */
156*38fd1498Szrj 
157*38fd1498Szrj static inline bool
pow2p_hwi(unsigned HOST_WIDE_INT x)158*38fd1498Szrj pow2p_hwi (unsigned HOST_WIDE_INT x)
159*38fd1498Szrj {
160*38fd1498Szrj   return x && pow2_or_zerop (x);
161*38fd1498Szrj }
162*38fd1498Szrj 
163*38fd1498Szrj #if GCC_VERSION < 3004
164*38fd1498Szrj 
165*38fd1498Szrj extern int clz_hwi (unsigned HOST_WIDE_INT x);
166*38fd1498Szrj extern int ctz_hwi (unsigned HOST_WIDE_INT x);
167*38fd1498Szrj extern int ffs_hwi (unsigned HOST_WIDE_INT x);
168*38fd1498Szrj 
169*38fd1498Szrj /* Return the number of set bits in X.  */
170*38fd1498Szrj extern int popcount_hwi (unsigned HOST_WIDE_INT x);
171*38fd1498Szrj 
172*38fd1498Szrj /* Return log2, or -1 if not exact.  */
173*38fd1498Szrj extern int exact_log2                  (unsigned HOST_WIDE_INT);
174*38fd1498Szrj 
175*38fd1498Szrj /* Return floor of log2, with -1 for zero.  */
176*38fd1498Szrj extern int floor_log2                  (unsigned HOST_WIDE_INT);
177*38fd1498Szrj 
178*38fd1498Szrj /* Return the smallest n such that 2**n >= X.  */
179*38fd1498Szrj extern int ceil_log2			(unsigned HOST_WIDE_INT);
180*38fd1498Szrj 
181*38fd1498Szrj #else /* GCC_VERSION >= 3004 */
182*38fd1498Szrj 
183*38fd1498Szrj /* For convenience, define 0 -> word_size.  */
184*38fd1498Szrj static inline int
clz_hwi(unsigned HOST_WIDE_INT x)185*38fd1498Szrj clz_hwi (unsigned HOST_WIDE_INT x)
186*38fd1498Szrj {
187*38fd1498Szrj   if (x == 0)
188*38fd1498Szrj     return HOST_BITS_PER_WIDE_INT;
189*38fd1498Szrj # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
190*38fd1498Szrj   return __builtin_clzl (x);
191*38fd1498Szrj # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
192*38fd1498Szrj   return __builtin_clzll (x);
193*38fd1498Szrj # else
194*38fd1498Szrj   return __builtin_clz (x);
195*38fd1498Szrj # endif
196*38fd1498Szrj }
197*38fd1498Szrj 
198*38fd1498Szrj static inline int
ctz_hwi(unsigned HOST_WIDE_INT x)199*38fd1498Szrj ctz_hwi (unsigned HOST_WIDE_INT x)
200*38fd1498Szrj {
201*38fd1498Szrj   if (x == 0)
202*38fd1498Szrj     return HOST_BITS_PER_WIDE_INT;
203*38fd1498Szrj # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
204*38fd1498Szrj   return __builtin_ctzl (x);
205*38fd1498Szrj # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
206*38fd1498Szrj   return __builtin_ctzll (x);
207*38fd1498Szrj # else
208*38fd1498Szrj   return __builtin_ctz (x);
209*38fd1498Szrj # endif
210*38fd1498Szrj }
211*38fd1498Szrj 
212*38fd1498Szrj static inline int
ffs_hwi(unsigned HOST_WIDE_INT x)213*38fd1498Szrj ffs_hwi (unsigned HOST_WIDE_INT x)
214*38fd1498Szrj {
215*38fd1498Szrj # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
216*38fd1498Szrj   return __builtin_ffsl (x);
217*38fd1498Szrj # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
218*38fd1498Szrj   return __builtin_ffsll (x);
219*38fd1498Szrj # else
220*38fd1498Szrj   return __builtin_ffs (x);
221*38fd1498Szrj # endif
222*38fd1498Szrj }
223*38fd1498Szrj 
224*38fd1498Szrj static inline int
popcount_hwi(unsigned HOST_WIDE_INT x)225*38fd1498Szrj popcount_hwi (unsigned HOST_WIDE_INT x)
226*38fd1498Szrj {
227*38fd1498Szrj # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
228*38fd1498Szrj   return __builtin_popcountl (x);
229*38fd1498Szrj # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
230*38fd1498Szrj   return __builtin_popcountll (x);
231*38fd1498Szrj # else
232*38fd1498Szrj   return __builtin_popcount (x);
233*38fd1498Szrj # endif
234*38fd1498Szrj }
235*38fd1498Szrj 
236*38fd1498Szrj static inline int
floor_log2(unsigned HOST_WIDE_INT x)237*38fd1498Szrj floor_log2 (unsigned HOST_WIDE_INT x)
238*38fd1498Szrj {
239*38fd1498Szrj   return HOST_BITS_PER_WIDE_INT - 1 - clz_hwi (x);
240*38fd1498Szrj }
241*38fd1498Szrj 
242*38fd1498Szrj static inline int
ceil_log2(unsigned HOST_WIDE_INT x)243*38fd1498Szrj ceil_log2 (unsigned HOST_WIDE_INT x)
244*38fd1498Szrj {
245*38fd1498Szrj   return floor_log2 (x - 1) + 1;
246*38fd1498Szrj }
247*38fd1498Szrj 
248*38fd1498Szrj static inline int
exact_log2(unsigned HOST_WIDE_INT x)249*38fd1498Szrj exact_log2 (unsigned HOST_WIDE_INT x)
250*38fd1498Szrj {
251*38fd1498Szrj   return pow2p_hwi (x) ? ctz_hwi (x) : -1;
252*38fd1498Szrj }
253*38fd1498Szrj 
254*38fd1498Szrj #endif /* GCC_VERSION >= 3004 */
255*38fd1498Szrj 
256*38fd1498Szrj #define HOST_WIDE_INT_MIN (HOST_WIDE_INT) \
257*38fd1498Szrj   (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1))
258*38fd1498Szrj #define HOST_WIDE_INT_MAX (~(HOST_WIDE_INT_MIN))
259*38fd1498Szrj 
260*38fd1498Szrj extern HOST_WIDE_INT abs_hwi (HOST_WIDE_INT);
261*38fd1498Szrj extern unsigned HOST_WIDE_INT absu_hwi (HOST_WIDE_INT);
262*38fd1498Szrj extern HOST_WIDE_INT gcd (HOST_WIDE_INT, HOST_WIDE_INT);
263*38fd1498Szrj extern HOST_WIDE_INT pos_mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
264*38fd1498Szrj extern HOST_WIDE_INT mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
265*38fd1498Szrj extern HOST_WIDE_INT least_common_multiple (HOST_WIDE_INT, HOST_WIDE_INT);
266*38fd1498Szrj 
267*38fd1498Szrj /* Like ctz_hwi, except 0 when x == 0.  */
268*38fd1498Szrj 
269*38fd1498Szrj static inline int
ctz_or_zero(unsigned HOST_WIDE_INT x)270*38fd1498Szrj ctz_or_zero (unsigned HOST_WIDE_INT x)
271*38fd1498Szrj {
272*38fd1498Szrj   return ffs_hwi (x) - 1;
273*38fd1498Szrj }
274*38fd1498Szrj 
275*38fd1498Szrj /* Sign extend SRC starting from PREC.  */
276*38fd1498Szrj 
277*38fd1498Szrj static inline HOST_WIDE_INT
sext_hwi(HOST_WIDE_INT src,unsigned int prec)278*38fd1498Szrj sext_hwi (HOST_WIDE_INT src, unsigned int prec)
279*38fd1498Szrj {
280*38fd1498Szrj   if (prec == HOST_BITS_PER_WIDE_INT)
281*38fd1498Szrj     return src;
282*38fd1498Szrj   else
283*38fd1498Szrj #if defined (__GNUC__)
284*38fd1498Szrj     {
285*38fd1498Szrj       /* Take the faster path if the implementation-defined bits it's relying
286*38fd1498Szrj 	 on are implemented the way we expect them to be.  Namely, conversion
287*38fd1498Szrj 	 from unsigned to signed preserves bit pattern, and right shift of
288*38fd1498Szrj 	 a signed value propagates the sign bit.
289*38fd1498Szrj 	 We have to convert from signed to unsigned and back, because when left
290*38fd1498Szrj 	 shifting signed values, any overflow is undefined behavior.  */
291*38fd1498Szrj       gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
292*38fd1498Szrj       int shift = HOST_BITS_PER_WIDE_INT - prec;
293*38fd1498Szrj       return ((HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) src << shift)) >> shift;
294*38fd1498Szrj     }
295*38fd1498Szrj #else
296*38fd1498Szrj     {
297*38fd1498Szrj       /* Fall back to the slower, well defined path otherwise.  */
298*38fd1498Szrj       gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
299*38fd1498Szrj       HOST_WIDE_INT sign_mask = HOST_WIDE_INT_1 << (prec - 1);
300*38fd1498Szrj       HOST_WIDE_INT value_mask = (HOST_WIDE_INT_1U << prec) - HOST_WIDE_INT_1U;
301*38fd1498Szrj       return (((src & value_mask) ^ sign_mask) - sign_mask);
302*38fd1498Szrj     }
303*38fd1498Szrj #endif
304*38fd1498Szrj }
305*38fd1498Szrj 
306*38fd1498Szrj /* Zero extend SRC starting from PREC.  */
307*38fd1498Szrj static inline unsigned HOST_WIDE_INT
zext_hwi(unsigned HOST_WIDE_INT src,unsigned int prec)308*38fd1498Szrj zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
309*38fd1498Szrj {
310*38fd1498Szrj   if (prec == HOST_BITS_PER_WIDE_INT)
311*38fd1498Szrj     return src;
312*38fd1498Szrj   else
313*38fd1498Szrj     {
314*38fd1498Szrj       gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
315*38fd1498Szrj       return src & ((HOST_WIDE_INT_1U << prec) - 1);
316*38fd1498Szrj     }
317*38fd1498Szrj }
318*38fd1498Szrj 
319*38fd1498Szrj /* Compute the absolute value of X.  */
320*38fd1498Szrj 
321*38fd1498Szrj inline HOST_WIDE_INT
abs_hwi(HOST_WIDE_INT x)322*38fd1498Szrj abs_hwi (HOST_WIDE_INT x)
323*38fd1498Szrj {
324*38fd1498Szrj   gcc_checking_assert (x != HOST_WIDE_INT_MIN);
325*38fd1498Szrj   return x >= 0 ? x : -x;
326*38fd1498Szrj }
327*38fd1498Szrj 
328*38fd1498Szrj /* Compute the absolute value of X as an unsigned type.  */
329*38fd1498Szrj 
330*38fd1498Szrj inline unsigned HOST_WIDE_INT
absu_hwi(HOST_WIDE_INT x)331*38fd1498Szrj absu_hwi (HOST_WIDE_INT x)
332*38fd1498Szrj {
333*38fd1498Szrj   return x >= 0 ? (unsigned HOST_WIDE_INT)x : -(unsigned HOST_WIDE_INT)x;
334*38fd1498Szrj }
335*38fd1498Szrj 
336*38fd1498Szrj #endif /* ! GCC_HWINT_H */
337