]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/mips/mips-protos.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / mips / mips-protos.h
CommitLineData
bd9f1972 1/* Prototypes of target machine for GNU compiler. MIPS version.
818ab71a 2 Copyright (C) 1989-2016 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 *);
ef4bddc2
RS
195extern int mips_regno_mode_ok_for_base_p (int, machine_mode, bool);
196extern bool mips_stack_address_p (rtx, machine_mode);
197extern int mips_address_insns (rtx, machine_mode, bool);
b4966b1b 198extern int mips_const_insns (rtx);
c5cb5d18 199extern int mips_split_const_insns (rtx);
e8a54173 200extern int mips_load_store_insns (rtx, rtx_insn *);
46490403 201extern int mips_idiv_insns (void);
c6f971f4 202extern rtx_insn *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);
ef4bddc2 208extern bool mips_split_symbol (rtx, rtx, 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);
ef4bddc2 212extern bool mips_legitimize_move (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 231extern bool mips_use_pic_fn_addr_reg_p (const_rtx);
c6f971f4
DM
232extern rtx_insn *mips_expand_call (enum mips_call_type, rtx, rtx, rtx, rtx,
233 bool);
08d0963a 234extern void mips_split_call (rtx, rtx);
b53da244 235extern bool mips_get_pic_call_symbol (rtx *, int);
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);
ef4bddc2
RS
243extern bool mips_pad_arg_upward (machine_mode, const_tree);
244extern bool mips_pad_reg_upward (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);
ef4bddc2 250extern bool mips_mem_fits_mode_p (machine_mode mode, rtx x);
b4966b1b
RS
251extern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
252
cf5fb4b0
RS
253extern void mips_push_asm_switch (struct mips_asm_switch *);
254extern void mips_pop_asm_switch (struct mips_asm_switch *);
f8fdb503 255extern void mips_output_external (FILE *, tree, const char *);
65239d20 256extern void mips_output_ascii (FILE *, const char *, size_t);
ddaf8125 257extern const char *mips_output_tls_reloc_directive (rtx *);
35f5add9
RS
258extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
259 unsigned HOST_WIDE_INT,
260 unsigned int);
48b2e0a7
RS
261extern void mips_declare_common_object (FILE *, const char *,
262 const char *, unsigned HOST_WIDE_INT,
263 unsigned int, bool);
b4966b1b 264extern void mips_declare_object (FILE *, const char *, const char *,
99a3237a 265 const char *, ...) ATTRIBUTE_PRINTF_4;
b4966b1b
RS
266extern void mips_declare_object_name (FILE *, const char *, tree);
267extern void mips_finish_declare_object (FILE *, tree, int, int);
268
96a30b18 269extern bool mips_small_data_pattern_p (rtx);
108b61d5 270extern rtx mips_rewrite_small_data (rtx);
e88fb323 271extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
b4966b1b 272extern rtx mips_return_addr (int, rtx);
0c433c31 273extern bool mips_must_initialize_gp_p (void);
d9870b7e 274extern enum mips_loadgp_style mips_current_loadgp_style (void);
0c433c31 275extern void mips_emit_save_slot_move (rtx, rtx, rtx);
b4966b1b 276extern void mips_expand_prologue (void);
2f7e2abb 277extern void mips_expand_before_return (void);
65239d20
RS
278extern void mips_expand_epilogue (bool);
279extern bool mips_can_use_return_insn (void);
b4966b1b 280
050af144
MF
281extern bool mips_secondary_memory_needed (enum reg_class, enum reg_class,
282 machine_mode);
ef4bddc2
RS
283extern bool mips_cannot_change_mode_class (machine_mode,
284 machine_mode, enum reg_class);
a6008bd8 285extern bool mips_dangerous_for_la25_p (rtx);
ef4bddc2 286extern bool mips_modes_tieable_p (machine_mode, machine_mode);
b4966b1b 287extern enum reg_class mips_secondary_reload_class (enum reg_class,
ef4bddc2 288 machine_mode,
65239d20 289 rtx, bool);
ef4bddc2 290extern int mips_class_max_nregs (enum reg_class, machine_mode);
b4966b1b 291
050af144
MF
292extern machine_mode mips_hard_regno_caller_save_mode (unsigned int,
293 unsigned int,
294 machine_mode);
c6f971f4 295extern int mips_adjust_insn_length (rtx_insn *, int);
0c433c31 296extern void mips_output_load_label (rtx);
c6f971f4
DM
297extern const char *mips_output_conditional_branch (rtx_insn *, rtx *,
298 const char *, const char *);
299extern const char *mips_output_order_conditional_branch (rtx_insn *, rtx *,
300 bool);
22219d9b
MF
301extern const char *mips_output_equal_conditional_branch (rtx_insn *, rtx *,
302 bool);
303extern const char *mips_output_jump (rtx *, int, int, bool);
6f5a62e9 304extern const char *mips_output_sync (void);
84034c69
DM
305extern const char *mips_output_sync_loop (rtx_insn *, rtx *);
306extern unsigned int mips_sync_loop_insns (rtx_insn *, rtx *);
b4966b1b 307extern const char *mips_output_division (const char *, rtx *);
3b601ca3 308extern const char *mips_output_probe_stack_range (rtx, rtx);
ec8a2131 309extern bool mips_hard_regno_rename_ok (unsigned int, unsigned int);
ef4bddc2 310extern unsigned int mips_hard_regno_nregs (int, machine_mode);
647d790d 311extern bool mips_linked_madd_p (rtx_insn *, rtx_insn *);
e8a54173 312extern bool mips_store_data_bypass_p (rtx_insn *, rtx_insn *);
ef2e5300 313extern int mips_dspalu_bypass_p (rtx, rtx);
4767c570 314extern rtx mips_prefetch_cookie (rtx, rtx);
b4966b1b 315
b4966b1b
RS
316extern const char *current_section_name (void);
317extern unsigned int current_section_flags (void);
65239d20 318extern bool mips_use_ins_ext_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
bd9f1972 319
e1260576
RS
320extern const char *mips16e_output_save_restore (rtx, HOST_WIDE_INT);
321extern bool mips16e_save_restore_pattern_p (rtx, HOST_WIDE_INT,
322 struct mips16e_save_restore_info *);
49912bcd 323
ef4bddc2
RS
324extern bool mask_low_and_shift_p (machine_mode, rtx, rtx, int);
325extern int mask_low_and_shift_len (machine_mode, rtx, rtx);
326extern bool and_operands_ok (machine_mode, rtx, rtx);
647d790d 327extern bool mips_fmadd_bypass (rtx_insn *, rtx_insn *);
49912bcd 328
06d19617
DD
329union mips_gen_fn_ptrs
330{
331 rtx (*fn_6) (rtx, rtx, rtx, rtx, rtx, rtx);
332 rtx (*fn_5) (rtx, rtx, rtx, rtx, rtx);
333 rtx (*fn_4) (rtx, rtx, rtx, rtx);
334};
335
336extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
337 rtx, rtx, rtx, rtx);
e1260576 338
93581857 339extern void mips_expand_vector_init (rtx, rtx);
7dab511c
RH
340extern bool mips_expand_vec_perm_const (rtx op[4]);
341extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
342extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
343extern void mips_expand_vec_minmax (rtx, rtx, rtx,
344 rtx (*) (rtx, rtx, rtx), bool);
93581857 345
03a7dddb
CM
346extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int);
347extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int);
22c4c869
CM
348extern const char *umips_output_save_restore (bool, rtx);
349extern bool umips_save_restore_pattern_p (bool, rtx);
350extern bool umips_load_store_pair_p (bool, rtx *);
351extern void umips_output_load_store_pair (bool, rtx *);
352extern bool umips_movep_target_p (rtx, rtx);
ef4bddc2 353extern bool umips_12bit_offset_address_p (rtx, machine_mode);
82f84ecb 354extern bool mips_9bit_offset_address_p (rtx, machine_mode);
ef4bddc2
RS
355extern bool lwsp_swsp_address_p (rtx, machine_mode);
356extern bool m16_based_address_p (rtx, machine_mode,
03a7dddb 357 int (*)(rtx_def*, machine_mode));
f959607b 358extern rtx mips_expand_thread_pointer (rtx);
a90c0245
RS
359extern void mips16_expand_get_fcsr (rtx);
360extern void mips16_expand_set_fcsr (rtx);
f959607b 361
0c433c31 362extern bool mips_eh_uses (unsigned int);
e19da24c 363extern bool mips_epilogue_uses (unsigned int);
c6f971f4 364extern void mips_final_prescan_insn (rtx_insn *, rtx *, int);
c640a3bd 365extern int mips_trampoline_code_size (void);
c376dbfb 366extern void mips_function_profiler (FILE *);
abf96035 367extern bool mips_load_store_bonding_p (rtx *, machine_mode, bool);
e19da24c 368
a3c7bb26
AN
369typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
370#ifdef RTX_CODE
371extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
372#endif
373
d41c8b4c
SE
374extern void mips_register_frame_header_opt (void);
375
88657302 376#endif /* ! GCC_MIPS_PROTOS_H */