hwint.h 9.45 KB
Newer Older
1
/* HOST_WIDE_INT definitions for the GNU compiler.
2
   Copyright (C) 1998-2017 Free Software Foundation, Inc.
3

4
   This file is part of GCC.
5 6

   Provide definitions for macros which depend on HOST_BITS_PER_INT
7
   and HOST_BITS_PER_LONG.  */
8

9 10
#ifndef GCC_HWINT_H
#define GCC_HWINT_H
11

12 13 14 15 16 17
/* This describes the machine the compiler is hosted on.  */
#define HOST_BITS_PER_CHAR  CHAR_BIT
#define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT)
#define HOST_BITS_PER_INT   (CHAR_BIT * SIZEOF_INT)
#define HOST_BITS_PER_LONG  (CHAR_BIT * SIZEOF_LONG)

18
/* The string that should be inserted into a printf style format to
19
   indicate a "long" operand.  */
H.J. Lu committed
20
#ifndef HOST_LONG_FORMAT
21 22 23 24
#define HOST_LONG_FORMAT "l"
#endif

/* The string that should be inserted into a printf style format to
25
   indicate a "long long" operand.  */
H.J. Lu committed
26
#ifndef HOST_LONG_LONG_FORMAT
27 28 29
#define HOST_LONG_LONG_FORMAT "ll"
#endif

30 31 32 33 34 35 36 37 38 39
/* If HAVE_LONG_LONG and SIZEOF_LONG_LONG aren't defined, but
   GCC_VERSION >= 3000, assume this is the second or later stage of a
   bootstrap, we do have long long, and it's 64 bits.  (This is
   required by C99; we do have some ports that violate that assumption
   but they're all cross-compile-only.)  Just in case, force a
   constraint violation if that assumption is incorrect.  */
#if !defined HAVE_LONG_LONG
# if GCC_VERSION >= 3000
#  define HAVE_LONG_LONG 1
#  define SIZEOF_LONG_LONG 8
40
extern char sizeof_long_long_must_be_8[sizeof (long long) == 8 ? 1 : -1];
41 42 43
# endif
#endif

44 45
#ifdef HAVE_LONG_LONG
# define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG)
46
#endif
47

48
/* Set HOST_WIDE_INT, this should be always 64 bits.
49 50
   The underlying type is matched to that of int64_t and assumed
   to be either long or long long.  */
51

52
#define HOST_BITS_PER_WIDE_INT 64
53
#if INT64_T_IS_LONG   
54
#   define HOST_WIDE_INT long
55
#   define HOST_WIDE_INT_C(X) X ## L
56
#else
57
# if HOST_BITS_PER_LONGLONG == 64
58
#   define HOST_WIDE_INT long long
59
#   define HOST_WIDE_INT_C(X) X ## LL
60
# else
61
   #error "Unable to find a suitable type for HOST_WIDE_INT"
62
# endif
63
#endif
64

65
#define HOST_WIDE_INT_UC(X) HOST_WIDE_INT_C (X ## U)
66 67
#define HOST_WIDE_INT_0 HOST_WIDE_INT_C (0)
#define HOST_WIDE_INT_0U HOST_WIDE_INT_UC (0)
68 69 70 71
#define HOST_WIDE_INT_1 HOST_WIDE_INT_C (1)
#define HOST_WIDE_INT_1U HOST_WIDE_INT_UC (1)
#define HOST_WIDE_INT_M1 HOST_WIDE_INT_C (-1)
#define HOST_WIDE_INT_M1U HOST_WIDE_INT_UC (-1)
72

73 74 75 76 77
/* This is a magic identifier which allows GCC to figure out the type
   of HOST_WIDE_INT for %wd specifier checks.  You must issue this
   typedef before using the __asm_fprintf__ format attribute.  */
typedef HOST_WIDE_INT __gcc_host_wide_int__;

78 79
/* Provide C99 <inttypes.h> style format definitions for 64bits.  */
#ifndef HAVE_INTTYPES_H
80 81 82 83 84
#if INT64_T_IS_LONG
# define GCC_PRI64 HOST_LONG_FORMAT
#else
# define GCC_PRI64 HOST_LONG_LONG_FORMAT
#endif
85
#undef PRId64
86
#define PRId64 GCC_PRI64 "d"
87
#undef PRIi64
88
#define PRIi64 GCC_PRI64 "i"
89
#undef PRIo64
90
#define PRIo64 GCC_PRI64 "o"
91
#undef PRIu64
92
#define PRIu64 GCC_PRI64 "u"
93
#undef PRIx64
94
#define PRIx64 GCC_PRI64 "x"
95
#undef PRIX64
96
#define PRIX64 GCC_PRI64 "X"
97
#endif
98

