1/* Frv prototypes.
2   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005 Free Software Foundation,
3   Inc.
4   Contributed by Red Hat, Inc.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING.  If not, write to
20the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21Boston, MA 02110-1301, USA.  */
22
23/* CPU type.  This must be identical to the cpu enumeration in frv.md.  */
24typedef enum frv_cpu
25{
26  FRV_CPU_GENERIC,
27  FRV_CPU_FR550,
28  FRV_CPU_FR500,
29  FRV_CPU_FR450,
30  FRV_CPU_FR405,
31  FRV_CPU_FR400,
32  FRV_CPU_FR300,
33  FRV_CPU_SIMPLE,
34  FRV_CPU_TOMCAT
35} frv_cpu_t;
36
37extern frv_cpu_t frv_cpu_type;			/* value of -mcpu= */
38
39/* Define functions defined in frv.c */
40extern void frv_expand_prologue			(void);
41extern void frv_expand_epilogue			(bool);
42extern void frv_override_options		(void);
43extern void frv_optimization_options		(int, int);
44extern void frv_conditional_register_usage	(void);
45extern frv_stack_t *frv_stack_info		(void);
46extern void frv_debug_stack			(frv_stack_t *);
47extern int frv_frame_pointer_required		(void);
48extern int frv_initial_elimination_offset	(int, int);
49
50#ifdef RTX_CODE
51extern int frv_legitimate_address_p		(enum machine_mode, rtx,
52						 int, int, int);
53extern rtx frv_legitimize_address		(rtx, rtx, enum machine_mode);
54extern rtx frv_find_base_term			(rtx);
55
56#ifdef TREE_CODE
57extern void frv_init_cumulative_args		(CUMULATIVE_ARGS *, tree,
58						 rtx, tree, int);
59
60extern int frv_function_arg_boundary		(enum machine_mode, tree);
61extern rtx frv_function_arg			(CUMULATIVE_ARGS *,
62						 enum machine_mode,
63						 tree, int, int);
64
65extern void frv_function_arg_advance		(CUMULATIVE_ARGS *,
66						 enum machine_mode,
67						 tree, int);
68
69extern void frv_expand_builtin_va_start		(tree, rtx);
70#endif /* TREE_CODE */
71
72extern int frv_expand_block_move		(rtx *);
73extern int frv_expand_block_clear		(rtx *);
74extern rtx frv_dynamic_chain_address		(rtx);
75extern rtx frv_return_addr_rtx			(int, rtx);
76extern rtx frv_index_memory			(rtx, enum machine_mode, int);
77extern const char *frv_asm_output_opcode
78				 	(FILE *, const char *);
79extern void frv_final_prescan_insn	(rtx, rtx *, int);
80extern void frv_print_operand		(FILE *, rtx, int);
81extern void frv_print_operand_address	(FILE *, rtx);
82extern void frv_emit_move		(enum machine_mode, rtx, rtx);
83extern int frv_emit_movsi		(rtx, rtx);
84extern const char *output_move_single	(rtx *, rtx);
85extern const char *output_move_double	(rtx *, rtx);
86extern const char *output_condmove_single
87					(rtx *, rtx);
88extern int frv_emit_cond_branch		(enum rtx_code, rtx);
89extern int frv_emit_scc			(enum rtx_code, rtx);
90extern rtx frv_split_scc		(rtx, rtx, rtx, rtx, HOST_WIDE_INT);
91extern int frv_emit_cond_move		(rtx, rtx, rtx, rtx);
92extern rtx frv_split_cond_move		(rtx *);
93extern rtx frv_split_minmax		(rtx *);
94extern rtx frv_split_abs		(rtx *);
95extern void frv_split_double_load	(rtx, rtx);
96extern void frv_split_double_store	(rtx, rtx);
97#ifdef BB_HEAD
98extern void frv_ifcvt_init_extra_fields	(ce_if_block_t *);
99extern void frv_ifcvt_modify_tests	(ce_if_block_t *, rtx *, rtx *);
100extern void frv_ifcvt_modify_multiple_tests
101					(ce_if_block_t *, basic_block,
102					 rtx *, rtx *);
103extern rtx frv_ifcvt_modify_insn	(ce_if_block_t *, rtx, rtx);
104extern void frv_ifcvt_modify_final	(ce_if_block_t *);
105extern void frv_ifcvt_modify_cancel	(ce_if_block_t *);
106#endif
107extern int frv_trampoline_size		(void);
108extern void frv_initialize_trampoline	(rtx, rtx, rtx);
109extern enum reg_class frv_secondary_reload_class
110					(enum reg_class class,
111					 enum machine_mode mode,
112					 rtx x, int);
113extern int frv_class_likely_spilled_p	(enum reg_class class);
114extern int frv_hard_regno_mode_ok	(int, enum machine_mode);
115extern int frv_hard_regno_nregs		(int, enum machine_mode);
116extern int frv_class_max_nregs		(enum reg_class class,
117					 enum machine_mode mode);
118extern int frv_legitimate_constant_p	(rtx);
119extern enum machine_mode frv_select_cc_mode (enum rtx_code, rtx, rtx);
120#endif	/* RTX_CODE */
121
122extern int direct_return_p		(void);
123extern int frv_register_move_cost	(enum reg_class, enum reg_class);
124extern int frv_issue_rate		(void);
125extern int frv_acc_group		(rtx);
126
127#ifdef TREE_CODE
128extern int frv_adjust_field_align	(tree, int);
129#endif
130
131extern void fixup_section		(void);
132extern void sdata_section		(void);
133extern void sbss_section		(void);
134extern void data_section		(void);
135
136#ifdef RTX_CODE
137extern int integer_register_operand	(rtx, enum machine_mode);
138extern int frv_load_operand		(rtx, enum machine_mode);
139extern int gpr_or_fpr_operand		(rtx, enum machine_mode);
140extern int gpr_no_subreg_operand	(rtx, enum machine_mode);
141extern int gpr_or_int6_operand		(rtx, enum machine_mode);
142extern int fpr_or_int6_operand		(rtx, enum machine_mode);
143extern int gpr_or_int_operand		(rtx, enum machine_mode);
144extern int gpr_or_int12_operand		(rtx, enum machine_mode);
145extern int gpr_fpr_or_int12_operand	(rtx, enum machine_mode);
146extern int gpr_or_int10_operand		(rtx, enum machine_mode);
147extern int move_source_operand		(rtx, enum machine_mode);
148extern int move_destination_operand	(rtx, enum machine_mode);
149extern int condexec_source_operand	(rtx, enum machine_mode);
150extern int condexec_dest_operand	(rtx, enum machine_mode);
151extern int lr_operand			(rtx, enum machine_mode);
152extern int gpr_or_memory_operand	(rtx, enum machine_mode);
153extern int fpr_or_memory_operand	(rtx, enum machine_mode);
154extern int reg_or_0_operand		(rtx, enum machine_mode);
155extern int fcc_operand			(rtx, enum machine_mode);
156extern int icc_operand			(rtx, enum machine_mode);
157extern int cc_operand			(rtx, enum machine_mode);
158extern int fcr_operand			(rtx, enum machine_mode);
159extern int icr_operand			(rtx, enum machine_mode);
160extern int cr_operand			(rtx, enum machine_mode);
161extern int call_operand			(rtx, enum machine_mode);
162extern int fpr_operand			(rtx, enum machine_mode);
163extern int even_reg_operand		(rtx, enum machine_mode);
164extern int odd_reg_operand		(rtx, enum machine_mode);
165extern int even_gpr_operand		(rtx, enum machine_mode);
166extern int odd_gpr_operand		(rtx, enum machine_mode);
167extern int quad_fpr_operand		(rtx, enum machine_mode);
168extern int even_fpr_operand		(rtx, enum machine_mode);
169extern int odd_fpr_operand		(rtx, enum machine_mode);
170extern int dbl_memory_one_insn_operand	(rtx, enum machine_mode);
171extern int dbl_memory_two_insn_operand	(rtx, enum machine_mode);
172extern int int12_operand		(rtx, enum machine_mode);
173extern int int6_operand			(rtx, enum machine_mode);
174extern int int5_operand			(rtx, enum machine_mode);
175extern int uint5_operand		(rtx, enum machine_mode);
176extern int uint4_operand		(rtx, enum machine_mode);
177extern int uint1_operand		(rtx, enum machine_mode);
178extern int int_2word_operand		(rtx, enum machine_mode);
179extern int pic_register_operand		(rtx, enum machine_mode);
180extern int pic_symbolic_operand		(rtx, enum machine_mode);
181extern int small_data_register_operand	(rtx, enum machine_mode);
182extern int small_data_symbolic_operand	(rtx, enum machine_mode);
183extern int upper_int16_operand		(rtx, enum machine_mode);
184extern int uint16_operand		(rtx, enum machine_mode);
185extern int symbolic_operand		(rtx, enum machine_mode);
186extern int relational_operator		(rtx, enum machine_mode);
187extern int signed_relational_operator	(rtx, enum machine_mode);
188extern int unsigned_relational_operator	(rtx, enum machine_mode);
189extern int float_relational_operator	(rtx, enum machine_mode);
190extern int ccr_eqne_operator		(rtx, enum machine_mode);
191extern int minmax_operator		(rtx, enum machine_mode);
192extern int condexec_si_binary_operator	(rtx, enum machine_mode);
193extern int condexec_si_media_operator	(rtx, enum machine_mode);
194extern int condexec_si_divide_operator	(rtx, enum machine_mode);
195extern int condexec_si_unary_operator	(rtx, enum machine_mode);
196extern int condexec_sf_conv_operator	(rtx, enum machine_mode);
197extern int condexec_sf_add_operator	(rtx, enum machine_mode);
198extern int condexec_memory_operand	(rtx, enum machine_mode);
199extern int intop_compare_operator	(rtx, enum machine_mode);
200extern int acc_operand			(rtx, enum machine_mode);
201extern int even_acc_operand		(rtx, enum machine_mode);
202extern int quad_acc_operand		(rtx, enum machine_mode);
203extern int accg_operand			(rtx, enum machine_mode);
204extern rtx frv_matching_accg_for_acc	(rtx);
205extern void frv_expand_fdpic_call	(rtx *, bool, bool);
206extern rtx frv_gen_GPsym2reg		(rtx, rtx);
207extern int frv_legitimate_memory_operand (rtx, enum machine_mode, int);
208
209/* Information about a relocation unspec.  SYMBOL is the relocation symbol
210   (a SYMBOL_REF or LABEL_REF), RELOC is the type of relocation and OFFSET
211   is the constant addend.  */
212struct frv_unspec {
213  rtx symbol;
214  int reloc;
215  HOST_WIDE_INT offset;
216};
217
218extern bool frv_const_unspec_p (rtx, struct frv_unspec *);
219
220#endif
221
222