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

            Line data    Source code
       1              : /* Sets (bit vectors) of hard registers, and operations on them.
       2              :    Copyright (C) 1987-2026 Free Software Foundation, Inc.
       3              : 
       4              : This file is part of GCC
       5              : 
       6              : GCC is free software; you can redistribute it and/or modify it under
       7              : the terms of the GNU General Public License as published by the Free
       8              : Software Foundation; either version 3, or (at your option) any later
       9              : version.
      10              : 
      11              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14              : for more details.
      15              : 
      16              : You should have received a copy of the GNU General Public License
      17              : along with GCC; see the file COPYING3.  If not see
      18              : <http://www.gnu.org/licenses/>.  */
      19              : 
      20              : #ifndef GCC_HARD_REG_SET_H
      21              : #define GCC_HARD_REG_SET_H
      22              : 
      23              : #include "array-traits.h"
      24              : 
      25              : /* Define the type of a set of hard registers.  */
      26              : 
      27              : /* HARD_REG_ELT_TYPE is a typedef of the unsigned integral type which
      28              :    will be used for hard reg sets, either alone or in an array.
      29              : 
      30              :    If HARD_REG_SET is a macro, its definition is HARD_REG_ELT_TYPE,
      31              :    and it has enough bits to represent all the target machine's hard
      32              :    registers.  Otherwise, it is a typedef for a suitably sized array
      33              :    of HARD_REG_ELT_TYPEs.  HARD_REG_SET_LONGS is defined as how many.
      34              : 
      35              :    Note that lots of code assumes that the first part of a regset is
      36              :    the same format as a HARD_REG_SET.  To help make sure this is true,
      37              :    we only try the widest fast integer mode (HOST_WIDEST_FAST_INT)
      38              :    instead of all the smaller types.  This approach loses only if
      39              :    there are very few registers and then only in the few cases where
      40              :    we have an array of HARD_REG_SETs, so it needn't be as complex as
      41              :    it used to be.  */
      42              : 
      43              : typedef unsigned HOST_WIDEST_FAST_INT HARD_REG_ELT_TYPE;
      44              : 
      45              : #if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDEST_FAST_INT
      46              : 
      47              : typedef HARD_REG_ELT_TYPE HARD_REG_SET;
      48              : typedef const HARD_REG_SET const_hard_reg_set;
      49              : 
      50              : #else
      51              : 
      52              : #define HARD_REG_SET_LONGS \
      53              :  ((FIRST_PSEUDO_REGISTER + HOST_BITS_PER_WIDEST_FAST_INT - 1)   \
      54              :   / HOST_BITS_PER_WIDEST_FAST_INT)
      55              : 
      56              : struct HARD_REG_SET
      57              : {
      58              :   HARD_REG_SET
      59  18694917644 :   operator~ () const
      60              :   {
      61  18694917644 :     HARD_REG_SET res;
      62  56084752932 :     for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
      63  37389835288 :       res.elts[i] = ~elts[i];
      64  18694917644 :     return res;
      65              :   }
      66              : 
      67              :   HARD_REG_SET
      68  18575114658 :   operator& (const HARD_REG_SET &other) const
      69              :   {
      70  18575114658 :     HARD_REG_SET res;
      71  55725343974 :     for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
      72  37150229316 :       res.elts[i] = elts[i] & other.elts[i];
      73  18575114658 :     return res;
      74              :   }
      75              : 
      76              :   HARD_REG_SET &
      77   2277274965 :   operator&= (const HARD_REG_SET &other)
      78              :   {
      79   6745705567 :     for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
      80   4556194254 :       elts[i] &= other.elts[i];
      81   2275818868 :     return *this;
      82              :   }
      83              : 
      84              :   HARD_REG_SET
      85   3896794989 :   operator| (const HARD_REG_SET &other) const
      86              :   {
      87   3896794989 :     HARD_REG_SET res;
      88  11690384967 :     for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
      89   7793589978 :       res.elts[i] = elts[i] | other.elts[i];
      90   3896794989 :     return res;
      91              :   }
      92              : 
      93              :   HARD_REG_SET &
      94   2517187898 :   operator|= (const HARD_REG_SET &other)
      95              :   {
      96   9478839793 :     for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
      97   6356981158 :       elts[i] |= other.elts[i];
      98   2486578673 :     return *this;
      99              :   }
     100              : 
     101              :   bool
     102    451617550 :   operator== (const HARD_REG_SET &other) const
     103              :   {
     104    451617550 :     HARD_REG_ELT_TYPE bad = 0;
     105   5843853087 :     for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
     106   3895902058 :       bad |= (elts[i] ^ other.elts[i]);
     107   1946450361 :     return bad == 0;
     108              :   }
     109              : 
     110              :   bool
     111      1500668 :   operator!= (const HARD_REG_SET &other) const
     112              :   {
     113      3001336 :     return !operator== (other);
     114              :   }
     115              : 
     116              :   HARD_REG_ELT_TYPE elts[HARD_REG_SET_LONGS];
     117              : };
     118              : typedef const HARD_REG_SET &const_hard_reg_set;
     119              : 
     120              : template<>
     121              : struct array_traits<HARD_REG_SET>
     122              : {
     123              :   typedef HARD_REG_ELT_TYPE element_type;
     124              :   static const bool has_constant_size = true;
     125              :   static const size_t constant_size = HARD_REG_SET_LONGS;
     126    154657061 :   static const element_type *base (const HARD_REG_SET &x) { return x.elts; }
     127    154657061 :   static size_t size (const HARD_REG_SET &) { return HARD_REG_SET_LONGS; }
     128              : };
     129              : 
     130              : #endif
     131              : 
     132              : /* HARD_REG_SET wrapped into a structure, to make it possible to
     133              :    use HARD_REG_SET even in APIs that should not include
     134              :    hard-reg-set.h.  */
     135              : struct hard_reg_set_container
     136              : {
     137              :   HARD_REG_SET set;
     138              : };
     139              : 
     140              : /* HARD_CONST is used to cast a constant to the appropriate type
     141              :    for use with a HARD_REG_SET.  */
     142              : 
     143              : #define HARD_CONST(X) ((HARD_REG_ELT_TYPE) (X))
     144              : 
     145              : /* Define macros SET_HARD_REG_BIT, CLEAR_HARD_REG_BIT and TEST_HARD_REG_BIT
     146              :    to set, clear or test one bit in a hard reg set of type HARD_REG_SET.
     147              :    All three take two arguments: the set and the register number.
     148              : 
     149              :    In the case where sets are arrays of longs, the first argument
     150              :    is actually a pointer to a long.
     151              : 
     152              :    Define two macros for initializing a set:
     153              :    CLEAR_HARD_REG_SET and SET_HARD_REG_SET.
     154              :    These take just one argument.
     155              : 
     156              :    Also define:
     157              : 
     158              :    hard_reg_set_subset_p (X, Y), which returns true if X is a subset of Y.
     159              :    hard_reg_set_intersect_p (X, Y), which returns true if X and Y intersect.
     160              :    hard_reg_set_empty_p (X), which returns true if X is empty.  */
     161              : 
     162              : #define UHOST_BITS_PER_WIDE_INT ((unsigned) HOST_BITS_PER_WIDEST_FAST_INT)
     163              : 
     164              : #if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDEST_FAST_INT
     165              : 
     166              : #define SET_HARD_REG_BIT(SET, BIT)  \
     167              :  ((SET) |= HARD_CONST (1) << (BIT))
     168              : #define CLEAR_HARD_REG_BIT(SET, BIT)  \
     169              :  ((SET) &= ~(HARD_CONST (1) << (BIT)))
     170              : #define TEST_HARD_REG_BIT(SET, BIT)  \
     171              :  (!!((SET) & (HARD_CONST (1) << (BIT))))
     172              : 
     173              : #define CLEAR_HARD_REG_SET(TO) ((TO) = HARD_CONST (0))
     174              : #define SET_HARD_REG_SET(TO) ((TO) = ~ HARD_CONST (0))
     175              : 
     176              : inline bool
     177              : hard_reg_set_subset_p (const_hard_reg_set x, const_hard_reg_set y)
     178              : {
     179              :   return (x & ~y) == HARD_CONST (0);
     180              : }
     181              : 
     182              : inline bool
     183              : hard_reg_set_intersect_p (const_hard_reg_set x, const_hard_reg_set y)
     184              : {
     185              :   return (x & y) != HARD_CONST (0);
     186              : }
     187              : 
     188              : inline bool
     189              : hard_reg_set_empty_p (const_hard_reg_set x)
     190              : {
     191              :   return x == HARD_CONST (0);
     192              : }
     193              : 
     194              : inline int
     195              : hard_reg_set_popcount (const_hard_reg_set x)
     196              : {
     197              :   return popcount_hwi (x);
     198              : }
     199              : 
     200              : /* Return 0 if there aren't any differences between X and Y after the first
     201              :    SKIP registers, or 1 + the register number of the lowest-numbered
     202              :    difference, negated if it's set in Y.  The return value is suitable for
     203              :    qsort.  */
     204              : inline int
     205              : hard_reg_set_first_diff (const_hard_reg_set x, const_hard_reg_set y,
     206              :                          unsigned skip)
     207              : {
     208              :   if (skip >= UHOST_BITS_PER_WIDE_INT)
     209              :     return 0;
     210              :   const HARD_REG_ELT_TYPE full_mask = -1;
     211              :   HARD_REG_ELT_TYPE mask = full_mask << skip;
     212              :   HARD_REG_ELT_TYPE dif = (x ^ y) & mask;
     213              :   if (dif == 0)
     214              :     return 0;
     215              :   int bit = ctz_hwi (dif);
     216              :   int regp1 = bit + 1;
     217              :   if (y & (HARD_CONST (1) << bit))
     218              :     return -regp1;
     219              :   return regp1;
     220              : }
     221              : 
     222              : #else
     223              : 
     224              : inline void
     225  22169242917 : SET_HARD_REG_BIT (HARD_REG_SET &set, unsigned int bit)
     226              : {
     227  22169242917 :   set.elts[bit / UHOST_BITS_PER_WIDE_INT]
     228   8148271629 :     |= HARD_CONST (1) << (bit % UHOST_BITS_PER_WIDE_INT);
     229  14608913340 : }
     230              : 
     231              : inline void
     232    971581063 : CLEAR_HARD_REG_BIT (HARD_REG_SET &set, unsigned int bit)
     233              : {
     234    971581063 :   set.elts[bit / UHOST_BITS_PER_WIDE_INT]
     235    960343482 :     &= ~(HARD_CONST (1) << (bit % UHOST_BITS_PER_WIDE_INT));
     236    245141171 : }
     237              : 
     238              : inline bool
     239  >11639*10^7 : TEST_HARD_REG_BIT (const_hard_reg_set set, unsigned int bit)
     240              : {
     241  >11637*10^7 :   return (set.elts[bit / UHOST_BITS_PER_WIDE_INT]
     242  >10806*10^7 :           & (HARD_CONST (1) << (bit % UHOST_BITS_PER_WIDE_INT)));
     243              : }
     244              : 
     245              : inline void
     246   6202983286 : CLEAR_HARD_REG_SET (HARD_REG_SET &set)
     247              : {
     248  25586062936 :   for (unsigned int i = 0; i < ARRAY_SIZE (set.elts); ++i)
     249  18492716204 :     set.elts[i] = 0;
     250              : }
     251              : 
     252              : inline void
     253     29268570 : SET_HARD_REG_SET (HARD_REG_SET &set)
     254              : {
     255     90176278 :   for (unsigned int i = 0; i < ARRAY_SIZE (set.elts); ++i)
     256     60119916 :     set.elts[i] = -1;
     257              : }
     258              : 
     259              : inline bool
     260  >11540*10^7 : hard_reg_set_subset_p (const_hard_reg_set x, const_hard_reg_set y)
     261              : {
     262  >11540*10^7 :   HARD_REG_ELT_TYPE bad = 0;
     263  >57881*10^7 :   for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
     264  >38587*10^7 :     bad |= (x.elts[i] & ~y.elts[i]);
     265  >19293*10^7 :   return bad == 0;
     266              : }
     267              : 
     268              : inline bool
     269  58369741985 : hard_reg_set_intersect_p (const_hard_reg_set x, const_hard_reg_set y)
     270              : {
     271  59107743755 :   HARD_REG_ELT_TYPE good = 0;
     272  >21192*10^7 :   for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
     273  >14128*10^7 :     good |= (x.elts[i] & y.elts[i]);
     274  70640564975 :   return good != 0;
     275              : }
     276              : 
     277              : inline bool
     278  10749124348 : hard_reg_set_empty_p (const_hard_reg_set x)
     279              : {
     280  10749124348 :   HARD_REG_ELT_TYPE bad = 0;
     281  33132952122 :   for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
     282  22088634748 :     bad |= x.elts[i];
     283  11044317374 :   return bad == 0;
     284              : }
     285              : 
     286              : inline int
     287              : hard_reg_set_popcount (const_hard_reg_set x)
     288              : {
     289              :   int count = 0;
     290              :   for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
     291              :     count += popcount_hwi (x.elts[i]);
     292              :   return count;
     293              : }
     294              : 
     295              : /* Return 0 if there aren't any differences between X and Y after the first
     296              :    SKIP registers, or 1 + the register number of the lowest-numbered
     297              :    difference, negated if it's set in Y.  The return value is suitable for
     298              :    qsort.  */
     299              : inline int
     300      2097133 : hard_reg_set_first_diff (const_hard_reg_set x, const_hard_reg_set y,
     301              :                          unsigned skip)
     302              : {
     303      2097133 :   const HARD_REG_ELT_TYPE full_mask = -1;
     304      2097133 :   HARD_REG_ELT_TYPE mask = full_mask << (skip % UHOST_BITS_PER_WIDE_INT);
     305      2097133 :   for (unsigned int i = skip / UHOST_BITS_PER_WIDE_INT;
     306      2097391 :        i < ARRAY_SIZE (x.elts); ++i)
     307              :     {
     308      2097391 :       HARD_REG_ELT_TYPE dif = (x.elts[i] ^ y.elts[i]) & mask;
     309      2097391 :       if (dif == 0)
     310              :         {
     311          258 :           mask = full_mask;
     312          258 :           continue;
     313              :         }
     314      2097133 :       int bit = ctz_hwi (dif);
     315      2097133 :       int regp1 = bit + 1 + i * UHOST_BITS_PER_WIDE_INT;
     316      2097133 :       if (y.elts[i] & (HARD_CONST (1) << bit))
     317      1159381 :         return -regp1;
     318              :       return regp1;
     319              :     }
     320              :   return 0;
     321              : }
     322              : #endif
     323              : 
     324              : /* Iterator for hard register sets.  */
     325              : 
     326              : struct hard_reg_set_iterator
     327              : {
     328              :   /* Pointer to the current element.  */
     329              :   const HARD_REG_ELT_TYPE *pelt;
     330              : 
     331              :   /* The length of the set.  */
     332              :   unsigned short length;
     333              : 
     334              :   /* Word within the current element.  */
     335              :   unsigned short word_no;
     336              : 
     337              :   /* Contents of the actually processed word.  When finding next bit
     338              :      it is shifted right, so that the actual bit is always the least
     339              :      significant bit of ACTUAL.  */
     340              :   HARD_REG_ELT_TYPE bits;
     341              : };
     342              : 
     343              : #define HARD_REG_ELT_BITS UHOST_BITS_PER_WIDE_INT
     344              : 
     345              : /* The implementation of the iterator functions is a simplified version of
     346              :    those of bitmap iterators.  */
     347              : inline void
     348     36422908 : hard_reg_set_iter_init (hard_reg_set_iterator *iter, const_hard_reg_set set,
     349              :                         unsigned min, unsigned *regno)
     350              : {
     351              : #ifdef HARD_REG_SET_LONGS
     352     36422908 :   iter->pelt = set.elts;
     353     36422908 :   iter->length = HARD_REG_SET_LONGS;
     354              : #else
     355              :   iter->pelt = &set;
     356              :   iter->length = 1;
     357              : #endif
     358     36422908 :   iter->word_no = min / HARD_REG_ELT_BITS;
     359     36422908 :   if (iter->word_no < iter->length)
     360              :     {
     361     36422908 :       iter->bits = iter->pelt[iter->word_no];
     362     36422908 :       iter->bits >>= min % HARD_REG_ELT_BITS;
     363     36422908 :       *regno = min;
     364              :     }
     365     36422908 : }
     366              : 
     367              : inline bool
     368   2966183524 : hard_reg_set_iter_set (hard_reg_set_iterator *iter, unsigned *regno)
     369              : {
     370   3038320819 :   while (1)
     371              :     {
     372              :       /* Return false when we're advanced past the end of the set.  */
     373   3038320819 :       if (iter->word_no >= iter->length)
     374              :         return false;
     375              : 
     376   3001898442 :       if (iter->bits)
     377              :         {
     378   2929761147 :           unsigned skip = ctz_hwi (iter->bits);
     379   2929761147 :           iter->bits >>= skip;
     380   2929761147 :           *regno += skip;
     381   2929761147 :           return (*regno < FIRST_PSEUDO_REGISTER);
     382              :         }
     383              : 
     384              :       /* Find the next non-zero word.  */
     385     72844754 :       while (++iter->word_no < iter->length)
     386              :         {
     387     36422377 :           iter->bits = iter->pelt[iter->word_no];
     388     36422377 :           if (iter->bits)
     389              :             {
     390     35714918 :               *regno = iter->word_no * HARD_REG_ELT_BITS;
     391     35714918 :               break;
     392              :             }
     393              :         }
     394              :     }
     395              : }
     396              : 
     397              : inline void
     398   2929760616 : hard_reg_set_iter_next (hard_reg_set_iterator *iter, unsigned *)
     399              : {
     400              :   /* Only clear the bit, so that we skip it in iter_set.  */
     401   2929760616 :   iter->bits &= ~ HARD_CONST (1);
     402   2929760616 : }
     403              : 
     404              : /* SET must not change throughout the iteration.
     405              :    REGNUM (and ITER) may only be changed by the iteration functions.  */
     406              : #define EXECUTE_IF_SET_IN_HARD_REG_SET(SET, MIN, REGNUM, ITER)          \
     407              :   for (hard_reg_set_iter_init (&(ITER), (SET), (MIN), &(REGNUM));       \
     408              :        hard_reg_set_iter_set (&(ITER), &(REGNUM));                      \
     409              :        hard_reg_set_iter_next (&(ITER), &(REGNUM)))
     410              : 
     411              : 
     412              : /* Define some standard sets of registers.  */
     413              : 
     414              : /* Indexed by hard register number, contains 1 for registers
     415              :    that are being used for global register decls.
     416              :    These must be exempt from ordinary flow analysis
     417              :    and are also considered fixed.  */
     418              : 
     419              : extern char global_regs[FIRST_PSEUDO_REGISTER];
     420              : 
     421              : extern HARD_REG_SET global_reg_set;
     422              : 
     423              : class simplifiable_subreg;
     424              : class subreg_shape;
     425              : 
     426              : struct simplifiable_subregs_hasher : nofree_ptr_hash <simplifiable_subreg>
     427              : {
     428              :   typedef const subreg_shape *compare_type;
     429              : 
     430              :   static inline hashval_t hash (const simplifiable_subreg *);
     431              :   static inline bool equal (const simplifiable_subreg *, const subreg_shape *);
     432              : };
     433              : 
     434              : struct target_hard_regs {
     435              :   void finalize ();
     436              : 
     437              :   /* The set of registers that actually exist on the current target.  */
     438              :   HARD_REG_SET x_accessible_reg_set;
     439              : 
     440              :   /* The set of registers that should be considered to be register
     441              :      operands.  It is a subset of x_accessible_reg_set.  */
     442              :   HARD_REG_SET x_operand_reg_set;
     443              : 
     444              :   /* Indexed by hard register number, contains 1 for registers
     445              :      that are fixed use (stack pointer, pc, frame pointer, etc.;.
     446              :      These are the registers that cannot be used to allocate
     447              :      a pseudo reg whose life does not cross calls.  */
     448              :   char x_fixed_regs[FIRST_PSEUDO_REGISTER];
     449              : 
     450              :   /* The same info as a HARD_REG_SET.  */
     451              :   HARD_REG_SET x_fixed_reg_set;
     452              : 
     453              :   /* Indexed by hard register number, contains 1 for registers
     454              :      that are fixed use or are clobbered by function calls.
     455              :      These are the registers that cannot be used to allocate
     456              :      a pseudo reg whose life crosses calls.  */
     457              :   char x_call_used_regs[FIRST_PSEUDO_REGISTER];
     458              : 
     459              :   /* For targets that use reload rather than LRA, this is the set
     460              :      of registers that we are able to save and restore around calls
     461              :      (i.e. those for which we know a suitable mode and set of
     462              :      load/store instructions exist).  For LRA targets it contains
     463              :      all registers.
     464              : 
     465              :      This is legacy information and should be removed if all targets
     466              :      switch to LRA.  */
     467              :   HARD_REG_SET x_savable_regs;
     468              : 
     469              :   /* Contains registers that are fixed use -- i.e. in fixed_reg_set -- but
     470              :      only if they are not merely part of that set because they are global
     471              :      regs.  Global regs that are not otherwise fixed can still take part
     472              :      in register allocation.  */
     473              :   HARD_REG_SET x_fixed_nonglobal_reg_set;
     474              : 
     475              :   /* Contains 1 for registers that are set or clobbered by calls.  */
     476              :   /* ??? Ideally, this would be just call_used_regs plus global_regs, but
     477              :      for someone's bright idea to have call_used_regs strictly include
     478              :      fixed_regs.  Which leaves us guessing as to the set of fixed_regs
     479              :      that are actually preserved.  We know for sure that those associated
     480              :      with the local stack frame are safe, but scant others.  */
     481              :   HARD_REG_SET x_regs_invalidated_by_call;
     482              : 
     483              :   /* The set of registers that are used by EH_RETURN_DATA_REGNO.  */
     484              :   HARD_REG_SET x_eh_return_data_regs;
     485              : 
     486              :   /* Table of register numbers in the order in which to try to use them.  */
     487              :   int x_reg_alloc_order[FIRST_PSEUDO_REGISTER];
     488              : 
     489              :   /* The inverse of reg_alloc_order.  */
     490              :   int x_inv_reg_alloc_order[FIRST_PSEUDO_REGISTER];
     491              : 
     492              :   /* For each reg class, a HARD_REG_SET saying which registers are in it.  */
     493              :   HARD_REG_SET x_reg_class_contents[N_REG_CLASSES];
     494              : 
     495              :   /* For each reg class, a boolean saying whether the class contains only
     496              :      fixed registers.  */
     497              :   bool x_class_only_fixed_regs[N_REG_CLASSES];
     498              : 
     499              :   /* For each reg class, number of regs it contains.  */
     500              :   unsigned int x_reg_class_size[N_REG_CLASSES];
     501              : 
     502              :   /* For each reg class, table listing all the classes contained in it.  */
     503              :   enum reg_class x_reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
     504              : 
     505              :   /* For each pair of reg classes,
     506              :      a largest reg class contained in their union.  */
     507              :   enum reg_class x_reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
     508              : 
     509              :   /* For each pair of reg classes,
     510              :      the smallest reg class that contains their union.  */
     511              :   enum reg_class x_reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
     512              : 
     513              :   /* Vector indexed by hardware reg giving its name.  */
     514              :   const char *x_reg_names[FIRST_PSEUDO_REGISTER];
     515              : 
     516              :   /* Records which registers can form a particular subreg, with the subreg
     517              :      being identified by its outer mode, inner mode and offset.  */
     518              :   hash_table <simplifiable_subregs_hasher> *x_simplifiable_subregs;
     519              : };
     520              : 
     521              : extern struct target_hard_regs default_target_hard_regs;
     522              : #if SWITCHABLE_TARGET
     523              : extern struct target_hard_regs *this_target_hard_regs;
     524              : #else
     525              : #define this_target_hard_regs (&default_target_hard_regs)
     526              : #endif
     527              : 
     528              : #define accessible_reg_set \
     529              :   (this_target_hard_regs->x_accessible_reg_set)
     530              : #define operand_reg_set \
     531              :   (this_target_hard_regs->x_operand_reg_set)
     532              : #define fixed_regs \
     533              :   (this_target_hard_regs->x_fixed_regs)
     534              : #define fixed_reg_set \
     535              :   (this_target_hard_regs->x_fixed_reg_set)
     536              : #define fixed_nonglobal_reg_set \
     537              :   (this_target_hard_regs->x_fixed_nonglobal_reg_set)
     538              : #ifdef IN_TARGET_CODE
     539              : #define call_used_regs \
     540              :   (this_target_hard_regs->x_call_used_regs)
     541              : #endif
     542              : #define savable_regs \
     543              :   (this_target_hard_regs->x_savable_regs)
     544              : #ifdef IN_TARGET_CODE
     545              : #define regs_invalidated_by_call \
     546              :   (this_target_hard_regs->x_regs_invalidated_by_call)
     547              : #define call_used_or_fixed_regs \
     548              :   (regs_invalidated_by_call | fixed_reg_set)
     549              : #endif
     550              : #define eh_return_data_regs \
     551              :   (this_target_hard_regs->x_eh_return_data_regs)
     552              : #define reg_alloc_order \
     553              :   (this_target_hard_regs->x_reg_alloc_order)
     554              : #define inv_reg_alloc_order \
     555              :   (this_target_hard_regs->x_inv_reg_alloc_order)
     556              : #define reg_class_contents \
     557              :   (this_target_hard_regs->x_reg_class_contents)
     558              : #define class_only_fixed_regs \
     559              :   (this_target_hard_regs->x_class_only_fixed_regs)
     560              : #define reg_class_size \
     561              :   (this_target_hard_regs->x_reg_class_size)
     562              : #define reg_class_subclasses \
     563              :   (this_target_hard_regs->x_reg_class_subclasses)
     564              : #define reg_class_subunion \
     565              :   (this_target_hard_regs->x_reg_class_subunion)
     566              : #define reg_class_superunion \
     567              :   (this_target_hard_regs->x_reg_class_superunion)
     568              : #define reg_names \
     569              :   (this_target_hard_regs->x_reg_names)
     570              : 
     571              : /* Vector indexed by reg class giving its name.  */
     572              : 
     573              : extern const char * reg_class_names[];
     574              : 
     575              : /* Given a hard REGN a FROM mode and a TO mode, return true if
     576              :    REGN can change from mode FROM to mode TO.  */
     577              : #define REG_CAN_CHANGE_MODE_P(REGN, FROM, TO)                          \
     578              :   (targetm.can_change_mode_class (FROM, TO, REGNO_REG_CLASS (REGN)))
     579              : 
     580              : #ifdef IN_TARGET_CODE
     581              : /* Return true if register REGNO is either fixed or call-used
     582              :    (aka call-clobbered).  */
     583              : 
     584              : inline bool
     585    382906512 : call_used_or_fixed_reg_p (unsigned int regno)
     586              : {
     587    382906512 :   return fixed_regs[regno] || this_target_hard_regs->x_call_used_regs[regno];
     588              : }
     589              : #endif
     590              : 
     591              : #endif /* ! GCC_HARD_REG_SET_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.