99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
/* Various printf format strings for HOST_WIDE_INT.  */

#if INT64_T_IS_LONG
# define HOST_WIDE_INT_PRINT HOST_LONG_FORMAT
# define HOST_WIDE_INT_PRINT_C "L"
#else
# define HOST_WIDE_INT_PRINT HOST_LONG_LONG_FORMAT
# define HOST_WIDE_INT_PRINT_C "LL"
#endif

#define HOST_WIDE_INT_PRINT_DEC "%" PRId64
#define HOST_WIDE_INT_PRINT_DEC_C "%" PRId64 HOST_WIDE_INT_PRINT_C
#define HOST_WIDE_INT_PRINT_UNSIGNED "%" PRIu64
#define HOST_WIDE_INT_PRINT_HEX "%#" PRIx64
#define HOST_WIDE_INT_PRINT_HEX_PURE "%" PRIx64
#define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%" PRIx64 "%016" PRIx64
#define HOST_WIDE_INT_PRINT_PADDED_HEX "%016" PRIx64

117 118 119 120
/* Define HOST_WIDEST_FAST_INT to the widest integer type supported
   efficiently in hardware.  (That is, the widest integer type that fits
   in a hardware register.)  Normally this is "long" but on some hosts it
   should be "long long" or "__int64".  This is no convenient way to
121
   autodetect this, so such systems must set a flag in config.host; see there
122 123 124 125 126 127 128
   for details.  */

#ifdef USE_LONG_LONG_FOR_WIDEST_FAST_INT
#  ifdef HAVE_LONG_LONG
#    define HOST_WIDEST_FAST_INT long long
#    define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONGLONG
#  else
129
#    error "Your host said it wanted to use long long but that does not exist"
130 131 132 133 134 135
#  endif
#else
#  define HOST_WIDEST_FAST_INT long
#  define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONG
#endif

Joseph Myers committed
136
/* Inline functions operating on HOST_WIDE_INT.  */
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161

/* Return X with all but the lowest bit masked off.  */

static inline unsigned HOST_WIDE_INT
least_bit_hwi (unsigned HOST_WIDE_INT x)
{
  return (x & -x);
}

/* True if X is zero or a power of two.  */

static inline bool
pow2_or_zerop (unsigned HOST_WIDE_INT x)
{
  return least_bit_hwi (x) == x;
}

/* True if X is a power of two.  */

static inline bool
pow2p_hwi (unsigned HOST_WIDE_INT x)
{
  return x && pow2_or_zerop (x);
}

Joseph Myers committed
162 163 164 165 166 167
#if GCC_VERSION < 3004

extern int clz_hwi (unsigned HOST_WIDE_INT x);
extern int ctz_hwi (unsigned HOST_WIDE_INT x);
extern int ffs_hwi (unsigned HOST_WIDE_INT x);

168 169 170
/* Return the number of set bits in X.  */
extern int popcount_hwi (unsigned HOST_WIDE_INT x);

Joseph Myers committed
171 172 173 174 175 176
/* Return log2, or -1 if not exact.  */
extern int exact_log2                  (unsigned HOST_WIDE_INT);

/* Return floor of log2, with -1 for zero.  */
extern int floor_log2                  (unsigned HOST_WIDE_INT);

177 178 179
/* Return the smallest n such that 2**n >= X.  */
extern int ceil_log2			(unsigned HOST_WIDE_INT);

Joseph Myers committed
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
#else /* GCC_VERSION >= 3004 */

/* For convenience, define 0 -> word_size.  */
static inline int
clz_hwi (unsigned HOST_WIDE_INT x)
{
  if (x == 0)
    return HOST_BITS_PER_WIDE_INT;
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
  return __builtin_clzl (x);
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
  return __builtin_clzll (x);
# else
  return __builtin_clz (x);
# endif
}

static inline int
ctz_hwi (unsigned HOST_WIDE_INT x)
{
  if (x == 0)
    return HOST_BITS_PER_WIDE_INT;
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
  return __builtin_ctzl (x);
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
  return __builtin_ctzll (x);
# else
  return __builtin_ctz (x);
# endif
}

