rx-protos.h revision 1.1.1.8 1 1.1 mrg /* Exported function prototypes from the Renesas RX backend.
2 1.1.1.8 mrg Copyright (C) 2008-2020 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.1.1.2 mrg extern bool rx_can_use_simple_return (void);
25 1.1.1.2 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.1.1.5 mrg bool is_interrupt_func (const_tree decl);
30 1.1.1.5 mrg bool is_fast_interrupt_func (const_tree decl);
31 1.1.1.5 mrg
32 1.1.1.5 mrg /* rx_atomic_sequence is used to emit the header and footer
33 1.1.1.5 mrg of an atomic sequence. It's supposed to be used in a scope.
34 1.1.1.5 mrg When constructed, it will emit the atomic sequence header insns.
35 1.1.1.5 mrg When destructred (goes out of scope), it will emit the
36 1.1.1.5 mrg corresponding atomic sequence footer insns. */
37 1.1.1.5 mrg class rx_atomic_sequence
38 1.1.1.5 mrg {
39 1.1.1.5 mrg public:
40 1.1.1.5 mrg rx_atomic_sequence (const_tree fun_decl);
41 1.1.1.5 mrg ~rx_atomic_sequence (void);
42 1.1.1.5 mrg
43 1.1.1.5 mrg private:
44 1.1.1.5 mrg rx_atomic_sequence (void);
45 1.1.1.5 mrg rx_atomic_sequence (const rx_atomic_sequence&);
46 1.1.1.5 mrg rx_atomic_sequence& operator = (const rx_atomic_sequence&);
47 1.1.1.5 mrg
48 1.1.1.5 mrg rtx m_prev_psw_reg;
49 1.1.1.5 mrg };
50 1.1.1.5 mrg
51 1.1 mrg #ifdef RTX_CODE
52 1.1.1.3 mrg extern int rx_adjust_insn_length (rtx_insn *, int);
53 1.1.1.7 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.1.1.3 mrg extern bool rx_is_legitimate_constant (machine_mode, rtx);
58 1.1.1.2 mrg extern bool rx_is_restricted_memory_address (rtx,
59 1.1.1.3 mrg machine_mode);
60 1.1.1.3 mrg extern bool rx_match_ccmode (rtx, machine_mode);
61 1.1.1.2 mrg extern rtx rx_maybe_pidify_operand (rtx, int);
62 1.1.1.2 mrg extern void rx_notice_update_cc (rtx, rtx);
63 1.1.1.3 mrg extern void rx_split_cbranch (machine_mode, enum rtx_code,
64 1.1.1.2 mrg rtx, rtx, rtx);
65 1.1.1.3 mrg extern machine_mode rx_select_cc_mode (enum rtx_code, rtx, rtx);
66 1.1.1.6 mrg
67 1.1.1.6 mrg extern bool rx_reg_dead_or_unused_after_insn (const rtx_insn* i, int regno);
68 1.1.1.6 mrg extern void rx_copy_reg_dead_or_unused_notes (rtx reg, const rtx_insn* src,
69 1.1.1.6 mrg rtx_insn* dst);
70 1.1.1.6 mrg
71 1.1.1.6 mrg extern bool rx_fuse_in_memory_bitop (rtx* operands, rtx_insn* curr_insn,
72 1.1.1.6 mrg rtx (*gen_insn)(rtx, rtx));
73 1.1.1.6 mrg
74 1.1.1.6 mrg /* Result value of rx_find_set_of_reg. */
75 1.1.1.6 mrg struct set_of_reg
76 1.1.1.6 mrg {
77 1.1.1.6 mrg /* The insn where sh_find_set_of_reg stopped looking.
78 1.1.1.6 mrg Can be NULL_RTX if the end of the insn list was reached. */
79 1.1.1.6 mrg rtx_insn* insn;
80 1.1.1.6 mrg
81 1.1.1.6 mrg /* The set rtx of the specified reg if found, NULL_RTX otherwise. */
82 1.1.1.6 mrg const_rtx set_rtx;
83 1.1.1.6 mrg
84 1.1.1.6 mrg /* The set source rtx of the specified reg if found, NULL_RTX otherwise.
85 1.1.1.6 mrg Usually, this is the most interesting return value. */
86 1.1.1.6 mrg rtx set_src;
87 1.1.1.6 mrg };
88 1.1.1.6 mrg
89 1.1.1.6 mrg /* FIXME: Copy-pasta from SH. Move to rtl.h.
90 1.1.1.6 mrg Given a reg rtx and a start insn, try to find the insn that sets
91 1.1.1.6 mrg the specified reg by using the specified insn stepping function,
92 1.1.1.6 mrg such as 'prev_nonnote_nondebug_insn_bb'. When the insn is found,
93 1.1.1.6 mrg try to extract the rtx of the reg set. */
94 1.1.1.6 mrg template <typename F> inline set_of_reg
95 1.1.1.6 mrg rx_find_set_of_reg (rtx reg, rtx_insn* insn, F stepfunc,
96 1.1.1.6 mrg bool ignore_reg_reg_copies = false)
97 1.1.1.6 mrg {
98 1.1.1.6 mrg set_of_reg result;
99 1.1.1.6 mrg result.insn = insn;
100 1.1.1.6 mrg result.set_rtx = NULL_RTX;
101 1.1.1.6 mrg result.set_src = NULL_RTX;
102 1.1.1.6 mrg
103 1.1.1.6 mrg if (!REG_P (reg) || insn == NULL_RTX)
104 1.1.1.6 mrg return result;
105 1.1.1.6 mrg
106 1.1.1.6 mrg for (rtx_insn* i = stepfunc (insn); i != NULL_RTX; i = stepfunc (i))
107 1.1.1.6 mrg {
108 1.1.1.6 mrg if (BARRIER_P (i))
109 1.1.1.6 mrg break;
110 1.1.1.6 mrg if (!INSN_P (i) || DEBUG_INSN_P (i))
111 1.1.1.6 mrg continue;
112 1.1.1.6 mrg if (reg_set_p (reg, i))
113 1.1.1.6 mrg {
114 1.1.1.6 mrg if (CALL_P (i))
115 1.1.1.6 mrg break;
116 1.1.1.6 mrg
117 1.1.1.6 mrg result.insn = i;
118 1.1.1.6 mrg result.set_rtx = set_of (reg, i);
119 1.1.1.6 mrg
120 1.1.1.6 mrg if (result.set_rtx == NULL_RTX || GET_CODE (result.set_rtx) != SET)
121 1.1.1.6 mrg break;
122 1.1.1.6 mrg
123 1.1.1.6 mrg result.set_src = XEXP (result.set_rtx, 1);
124 1.1.1.6 mrg
125 1.1.1.6 mrg if (ignore_reg_reg_copies && REG_P (result.set_src))
126 1.1.1.6 mrg {
127 1.1.1.6 mrg reg = result.set_src;
128 1.1.1.6 mrg continue;
129 1.1.1.6 mrg }
130 1.1.1.6 mrg if (ignore_reg_reg_copies && SUBREG_P (result.set_src)
131 1.1.1.6 mrg && REG_P (SUBREG_REG (result.set_src)))
132 1.1.1.6 mrg {
133 1.1.1.6 mrg reg = SUBREG_REG (result.set_src);
134 1.1.1.6 mrg continue;
135 1.1.1.6 mrg }
136 1.1.1.6 mrg
137 1.1.1.6 mrg break;
138 1.1.1.6 mrg }
139 1.1.1.6 mrg }
140 1.1.1.6 mrg
141 1.1.1.6 mrg /* If the searched reg is found inside a (mem (post_inc:SI (reg))), set_of
142 1.1.1.6 mrg will return NULL and set_rtx will be NULL.
143 1.1.1.6 mrg In this case report a 'not found'. result.insn will always be non-null
144 1.1.1.6 mrg at this point, so no need to check it. */
145 1.1.1.6 mrg if (result.set_src != NULL && result.set_rtx == NULL)
146 1.1.1.6 mrg result.set_src = NULL;
147 1.1.1.6 mrg
148 1.1.1.6 mrg return result;
149 1.1.1.6 mrg }
150 1.1.1.6 mrg
151 1.1.1.6 mrg /* FIXME: Move to rtlh.h. */
152 1.1.1.6 mrg template <typename F> inline rtx_insn*
153 1.1.1.6 mrg rx_find_use_of_reg (rtx reg, rtx_insn* insn, F stepfunc)
154 1.1.1.6 mrg {
155 1.1.1.6 mrg if (!REG_P (reg) || insn == NULL_RTX)
156 1.1.1.6 mrg return NULL;
157 1.1.1.6 mrg
158 1.1.1.6 mrg for (rtx_insn* i = stepfunc (insn); i != NULL_RTX; i = stepfunc (i))
159 1.1.1.6 mrg {
160 1.1.1.6 mrg if (BARRIER_P (i))
161 1.1.1.6 mrg break;
162 1.1.1.6 mrg if (!INSN_P (i) || DEBUG_INSN_P (i))
163 1.1.1.6 mrg continue;
164 1.1.1.6 mrg if (reg_overlap_mentioned_p (reg, PATTERN (i))
165 1.1.1.6 mrg || (CALL_P (i) && find_reg_fusage (i, USE, reg)))
166 1.1.1.6 mrg return i;
167 1.1.1.6 mrg }
168 1.1.1.6 mrg
169 1.1.1.6 mrg return NULL;
170 1.1.1.6 mrg }
171 1.1.1.6 mrg
172 1.1 mrg #endif
173 1.1 mrg
174 1.1 mrg #endif /* GCC_RX_PROTOS_H */
175