LCOV - code coverage report
Current view: top level - gcc - hwint.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 96.4 % 56 54
Test Date: 2026-02-28 14:20:25 Functions: 100.0 % 5 5
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* HOST_WIDE_INT definitions for the GNU compiler.
       2              :    Copyright (C) 1998-2026 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              : /* Similarly format modifier for printing size_t.  As not all hosts support
     119              :    z modifier in printf, use GCC_PRISZ and cast argument to fmt_size_t.
     120              :    So, instead of doing fprintf ("%zu\n", sizeof (x) * y); use
     121              :    fprintf (HOST_SIZE_T_PRINT_UNSIGNED "\n",
     122              :             (fmt_size_t) (sizeof (x) * y));  */
     123              : #if SIZE_MAX <= UINT_MAX
     124              : # define GCC_PRISZ ""
     125              : # define fmt_size_t unsigned int
     126              : #elif SIZE_MAX <= ULONG_MAX
     127              : # define GCC_PRISZ HOST_LONG_FORMAT
     128              : # define fmt_size_t unsigned long int
     129              : #else
     130              : # define GCC_PRISZ HOST_LONG_LONG_FORMAT
     131              : # define fmt_size_t unsigned long long int
     132              : #endif
     133              : 
     134              : #define HOST_SIZE_T_PRINT_DEC "%" GCC_PRISZ "d"
     135              : #define HOST_SIZE_T_PRINT_UNSIGNED "%" GCC_PRISZ "u"
     136              : #define HOST_SIZE_T_PRINT_HEX "%#" GCC_PRISZ "x"
     137              : #define HOST_SIZE_T_PRINT_HEX_PURE "%" GCC_PRISZ "x"
     138              : 
     139              : /* Define HOST_WIDEST_FAST_INT to the widest integer type supported
     140              :    efficiently in hardware.  (That is, the widest integer type that fits
     141              :    in a hardware register.)  Normally this is "long" but on some hosts it
     142              :    should be "long long" or "__int64".  This is no convenient way to
     143              :    autodetect this, so such systems must set a flag in config.host; see there
     144              :    for details.  */
     145              : 
     146              : #ifdef USE_LONG_LONG_FOR_WIDEST_FAST_INT
     147              : #  ifdef HAVE_LONG_LONG
     148              : #    define HOST_WIDEST_FAST_INT long long
     149              : #    define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONGLONG
     150              : #  else
     151              : #    error "Your host said it wanted to use long long but that does not exist"
     152              : #  endif
     153              : #else
     154              : #  define HOST_WIDEST_FAST_INT long
     155              : #  define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONG
     156              : #endif
     157              : 
     158              : /* Inline functions operating on HOST_WIDE_INT.  */
     159              : 
     160              : /* Return X with all but the lowest bit masked off.  */
     161              : 
     162              : inline unsigned HOST_WIDE_INT
     163   2526894409 : least_bit_hwi (unsigned HOST_WIDE_INT x)
     164              : {
     165   2526539312 :   return (x & -x);
     166              : }
     167              : 
     168              : /* True if X is zero or a power of two.  */
     169              : 
     170              : inline bool
     171   2448835602 : pow2_or_zerop (unsigned HOST_WIDE_INT x)
     172              : {
     173   2454565971 :   return least_bit_hwi (x) == x;
     174              : }
     175              : 
     176              : /* True if X is a power of two.  */
     177              : 
     178              : inline bool
     179    494295401 : pow2p_hwi (unsigned HOST_WIDE_INT x)
     180              : {
     181    491436512 :   return x && pow2_or_zerop (x);
     182              : }
     183              : 
     184              : #if GCC_VERSION < 3004
     185              : 
     186              : extern int clz_hwi (unsigned HOST_WIDE_INT x);
     187              : extern int ctz_hwi (unsigned HOST_WIDE_INT x);
     188              : extern int ffs_hwi (unsigned HOST_WIDE_INT x);
     189              : 
     190              : /* Return the number of set bits in X.  */
     191              : extern int popcount_hwi (unsigned HOST_WIDE_INT x);
     192              : 
     193              : /* Return log2, or -1 if not exact.  */
     194              : extern int exact_log2                  (unsigned HOST_WIDE_INT);
     195              : 
     196              : /* Return floor of log2, with -1 for zero.  */
     197              : extern int floor_log2                  (unsigned HOST_WIDE_INT);
     198              : 
     199              : /* Return the smallest n such that 2**n >= X.  */
     200              : extern int ceil_log2                    (unsigned HOST_WIDE_INT);
     201              : 
     202              : #else /* GCC_VERSION >= 3004 */
     203              : 
     204              : /* For convenience, define 0 -> word_size.  */
     205              : inline int
     206   4097230495 : clz_hwi (unsigned HOST_WIDE_INT x)
     207              : {
     208   3562499380 :   if (x == 0)
     209              :     return HOST_BITS_PER_WIDE_INT;
     210              : # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
     211   3585106497 :   return __builtin_clzl (x);
     212              : # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
     213              :   return __builtin_clzll (x);
     214              : # else
     215              :   return __builtin_clz (x);
     216              : # endif
     217              : }
     218              : 
     219              : inline int
     220   6165343817 : ctz_hwi (unsigned HOST_WIDE_INT x)
     221              : {
     222   5925265844 :   if (x == 0)
     223              :     return HOST_BITS_PER_WIDE_INT;
     224              : # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
     225   5845465866 :   return __builtin_ctzl (x);
     226              : # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
     227              :   return __builtin_ctzll (x);
     228              : # else
     229              :   return __builtin_ctz (x);
     230              : # endif
     231              : }
     232              : 
     233              : inline int
     234   5756425431 : ffs_hwi (unsigned HOST_WIDE_INT x)
     235              : {
     236              : # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
     237   5506698237 :   return __builtin_ffsl (x);
     238              : # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
     239              :   return __builtin_ffsll (x);
     240              : # else
     241              :   return __builtin_ffs (x);
     242              : # endif
     243              : }
     244              : 
     245              : inline int
     246    159487590 : popcount_hwi (unsigned HOST_WIDE_INT x)
     247              : {
     248              : # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
     249    159482024 :   return __builtin_popcountl (x);
     250              : # elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
     251              :   return __builtin_popcountll (x);
     252              : # else
     253              :   return __builtin_popcount (x);
     254              : # endif
     255              : }
     256              : 
     257              : inline int
     258   3294509975 : floor_log2 (unsigned HOST_WIDE_INT x)
     259              : {
     260   3612001242 :   return HOST_BITS_PER_WIDE_INT - 1 - clz_hwi (x);
     261              : }
     262              : 
     263              : inline int
     264     61202937 : ceil_log2 (unsigned HOST_WIDE_INT x)
     265              : {
     266     73617392 :   return x == 0 ? 0 : floor_log2 (x - 1) + 1;
     267              : }
     268              : 
     269              : inline int
     270    330181582 : exact_log2 (unsigned HOST_WIDE_INT x)
     271              : {
     272   1193375071 :   return pow2p_hwi (x) ? ctz_hwi (x) : -1;
     273              : }
     274              : 
     275              : #endif /* GCC_VERSION >= 3004 */
     276              : 
     277              : #define HOST_WIDE_INT_MIN (HOST_WIDE_INT) \
     278              :   (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1))
     279              : #define HOST_WIDE_INT_MAX (~(HOST_WIDE_INT_MIN))
     280              : 
     281              : extern HOST_WIDE_INT abs_hwi (HOST_WIDE_INT);
     282              : extern unsigned HOST_WIDE_INT absu_hwi (HOST_WIDE_INT);
     283              : extern HOST_WIDE_INT gcd (HOST_WIDE_INT, HOST_WIDE_INT);
     284              : extern HOST_WIDE_INT pos_mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
     285              : extern HOST_WIDE_INT mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
     286              : extern HOST_WIDE_INT least_common_multiple (HOST_WIDE_INT, HOST_WIDE_INT);
     287              : extern unsigned HOST_WIDE_INT reflect_hwi (unsigned HOST_WIDE_INT, unsigned);
     288              : 
     289              : /* Like ctz_hwi, except 0 when x == 0.  */
     290              : 
     291              : inline int
     292    100657122 : ctz_or_zero (unsigned HOST_WIDE_INT x)
     293              : {
     294    100657122 :   return ffs_hwi (x) - 1;
     295              : }
     296              : 
     297              : /* Sign extend SRC starting from PREC.  */
     298              : 
     299              : inline HOST_WIDE_INT
     300  26387230764 : sext_hwi (HOST_WIDE_INT src, unsigned int prec)
     301              : {
     302  26387230764 :   if (prec == HOST_BITS_PER_WIDE_INT)
     303              :     return src;
     304              :   else
     305              : #if defined (__GNUC__)
     306              :     {
     307              :       /* Take the faster path if the implementation-defined bits it's relying
     308              :          on are implemented the way we expect them to be.  Namely, conversion
     309              :          from unsigned to signed preserves bit pattern, and right shift of
     310              :          a signed value propagates the sign bit.
     311              :          We have to convert from signed to unsigned and back, because when left
     312              :          shifting signed values, any overflow is undefined behavior.  */
     313  24615382594 :       gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
     314  24615382594 :       int shift = HOST_BITS_PER_WIDE_INT - prec;
     315  24615382594 :       return ((HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) src << shift)) >> shift;
     316              :     }
     317              : #else
     318              :     {
     319              :       /* Fall back to the slower, well defined path otherwise.  */
     320              :       gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
     321              :       HOST_WIDE_INT sign_mask = HOST_WIDE_INT_1 << (prec - 1);
     322              :       HOST_WIDE_INT value_mask = (HOST_WIDE_INT_1U << prec) - HOST_WIDE_INT_1U;
     323              :       return (((src & value_mask) ^ sign_mask) - sign_mask);
     324              :     }
     325              : #endif
     326              : }
     327              : 
     328              : /* Zero extend SRC starting from PREC.  */
     329              : inline unsigned HOST_WIDE_INT
     330  17963065693 : zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
     331              : {
     332  17963065693 :   if (prec == HOST_BITS_PER_WIDE_INT)
     333              :     return src;
     334              :   else
     335              :     {
     336  17960829561 :       gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
     337  17960829561 :       return src & ((HOST_WIDE_INT_1U << prec) - 1);
     338              :     }
     339              : }
     340              : 
     341              : /* Compute the absolute value of X.  */
     342              : 
     343              : inline HOST_WIDE_INT
     344     65144130 : abs_hwi (HOST_WIDE_INT x)
     345              : {
     346     65144130 :   gcc_checking_assert (x != HOST_WIDE_INT_MIN);
     347     65144130 :   return x >= 0 ? x : -x;
     348              : }
     349              : 
     350              : /* Compute the absolute value of X as an unsigned type.  */
     351              : 
     352              : inline unsigned HOST_WIDE_INT
     353   7014536482 : absu_hwi (HOST_WIDE_INT x)
     354              : {
     355   6447222836 :   return x >= 0 ? (unsigned HOST_WIDE_INT)x : -(unsigned HOST_WIDE_INT)x;
     356              : }
     357              : 
     358              : /* Compute the sum of signed A and B and indicate in *OVERFLOW whether
     359              :    that operation overflowed.  */
     360              : 
     361              : inline HOST_WIDE_INT
     362     14072780 : add_hwi (HOST_WIDE_INT a, HOST_WIDE_INT b, bool *overflow)
     363              : {
     364              : #if GCC_VERSION < 11000
     365              :   unsigned HOST_WIDE_INT result = a + (unsigned HOST_WIDE_INT)b;
     366              :   if ((((result ^ a) & (result ^ b))
     367              :        >> (HOST_BITS_PER_WIDE_INT - 1)) & 1)
     368              :     *overflow = true;
     369              :   else
     370              :     *overflow = false;
     371              :   return result;
     372              : #else
     373     14072780 :   HOST_WIDE_INT result;
     374     14072780 :   *overflow = __builtin_add_overflow (a, b, &result);
     375     14072780 :   return result;
     376              : #endif
     377              : }
     378              : 
     379              : /* Compute the product of signed A and B and indicate in *OVERFLOW whether
     380              :    that operation overflowed.  */
     381              : 
     382              : inline HOST_WIDE_INT
     383      5079815 : mul_hwi (HOST_WIDE_INT a, HOST_WIDE_INT b, bool *overflow)
     384              : {
     385              : #if GCC_VERSION < 11000
     386              :   unsigned HOST_WIDE_INT result = a * (unsigned HOST_WIDE_INT)b;
     387              :   if ((a == -1 && b == HOST_WIDE_INT_MIN)
     388              :       || (a != 0 && (HOST_WIDE_INT)result / a != b))
     389              :     *overflow = true;
     390              :   else
     391              :     *overflow = false;
     392              :   return result;
     393              : #else
     394      5079815 :   HOST_WIDE_INT result;
     395      5079815 :   *overflow = __builtin_mul_overflow (a, b, &result);
     396      5079815 :   return result;
     397              : #endif
     398              : }
     399              : 
     400              : /* Compute the saturated sum of signed A and B, i.e. upon overflow clamp
     401              :    the result to the corresponding extremum.  */
     402              : 
     403              : inline HOST_WIDE_INT
     404      9011012 : add_sat_hwi (HOST_WIDE_INT a, HOST_WIDE_INT b)
     405              : {
     406      9011012 :   bool overflow;
     407      9011012 :   HOST_WIDE_INT result = add_hwi (a, b, &overflow);
     408      6568959 :   if (!overflow)
     409              :     return result;
     410            0 :   return (a < 0) ? HOST_WIDE_INT_MIN : HOST_WIDE_INT_MAX;
     411              : }
     412              : 
     413              : /* Compute the saturated product of signed A and B, i.e. upon overflow clamp
     414              :    the result to the corresponding extremum.  */
     415              : 
     416              : inline HOST_WIDE_INT
     417        18047 : mul_sat_hwi (HOST_WIDE_INT a, HOST_WIDE_INT b)
     418              : {
     419        18047 :   bool overflow;
     420        18047 :   HOST_WIDE_INT result = mul_hwi (a, b, &overflow);
     421        18047 :   if (!overflow)
     422              :     return result;
     423            0 :   return ((a < 0) != (b < 0)) ? HOST_WIDE_INT_MIN : HOST_WIDE_INT_MAX;
     424              : }
     425              : 
     426              : #endif /* ! GCC_HWINT_H */
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.