LCOV - code coverage report
Current view: top level - gcc - hwint.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 22 22 100.0 %
Date: 2023-07-19 08:18:47 Functions: 2 2 100.0 %

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

Generated by: LCOV version 1.16