static inline int
ffs_hwi (unsigned HOST_WIDE_INT x)
{
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
  return __builtin_ffsl (x);
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
  return __builtin_ffsll (x);
# else
  return __builtin_ffs (x);
# endif
}

static inline int
224 225 226 227 228 229 230 231 232 233 234 235
popcount_hwi (unsigned HOST_WIDE_INT x)
{
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
  return __builtin_popcountl (x);
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
  return __builtin_popcountll (x);
# else
  return __builtin_popcount (x);
# endif
}

static inline int
Joseph Myers committed
236 237 238 239 240 241
floor_log2 (unsigned HOST_WIDE_INT x)
{
  return HOST_BITS_PER_WIDE_INT - 1 - clz_hwi (x);
}

static inline int
242 243 244 245 246 247
ceil_log2 (unsigned HOST_WIDE_INT x)
{
  return floor_log2 (x - 1) + 1;
}

static inline int
Joseph Myers committed
248 249
exact_log2 (unsigned HOST_WIDE_INT x)
{
250
  return pow2p_hwi (x) ? ctz_hwi (x) : -1;
Joseph Myers committed
251 252 253 254
}

#endif /* GCC_VERSION >= 3004 */

255
#define HOST_WIDE_INT_MIN (HOST_WIDE_INT) \
256
  (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1))
257 258 259
#define HOST_WIDE_INT_MAX (~(HOST_WIDE_INT_MIN))

extern HOST_WIDE_INT abs_hwi (HOST_WIDE_INT);
260
extern unsigned HOST_WIDE_INT absu_hwi (HOST_WIDE_INT);
261 262 263 264
extern HOST_WIDE_INT gcd (HOST_WIDE_INT, HOST_WIDE_INT);
extern HOST_WIDE_INT pos_mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
extern HOST_WIDE_INT mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
extern HOST_WIDE_INT least_common_multiple (HOST_WIDE_INT, HOST_WIDE_INT);
265

266 267 268 269 270 271 272 273
/* Like ctz_hwi, except 0 when x == 0.  */

static inline int
ctz_or_zero (unsigned HOST_WIDE_INT x)
{
  return ffs_hwi (x) - 1;
}

274 275 276 277 278 279 280 281
/* Sign extend SRC starting from PREC.  */

static inline HOST_WIDE_INT
sext_hwi (HOST_WIDE_INT src, unsigned int prec)
{
  if (prec == HOST_BITS_PER_WIDE_INT)
    return src;
  else
282
#if defined (__GNUC__)
283
    {
284 285 286 287 288
      /* Take the faster path if the implementation-defined bits it's relying
	 on are implemented the way we expect them to be.  Namely, conversion
	 from unsigned to signed preserves bit pattern, and right shift of
	 a signed value propagates the sign bit.
	 We have to convert from signed to unsigned and back, because when left
289
	 shifting signed values, any overflow is undefined behavior.  */
290
      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
291
      int shift = HOST_BITS_PER_WIDE_INT - prec;
292
      return ((HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) src << shift)) >> shift;
293
    }
294 295 296 297 298 299 300 301 302
#else
    {
      /* Fall back to the slower, well defined path otherwise.  */
      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
      HOST_WIDE_INT sign_mask = HOST_WIDE_INT_1 << (prec - 1);
      HOST_WIDE_INT value_mask = (HOST_WIDE_INT_1U << prec) - HOST_WIDE_INT_1U;
      return (((src & value_mask) ^ sign_mask) - sign_mask);
    }
#endif
303 304 305 306 307 308 309 310 311
}

/* Zero extend SRC starting from PREC.  */
static inline unsigned HOST_WIDE_INT
zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
{
  if (prec == HOST_BITS_PER_WIDE_INT)
    return src;
  else
312 313
    {
      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
314
      return src & ((HOST_WIDE_INT_1U << prec) - 1);
315
    }
316 317
}

318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
/* Compute the absolute value of X.  */

inline HOST_WIDE_INT
abs_hwi (HOST_WIDE_INT x)
{
  gcc_checking_assert (x != HOST_WIDE_INT_MIN);
  return x >= 0 ? x : -x;
}

/* Compute the absolute value of X as an unsigned type.  */

inline unsigned HOST_WIDE_INT
absu_hwi (HOST_WIDE_INT x)
{
  return x >= 0 ? (unsigned HOST_WIDE_INT)x : -(unsigned HOST_WIDE_INT)x;
}

335
#endif /* ! GCC_HWINT_H */