libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / config / loongarch / loongarch-protos.h
blob85f6e89439978a90fc998c67a55cea0d00d75368
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)
11 any later version.
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.
27 SYMBOL_GOT_DISP
28 The symbol's value will be loaded directly from the GOT.
30 SYMBOL_PCREL
31 The symbol's value will be loaded directly from data section within
32 +/- 2GiB range.
34 SYMBOL_PCREL64
35 The symbol's value will be loaded directly from data section within
36 +/- 8EiB range.
38 SYMBOL_TLS
39 A thread-local symbol.
41 SYMBOL_TLS_IE
42 SYMBOL_TLSGD
43 SYMBOL_TLSLDM
44 UNSPEC wrappers around SYMBOL_TLS, corresponding to the
45 thread-local storage relocation operators.
47 enum loongarch_symbol_type {
48 SYMBOL_GOT_DISP,
49 SYMBOL_PCREL,
50 SYMBOL_PCREL64,
51 SYMBOL_TLS,
52 SYMBOL_TLS_IE,
53 SYMBOL_TLS_LE,
54 SYMBOL_TLSGD,
55 SYMBOL_TLSLDM,
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);
74 #ifdef RTX_CODE
75 extern void loongarch_emit_binary (enum rtx_code, rtx, rtx, rtx);
76 #endif
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);
90 #ifdef RTX_CODE
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);
96 #endif
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,
105 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,
117 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,
124 machine_mode,
125 rtx, bool);
126 extern int loongarch_class_max_nregs (enum reg_class, machine_mode);
128 extern machine_mode loongarch_hard_regno_caller_save_mode (unsigned int,
129 unsigned int,
130 machine_mode);
131 extern const char *loongarch_output_conditional_branch (rtx_insn *, rtx *,
132 const char *,
133 const char *);
134 extern const char *loongarch_output_order_conditional_branch (rtx_insn *,
135 rtx *,
136 bool);
137 extern const char *loongarch_output_equal_conditional_branch (rtx_insn *,
138 rtx *,
139 bool);
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,
195 rtx *);
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,
205 machine_mode, int);
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 */