1/* Frv prototypes.
2   Copyright (C) 1999-2022 Free Software Foundation, Inc.
3   Contributed by Red Hat, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21/* Define functions defined in frv.cc */
22extern void frv_expand_prologue			(void);
23extern void frv_expand_epilogue			(bool);
24extern frv_stack_t *frv_stack_info		(void);
25extern void frv_debug_stack			(frv_stack_t *);
26extern int frv_initial_elimination_offset	(int, int);
27extern void frv_ifcvt_machdep_init		(void *);
28
29#ifdef RTX_CODE
30extern int frv_legitimate_address_p_1		(machine_mode, rtx,
31						 int, int, int);
32extern rtx frv_find_base_term			(rtx);
33
34#ifdef TREE_CODE
35extern void frv_init_cumulative_args		(CUMULATIVE_ARGS *, tree,
36						 rtx, tree, int);
37
38extern bool frv_function_value_regno_p		(const unsigned int);
39#endif /* TREE_CODE */
40
41extern int frv_expand_block_move		(rtx *);
42extern int frv_expand_block_clear		(rtx *);
43extern rtx frv_dynamic_chain_address		(rtx);
44extern rtx frv_return_addr_rtx			(int, rtx);
45extern rtx frv_index_memory			(rtx, machine_mode, int);
46extern const char *frv_asm_output_opcode
47				 	(FILE *, const char *);
48extern void frv_final_prescan_insn	(rtx_insn *, rtx *, int);
49extern void frv_emit_move		(machine_mode, rtx, rtx);
50extern int frv_emit_movsi		(rtx, rtx);
51extern const char *output_move_single	(rtx *, rtx);
52extern const char *output_move_double	(rtx *, rtx);
53extern const char *output_condmove_single
54					(rtx *, rtx);
55extern int frv_emit_cond_branch		(rtx *);
56extern int frv_emit_scc			(rtx *);
57extern rtx frv_split_scc		(rtx, rtx, rtx, rtx, HOST_WIDE_INT);
58extern int frv_emit_cond_move		(rtx, rtx, rtx, rtx);
59extern rtx frv_split_cond_move		(rtx *);
60extern rtx frv_split_minmax		(rtx *);
61extern rtx frv_split_abs		(rtx *);
62extern void frv_split_double_load	(rtx, rtx);
63extern void frv_split_double_store	(rtx, rtx);
64#ifdef BB_HEAD
65extern void frv_ifcvt_init_extra_fields	(struct ce_if_block *);
66extern void frv_ifcvt_modify_tests	(struct ce_if_block *, rtx *, rtx *);
67extern void frv_ifcvt_modify_multiple_tests
68					(struct ce_if_block *, basic_block,
69					 rtx *, rtx *);
70extern rtx frv_ifcvt_modify_insn	(struct ce_if_block *, rtx, rtx_insn *);
71extern void frv_ifcvt_modify_final	(struct ce_if_block *);
72extern void frv_ifcvt_modify_cancel	(struct ce_if_block *);
73#endif
74extern enum reg_class frv_secondary_reload_class
75					(enum reg_class,
76					 machine_mode, rtx);
77extern int frv_class_max_nregs		(enum reg_class rclass,
78					 machine_mode mode);
79extern machine_mode frv_select_cc_mode (enum rtx_code, rtx, rtx);
80#endif	/* RTX_CODE */
81
82extern int frv_trampoline_size		(void);
83extern int direct_return_p		(void);
84extern int frv_issue_rate		(void);
85extern int frv_acc_group		(rtx);
86
87#ifdef TREE_CODE
88extern int frv_adjust_field_align	(tree, int);
89#endif
90
91#ifdef RTX_CODE
92extern bool integer_register_operand	(rtx, machine_mode);
93extern bool frv_load_operand		(rtx, machine_mode);
94extern bool gpr_or_fpr_operand		(rtx, machine_mode);
95extern bool gpr_no_subreg_operand	(rtx, machine_mode);
96extern int gpr_or_int6_operand		(rtx, machine_mode);
97extern bool fpr_or_int6_operand		(rtx, machine_mode);
98extern bool gpr_or_int_operand		(rtx, machine_mode);
99extern bool gpr_or_int12_operand	(rtx, machine_mode);
100extern bool gpr_fpr_or_int12_operand	(rtx, machine_mode);
101extern bool gpr_or_int10_operand	(rtx, machine_mode);
102extern bool move_source_operand		(rtx, machine_mode);
103extern bool move_destination_operand	(rtx, machine_mode);
104extern bool condexec_source_operand	(rtx, machine_mode);
105extern bool condexec_dest_operand	(rtx, machine_mode);
106extern bool lr_operand			(rtx, machine_mode);
107extern bool gpr_or_memory_operand	(rtx, machine_mode);
108extern bool fpr_or_memory_operand	(rtx, machine_mode);
109extern bool reg_or_0_operand		(rtx, machine_mode);
110extern bool fcc_operand			(rtx, machine_mode);
111extern bool icc_operand			(rtx, machine_mode);
112extern bool cc_operand			(rtx, machine_mode);
113extern bool fcr_operand			(rtx, machine_mode);
114extern bool icr_operand			(rtx, machine_mode);
115extern bool cr_operand			(rtx, machine_mode);
116extern bool call_operand		(rtx, machine_mode);
117extern bool fpr_operand			(rtx, machine_mode);
118extern bool even_reg_operand		(rtx, machine_mode);
119extern bool odd_reg_operand		(rtx, machine_mode);
120extern bool even_gpr_operand		(rtx, machine_mode);
121extern bool odd_gpr_operand		(rtx, machine_mode);
122extern bool quad_fpr_operand		(rtx, machine_mode);
123extern bool even_fpr_operand		(rtx, machine_mode);
124extern bool odd_fpr_operand		(rtx, machine_mode);
125extern bool dbl_memory_one_insn_operand	(rtx, machine_mode);
126extern bool dbl_memory_two_insn_operand	(rtx, machine_mode);
127extern bool int12_operand		(rtx, machine_mode);
128extern bool int6_operand		(rtx, machine_mode);
129extern bool int5_operand		(rtx, machine_mode);
130extern bool uint5_operand		(rtx, machine_mode);
131extern bool uint4_operand		(rtx, machine_mode);
132extern bool uint1_operand		(rtx, machine_mode);
133extern bool int_2word_operand		(rtx, machine_mode);
134extern int pic_register_operand		(rtx, machine_mode);
135extern int pic_symbolic_operand		(rtx, machine_mode);
136extern int small_data_register_operand	(rtx, machine_mode);
137extern int small_data_symbolic_operand	(rtx, machine_mode);
138extern bool upper_int16_operand		(rtx, machine_mode);
139extern bool uint16_operand		(rtx, machine_mode);
140extern bool symbolic_operand		(rtx, machine_mode);
141extern bool relational_operator		(rtx, machine_mode);
142extern int signed_relational_operator	(rtx, machine_mode);
143extern int unsigned_relational_operator	(rtx, machine_mode);
144extern bool float_relational_operator	(rtx, machine_mode);
145extern bool ccr_eqne_operator		(rtx, machine_mode);
146extern bool minmax_operator		(rtx, machine_mode);
147extern bool condexec_si_binary_operator	(rtx, machine_mode);
148extern bool condexec_si_media_operator	(rtx, machine_mode);
149extern bool condexec_si_divide_operator	(rtx, machine_mode);
150extern bool condexec_si_unary_operator	(rtx, machine_mode);
151extern bool condexec_sf_conv_operator	(rtx, machine_mode);
152extern bool condexec_sf_add_operator	(rtx, machine_mode);
153extern int condexec_memory_operand	(rtx, machine_mode);
154extern bool intop_compare_operator	(rtx, machine_mode);
155extern bool acc_operand			(rtx, machine_mode);
156extern bool even_acc_operand		(rtx, machine_mode);
157extern bool quad_acc_operand		(rtx, machine_mode);
158extern bool accg_operand			(rtx, machine_mode);
159extern rtx frv_matching_accg_for_acc	(rtx);
160extern void frv_expand_fdpic_call	(rtx *, bool, bool);
161extern rtx frv_gen_GPsym2reg		(rtx, rtx);
162extern int frv_legitimate_memory_operand (rtx, machine_mode, int);
163
164/* Information about a relocation unspec.  SYMBOL is the relocation symbol
165   (a SYMBOL_REF or LABEL_REF), RELOC is the type of relocation and OFFSET
166   is the constant addend.  */
167struct frv_unspec {
168  rtx symbol;
169  int reloc;
170  HOST_WIDE_INT offset;
171};
172
173extern bool frv_const_unspec_p (rtx, struct frv_unspec *);
174
175#endif
176
177