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