1169689Skan/* Prototypes of target machine for GNU compiler.  MIPS version.
2169689Skan   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3169689Skan   1999, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4169689Skan   Contributed by A. Lichnewsky (lich@inria.inria.fr).
5169689Skan   Changed by Michael Meissner	(meissner@osf.org).
6169689Skan   64 bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
7169689Skan   Brendan Eich (brendan@microunity.com).
8169689Skan
9169689SkanThis file is part of GCC.
10169689Skan
11169689SkanGCC is free software; you can redistribute it and/or modify
12169689Skanit under the terms of the GNU General Public License as published by
13169689Skanthe Free Software Foundation; either version 2, or (at your option)
14169689Skanany later version.
15169689Skan
16169689SkanGCC is distributed in the hope that it will be useful,
17169689Skanbut WITHOUT ANY WARRANTY; without even the implied warranty of
18169689SkanMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19169689SkanGNU General Public License for more details.
20169689Skan
21169689SkanYou should have received a copy of the GNU General Public License
22169689Skanalong with GCC; see the file COPYING.  If not, write to
23169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
24169689SkanBoston, MA 02110-1301, USA.  */
25169689Skan
26169689Skan#ifndef GCC_MIPS_PROTOS_H
27169689Skan#define GCC_MIPS_PROTOS_H
28169689Skan
29169689Skan/* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
30169689Skan
31169689Skan   SYMBOL_GENERAL
32169689Skan       Used when none of the below apply.
33169689Skan
34169689Skan   SYMBOL_SMALL_DATA
35169689Skan       The symbol refers to something in a small data section.
36169689Skan
37169689Skan   SYMBOL_CONSTANT_POOL
38169689Skan       The symbol refers to something in the mips16 constant pool.
39169689Skan
40169689Skan   SYMBOL_GOT_LOCAL
41169689Skan       The symbol refers to local data that will be found using
42169689Skan       the global offset table.
43169689Skan
44169689Skan   SYMBOL_GOT_GLOBAL
45169689Skan       Likewise non-local data.
46169689Skan
47169689Skan   SYMBOL_GOTOFF_PAGE
48169689Skan       An UNSPEC wrapper around a SYMBOL_GOT_LOCAL.  It represents the
49169689Skan       offset from _gp of a GOT page entry.
50169689Skan
51169689Skan   SYMBOL_GOTOFF_GLOBAL
52169689Skan       An UNSPEC wrapper around a SYMBOL_GOT_GLOBAL.  It represents the
53169689Skan       the offset from _gp of the symbol's GOT entry.
54169689Skan
55169689Skan   SYMBOL_GOTOFF_CALL
56169689Skan       Like SYMBOL_GOTOFF_GLOBAL, but used when calling a global function.
57169689Skan       The GOT entry is allowed to point to a stub rather than to the
58169689Skan       function itself.
59169689Skan
60169689Skan   SYMBOL_GOTOFF_LOADGP
61169689Skan       An UNSPEC wrapper around a function's address.  It represents the
62169689Skan       offset of _gp from the start of the function.
63169689Skan
64169689Skan   SYMBOL_TLS
65169689Skan       A thread-local symbol.
66169689Skan
67169689Skan   SYMBOL_TLSGD
68169689Skan   SYMBOL_TLSLDM
69169689Skan   SYMBOL_DTPREL
70169689Skan   SYMBOL_GOTTPREL
71169689Skan   SYMBOL_TPREL
72169689Skan       UNSPEC wrappers around SYMBOL_TLS, corresponding to the
73169689Skan       thread-local storage relocation operators.
74169689Skan
75169689Skan   SYMBOL_64_HIGH
76169689Skan       For a 64-bit symbolic address X, this is the value of
77169689Skan       (%highest(X) << 16) + %higher(X).
78169689Skan
79169689Skan   SYMBOL_64_MID
80169689Skan       For a 64-bit symbolic address X, this is the value of
81169689Skan       (%higher(X) << 16) + %hi(X).
82169689Skan
83169689Skan   SYMBOL_64_LOW
84169689Skan       For a 64-bit symbolic address X, this is the value of
85169689Skan       (%hi(X) << 16) + %lo(X).  */
86169689Skanenum mips_symbol_type {
87169689Skan  SYMBOL_GENERAL,
88169689Skan  SYMBOL_SMALL_DATA,
89169689Skan  SYMBOL_CONSTANT_POOL,
90169689Skan  SYMBOL_GOT_LOCAL,
91169689Skan  SYMBOL_GOT_GLOBAL,
92169689Skan  SYMBOL_GOTOFF_PAGE,
93169689Skan  SYMBOL_GOTOFF_GLOBAL,
94169689Skan  SYMBOL_GOTOFF_CALL,
95169689Skan  SYMBOL_GOTOFF_LOADGP,
96169689Skan  SYMBOL_TLS,
97169689Skan  SYMBOL_TLSGD,
98169689Skan  SYMBOL_TLSLDM,
99169689Skan  SYMBOL_DTPREL,
100169689Skan  SYMBOL_GOTTPREL,
101169689Skan  SYMBOL_TPREL,
102169689Skan  SYMBOL_64_HIGH,
103169689Skan  SYMBOL_64_MID,
104169689Skan  SYMBOL_64_LOW
105169689Skan};
106169689Skan#define NUM_SYMBOL_TYPES (SYMBOL_64_LOW + 1)
107169689Skan
108169689Skan/* Identifiers a style of $gp initialization sequence.
109169689Skan
110169689Skan   LOADGP_NONE
111169689Skan	No initialization sequence is needed.
112169689Skan
113169689Skan   LOADGP_OLDABI
114169689Skan	The o32 and o64 PIC sequence (the kind traditionally generated
115169689Skan	by .cpload).
116169689Skan
117169689Skan   LOADGP_NEWABI
118169689Skan	The n32 and n64 PIC sequence (the kind traditionally generated
119169689Skan	by .cpsetup).
120169689Skan
121169689Skan   LOADGP_ABSOLUTE
122169689Skan	The GNU absolute sequence, as generated by loadgp_noshared.  */
123169689Skanenum mips_loadgp_style {
124169689Skan  LOADGP_NONE,
125169689Skan  LOADGP_OLDABI,
126169689Skan  LOADGP_NEWABI,
127169689Skan  LOADGP_ABSOLUTE
128169689Skan};
129169689Skan
130169689Skanextern bool mips_symbolic_constant_p (rtx, enum mips_symbol_type *);
131169689Skanextern int mips_regno_mode_ok_for_base_p (int, enum machine_mode, int);
132169689Skanextern bool mips_stack_address_p (rtx, enum machine_mode);
133169689Skanextern int mips_address_insns (rtx, enum machine_mode);
134169689Skanextern int mips_const_insns (rtx);
135169689Skanextern int mips_fetch_insns (rtx);
136169689Skanextern int mips_idiv_insns (void);
137169689Skanextern int fp_register_operand (rtx, enum machine_mode);
138169689Skanextern int lo_operand (rtx, enum machine_mode);
139169689Skanextern bool mips_legitimate_address_p (enum machine_mode, rtx, int);
140169689Skanextern rtx mips_split_symbol (rtx, rtx);
141169689Skanextern rtx mips_unspec_address (rtx, enum mips_symbol_type);
142169689Skanextern bool mips_legitimize_address (rtx *, enum machine_mode);
143169689Skanextern void mips_move_integer (rtx, rtx, unsigned HOST_WIDE_INT);
144169689Skanextern bool mips_legitimize_move (enum machine_mode, rtx, rtx);
145169689Skan
146169689Skanextern int m16_uimm3_b (rtx, enum machine_mode);
147169689Skanextern int m16_simm4_1 (rtx, enum machine_mode);
148169689Skanextern int m16_nsimm4_1 (rtx, enum machine_mode);
149169689Skanextern int m16_simm5_1 (rtx, enum machine_mode);
150169689Skanextern int m16_nsimm5_1 (rtx, enum machine_mode);
151169689Skanextern int m16_uimm5_4 (rtx, enum machine_mode);
152169689Skanextern int m16_nuimm5_4 (rtx, enum machine_mode);
153169689Skanextern int m16_simm8_1 (rtx, enum machine_mode);
154169689Skanextern int m16_nsimm8_1 (rtx, enum machine_mode);
155169689Skanextern int m16_uimm8_1 (rtx, enum machine_mode);
156169689Skanextern int m16_nuimm8_1 (rtx, enum machine_mode);
157169689Skanextern int m16_uimm8_m1_1 (rtx, enum machine_mode);
158169689Skanextern int m16_uimm8_4 (rtx, enum machine_mode);
159169689Skanextern int m16_nuimm8_4 (rtx, enum machine_mode);
160169689Skanextern int m16_simm8_8 (rtx, enum machine_mode);
161169689Skanextern int m16_nsimm8_8 (rtx, enum machine_mode);
162169689Skan
163169689Skanextern rtx mips_subword (rtx, int);
164169689Skanextern bool mips_split_64bit_move_p (rtx, rtx);
165169689Skanextern void mips_split_64bit_move (rtx, rtx);
166169689Skanextern const char *mips_output_move (rtx, rtx);
167169689Skanextern void mips_restore_gp (void);
168169689Skan#ifdef RTX_CODE
169169689Skanextern bool mips_emit_scc (enum rtx_code, rtx);
170169689Skanextern void gen_conditional_branch (rtx *, enum rtx_code);
171169689Skanextern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx);
172169689Skan#endif
173169689Skanextern void gen_conditional_move (rtx *);
174169689Skanextern void mips_gen_conditional_trap (rtx *);
175169689Skanextern void mips_expand_call (rtx, rtx, rtx, rtx, int);
176169689Skanextern void mips_emit_fcc_reload (rtx, rtx, rtx);
177169689Skanextern void mips_set_return_address (rtx, rtx);
178169689Skanextern bool mips_expand_block_move (rtx, rtx, rtx);
179169689Skan
180169689Skanextern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx);
181169689Skanextern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
182169689Skan				  tree, int);
183169689Skanextern struct rtx_def *function_arg (const CUMULATIVE_ARGS *,
184169689Skan				     enum machine_mode, tree, int);
185169689Skanextern int function_arg_boundary (enum machine_mode, tree);
186169689Skanextern bool mips_pad_arg_upward (enum machine_mode, tree);
187169689Skanextern bool mips_pad_reg_upward (enum machine_mode, tree);
188169689Skanextern void mips_va_start (tree, rtx);
189169689Skan
190169689Skanextern bool mips_expand_unaligned_load (rtx, rtx, unsigned int, int);
191169689Skanextern bool mips_expand_unaligned_store (rtx, rtx, unsigned int, int);
192169689Skanextern bool mips_mem_fits_mode_p (enum machine_mode mode, rtx x);
193169689Skanextern void override_options (void);
194169689Skanextern void mips_conditional_register_usage (void);
195169689Skanextern void mips_order_regs_for_local_alloc (void);
196169689Skanextern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
197169689Skan
198169689Skanextern void print_operand (FILE *, rtx, int);
199169689Skanextern void print_operand_address (FILE *, rtx);
200169689Skanextern int mips_output_external (FILE *, tree, const char *);
201169689Skanextern void mips_output_filename (FILE *, const char *);
202169689Skanextern void mips_output_ascii (FILE *, const char *, size_t, const char *);
203169689Skanextern void mips_output_aligned_bss (FILE *, tree, const char *,
204169689Skan				     unsigned HOST_WIDE_INT, int);
205169689Skanextern void mips_output_aligned_decl_common (FILE *, tree, const char *,
206169689Skan					     unsigned HOST_WIDE_INT,
207169689Skan					     unsigned int);
208169689Skanextern void mips_declare_common_object (FILE *, const char *,
209169689Skan					const char *, unsigned HOST_WIDE_INT,
210169689Skan					unsigned int, bool);
211169689Skanextern void mips_declare_object (FILE *, const char *, const char *,
212169689Skan				 const char *, ...) ATTRIBUTE_PRINTF_4;
213169689Skanextern void mips_declare_object_name (FILE *, const char *, tree);
214169689Skanextern void mips_finish_declare_object (FILE *, tree, int, int);
215169689Skan
216169689Skanextern bool mips_small_data_pattern_p (rtx);
217169689Skanextern rtx mips_rewrite_small_data (rtx);
218169689Skanextern HOST_WIDE_INT compute_frame_size (HOST_WIDE_INT);
219169689Skanextern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
220169689Skanextern rtx mips_return_addr (int, rtx);
221169689Skanextern enum mips_loadgp_style mips_current_loadgp_style (void);
222169689Skanextern void mips_expand_prologue (void);
223169689Skanextern void mips_expand_epilogue (int);
224169689Skanextern int mips_can_use_return_insn (void);
225169689Skanextern struct rtx_def *mips_function_value (tree, tree, enum machine_mode);
226169689Skan
227169689Skanextern bool mips_cannot_change_mode_class (enum machine_mode,
228169689Skan					   enum machine_mode, enum reg_class);
229169689Skanextern bool mips_dangerous_for_la25_p (rtx);
230169689Skanextern enum reg_class mips_preferred_reload_class (rtx, enum reg_class);
231169689Skanextern enum reg_class mips_secondary_reload_class (enum reg_class,
232169689Skan						   enum machine_mode,
233169689Skan						   rtx, int);
234169689Skanextern int mips_class_max_nregs (enum reg_class, enum machine_mode);
235169689Skanextern int build_mips16_call_stub (rtx, rtx, rtx, int);
236169689Skanextern int mips_register_move_cost (enum machine_mode, enum reg_class,
237169689Skan				    enum reg_class);
238169689Skan
239169689Skanextern int mips_adjust_insn_length (rtx, int);
240169689Skanextern const char *mips_output_load_label (void);
241169689Skanextern const char *mips_output_conditional_branch (rtx, rtx *, const char *,
242169689Skan						   const char *);
243169689Skanextern const char *mips_output_order_conditional_branch (rtx, rtx *, bool);
244169689Skanextern const char *mips_output_division (const char *, rtx *);
245169689Skanextern unsigned int mips_hard_regno_nregs (int, enum machine_mode);
246169689Skanextern bool mips_linked_madd_p (rtx, rtx);
247169689Skanextern int mips_store_data_bypass_p (rtx, rtx);
248169689Skanextern rtx mips_prefetch_cookie (rtx, rtx);
249169689Skan
250169689Skanextern void irix_asm_output_align (FILE *, unsigned);
251169689Skanextern const char *current_section_name (void);
252169689Skanextern unsigned int current_section_flags (void);
253169689Skanextern bool mips_use_ins_ext_p (rtx, rtx, rtx);
254169689Skan
255169689Skan#endif /* ! GCC_MIPS_PROTOS_H */
256