1*38fd1498Szrj /* Define regsets. 2*38fd1498Szrj Copyright (C) 1987-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498Szrj This file is part of GCC. 5*38fd1498Szrj 6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrj the terms of the GNU General Public License as published by the Free 8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 9*38fd1498Szrj version. 10*38fd1498Szrj 11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrj for more details. 15*38fd1498Szrj 16*38fd1498Szrj You should have received a copy of the GNU General Public License 17*38fd1498Szrj along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj #ifndef GCC_REGSET_H 21*38fd1498Szrj #define GCC_REGSET_H 22*38fd1498Szrj 23*38fd1498Szrj /* TODO: regset is just a bitmap in its implementation. The compiler does 24*38fd1498Szrj not consistently use one or the other, i.e. sometimes variables are 25*38fd1498Szrj declared as bitmap but they are actually regsets and regset accessors 26*38fd1498Szrj are used, and vice versa, or mixed (see e.g. spilled_regs in IRA). 27*38fd1498Szrj 28*38fd1498Szrj This should be cleaned up, either by just dropping the regset type, or 29*38fd1498Szrj by changing all bitmaps that are really regsets to the regset type. For 30*38fd1498Szrj the latter option, a good start would be to change everything allocated 31*38fd1498Szrj on the reg_obstack to regset. */ 32*38fd1498Szrj 33*38fd1498Szrj 34*38fd1498Szrj /* Head of register set linked list. */ 35*38fd1498Szrj typedef bitmap_head regset_head; 36*38fd1498Szrj 37*38fd1498Szrj /* A pointer to a regset_head. */ 38*38fd1498Szrj typedef bitmap regset; 39*38fd1498Szrj 40*38fd1498Szrj /* Allocate a register set with oballoc. */ 41*38fd1498Szrj #define ALLOC_REG_SET(OBSTACK) BITMAP_ALLOC (OBSTACK) 42*38fd1498Szrj 43*38fd1498Szrj /* Do any cleanup needed on a regset when it is no longer used. */ 44*38fd1498Szrj #define FREE_REG_SET(REGSET) BITMAP_FREE (REGSET) 45*38fd1498Szrj 46*38fd1498Szrj /* Initialize a new regset. */ 47*38fd1498Szrj #define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, ®_obstack) 48*38fd1498Szrj 49*38fd1498Szrj /* Clear a register set by freeing up the linked list. */ 50*38fd1498Szrj #define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD) 51*38fd1498Szrj 52*38fd1498Szrj /* Copy a register set to another register set. */ 53*38fd1498Szrj #define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM) 54*38fd1498Szrj 55*38fd1498Szrj /* Compare two register sets. */ 56*38fd1498Szrj #define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B) 57*38fd1498Szrj 58*38fd1498Szrj /* `and' a register set with a second register set. */ 59*38fd1498Szrj #define AND_REG_SET(TO, FROM) bitmap_and_into (TO, FROM) 60*38fd1498Szrj 61*38fd1498Szrj /* `and' the complement of a register set with a register set. */ 62*38fd1498Szrj #define AND_COMPL_REG_SET(TO, FROM) bitmap_and_compl_into (TO, FROM) 63*38fd1498Szrj 64*38fd1498Szrj /* Inclusive or a register set with a second register set. */ 65*38fd1498Szrj #define IOR_REG_SET(TO, FROM) bitmap_ior_into (TO, FROM) 66*38fd1498Szrj 67*38fd1498Szrj /* Exclusive or a register set with a second register set. */ 68*38fd1498Szrj #define XOR_REG_SET(TO, FROM) bitmap_xor_into (TO, FROM) 69*38fd1498Szrj 70*38fd1498Szrj /* Or into TO the register set FROM1 `and'ed with the complement of FROM2. */ 71*38fd1498Szrj #define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \ 72*38fd1498Szrj bitmap_ior_and_compl_into (TO, FROM1, FROM2) 73*38fd1498Szrj 74*38fd1498Szrj /* Clear a single register in a register set. */ 75*38fd1498Szrj #define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG) 76*38fd1498Szrj 77*38fd1498Szrj /* Set a single register in a register set. */ 78*38fd1498Szrj #define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG) 79*38fd1498Szrj 80*38fd1498Szrj /* Return true if a register is set in a register set. */ 81*38fd1498Szrj #define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG) 82*38fd1498Szrj 83*38fd1498Szrj /* Copy the hard registers in a register set to the hard register set. */ 84*38fd1498Szrj extern void reg_set_to_hard_reg_set (HARD_REG_SET *, const_bitmap); 85*38fd1498Szrj #define REG_SET_TO_HARD_REG_SET(TO, FROM) \ 86*38fd1498Szrj do { \ 87*38fd1498Szrj CLEAR_HARD_REG_SET (TO); \ 88*38fd1498Szrj reg_set_to_hard_reg_set (&TO, FROM); \ 89*38fd1498Szrj } while (0) 90*38fd1498Szrj 91*38fd1498Szrj typedef bitmap_iterator reg_set_iterator; 92*38fd1498Szrj 93*38fd1498Szrj /* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the 94*38fd1498Szrj register number and executing CODE for all registers that are set. */ 95*38fd1498Szrj #define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, RSI) \ 96*38fd1498Szrj EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, RSI) 97*38fd1498Szrj 98*38fd1498Szrj /* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting 99*38fd1498Szrj REGNUM to the register number and executing CODE for all registers that are 100*38fd1498Szrj set in the first regset and not set in the second. */ 101*38fd1498Szrj #define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \ 102*38fd1498Szrj EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI) 103*38fd1498Szrj 104*38fd1498Szrj /* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting 105*38fd1498Szrj REGNUM to the register number and executing CODE for all registers that are 106*38fd1498Szrj set in both regsets. */ 107*38fd1498Szrj #define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \ 108*38fd1498Szrj EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI) \ 109*38fd1498Szrj 110*38fd1498Szrj /* Same information as REGS_INVALIDATED_BY_CALL but in regset form to be used 111*38fd1498Szrj in dataflow more conveniently. */ 112*38fd1498Szrj 113*38fd1498Szrj extern regset regs_invalidated_by_call_regset; 114*38fd1498Szrj 115*38fd1498Szrj /* Same information as FIXED_REG_SET but in regset form. */ 116*38fd1498Szrj extern regset fixed_reg_set_regset; 117*38fd1498Szrj 118*38fd1498Szrj /* An obstack for regsets. */ 119*38fd1498Szrj extern bitmap_obstack reg_obstack; 120*38fd1498Szrj 121*38fd1498Szrj /* In df-core.c (which should use regset consistently instead of bitmap...) */ 122*38fd1498Szrj extern void dump_regset (regset, FILE *); 123*38fd1498Szrj 124*38fd1498Szrj #endif /* GCC_REGSET_H */ 125