Home | History | Annotate | Line # | Download | only in rx
rx-protos.h revision 1.12
      1   1.1  mrg /* Exported function prototypes from the Renesas RX backend.
      2  1.12  mrg    Copyright (C) 2008-2022 Free Software Foundation, Inc.
      3   1.1  mrg    Contributed by Red Hat.
      4   1.1  mrg 
      5   1.1  mrg    This file is part of GCC.
      6   1.1  mrg 
      7   1.1  mrg    GCC is free software; you can redistribute it and/or modify
      8   1.1  mrg    it under the terms of the GNU General Public License as published by
      9   1.1  mrg    the Free Software Foundation; either version 3, or (at your option)
     10   1.1  mrg    any later version.
     11   1.1  mrg 
     12   1.1  mrg    GCC is distributed in the hope that it will be useful,
     13   1.1  mrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  mrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  mrg    GNU General Public License for more details.
     16   1.1  mrg 
     17   1.1  mrg    You should have received a copy of the GNU General Public License
     18   1.1  mrg    along with GCC; see the file COPYING3.  If not see
     19   1.1  mrg    <http://www.gnu.org/licenses/>.  */
     20   1.1  mrg 
     21   1.1  mrg #ifndef GCC_RX_PROTOS_H
     22   1.1  mrg #define GCC_RX_PROTOS_H
     23   1.1  mrg 
     24   1.3  mrg extern bool             rx_can_use_simple_return (void);
     25   1.3  mrg extern void		rx_expand_epilogue (bool);
     26   1.1  mrg extern void		rx_expand_prologue (void);
     27   1.1  mrg extern int		rx_initial_elimination_offset (int, int);
     28   1.1  mrg 
     29   1.8  mrg bool is_interrupt_func (const_tree decl);
     30   1.8  mrg bool is_fast_interrupt_func (const_tree decl);
     31   1.8  mrg 
     32   1.8  mrg /* rx_atomic_sequence is used to emit the header and footer
     33   1.8  mrg    of an atomic sequence.  It's supposed to be used in a scope.
     34   1.8  mrg    When constructed, it will emit the atomic sequence header insns.
     35   1.8  mrg    When destructred (goes out of scope), it will emit the
     36   1.8  mrg    corresponding atomic sequence footer insns.  */
     37   1.8  mrg class rx_atomic_sequence
     38   1.8  mrg {
     39   1.8  mrg public:
     40   1.8  mrg   rx_atomic_sequence (const_tree fun_decl);
     41   1.8  mrg   ~rx_atomic_sequence (void);
     42   1.8  mrg 
     43   1.8  mrg private:
     44   1.8  mrg   rx_atomic_sequence (void);
     45   1.8  mrg   rx_atomic_sequence (const rx_atomic_sequence&);
     46   1.8  mrg   rx_atomic_sequence& operator = (const rx_atomic_sequence&);
     47   1.8  mrg 
     48   1.8  mrg   rtx m_prev_psw_reg;
     49   1.8  mrg };
     50   1.8  mrg 
     51   1.1  mrg #ifdef RTX_CODE
     52   1.5  mrg extern int		rx_adjust_insn_length (rtx_insn *, int);
     53  1.10  mrg extern align_flags	rx_align_for_label (rtx_insn *, int);
     54   1.1  mrg extern void             rx_emit_stack_popm (rtx *, bool);
     55   1.1  mrg extern void             rx_emit_stack_pushm (rtx *);
     56   1.1  mrg extern char *		rx_gen_move_template (rtx *, bool);
     57   1.5  mrg extern bool		rx_is_legitimate_constant (machine_mode, rtx);
     58   1.3  mrg extern bool		rx_is_restricted_memory_address (rtx,
     59   1.5  mrg 							 machine_mode);
     60   1.5  mrg extern bool		rx_match_ccmode (rtx, machine_mode);
     61   1.3  mrg extern rtx		rx_maybe_pidify_operand (rtx, int);
     62   1.3  mrg extern void		rx_notice_update_cc (rtx, rtx);
     63   1.5  mrg extern void		rx_split_cbranch (machine_mode, enum rtx_code,
     64   1.3  mrg 					  rtx, rtx, rtx);
     65   1.5  mrg extern machine_mode	rx_select_cc_mode (enum rtx_code, rtx, rtx);
     66   1.9  mrg 
     67   1.9  mrg extern bool rx_reg_dead_or_unused_after_insn (const rtx_insn* i, int regno);
     68   1.9  mrg extern void rx_copy_reg_dead_or_unused_notes (rtx reg, const rtx_insn* src,
     69   1.9  mrg 					      rtx_insn* dst);
     70   1.9  mrg 
     71   1.9  mrg extern bool rx_fuse_in_memory_bitop (rtx* operands, rtx_insn* curr_insn,
     72   1.9  mrg 				     rtx (*gen_insn)(rtx, rtx));
     73   1.9  mrg 
     74   1.9  mrg /* Result value of rx_find_set_of_reg.  */
     75   1.9  mrg struct set_of_reg
     76   1.9  mrg {
     77   1.9  mrg   /* The insn where sh_find_set_of_reg stopped looking.
     78   1.9  mrg      Can be NULL_RTX if the end of the insn list was reached.  */
     79   1.9  mrg   rtx_insn* insn;
     80   1.9  mrg 
     81   1.9  mrg   /* The set rtx of the specified reg if found, NULL_RTX otherwise.  */
     82   1.9  mrg   const_rtx set_rtx;
     83   1.9  mrg 
     84   1.9  mrg   /* The set source rtx of the specified reg if found, NULL_RTX otherwise.
     85   1.9  mrg      Usually, this is the most interesting return value.  */
     86   1.9  mrg   rtx set_src;
     87   1.9  mrg };
     88   1.9  mrg 
     89   1.9  mrg /* FIXME: Copy-pasta from SH.  Move to rtl.h.
     90   1.9  mrg    Given a reg rtx and a start insn, try to find the insn that sets
     91   1.9  mrg    the specified reg by using the specified insn stepping function,
     92   1.9  mrg    such as 'prev_nonnote_nondebug_insn_bb'.  When the insn is found,
     93   1.9  mrg    try to extract the rtx of the reg set.  */
     94   1.9  mrg template <typename F> inline set_of_reg
     95   1.9  mrg rx_find_set_of_reg (rtx reg, rtx_insn* insn, F stepfunc,
     96   1.9  mrg 		    bool ignore_reg_reg_copies = false)
     97   1.9  mrg {
     98   1.9  mrg   set_of_reg result;
     99   1.9  mrg   result.insn = insn;
    100   1.9  mrg   result.set_rtx = NULL_RTX;
    101   1.9  mrg   result.set_src = NULL_RTX;
    102   1.9  mrg 
    103   1.9  mrg   if (!REG_P (reg) || insn == NULL_RTX)
    104   1.9  mrg     return result;
    105   1.9  mrg 
    106   1.9  mrg   for (rtx_insn* i = stepfunc (insn); i != NULL_RTX; i = stepfunc (i))
    107   1.9  mrg     {
    108   1.9  mrg       if (BARRIER_P (i))
    109   1.9  mrg 	break;
    110   1.9  mrg       if (!INSN_P (i) || DEBUG_INSN_P (i))
    111   1.9  mrg 	  continue;
    112   1.9  mrg       if (reg_set_p (reg, i))
    113   1.9  mrg 	{
    114   1.9  mrg 	  if (CALL_P (i))
    115   1.9  mrg 	    break;
    116   1.9  mrg 
    117   1.9  mrg 	  result.insn = i;
    118   1.9  mrg 	  result.set_rtx = set_of (reg, i);
    119   1.9  mrg 
    120   1.9  mrg 	  if (result.set_rtx == NULL_RTX || GET_CODE (result.set_rtx) != SET)
    121   1.9  mrg 	    break;
    122   1.9  mrg 
    123   1.9  mrg 	  result.set_src = XEXP (result.set_rtx, 1);
    124   1.9  mrg 
    125   1.9  mrg 	  if (ignore_reg_reg_copies && REG_P (result.set_src))
    126   1.9  mrg 	    {
    127   1.9  mrg 	      reg = result.set_src;
    128   1.9  mrg 	      continue;
    129   1.9  mrg 	    }
    130   1.9  mrg 	  if (ignore_reg_reg_copies && SUBREG_P (result.set_src)
    131   1.9  mrg 	      && REG_P (SUBREG_REG (result.set_src)))
    132   1.9  mrg 	    {
    133   1.9  mrg 	      reg = SUBREG_REG (result.set_src);
    134   1.9  mrg 	      continue;
    135   1.9  mrg 	    }
    136   1.9  mrg 
    137   1.9  mrg 	  break;
    138   1.9  mrg 	}
    139   1.9  mrg     }
    140   1.9  mrg 
    141   1.9  mrg   /* If the searched reg is found inside a (mem (post_inc:SI (reg))), set_of
    142   1.9  mrg      will return NULL and set_rtx will be NULL.
    143   1.9  mrg      In this case report a 'not found'.  result.insn will always be non-null
    144   1.9  mrg      at this point, so no need to check it.  */
    145   1.9  mrg   if (result.set_src != NULL && result.set_rtx == NULL)
    146   1.9  mrg     result.set_src = NULL;
    147   1.9  mrg 
    148   1.9  mrg   return result;
    149   1.9  mrg }
    150   1.9  mrg 
    151   1.9  mrg /* FIXME: Move to rtlh.h.  */
    152   1.9  mrg template <typename F> inline rtx_insn*
    153   1.9  mrg rx_find_use_of_reg (rtx reg, rtx_insn* insn, F stepfunc)
    154   1.9  mrg {
    155   1.9  mrg   if (!REG_P (reg) || insn == NULL_RTX)
    156   1.9  mrg     return NULL;
    157   1.9  mrg 
    158   1.9  mrg   for (rtx_insn* i = stepfunc (insn); i != NULL_RTX; i = stepfunc (i))
    159   1.9  mrg     {
    160   1.9  mrg       if (BARRIER_P (i))
    161   1.9  mrg 	break;
    162   1.9  mrg       if (!INSN_P (i) || DEBUG_INSN_P (i))
    163   1.9  mrg 	continue;
    164   1.9  mrg       if (reg_overlap_mentioned_p (reg, PATTERN (i))
    165   1.9  mrg 	  || (CALL_P (i) && find_reg_fusage (i, USE, reg)))
    166   1.9  mrg 	return i;
    167   1.9  mrg     }
    168   1.9  mrg 
    169   1.9  mrg   return NULL;
    170   1.9  mrg }
    171   1.9  mrg 
    172   1.1  mrg #endif
    173   1.1  mrg 
    174   1.1  mrg #endif /* GCC_RX_PROTOS_H */
    175