]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/arm-protos.h
Daily bump.
[thirdparty/gcc.git] / gcc / config / arm / arm-protos.h
CommitLineData
eb3921e8 1/* Prototypes for exported functions defined in arm.c and pe.c
d1e082c2 2 Copyright (C) 1999-2013 Free Software Foundation, Inc.
eb3921e8
NC
3 Contributed by Richard Earnshaw (rearnsha@arm.com)
4 Minor hacks by Nick Clifton (nickc@cygnus.com)
5
4f448245 6 This file is part of GCC.
eb3921e8 7
4f448245
NC
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
2f83c7d6 10 the Free Software Foundation; either version 3, or (at your option)
4f448245 11 any later version.
eb3921e8 12
4f448245
NC
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.
eb3921e8 17
4f448245 18 You should have received a copy of the GNU General Public License
2f83c7d6
NC
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
eb3921e8 21
8b97c5f8
ZW
22#ifndef GCC_ARM_PROTOS_H
23#define GCC_ARM_PROTOS_H
24
677f3fa8 25extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
a72d4945 26extern int use_return_insn (int, rtx);
24d5b097 27extern bool use_simple_return_p (void);
bbbbb16a 28extern enum reg_class arm_regno_class (int);
e55ef7f4 29extern void arm_load_pic_register (unsigned long);
e32bac5b 30extern int arm_volatile_func (void);
e32bac5b 31extern void arm_expand_prologue (void);
d461c88a 32extern void arm_expand_epilogue (bool);
24d5b097 33extern void thumb2_expand_return (bool);
e32bac5b
RE
34extern const char *arm_strip_name_encoding (const char *);
35extern void arm_asm_output_labelref (FILE *, const char *);
5b3e6663 36extern void thumb2_asm_output_opcode (FILE *);
e32bac5b 37extern unsigned long arm_current_func_type (void);
b3f8d95d
MM
38extern HOST_WIDE_INT arm_compute_initial_elimination_offset (unsigned int,
39 unsigned int);
5848830f
PB
40extern HOST_WIDE_INT thumb_compute_initial_elimination_offset (unsigned int,
41 unsigned int);
2fa330b2 42extern unsigned int arm_dbx_register_number (unsigned int);
617a1b71
PB
43extern void arm_output_fn_unwind (FILE *, bool);
44
eb3921e8 45
eb3921e8 46#ifdef RTX_CODE
f676971a 47extern bool arm_vector_mode_supported_p (enum machine_mode);
42db504c 48extern bool arm_small_register_classes_for_mode_p (enum machine_mode);
e32bac5b 49extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
2af8e257 50extern bool arm_modes_tieable_p (enum machine_mode, enum machine_mode);
e32bac5b 51extern int const_ok_for_arm (HOST_WIDE_INT);
c2b640a7 52extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
44cd6810 53extern int const_ok_for_dimode_op (HOST_WIDE_INT, enum rtx_code);
a406f566
MM
54extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
55 HOST_WIDE_INT, rtx, rtx, int);
e32bac5b
RE
56extern int legitimate_pic_operand_p (rtx);
57extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
d3585b76 58extern rtx legitimize_tls_address (rtx, rtx);
c6c3dba9 59extern int arm_legitimate_address_outer_p (enum machine_mode, rtx, RTX_CODE, int);
e32bac5b 60extern int thumb_legitimate_offset_p (enum machine_mode, HOST_WIDE_INT);
0cd98787
JZ
61extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int,
62 int);
a132dad6
RE
63extern rtx thumb_legitimize_reload_address (rtx *, enum machine_mode, int, int,
64 int);
363ee90e 65extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int);
fb40241d
IB
66extern bool ldm_stm_operation_p (rtx, bool, enum machine_mode mode,
67 bool, bool);
9b66ebb1 68extern int arm_const_double_rtx (rtx);
f1adb0a9 69extern int vfp3_const_double_rtx (rtx);
88f77cba
JB
70extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *);
71extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *,
72 int *);
31a0c825
DP
73extern int neon_immediate_valid_for_shift (rtx, enum machine_mode, rtx *,
74 int *, bool);
88f77cba
JB
75extern char *neon_output_logic_immediate (const char *, rtx *,
76 enum machine_mode, int, int);
31a0c825
DP
77extern char *neon_output_shift_immediate (const char *, char, rtx *,
78 enum machine_mode, int, bool);
88f77cba
JB
79extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode,
80 rtx (*) (rtx, rtx, rtx));
814a4c3b 81extern rtx neon_make_constant (rtx);
dfa3f8d0 82extern tree arm_builtin_vectorized_function (tree, tree, tree);
88f77cba 83extern void neon_expand_vector_init (rtx, rtx);
b617fc71
JB
84extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
85extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
86extern HOST_WIDE_INT neon_element_bits (enum machine_mode);
88f77cba
JB
87extern void neon_reinterpret (rtx, rtx);
88extern void neon_emit_pair_result_insn (enum machine_mode,
89 rtx (*) (rtx, rtx, rtx, rtx),
90 rtx, rtx, rtx);
91extern void neon_disambiguate_copy (rtx *, rtx *, rtx *, unsigned int);
b440f324 92extern void neon_split_vcombine (rtx op[3]);
fe2d934b
PB
93extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx,
94 bool);
d3585b76 95extern bool arm_tls_referenced_p (rtx);
d5b7b3ae 96
fdd695fd 97extern int arm_coproc_mem_operand (rtx, bool);
33255ae3 98extern int neon_vector_mem_operand (rtx, int, bool);
88f77cba 99extern int neon_struct_mem_operand (rtx);
e32bac5b 100
d3585b76 101extern int tls_mentioned_p (rtx);
e32bac5b
RE
102extern int symbol_mentioned_p (rtx);
103extern int label_mentioned_p (rtx);
104extern RTX_CODE minmax_code (rtx);
5d216c70 105extern bool arm_sat_operator_match (rtx, rtx, int *, bool *);
e32bac5b 106extern int adjacent_mem_locations (rtx, rtx);
37119410
BS
107extern bool gen_ldm_seq (rtx *, int, bool);
108extern bool gen_stm_seq (rtx *, int);
109extern bool gen_const_stm_seq (rtx *, int);
110extern rtx arm_gen_load_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
111extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
56289ed2
SD
112extern bool offset_ok_for_ldrd_strd (HOST_WIDE_INT);
113extern bool operands_ok_ldrd_strd (rtx, rtx, rtx, HOST_WIDE_INT, bool, bool);
4542a38a 114extern bool gen_operands_ldrd_strd (rtx *, bool, bool, bool);
70128ad9 115extern int arm_gen_movmemqi (rtx *);
798d3d04 116extern bool gen_movmem_ldrd_strd (rtx *);
e32bac5b
RE
117extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
118extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx,
119 HOST_WIDE_INT);
18f0fe6b 120extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx, rtx);
e32bac5b
RE
121extern rtx arm_gen_return_addr_mask (void);
122extern void arm_reload_in_hi (rtx *);
123extern void arm_reload_out_hi (rtx *);
2075b05d 124extern int arm_const_double_inline_cost (rtx);
b4a58f80 125extern bool arm_const_double_by_parts (rtx);
73160ba9 126extern bool arm_const_double_by_immediates (rtx);
e32bac5b 127extern const char *fp_immediate_constant (rtx);
9403b7f7 128extern void arm_emit_call_insn (rtx, rtx);
e32bac5b
RE
129extern const char *output_call (rtx *);
130extern const char *output_call_mem (rtx *);
571191af 131void arm_emit_movpair (rtx, rtx);
e32bac5b 132extern const char *output_mov_long_double_arm_from_arm (rtx *);
3598da80 133extern const char *output_move_double (rtx *, bool, int *count);
88f77cba 134extern const char *output_move_quad (rtx *);
3598da80 135extern int arm_count_output_move_double_insns (rtx *);
5b3e6663 136extern const char *output_move_vfp (rtx *operands);
88f77cba 137extern const char *output_move_neon (rtx *operands);
7c4f0041 138extern int arm_attr_length_move_neon (rtx);
47d8f18d 139extern int arm_address_offset_is_imm (rtx);
e32bac5b
RE
140extern const char *output_add_immediate (rtx *);
141extern const char *arithmetic_instr (rtx, int);
142extern void output_ascii_pseudo_op (FILE *, const unsigned char *, int);
f79b86a4 143extern const char *output_return_instruction (rtx, bool, bool, bool);
e32bac5b 144extern void arm_poke_function_name (FILE *, const char *);
e32bac5b 145extern void arm_final_prescan_insn (rtx);
e32bac5b 146extern int arm_debugger_arg_offset (int, rtx);
25a65198 147extern bool arm_is_long_call_p (tree);
5a9335ef 148extern int arm_emit_vector_const (FILE *, rtx);
0fd8c3ad 149extern void arm_emit_fp16_const (rtx c);
5a9335ef 150extern const char * arm_output_load_gr (rtx *);
8edfc4cc 151extern const char *vfp_output_fstmd (rtx *);
3aee1982 152extern void arm_output_multireg_pop (rtx *, bool, rtx, bool, bool);
c9ca9b88 153extern void arm_set_return_address (rtx, rtx);
6555b6bd 154extern int arm_eliminable_register (rtx);
5b3e6663 155extern const char *arm_output_shift(rtx *, int);
8fd03515
XQ
156extern const char *arm_output_iwmmxt_shift_immediate (const char *, rtx *, bool);
157extern const char *arm_output_iwmmxt_tinsr (rtx *);
029e79eb 158extern unsigned int arm_sync_loop_insns (rtx , rtx *);
0c27e2d8 159extern int arm_attr_length_push_multi(rtx, rtx);
18f0fe6b
RH
160extern void arm_expand_compare_and_swap (rtx op[]);
161extern void arm_split_compare_and_swap (rtx op[]);
162extern void arm_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx, rtx);
f959607b 163extern rtx arm_load_tp (rtx);
d5b7b3ae
RE
164
165#if defined TREE_CODE
e32bac5b 166extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
586de218 167extern bool arm_pad_arg_upward (enum machine_mode, const_tree);
866af8a9 168extern bool arm_pad_reg_upward (enum machine_mode, tree, int);
d5b7b3ae 169#endif
9f7bf991 170extern int arm_apply_result_size (void);
d5b7b3ae 171
eb3921e8
NC
172#endif /* RTX_CODE */
173
d5b7b3ae 174/* Thumb functions. */
e32bac5b 175extern void arm_init_expanders (void);
90911ab6 176extern const char *thumb1_unexpanded_epilogue (void);
5b3e6663
PB
177extern void thumb1_expand_prologue (void);
178extern void thumb1_expand_epilogue (void);
d018b46e 179extern const char *thumb1_output_interwork (void);
d5b7b3ae 180#ifdef TREE_CODE
e32bac5b 181extern int is_called_in_ARM_mode (tree);
d5b7b3ae 182#endif
e32bac5b 183extern int thumb_shiftable_const (unsigned HOST_WIDE_INT);
cd2b33d0 184#ifdef RTX_CODE
723d95fe 185extern enum arm_cond_code maybe_get_arm_condition_code (rtx);
5b3e6663
PB
186extern void thumb1_final_prescan_insn (rtx);
187extern void thumb2_final_prescan_insn (rtx);
e32bac5b
RE
188extern const char *thumb_load_double_from_address (rtx *);
189extern const char *thumb_output_move_mem_multiple (int, rtx *);
b12a00f1 190extern const char *thumb_call_via_reg (rtx);
70128ad9 191extern void thumb_expand_movmemqi (rtx *);
e32bac5b
RE
192extern rtx arm_return_addr (int, rtx);
193extern void thumb_reload_out_hi (rtx *);
194extern void thumb_reload_in_hi (rtx *);
c9ca9b88 195extern void thumb_set_return_address (rtx, rtx);
907dd0c7
RE
196extern const char *thumb1_output_casesi (rtx *);
197extern const char *thumb2_output_casesi (rtx *);
d5b7b3ae
RE
198#endif
199
200/* Defined in pe.c. */
e32bac5b
RE
201extern int arm_dllexport_name_p (const char *);
202extern int arm_dllimport_name_p (const char *);
d5b7b3ae
RE
203
204#ifdef TREE_CODE
e32bac5b
RE
205extern void arm_pe_unique_section (tree, int);
206extern void arm_pe_encode_section_info (tree, rtx, int);
207extern int arm_dllexport_p (tree);
208extern int arm_dllimport_p (tree);
209extern void arm_mark_dllexport (tree);
210extern void arm_mark_dllimport (tree);
d5b7b3ae 211#endif
8b97c5f8 212
e32bac5b
RE
213extern void arm_pr_long_calls (struct cpp_reader *);
214extern void arm_pr_no_long_calls (struct cpp_reader *);
215extern void arm_pr_long_calls_off (struct cpp_reader *);
8b97c5f8 216
b76c3c4b
PB
217extern void arm_lang_object_attributes_init(void);
218
3101faab 219extern const char *arm_mangle_type (const_tree);
608063c3 220
795dc4fc
PB
221extern void arm_order_regs_for_local_alloc (void);
222
b24a2ce5
GY
223extern int arm_max_conditional_execute ();
224
2597da22
CL
225/* Vectorizer cost model implementation. */
226struct cpu_vec_costs {
227 const int scalar_stmt_cost; /* Cost of any scalar operation, excluding
228 load and store. */
229 const int scalar_load_cost; /* Cost of scalar load. */
230 const int scalar_store_cost; /* Cost of scalar store. */
231 const int vec_stmt_cost; /* Cost of any vector operation, excluding
232 load, store, vector-to-scalar and
233 scalar-to-vector operation. */
234 const int vec_to_scalar_cost; /* Cost of vect-to-scalar operation. */
235 const int scalar_to_vec_cost; /* Cost of scalar-to-vector operation. */
236 const int vec_align_load_cost; /* Cost of aligned vector load. */
237 const int vec_unalign_load_cost; /* Cost of unaligned vector load. */
238 const int vec_unalign_store_cost; /* Cost of unaligned vector load. */
239 const int vec_store_cost; /* Cost of vector store. */
240 const int cond_taken_branch_cost; /* Cost of taken branch for vectorizer
241 cost model. */
242 const int cond_not_taken_branch_cost;/* Cost of not taken branch for
243 vectorizer cost model. */
244};
245
1b78f575
RE
246#ifdef RTX_CODE
247/* This needs to be here because we need RTX_CODE and similar. */
248
5bea0c6c
KT
249struct cpu_cost_table;
250
1b78f575
RE
251struct tune_params
252{
253 bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
5bea0c6c 254 const struct cpu_cost_table *insn_extra_cost;
b0c13111 255 bool (*sched_adjust_cost) (rtx, rtx, rtx, int *);
1b78f575 256 int constant_limit;
b24a2ce5 257 /* Maximum number of instructions to conditionalise. */
16868d84 258 int max_insns_skipped;
911de8a3
IB
259 int num_prefetch_slots;
260 int l1_cache_size;
261 int l1_cache_line_size;
7ec70105 262 bool prefer_constant_pool;
153668ec 263 int (*branch_cost) (bool, bool);
ab3dfff7
SD
264 /* Prefer STRD/LDRD instructions over PUSH/POP/LDM/STM. */
265 bool prefer_ldrd_strd;
a51fb17f
BC
266 /* The preference for non short cirtcuit operation when optimizing for
267 performance. The first element covers Thumb state and the second one
268 is for ARM state. */
269 bool logical_op_non_short_circuit[2];
2597da22
CL
270 /* Vectorizer costs. */
271 const struct cpu_vec_costs* vec_costs;
65074f54
CL
272 /* Prefer Neon for 64-bit bitops. */
273 bool prefer_neon_for_64bits;
1b78f575
RE
274};
275
276extern const struct tune_params *current_tune;
7f3d8f56 277extern int vfp3_const_double_for_fract_bits (rtx);
99aea943
AS
278
279extern void arm_emit_coreregs_64bit_shift (enum rtx_code, rtx, rtx, rtx, rtx,
280 rtx);
95ffee1f 281extern bool arm_validize_comparison (rtx *, rtx *, rtx *);
1b78f575
RE
282#endif /* RTX_CODE */
283
b440f324
RH
284extern void arm_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
285extern bool arm_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
286
8875e939
RR
287extern bool arm_autoinc_modes_ok_p (enum machine_mode, enum arm_auto_incmodes);
288
34dd397b
SB
289extern void arm_emit_eabi_attribute (const char *, int, int);
290
88657302 291#endif /* ! GCC_ARM_PROTOS_H */