]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/mips/mips-protos.h
mips16.S: Don't build for microMIPS.
[thirdparty/gcc.git] / gcc / config / mips / mips-protos.h
CommitLineData
bd9f1972 1/* Prototypes of target machine for GNU compiler. MIPS version.
d1e082c2 2 Copyright (C) 1989-2013 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
RS
213
214extern int m16_uimm3_b (rtx, enum machine_mode);
215extern int m16_simm4_1 (rtx, enum machine_mode);
216extern int m16_nsimm4_1 (rtx, enum machine_mode);
217extern int m16_simm5_1 (rtx, enum machine_mode);
218extern int m16_nsimm5_1 (rtx, enum machine_mode);
219extern int m16_uimm5_4 (rtx, enum machine_mode);
220extern int m16_nuimm5_4 (rtx, enum machine_mode);
221extern int m16_simm8_1 (rtx, enum machine_mode);
222extern int m16_nsimm8_1 (rtx, enum machine_mode);
223extern int m16_uimm8_1 (rtx, enum machine_mode);
224extern int m16_nuimm8_1 (rtx, enum machine_mode);
225extern int m16_uimm8_m1_1 (rtx, enum machine_mode);
226extern int m16_uimm8_4 (rtx, enum machine_mode);
227extern int m16_nuimm8_4 (rtx, enum machine_mode);
228extern int m16_simm8_8 (rtx, enum machine_mode);
229extern int m16_nsimm8_8 (rtx, enum machine_mode);
6b7d57c7 230
65239d20 231extern rtx mips_subword (rtx, bool);
4670abb0
RS
232extern bool mips_split_move_p (rtx, rtx, enum mips_split_type);
233extern void mips_split_move (rtx, rtx, enum mips_split_type);
234extern bool mips_split_move_insn_p (rtx, rtx, rtx);
235extern void mips_split_move_insn (rtx, rtx, rtx);
b4966b1b 236extern const char *mips_output_move (rtx, rtx);
0c433c31
RS
237extern bool mips_cfun_has_cprestore_slot_p (void);
238extern bool mips_cprestore_address_p (rtx, bool);
239extern void mips_save_gp_to_cprestore_slot (rtx, rtx, rtx, rtx);
240extern void mips_restore_gp_from_cprestore_slot (rtx);
6b7d57c7 241#ifdef RTX_CODE
f90b7a5a
PB
242extern void mips_expand_scc (rtx *);
243extern void mips_expand_conditional_branch (rtx *);
ec4fc7ed 244extern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx);
65239d20 245extern void mips_expand_conditional_move (rtx *);
f90b7a5a 246extern void mips_expand_conditional_trap (rtx);
6b7d57c7 247#endif
08d0963a
RS
248extern bool mips_use_pic_fn_addr_reg_p (const_rtx);
249extern rtx mips_expand_call (enum mips_call_type, rtx, rtx, rtx, rtx, bool);
250extern void mips_split_call (rtx, rtx);
b53da244 251extern bool mips_get_pic_call_symbol (rtx *, int);
65239d20 252extern void mips_expand_fcc_reload (rtx, rtx, rtx);
b4966b1b 253extern void mips_set_return_address (rtx, rtx);
0d8f5d62
RS
254extern bool mips_move_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
255extern bool mips_store_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
b4966b1b 256extern bool mips_expand_block_move (rtx, rtx, rtx);
df770e04 257extern void mips_expand_synci_loop (rtx, rtx);
b4966b1b 258
65239d20 259extern void mips_init_cumulative_args (CUMULATIVE_ARGS *, tree);
586de218 260extern bool mips_pad_arg_upward (enum machine_mode, const_tree);
648bb159 261extern bool mips_pad_reg_upward (enum machine_mode, tree);
b4966b1b 262
65239d20 263extern bool mips_expand_ext_as_unaligned_load (rtx, rtx, HOST_WIDE_INT,
aea21190 264 HOST_WIDE_INT, bool);
65239d20
RS
265extern bool mips_expand_ins_as_unaligned_store (rtx, rtx, HOST_WIDE_INT,
266 HOST_WIDE_INT);
9226543b 267extern bool mips_mem_fits_mode_p (enum machine_mode mode, rtx x);
b4966b1b
RS
268extern void mips_order_regs_for_local_alloc (void);
269extern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
270
cf5fb4b0
RS
271extern void mips_push_asm_switch (struct mips_asm_switch *);
272extern void mips_pop_asm_switch (struct mips_asm_switch *);
f8fdb503 273extern void mips_output_external (FILE *, tree, const char *);
65239d20 274extern void mips_output_ascii (FILE *, const char *, size_t);
ddaf8125 275extern const char *mips_output_tls_reloc_directive (rtx *);
35f5add9
RS
276extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
277 unsigned HOST_WIDE_INT,
278 unsigned int);
48b2e0a7
RS
279extern void mips_declare_common_object (FILE *, const char *,
280 const char *, unsigned HOST_WIDE_INT,
281 unsigned int, bool);
b4966b1b 282extern void mips_declare_object (FILE *, const char *, const char *,
99a3237a 283 const char *, ...) ATTRIBUTE_PRINTF_4;
b4966b1b
RS
284extern void mips_declare_object_name (FILE *, const char *, tree);
285extern void mips_finish_declare_object (FILE *, tree, int, int);
286
96a30b18 287extern bool mips_small_data_pattern_p (rtx);
108b61d5 288extern rtx mips_rewrite_small_data (rtx);
e88fb323 289extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
b4966b1b 290extern rtx mips_return_addr (int, rtx);
0c433c31 291extern bool mips_must_initialize_gp_p (void);
d9870b7e 292extern enum mips_loadgp_style mips_current_loadgp_style (void);
0c433c31 293extern void mips_emit_save_slot_move (rtx, rtx, rtx);
b4966b1b 294extern void mips_expand_prologue (void);
2f7e2abb 295extern void mips_expand_before_return (void);
65239d20
RS
296extern void mips_expand_epilogue (bool);
297extern bool mips_can_use_return_insn (void);
b4966b1b
RS
298
299extern bool mips_cannot_change_mode_class (enum machine_mode,
300 enum machine_mode, enum reg_class);
a6008bd8 301extern bool mips_dangerous_for_la25_p (rtx);
e5a2b69d 302extern bool mips_modes_tieable_p (enum machine_mode, enum machine_mode);
b4966b1b
RS
303extern enum reg_class mips_secondary_reload_class (enum reg_class,
304 enum machine_mode,
65239d20 305 rtx, bool);
b4966b1b 306extern int mips_class_max_nregs (enum reg_class, enum machine_mode);
b4966b1b
RS
307
308extern int mips_adjust_insn_length (rtx, int);
0c433c31 309extern void mips_output_load_label (rtx);
a8c1d5f8
RS
310extern const char *mips_output_conditional_branch (rtx, rtx *, const char *,
311 const char *);
312extern const char *mips_output_order_conditional_branch (rtx, rtx *, bool);
6f5a62e9
RS
313extern const char *mips_output_sync (void);
314extern const char *mips_output_sync_loop (rtx, rtx *);
315extern unsigned int mips_sync_loop_insns (rtx, rtx *);
b4966b1b 316extern const char *mips_output_division (const char *, rtx *);
3b601ca3 317extern const char *mips_output_probe_stack_range (rtx, rtx);
b4966b1b 318extern unsigned int mips_hard_regno_nregs (int, enum machine_mode);
39ba1719 319extern bool mips_linked_madd_p (rtx, rtx);
65239d20 320extern bool mips_store_data_bypass_p (rtx, rtx);
ef2e5300 321extern int mips_dspalu_bypass_p (rtx, rtx);
4767c570 322extern rtx mips_prefetch_cookie (rtx, rtx);
b4966b1b 323
b4966b1b
RS
324extern const char *current_section_name (void);
325extern unsigned int current_section_flags (void);
65239d20 326extern bool mips_use_ins_ext_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
bd9f1972 327
e1260576
RS
328extern const char *mips16e_output_save_restore (rtx, HOST_WIDE_INT);
329extern bool mips16e_save_restore_pattern_p (rtx, HOST_WIDE_INT,
330 struct mips16e_save_restore_info *);
49912bcd
AN
331
332extern bool mask_low_and_shift_p (enum machine_mode, rtx, rtx, int);
333extern int mask_low_and_shift_len (enum machine_mode, rtx, rtx);
b2c9d70f 334extern bool and_operands_ok (enum machine_mode, rtx, rtx);
49912bcd 335
06d19617
DD
336union mips_gen_fn_ptrs
337{
338 rtx (*fn_6) (rtx, rtx, rtx, rtx, rtx, rtx);
339 rtx (*fn_5) (rtx, rtx, rtx, rtx, rtx);
340 rtx (*fn_4) (rtx, rtx, rtx, rtx);
341};
342
343extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
344 rtx, rtx, rtx, rtx);
e1260576 345
93581857 346extern void mips_expand_vector_init (rtx, rtx);
7dab511c
RH
347extern bool mips_expand_vec_perm_const (rtx op[4]);
348extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
349extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
350extern void mips_expand_vec_minmax (rtx, rtx, rtx,
351 rtx (*) (rtx, rtx, rtx), bool);
93581857 352
6941b508
CM
353extern const char *umips_output_save_restore (bool, rtx);
354extern bool umips_save_restore_pattern_p (bool, rtx);
355extern bool umips_load_store_pair_p (bool, rtx *);
356extern void umips_output_load_store_pair (bool, rtx *);
357extern bool umips_movep_target_p (rtx, rtx);
358extern bool umips_12bit_offset_address_p (rtx, enum machine_mode);
f959607b
CLT
359extern rtx mips_expand_thread_pointer (rtx);
360
0c433c31 361extern bool mips_eh_uses (unsigned int);
e19da24c 362extern bool mips_epilogue_uses (unsigned int);
1afc5373 363extern void mips_final_prescan_insn (rtx, rtx *, int);
c640a3bd 364extern int mips_trampoline_code_size (void);
c376dbfb 365extern void mips_function_profiler (FILE *);
e19da24c 366
a3c7bb26
AN
367typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
368#ifdef RTX_CODE
369extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
370#endif
371
88657302 372#endif /* ! GCC_MIPS_PROTOS_H */