1 /* Prototypes of target machine for GNU compiler. LoongArch version.
2 Copyright (C) 2021-2024 Free Software Foundation, Inc.
3 Contributed by Loongson Ltd.
4 Based on MIPS target for GNU compiler.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #ifndef GCC_LOONGARCH_PROTOS_H
23 #define GCC_LOONGARCH_PROTOS_H
25 /* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
28 The symbol's value will be loaded directly from the GOT.
31 The symbol's value will be loaded directly from data section within
35 The symbol's value will be loaded directly from data section within
39 A thread-local symbol.
44 UNSPEC wrappers around SYMBOL_TLS, corresponding to the
45 thread-local storage relocation operators.
47 enum loongarch_symbol_type
{
57 #define NUM_SYMBOL_TYPES (SYMBOL_TLSLDM + 1)
59 /* Routines implemented in loongarch.cc. */
60 extern rtx
loongarch_emit_move (rtx
, rtx
);
61 extern HOST_WIDE_INT
loongarch_initial_elimination_offset (int, int);
62 extern void loongarch_expand_prologue (void);
63 extern void loongarch_expand_epilogue (int);
64 extern bool loongarch_can_use_return_insn (void);
66 extern bool loongarch_symbolic_constant_p (rtx
, enum loongarch_symbol_type
*);
67 extern int loongarch_regno_mode_ok_for_base_p (int, machine_mode
, bool);
68 extern int loongarch_address_insns (rtx
, machine_mode
, bool);
69 extern int loongarch_const_insns (rtx
);
70 extern int loongarch_split_const_insns (rtx
);
71 extern int loongarch_split_128bit_const_insns (rtx
);
72 extern int loongarch_load_store_insns (rtx
, rtx_insn
*);
73 extern int loongarch_idiv_insns (machine_mode
);
75 extern void loongarch_emit_binary (enum rtx_code
, rtx
, rtx
, rtx
);
77 extern rtx
loongarch_unspec_address (rtx
, enum loongarch_symbol_type
);
78 extern rtx
loongarch_strip_unspec_address (rtx
);
79 extern void loongarch_move_integer (rtx
, rtx
, unsigned HOST_WIDE_INT
);
80 extern bool loongarch_legitimize_move (machine_mode
, rtx
, rtx
);
81 extern rtx
loongarch_legitimize_call_address (rtx
);
83 extern rtx
loongarch_subword (rtx
, bool);
84 extern bool loongarch_split_move_p (rtx
, rtx
);
85 extern void loongarch_split_move (rtx
, rtx
);
86 extern bool loongarch_addu16i_imm12_operand_p (HOST_WIDE_INT
, machine_mode
);
87 extern void loongarch_split_plus_constant (rtx
*, machine_mode
);
88 extern void loongarch_split_vector_move (rtx
, rtx
);
89 extern const char *loongarch_output_move (rtx
, rtx
);
91 extern void loongarch_expand_scc (rtx
*);
92 extern void loongarch_expand_vec_cmp (rtx
*);
93 extern void loongarch_expand_conditional_branch (rtx
*);
94 extern void loongarch_expand_conditional_move (rtx
*);
95 extern void loongarch_expand_conditional_trap (rtx
);
97 extern void loongarch_set_return_address (rtx
, rtx
);
98 extern bool loongarch_move_by_pieces_p (unsigned HOST_WIDE_INT
, unsigned int);
99 extern bool loongarch_expand_block_move (rtx
, rtx
, rtx
, rtx
);
100 extern bool loongarch_do_optimize_block_move_p (void);
102 extern bool loongarch_expand_ext_as_unaligned_load (rtx
, rtx
, HOST_WIDE_INT
,
103 HOST_WIDE_INT
, bool);
104 extern bool loongarch_expand_ins_as_unaligned_store (rtx
, rtx
, HOST_WIDE_INT
,
106 extern HOST_WIDE_INT
loongarch_debugger_offset (rtx
, HOST_WIDE_INT
);
108 extern void loongarch_output_external (FILE *, tree
, const char *);
109 extern void loongarch_output_ascii (FILE *, const char *, size_t);
110 extern bool loongarch_small_data_pattern_p (rtx
);
111 extern rtx
loongarch_rewrite_small_data (rtx
);
112 extern rtx
loongarch_return_addr (int, rtx
);
114 extern bool loongarch_const_vector_same_val_p (rtx
, machine_mode
);
115 extern bool loongarch_const_vector_same_bytes_p (rtx
, machine_mode
);
116 extern bool loongarch_const_vector_same_int_p (rtx
, machine_mode
, HOST_WIDE_INT
,
118 extern bool loongarch_const_vector_shuffle_set_p (rtx
, machine_mode
);
119 extern bool loongarch_const_vector_bitimm_set_p (rtx
, machine_mode
);
120 extern bool loongarch_const_vector_bitimm_clr_p (rtx
, machine_mode
);
121 extern rtx
loongarch_lsx_vec_parallel_const_half (machine_mode
, bool);
122 extern rtx
loongarch_gen_const_int_vector (machine_mode
, HOST_WIDE_INT
);
123 extern enum reg_class
loongarch_secondary_reload_class (enum reg_class
,
126 extern int loongarch_class_max_nregs (enum reg_class
, machine_mode
);
128 extern machine_mode
loongarch_hard_regno_caller_save_mode (unsigned int,
131 extern const char *loongarch_output_conditional_branch (rtx_insn
*, rtx
*,
134 extern const char *loongarch_output_order_conditional_branch (rtx_insn
*,
137 extern const char *loongarch_output_equal_conditional_branch (rtx_insn
*,
140 extern const char *loongarch_output_division (const char *, rtx
*);
141 extern const char *loongarch_lsx_output_division (const char *, rtx
*);
142 extern const char *loongarch_output_probe_stack_range (rtx
, rtx
, rtx
);
143 extern bool loongarch_hard_regno_rename_ok (unsigned int, unsigned int);
144 extern int loongarch_dspalu_bypass_p (rtx
, rtx
);
145 extern rtx
loongarch_prefetch_cookie (rtx
, rtx
);
147 extern bool loongarch_global_symbol_p (const_rtx
);
148 extern bool loongarch_global_symbol_noweak_p (const_rtx
);
149 extern bool loongarch_weak_symbol_p (const_rtx
);
150 extern bool loongarch_symbol_binds_local_p (const_rtx
);
152 extern unsigned int current_section_flags (void);
153 extern bool loongarch_use_ins_ext_p (rtx
, HOST_WIDE_INT
, HOST_WIDE_INT
);
154 extern bool loongarch_check_zero_div_p (void);
155 extern bool loongarch_pre_reload_split (void);
156 extern int loongarch_use_bstrins_for_ior_with_mask (machine_mode
, rtx
*);
157 extern rtx
loongarch_rewrite_mem_for_simple_ldst (rtx
);
159 union loongarch_gen_fn_ptrs
161 rtx (*fn_8
) (rtx
, rtx
, rtx
, rtx
, rtx
, rtx
, rtx
, rtx
);
162 rtx (*fn_7
) (rtx
, rtx
, rtx
, rtx
, rtx
, rtx
, rtx
);
163 rtx (*fn_6
) (rtx
, rtx
, rtx
, rtx
, rtx
, rtx
);
164 rtx (*fn_5
) (rtx
, rtx
, rtx
, rtx
, rtx
);
165 rtx (*fn_4
) (rtx
, rtx
, rtx
, rtx
);
168 extern void loongarch_expand_atomic_qihi (union loongarch_gen_fn_ptrs
,
169 rtx
, rtx
, rtx
, rtx
, rtx
);
171 extern void loongarch_expand_vector_group_init (rtx
, rtx
);
172 extern void loongarch_expand_vector_init (rtx
, rtx
);
173 extern void loongarch_expand_vec_unpack (rtx op
[2], bool, bool);
174 extern void loongarch_expand_vec_perm (rtx
, rtx
, rtx
, rtx
);
175 extern void loongarch_expand_vec_perm_1 (rtx
[]);
176 extern void loongarch_expand_vector_extract (rtx
, rtx
, int);
177 extern void loongarch_expand_vector_reduc (rtx (*)(rtx
, rtx
, rtx
), rtx
, rtx
);
179 extern int loongarch_ldst_scaled_shift (machine_mode
);
180 extern bool loongarch_signed_immediate_p (unsigned HOST_WIDE_INT
, int, int);
181 extern bool loongarch_unsigned_immediate_p (unsigned HOST_WIDE_INT
, int, int);
182 extern bool loongarch_12bit_offset_address_p (rtx
, machine_mode
);
183 extern bool loongarch_14bit_shifted_offset_address_p (rtx
, machine_mode
);
184 extern bool loongarch_base_index_address_p (rtx
, machine_mode
);
185 extern rtx
loongarch_expand_thread_pointer (rtx
);
187 extern bool loongarch_eh_uses (unsigned int);
188 extern bool loongarch_epilogue_uses (unsigned int);
189 extern bool loongarch_load_store_bonding_p (rtx
*, machine_mode
, bool);
190 extern bool loongarch_split_symbol_type (enum loongarch_symbol_type
);
192 extern void loongarch_register_frame_header_opt (void);
193 extern void loongarch_expand_vec_cond_expr (machine_mode
, machine_mode
, rtx
*);
194 extern void loongarch_expand_vec_cond_mask_expr (machine_mode
, machine_mode
,
196 extern void loongarch_expand_vec_widen_hilo (rtx
, rtx
, rtx
, bool, bool, const char *);
198 /* Routines implemented in loongarch-c.c. */
199 void loongarch_cpu_cpp_builtins (cpp_reader
*);
201 extern void loongarch_init_builtins (void);
202 extern void loongarch_atomic_assign_expand_fenv (tree
*, tree
*, tree
*);
203 extern tree
loongarch_builtin_decl (unsigned int, bool);
204 extern rtx
loongarch_expand_builtin (tree
, rtx
, rtx subtarget ATTRIBUTE_UNUSED
,
206 extern tree
loongarch_builtin_vectorized_function (unsigned int, tree
, tree
);
207 extern rtx
loongarch_gen_const_int_vector_shuffle (machine_mode
, int);
208 extern tree
loongarch_build_builtin_va_list (void);
210 extern rtx
loongarch_build_signbit_mask (machine_mode
, bool, bool);
211 extern void loongarch_emit_swrsqrtsf (rtx
, rtx
, machine_mode
, bool);
212 extern void loongarch_emit_swdivsf (rtx
, rtx
, rtx
, machine_mode
);
213 extern bool loongarch_explicit_relocs_p (enum loongarch_symbol_type
);
214 extern bool loongarch_symbol_extreme_p (enum loongarch_symbol_type
);
215 #endif /* ! GCC_LOONGARCH_PROTOS_H */