]> 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.
a945c346 2 Copyright (C) 1989-2024 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);
6cf538da 200extern int mips_split_128bit_const_insns (rtx);
e8a54173 201extern int mips_load_store_insns (rtx, rtx_insn *);
6cf538da 202extern int mips_idiv_insns (machine_mode);
c6f971f4 203extern rtx_insn *mips_emit_move (rtx, rtx);
a2ccf3c2
RS
204#ifdef RTX_CODE
205extern void mips_emit_binary (enum rtx_code, rtx, rtx, rtx);
206#endif
08d0963a
RS
207extern rtx mips_pic_base_register (rtx);
208extern rtx mips_got_load (rtx, rtx, enum mips_symbol_type);
ef4bddc2 209extern bool mips_split_symbol (rtx, rtx, machine_mode, rtx *);
e245bd81 210extern rtx mips_unspec_address (rtx, enum mips_symbol_type);
36be1dee 211extern rtx mips_strip_unspec_address (rtx);
ea462dd0 212extern void mips_move_integer (rtx, rtx, unsigned HOST_WIDE_INT);
ef4bddc2 213extern bool mips_legitimize_move (machine_mode, rtx, rtx);
b4966b1b 214
65239d20 215extern rtx mips_subword (rtx, bool);
4670abb0 216extern bool mips_split_move_p (rtx, rtx, enum mips_split_type);
23843f47 217extern void mips_split_move (rtx, rtx, enum mips_split_type, rtx);
4670abb0
RS
218extern bool mips_split_move_insn_p (rtx, rtx, rtx);
219extern void mips_split_move_insn (rtx, rtx, rtx);
6cf538da
RS
220extern void mips_split_128bit_move (rtx, rtx);
221extern bool mips_split_128bit_move_p (rtx, rtx);
222extern void mips_split_msa_copy_d (rtx, rtx, rtx, rtx (*)(rtx, rtx, rtx));
223extern void mips_split_msa_insert_d (rtx, rtx, rtx, rtx);
224extern void mips_split_msa_fill_d (rtx, rtx);
b4966b1b 225extern const char *mips_output_move (rtx, rtx);
0c433c31
RS
226extern bool mips_cfun_has_cprestore_slot_p (void);
227extern bool mips_cprestore_address_p (rtx, bool);
228extern void mips_save_gp_to_cprestore_slot (rtx, rtx, rtx, rtx);
229extern void mips_restore_gp_from_cprestore_slot (rtx);
6b7d57c7 230#ifdef RTX_CODE
f90b7a5a
PB
231extern void mips_expand_scc (rtx *);
232extern void mips_expand_conditional_branch (rtx *);
ec4fc7ed 233extern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx);
65239d20 234extern void mips_expand_conditional_move (rtx *);
f90b7a5a 235extern void mips_expand_conditional_trap (rtx);
6b7d57c7 236#endif
08d0963a 237extern bool mips_use_pic_fn_addr_reg_p (const_rtx);
c6f971f4
DM
238extern rtx_insn *mips_expand_call (enum mips_call_type, rtx, rtx, rtx, rtx,
239 bool);
08d0963a 240extern void mips_split_call (rtx, rtx);
b53da244 241extern bool mips_get_pic_call_symbol (rtx *, int);
b4966b1b 242extern void mips_set_return_address (rtx, rtx);
0d8f5d62
RS
243extern bool mips_move_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
244extern bool mips_store_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
b4966b1b 245extern bool mips_expand_block_move (rtx, rtx, rtx);
df770e04 246extern void mips_expand_synci_loop (rtx, rtx);
b4966b1b 247
65239d20 248extern void mips_init_cumulative_args (CUMULATIVE_ARGS *, tree);
ef4bddc2 249extern bool mips_pad_reg_upward (machine_mode, tree);
b4966b1b 250
65239d20 251extern bool mips_expand_ext_as_unaligned_load (rtx, rtx, HOST_WIDE_INT,
aea21190 252 HOST_WIDE_INT, bool);
65239d20
RS
253extern bool mips_expand_ins_as_unaligned_store (rtx, rtx, HOST_WIDE_INT,
254 HOST_WIDE_INT);
ef4bddc2 255extern bool mips_mem_fits_mode_p (machine_mode mode, rtx x);
b4966b1b
RS
256extern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
257
cf5fb4b0
RS
258extern void mips_push_asm_switch (struct mips_asm_switch *);
259extern void mips_pop_asm_switch (struct mips_asm_switch *);
f8fdb503 260extern void mips_output_external (FILE *, tree, const char *);
65239d20 261extern void mips_output_ascii (FILE *, const char *, size_t);
ddaf8125 262extern const char *mips_output_tls_reloc_directive (rtx *);
35f5add9
RS
263extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
264 unsigned HOST_WIDE_INT,
265 unsigned int);
48b2e0a7
RS
266extern void mips_declare_common_object (FILE *, const char *,
267 const char *, unsigned HOST_WIDE_INT,
268 unsigned int, bool);
b4966b1b 269extern void mips_declare_object (FILE *, const char *, const char *,
99a3237a 270 const char *, ...) ATTRIBUTE_PRINTF_4;
b4966b1b
RS
271extern void mips_declare_object_name (FILE *, const char *, tree);
272extern void mips_finish_declare_object (FILE *, tree, int, int);
2fe2aba3 273extern void mips_set_text_contents_type (FILE *, const char *,
0b83fa07 274 unsigned HOST_WIDE_INT, bool);
b4966b1b 275
96a30b18 276extern bool mips_small_data_pattern_p (rtx);
108b61d5 277extern rtx mips_rewrite_small_data (rtx);
e88fb323 278extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
b4966b1b 279extern rtx mips_return_addr (int, rtx);
0c433c31 280extern bool mips_must_initialize_gp_p (void);
d9870b7e 281extern enum mips_loadgp_style mips_current_loadgp_style (void);
0c433c31 282extern void mips_emit_save_slot_move (rtx, rtx, rtx);
b4966b1b 283extern void mips_expand_prologue (void);
2f7e2abb 284extern void mips_expand_before_return (void);
65239d20
RS
285extern void mips_expand_epilogue (bool);
286extern bool mips_can_use_return_insn (void);
b4966b1b 287
6cf538da
RS
288extern bool mips_const_vector_same_val_p (rtx, machine_mode);
289extern bool mips_const_vector_same_bytes_p (rtx, machine_mode);
290extern bool mips_const_vector_same_int_p (rtx, machine_mode, HOST_WIDE_INT,
291 HOST_WIDE_INT);
292extern bool mips_const_vector_shuffle_set_p (rtx, machine_mode);
293extern bool mips_const_vector_bitimm_set_p (rtx, machine_mode);
294extern bool mips_const_vector_bitimm_clr_p (rtx, machine_mode);
295extern rtx mips_msa_vec_parallel_const_half (machine_mode, bool);
334b3c4b 296extern rtx mips_gen_const_int_vector (machine_mode, HOST_WIDE_INT);
a6008bd8 297extern bool mips_dangerous_for_la25_p (rtx);
b4966b1b 298extern enum reg_class mips_secondary_reload_class (enum reg_class,
ef4bddc2 299 machine_mode,
65239d20 300 rtx, bool);
ef4bddc2 301extern int mips_class_max_nregs (enum reg_class, machine_mode);
b4966b1b 302
050af144
MF
303extern machine_mode mips_hard_regno_caller_save_mode (unsigned int,
304 unsigned int,
305 machine_mode);
c6f971f4 306extern int mips_adjust_insn_length (rtx_insn *, int);
0c433c31 307extern void mips_output_load_label (rtx);
c6f971f4
DM
308extern const char *mips_output_conditional_branch (rtx_insn *, rtx *,
309 const char *, const char *);
310extern const char *mips_output_order_conditional_branch (rtx_insn *, rtx *,
311 bool);
22219d9b
MF
312extern const char *mips_output_equal_conditional_branch (rtx_insn *, rtx *,
313 bool);
314extern const char *mips_output_jump (rtx *, int, int, bool);
6f5a62e9 315extern const char *mips_output_sync (void);
84034c69
DM
316extern const char *mips_output_sync_loop (rtx_insn *, rtx *);
317extern unsigned int mips_sync_loop_insns (rtx_insn *, rtx *);
b4966b1b 318extern const char *mips_output_division (const char *, rtx *);
6cf538da 319extern const char *mips_msa_output_division (const char *, rtx *);
f93f0868 320extern const char *mips_msa_output_shift_immediate (const char *, rtx *);
3b601ca3 321extern const char *mips_output_probe_stack_range (rtx, rtx);
ec8a2131 322extern bool mips_hard_regno_rename_ok (unsigned int, unsigned int);
647d790d 323extern bool mips_linked_madd_p (rtx_insn *, rtx_insn *);
e8a54173 324extern bool mips_store_data_bypass_p (rtx_insn *, rtx_insn *);
ef2e5300 325extern int mips_dspalu_bypass_p (rtx, rtx);
4767c570 326extern rtx mips_prefetch_cookie (rtx, rtx);
d6319811 327extern rtx mips_loongson_ext2_prefetch_cookie (rtx, rtx);
b4966b1b 328
b4966b1b
RS
329extern const char *current_section_name (void);
330extern unsigned int current_section_flags (void);
65239d20 331extern bool mips_use_ins_ext_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
bd9f1972 332
e1260576
RS
333extern const char *mips16e_output_save_restore (rtx, HOST_WIDE_INT);
334extern bool mips16e_save_restore_pattern_p (rtx, HOST_WIDE_INT,
335 struct mips16e_save_restore_info *);
49912bcd 336
ef4bddc2
RS
337extern bool mask_low_and_shift_p (machine_mode, rtx, rtx, int);
338extern int mask_low_and_shift_len (machine_mode, rtx, rtx);
339extern bool and_operands_ok (machine_mode, rtx, rtx);
647d790d 340extern bool mips_fmadd_bypass (rtx_insn *, rtx_insn *);
49912bcd 341
06d19617
DD
342union mips_gen_fn_ptrs
343{
344 rtx (*fn_6) (rtx, rtx, rtx, rtx, rtx, rtx);
345 rtx (*fn_5) (rtx, rtx, rtx, rtx, rtx);
346 rtx (*fn_4) (rtx, rtx, rtx, rtx);
347};
348
349extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
350 rtx, rtx, rtx, rtx);
e1260576 351
93581857 352extern void mips_expand_vector_init (rtx, rtx);
7dab511c
RH
353extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
354extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
355extern void mips_expand_vec_minmax (rtx, rtx, rtx,
356 rtx (*) (rtx, rtx, rtx), bool);
93581857 357
6cf538da 358extern int mips_ldst_scaled_shift (machine_mode);
03a7dddb
CM
359extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int);
360extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int);
22c4c869
CM
361extern const char *umips_output_save_restore (bool, rtx);
362extern bool umips_save_restore_pattern_p (bool, rtx);
363extern bool umips_load_store_pair_p (bool, rtx *);
364extern void umips_output_load_store_pair (bool, rtx *);
365extern bool umips_movep_target_p (rtx, rtx);
ef4bddc2 366extern bool umips_12bit_offset_address_p (rtx, machine_mode);
82f84ecb 367extern bool mips_9bit_offset_address_p (rtx, machine_mode);
ef4bddc2
RS
368extern bool lwsp_swsp_address_p (rtx, machine_mode);
369extern bool m16_based_address_p (rtx, machine_mode,
a86b3453 370 bool (*)(rtx_def*, machine_mode));
f959607b 371extern rtx mips_expand_thread_pointer (rtx);
a90c0245
RS
372extern void mips16_expand_get_fcsr (rtx);
373extern void mips16_expand_set_fcsr (rtx);
f959607b 374
0c433c31 375extern bool mips_eh_uses (unsigned int);
e19da24c 376extern bool mips_epilogue_uses (unsigned int);
c6f971f4 377extern void mips_final_prescan_insn (rtx_insn *, rtx *, int);
c640a3bd 378extern int mips_trampoline_code_size (void);
c376dbfb 379extern void mips_function_profiler (FILE *);
abf96035 380extern bool mips_load_store_bonding_p (rtx *, machine_mode, bool);
e19da24c 381
a3c7bb26
AN
382typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
383#ifdef RTX_CODE
384extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
385#endif
386
d41c8b4c 387extern void mips_register_frame_header_opt (void);
6cf538da 388extern void mips_expand_vec_cond_expr (machine_mode, machine_mode, rtx *);
45cb789e 389extern void mips_expand_vec_cmp_expr (rtx *);
d41c8b4c 390
29b74545
YS
391extern void mips_emit_speculation_barrier_function (void);
392
42d6b905
JM
393extern bool mips_bit_clear_p (enum machine_mode, unsigned HOST_WIDE_INT);
394extern void mips_bit_clear_info (enum machine_mode, unsigned HOST_WIDE_INT,
395 int *, int *);
396
88657302 397#endif /* ! GCC_MIPS_PROTOS_H */