]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/mips/mips-protos.h
Update copyright years in gcc/
[thirdparty/gcc.git] / gcc / config / mips / mips-protos.h
CommitLineData
bd9f1972 1/* Prototypes of target machine for GNU compiler. MIPS version.
23a5b65a 2 Copyright (C) 1989-2014 Free Software Foundation, Inc.
bd9f1972
KG
3 Contributed by A. Lichnewsky (lich@inria.inria.fr).
4 Changed by Michael Meissner (meissner@osf.org).
85f65093 5 64-bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
bd9f1972
KG
6 Brendan Eich (brendan@microunity.com).
7
7ec022b2 8This file is part of GCC.
bd9f1972 9
7ec022b2 10GCC is free software; you can redistribute it and/or modify
bd9f1972 11it under the terms of the GNU General Public License as published by
2f83c7d6 12the Free Software Foundation; either version 3, or (at your option)
bd9f1972
KG
13any later version.
14
7ec022b2 15GCC is distributed in the hope that it will be useful,
bd9f1972
KG
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
2f83c7d6
NC
21along with GCC; see the file COPYING3. If not see
22<http://www.gnu.org/licenses/>. */
bd9f1972 23
88657302
RH
24#ifndef GCC_MIPS_PROTOS_H
25#define GCC_MIPS_PROTOS_H
bd9f1972 26
280fcbfa
RS
27/* Describes how a symbol is used.
28
29 SYMBOL_CONTEXT_CALL
30 The symbol is used as the target of a call instruction.
31
32 SYMBOL_CONTEXT_LEA
33 The symbol is used in a load-address operation.
34
35 SYMBOL_CONTEXT_MEM
36 The symbol is used as the address in a MEM. */
37enum mips_symbol_context {
38 SYMBOL_CONTEXT_CALL,
39 SYMBOL_CONTEXT_LEA,
40 SYMBOL_CONTEXT_MEM
41};
42
e245bd81
RS
43/* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
44
67da85da
RS
45 SYMBOL_ABSOLUTE
46 The symbol's value will be calculated using absolute relocations,
47 such as %hi and %lo.
e245bd81 48
67da85da
RS
49 SYMBOL_GP_RELATIVE
50 The symbol's value will be calculated by adding a 16-bit offset
51 from $gp.
e245bd81 52
67da85da
RS
53 SYMBOL_PC_RELATIVE
54 The symbol's value will be calculated using a MIPS16 PC-relative
55 calculation.
e245bd81 56
08e7ceb3
RS
57 SYMBOL_GOT_PAGE_OFST
58 The symbol's value will be calculated by loading an address
59 from the GOT and then applying a 16-bit offset.
e245bd81 60
08e7ceb3
RS
61 SYMBOL_GOT_DISP
62 The symbol's value will be loaded directly from the GOT.
e245bd81
RS
63
64 SYMBOL_GOTOFF_PAGE
08e7ceb3
RS
65 An UNSPEC wrapper around a SYMBOL_GOT_PAGE_OFST. It represents the
66 offset from _gp of the GOT entry.
e245bd81 67
08e7ceb3
RS
68 SYMBOL_GOTOFF_DISP
69 An UNSPEC wrapper around a SYMBOL_GOT_DISP. It represents the
dd5a833e 70 offset from _gp of the symbol's GOT entry.
e245bd81
RS
71
72 SYMBOL_GOTOFF_CALL
08e7ceb3 73 Like SYMBOL_GOTOFF_DISP, but used when calling a global function.
e245bd81
RS
74 The GOT entry is allowed to point to a stub rather than to the
75 function itself.
76
77 SYMBOL_GOTOFF_LOADGP
78 An UNSPEC wrapper around a function's address. It represents the
79 offset of _gp from the start of the function.
80
69229b81
DJ
81 SYMBOL_TLS
82 A thread-local symbol.
83
84 SYMBOL_TLSGD
85 SYMBOL_TLSLDM
86 SYMBOL_DTPREL
87 SYMBOL_GOTTPREL
88 SYMBOL_TPREL
89 UNSPEC wrappers around SYMBOL_TLS, corresponding to the
90 thread-local storage relocation operators.
91
e245bd81
RS
92 SYMBOL_64_HIGH
93 For a 64-bit symbolic address X, this is the value of
94 (%highest(X) << 16) + %higher(X).
95
96 SYMBOL_64_MID
97 For a 64-bit symbolic address X, this is the value of
98 (%higher(X) << 16) + %hi(X).
99
100 SYMBOL_64_LOW
101 For a 64-bit symbolic address X, this is the value of
8cb6400c
RS
102 (%hi(X) << 16) + %lo(X).
103
104 SYMBOL_HALF
105 An UNSPEC wrapper around any kind of address. It represents the
106 low 16 bits of that address. */
e245bd81 107enum mips_symbol_type {
67da85da
RS
108 SYMBOL_ABSOLUTE,
109 SYMBOL_GP_RELATIVE,
110 SYMBOL_PC_RELATIVE,
08e7ceb3
RS
111 SYMBOL_GOT_PAGE_OFST,
112 SYMBOL_GOT_DISP,
e245bd81 113 SYMBOL_GOTOFF_PAGE,
08e7ceb3 114 SYMBOL_GOTOFF_DISP,
e245bd81
RS
115 SYMBOL_GOTOFF_CALL,
116 SYMBOL_GOTOFF_LOADGP,
69229b81
DJ
117 SYMBOL_TLS,
118 SYMBOL_TLSGD,
119 SYMBOL_TLSLDM,
120 SYMBOL_DTPREL,
121 SYMBOL_GOTTPREL,
122 SYMBOL_TPREL,
e245bd81
RS
123 SYMBOL_64_HIGH,
124 SYMBOL_64_MID,
8cb6400c
RS
125 SYMBOL_64_LOW,
126 SYMBOL_HALF
e245bd81 127};
8cb6400c 128#define NUM_SYMBOL_TYPES (SYMBOL_HALF + 1)
e245bd81 129
d9870b7e
RS
130/* Identifiers a style of $gp initialization sequence.
131
132 LOADGP_NONE
133 No initialization sequence is needed.
134
135 LOADGP_OLDABI
136 The o32 and o64 PIC sequence (the kind traditionally generated
137 by .cpload).
138
139 LOADGP_NEWABI
140 The n32 and n64 PIC sequence (the kind traditionally generated
141 by .cpsetup).
142
143 LOADGP_ABSOLUTE
8cb6400c
RS
144 The GNU absolute sequence, as generated by loadgp_absolute.
145
146 LOADGP_RTP
147 The VxWorks RTP PIC sequence, as generated by loadgp_rtp. */
d9870b7e
RS
148enum mips_loadgp_style {
149 LOADGP_NONE,
150 LOADGP_OLDABI,
151 LOADGP_NEWABI,
8cb6400c
RS
152 LOADGP_ABSOLUTE,
153 LOADGP_RTP
d9870b7e
RS
154};
155
e1260576
RS
156struct mips16e_save_restore_info;
157
08d0963a
RS
158/* Classifies a type of call.
159
160 MIPS_CALL_NORMAL
161 A normal call or call_value pattern.
162
163 MIPS_CALL_SIBCALL
164 A sibcall or sibcall_value pattern.
165
166 MIPS_CALL_EPILOGUE
167 A call inserted in the epilogue. */
168enum mips_call_type {
169 MIPS_CALL_NORMAL,
170 MIPS_CALL_SIBCALL,
171 MIPS_CALL_EPILOGUE
172};
173
4670abb0
RS
174/* Controls the conditions under which certain instructions are split.
175
176 SPLIT_IF_NECESSARY
177 Only perform splits that are necessary for correctness
178 (because no unsplit version exists).
179
180 SPLIT_FOR_SPEED
181 Perform splits that are necessary for correctness or
182 beneficial for code speed.
183
184 SPLIT_FOR_SIZE
185 Perform splits that are necessary for correctness or
186 beneficial for code size. */
187enum mips_split_type {
188 SPLIT_IF_NECESSARY,
189 SPLIT_FOR_SPEED,
190 SPLIT_FOR_SIZE
191};
192
280fcbfa
RS
193extern bool mips_symbolic_constant_p (rtx, enum mips_symbol_context,
194 enum mips_symbol_type *);
65239d20 195extern int mips_regno_mode_ok_for_base_p (int, enum machine_mode, bool);
96a30b18 196extern bool mips_stack_address_p (rtx, enum machine_mode);
5955b0a3 197extern int mips_address_insns (rtx, enum machine_mode, bool);
b4966b1b 198extern int mips_const_insns (rtx);
c5cb5d18 199extern int mips_split_const_insns (rtx);
5955b0a3 200extern int mips_load_store_insns (rtx, rtx);
46490403 201extern int mips_idiv_insns (void);
51e7252a 202extern rtx mips_emit_move (rtx, rtx);
a2ccf3c2
RS
203#ifdef RTX_CODE
204extern void mips_emit_binary (enum rtx_code, rtx, rtx, rtx);
205#endif
08d0963a
RS
206extern rtx mips_pic_base_register (rtx);
207extern rtx mips_got_load (rtx, rtx, enum mips_symbol_type);
390ea488 208extern bool mips_split_symbol (rtx, rtx, enum machine_mode, rtx *);
e245bd81 209extern rtx mips_unspec_address (rtx, enum mips_symbol_type);
36be1dee 210extern rtx mips_strip_unspec_address (rtx);
ea462dd0 211extern void mips_move_integer (rtx, rtx, unsigned HOST_WIDE_INT);
b4966b1b 212extern bool mips_legitimize_move (enum machine_mode, rtx, rtx);
b4966b1b 213
65239d20 214extern rtx mips_subword (rtx, bool);
4670abb0
RS
215extern bool mips_split_move_p (rtx, rtx, enum mips_split_type);
216extern void mips_split_move (rtx, rtx, enum mips_split_type);
217extern bool mips_split_move_insn_p (rtx, rtx, rtx);
218extern void mips_split_move_insn (rtx, rtx, rtx);
b4966b1b 219extern const char *mips_output_move (rtx, rtx);
0c433c31
RS
220extern bool mips_cfun_has_cprestore_slot_p (void);
221extern bool mips_cprestore_address_p (rtx, bool);
222extern void mips_save_gp_to_cprestore_slot (rtx, rtx, rtx, rtx);
223extern void mips_restore_gp_from_cprestore_slot (rtx);
6b7d57c7 224#ifdef RTX_CODE
f90b7a5a
PB
225extern void mips_expand_scc (rtx *);
226extern void mips_expand_conditional_branch (rtx *);
ec4fc7ed 227extern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx);
65239d20 228extern void mips_expand_conditional_move (rtx *);
f90b7a5a 229extern void mips_expand_conditional_trap (rtx);
6b7d57c7 230#endif
08d0963a
RS
231extern bool mips_use_pic_fn_addr_reg_p (const_rtx);
232extern rtx mips_expand_call (enum mips_call_type, rtx, rtx, rtx, rtx, bool);
233extern void mips_split_call (rtx, rtx);
b53da244 234extern bool mips_get_pic_call_symbol (rtx *, int);
65239d20 235extern void mips_expand_fcc_reload (rtx, rtx, rtx);
b4966b1b 236extern void mips_set_return_address (rtx, rtx);
0d8f5d62
RS
237extern bool mips_move_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
238extern bool mips_store_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
b4966b1b 239extern bool mips_expand_block_move (rtx, rtx, rtx);
df770e04 240extern void mips_expand_synci_loop (rtx, rtx);
b4966b1b 241
65239d20 242extern void mips_init_cumulative_args (CUMULATIVE_ARGS *, tree);
586de218 243extern bool mips_pad_arg_upward (enum machine_mode, const_tree);
648bb159 244extern bool mips_pad_reg_upward (enum machine_mode, tree);
b4966b1b 245
65239d20 246extern bool mips_expand_ext_as_unaligned_load (rtx, rtx, HOST_WIDE_INT,
aea21190 247 HOST_WIDE_INT, bool);
65239d20
RS
248extern bool mips_expand_ins_as_unaligned_store (rtx, rtx, HOST_WIDE_INT,
249 HOST_WIDE_INT);
9226543b 250extern bool mips_mem_fits_mode_p (enum machine_mode mode, rtx x);
b4966b1b
RS
251extern void mips_order_regs_for_local_alloc (void);
252extern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
253
cf5fb4b0
RS
254extern void mips_push_asm_switch (struct mips_asm_switch *);
255extern void mips_pop_asm_switch (struct mips_asm_switch *);
f8fdb503 256extern void mips_output_external (FILE *, tree, const char *);
65239d20 257extern void mips_output_ascii (FILE *, const char *, size_t);
ddaf8125 258extern const char *mips_output_tls_reloc_directive (rtx *);
35f5add9
RS
259extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
260 unsigned HOST_WIDE_INT,
261 unsigned int);
48b2e0a7
RS
262extern void mips_declare_common_object (FILE *, const char *,
263 const char *, unsigned HOST_WIDE_INT,
264 unsigned int, bool);
b4966b1b 265extern void mips_declare_object (FILE *, const char *, const char *,
99a3237a 266 const char *, ...) ATTRIBUTE_PRINTF_4;
b4966b1b
RS
267extern void mips_declare_object_name (FILE *, const char *, tree);
268extern void mips_finish_declare_object (FILE *, tree, int, int);
269
96a30b18 270extern bool mips_small_data_pattern_p (rtx);
108b61d5 271extern rtx mips_rewrite_small_data (rtx);
e88fb323 272extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
b4966b1b 273extern rtx mips_return_addr (int, rtx);
0c433c31 274extern bool mips_must_initialize_gp_p (void);
d9870b7e 275extern enum mips_loadgp_style mips_current_loadgp_style (void);
0c433c31 276extern void mips_emit_save_slot_move (rtx, rtx, rtx);
b4966b1b 277extern void mips_expand_prologue (void);
2f7e2abb 278extern void mips_expand_before_return (void);
65239d20
RS
279extern void mips_expand_epilogue (bool);
280extern bool mips_can_use_return_insn (void);
b4966b1b
RS
281
282extern bool mips_cannot_change_mode_class (enum machine_mode,
283 enum machine_mode, enum reg_class);
a6008bd8 284extern bool mips_dangerous_for_la25_p (rtx);
e5a2b69d 285extern bool mips_modes_tieable_p (enum machine_mode, enum machine_mode);
b4966b1b
RS
286extern enum reg_class mips_secondary_reload_class (enum reg_class,
287 enum machine_mode,
65239d20 288 rtx, bool);
b4966b1b 289extern int mips_class_max_nregs (enum reg_class, enum machine_mode);
b4966b1b
RS
290
291extern int mips_adjust_insn_length (rtx, int);
0c433c31 292extern void mips_output_load_label (rtx);
a8c1d5f8
RS
293extern const char *mips_output_conditional_branch (rtx, rtx *, const char *,
294 const char *);
295extern const char *mips_output_order_conditional_branch (rtx, rtx *, bool);
6f5a62e9
RS
296extern const char *mips_output_sync (void);
297extern const char *mips_output_sync_loop (rtx, rtx *);
298extern unsigned int mips_sync_loop_insns (rtx, rtx *);
b4966b1b 299extern const char *mips_output_division (const char *, rtx *);
3b601ca3 300extern const char *mips_output_probe_stack_range (rtx, rtx);
b4966b1b 301extern unsigned int mips_hard_regno_nregs (int, enum machine_mode);
39ba1719 302extern bool mips_linked_madd_p (rtx, rtx);
65239d20 303extern bool mips_store_data_bypass_p (rtx, rtx);
ef2e5300 304extern int mips_dspalu_bypass_p (rtx, rtx);
4767c570 305extern rtx mips_prefetch_cookie (rtx, rtx);
b4966b1b 306
b4966b1b
RS
307extern const char *current_section_name (void);
308extern unsigned int current_section_flags (void);
65239d20 309extern bool mips_use_ins_ext_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
bd9f1972 310
e1260576
RS
311extern const char *mips16e_output_save_restore (rtx, HOST_WIDE_INT);
312extern bool mips16e_save_restore_pattern_p (rtx, HOST_WIDE_INT,
313 struct mips16e_save_restore_info *);
49912bcd
AN
314
315extern bool mask_low_and_shift_p (enum machine_mode, rtx, rtx, int);
316extern int mask_low_and_shift_len (enum machine_mode, rtx, rtx);
b2c9d70f 317extern bool and_operands_ok (enum machine_mode, rtx, rtx);
49912bcd 318
06d19617
DD
319union mips_gen_fn_ptrs
320{
321 rtx (*fn_6) (rtx, rtx, rtx, rtx, rtx, rtx);
322 rtx (*fn_5) (rtx, rtx, rtx, rtx, rtx);
323 rtx (*fn_4) (rtx, rtx, rtx, rtx);
324};
325
326extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
327 rtx, rtx, rtx, rtx);
e1260576 328
93581857 329extern void mips_expand_vector_init (rtx, rtx);
7dab511c
RH
330extern bool mips_expand_vec_perm_const (rtx op[4]);
331extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
332extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
333extern void mips_expand_vec_minmax (rtx, rtx, rtx,
334 rtx (*) (rtx, rtx, rtx), bool);
93581857 335
03a7dddb
CM
336extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int);
337extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int);
22c4c869
CM
338extern const char *umips_output_save_restore (bool, rtx);
339extern bool umips_save_restore_pattern_p (bool, rtx);
340extern bool umips_load_store_pair_p (bool, rtx *);
341extern void umips_output_load_store_pair (bool, rtx *);
342extern bool umips_movep_target_p (rtx, rtx);
343extern bool umips_12bit_offset_address_p (rtx, enum machine_mode);
03a7dddb
CM
344extern bool lwsp_swsp_address_p (rtx, enum machine_mode);
345extern bool m16_based_address_p (rtx, enum machine_mode,
346 int (*)(rtx_def*, machine_mode));
f959607b
CLT
347extern rtx mips_expand_thread_pointer (rtx);
348
0c433c31 349extern bool mips_eh_uses (unsigned int);
e19da24c 350extern bool mips_epilogue_uses (unsigned int);
1afc5373 351extern void mips_final_prescan_insn (rtx, rtx *, int);
c640a3bd 352extern int mips_trampoline_code_size (void);
c376dbfb 353extern void mips_function_profiler (FILE *);
e19da24c 354
a3c7bb26
AN
355typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
356#ifdef RTX_CODE
357extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
358#endif
359
88657302 360#endif /* ! GCC_MIPS_PROTOS_H */