]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/arm-protos.h
2012-05-18 Andrew Stubbs <ams@codesourcery.com>
[thirdparty/gcc.git] / gcc / config / arm / arm-protos.h
CommitLineData
5d3f468b 1/* Prototypes for exported functions defined in arm.c and pe.c
b9c74b4d 2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
e1b93706 3 2009, 2010, 2012 Free Software Foundation, Inc.
5d3f468b 4 Contributed by Richard Earnshaw (rearnsha@arm.com)
5 Minor hacks by Nick Clifton (nickc@cygnus.com)
6
acf6ed70 7 This file is part of GCC.
5d3f468b 8
acf6ed70 9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
038d1e19 11 the Free Software Foundation; either version 3, or (at your option)
acf6ed70 12 any later version.
5d3f468b 13
acf6ed70 14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
5d3f468b 18
acf6ed70 19 You should have received a copy of the GNU General Public License
038d1e19 20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
5d3f468b 22
1fcd08b1 23#ifndef GCC_ARM_PROTOS_H
24#define GCC_ARM_PROTOS_H
25
218e3e4e 26extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
ffc9d00c 27extern int use_return_insn (int, rtx);
b9c74b4d 28extern enum reg_class arm_regno_class (int);
aa6af490 29extern void arm_load_pic_register (unsigned long);
ebd88a36 30extern int arm_volatile_func (void);
ffc9d00c 31extern const char *arm_output_epilogue (rtx);
ebd88a36 32extern void arm_expand_prologue (void);
ebd88a36 33extern const char *arm_strip_name_encoding (const char *);
34extern void arm_asm_output_labelref (FILE *, const char *);
25f905c2 35extern void thumb2_asm_output_opcode (FILE *);
ebd88a36 36extern unsigned long arm_current_func_type (void);
30e9913f 37extern HOST_WIDE_INT arm_compute_initial_elimination_offset (unsigned int,
38 unsigned int);
f9273c43 39extern HOST_WIDE_INT thumb_compute_initial_elimination_offset (unsigned int,
40 unsigned int);
5f9d1097 41extern unsigned int arm_dbx_register_number (unsigned int);
1774763d 42extern void arm_output_fn_unwind (FILE *, bool);
43
5d3f468b 44
5d3f468b 45#ifdef RTX_CODE
9e7454d0 46extern bool arm_vector_mode_supported_p (enum machine_mode);
ed5527ca 47extern bool arm_small_register_classes_for_mode_p (enum machine_mode);
ebd88a36 48extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
224aeead 49extern bool arm_modes_tieable_p (enum machine_mode, enum machine_mode);
ebd88a36 50extern int const_ok_for_arm (HOST_WIDE_INT);
d5cbae34 51extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
96f57e36 52extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
53 HOST_WIDE_INT, rtx, rtx, int);
a8045a4f 54extern RTX_CODE arm_canonicalize_comparison (RTX_CODE, rtx *, rtx *);
ebd88a36 55extern int legitimate_pic_operand_p (rtx);
56extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
f655717d 57extern rtx legitimize_tls_address (rtx, rtx);
fd50b071 58extern int arm_legitimate_address_outer_p (enum machine_mode, rtx, RTX_CODE, int);
ebd88a36 59extern int thumb_legitimate_offset_p (enum machine_mode, HOST_WIDE_INT);
a4f7f36c 60extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int,
61 int);
5ede62f6 62extern rtx thumb_legitimize_reload_address (rtx *, enum machine_mode, int, int,
63 int);
a54e3e7b 64extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int);
394cb8e0 65extern bool ldm_stm_operation_p (rtx, bool, enum machine_mode mode,
66 bool, bool);
a2cd141b 67extern int arm_const_double_rtx (rtx);
ebd88a36 68extern int neg_const_double_rtx_ok_for_fpa (rtx);
b5a0636d 69extern int vfp3_const_double_rtx (rtx);
d98a3884 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 *);
73f20323 73extern int neon_immediate_valid_for_shift (rtx, enum machine_mode, rtx *,
74 int *, bool);
d98a3884 75extern char *neon_output_logic_immediate (const char *, rtx *,
76 enum machine_mode, int, int);
73f20323 77extern char *neon_output_shift_immediate (const char *, char, rtx *,
78 enum machine_mode, int, bool);
d98a3884 79extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode,
80 rtx (*) (rtx, rtx, rtx));
c747abbb 81extern rtx neon_make_constant (rtx);
d98a3884 82extern void neon_expand_vector_init (rtx, rtx);
8521669a 83extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
84extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
85extern HOST_WIDE_INT neon_element_bits (enum machine_mode);
d98a3884 86extern void neon_reinterpret (rtx, rtx);
87extern void neon_emit_pair_result_insn (enum machine_mode,
88 rtx (*) (rtx, rtx, rtx, rtx),
89 rtx, rtx, rtx);
90extern void neon_disambiguate_copy (rtx *, rtx *, rtx *, unsigned int);
47ddcd6b 91extern void neon_split_vcombine (rtx op[3]);
f1225f6f 92extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx,
93 bool);
f655717d 94extern bool arm_tls_referenced_p (rtx);
cffb2a26 95
ebd88a36 96extern int cirrus_memory_offset (rtx);
a8a3b539 97extern int arm_coproc_mem_operand (rtx, bool);
f1c02c87 98extern int neon_vector_mem_operand (rtx, int);
d98a3884 99extern int neon_struct_mem_operand (rtx);
a2cd141b 100extern int arm_no_early_store_addr_dep (rtx, rtx);
2546d93a 101extern int arm_early_store_addr_dep (rtx, rtx);
102extern int arm_early_load_addr_dep (rtx, rtx);
a2cd141b 103extern int arm_no_early_alu_shift_dep (rtx, rtx);
104extern int arm_no_early_alu_shift_value_dep (rtx, rtx);
105extern int arm_no_early_mul_dep (rtx, rtx);
bcaec148 106extern int arm_mac_accumulator_is_mul_result (rtx, rtx);
ebd88a36 107
f655717d 108extern int tls_mentioned_p (rtx);
ebd88a36 109extern int symbol_mentioned_p (rtx);
110extern int label_mentioned_p (rtx);
111extern RTX_CODE minmax_code (rtx);
b49e3742 112extern bool arm_sat_operator_match (rtx, rtx, int *, bool *);
ebd88a36 113extern int adjacent_mem_locations (rtx, rtx);
320ea44d 114extern bool gen_ldm_seq (rtx *, int, bool);
115extern bool gen_stm_seq (rtx *, int);
116extern bool gen_const_stm_seq (rtx *, int);
117extern rtx arm_gen_load_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
118extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
008c057d 119extern int arm_gen_movmemqi (rtx *);
ebd88a36 120extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
121extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx,
122 HOST_WIDE_INT);
e1b93706 123extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx, rtx);
ebd88a36 124extern rtx arm_gen_return_addr_mask (void);
125extern void arm_reload_in_hi (rtx *);
126extern void arm_reload_out_hi (rtx *);
359a6e9f 127extern int arm_const_double_inline_cost (rtx);
e5ba9289 128extern bool arm_const_double_by_parts (rtx);
a8045a4f 129extern bool arm_const_double_by_immediates (rtx);
ebd88a36 130extern const char *fp_immediate_constant (rtx);
bac7fc85 131extern void arm_emit_call_insn (rtx, rtx);
ebd88a36 132extern const char *output_call (rtx *);
133extern const char *output_call_mem (rtx *);
d0e6a121 134void arm_emit_movpair (rtx, rtx);
ebd88a36 135extern const char *output_mov_long_double_fpa_from_arm (rtx *);
136extern const char *output_mov_long_double_arm_from_fpa (rtx *);
137extern const char *output_mov_long_double_arm_from_arm (rtx *);
138extern const char *output_mov_double_fpa_from_arm (rtx *);
139extern const char *output_mov_double_arm_from_fpa (rtx *);
26ff80c0 140extern const char *output_move_double (rtx *, bool, int *count);
d98a3884 141extern const char *output_move_quad (rtx *);
26ff80c0 142extern int arm_count_output_move_double_insns (rtx *);
25f905c2 143extern const char *output_move_vfp (rtx *operands);
d98a3884 144extern const char *output_move_neon (rtx *operands);
ba6c018a 145extern int arm_attr_length_move_neon (rtx);
2546d93a 146extern int arm_address_offset_is_imm (rtx);
ebd88a36 147extern const char *output_add_immediate (rtx *);
148extern const char *arithmetic_instr (rtx, int);
149extern void output_ascii_pseudo_op (FILE *, const unsigned char *, int);
150extern const char *output_return_instruction (rtx, int, int);
151extern void arm_poke_function_name (FILE *, const char *);
ebd88a36 152extern void arm_final_prescan_insn (rtx);
ebd88a36 153extern int arm_debugger_arg_offset (int, rtx);
de55252a 154extern bool arm_is_long_call_p (tree);
755eb2b4 155extern int arm_emit_vector_const (FILE *, rtx);
9b8516be 156extern void arm_emit_fp16_const (rtx c);
755eb2b4 157extern const char * arm_output_load_gr (rtx *);
382a2a57 158extern const char *vfp_output_fstmd (rtx *);
4c44712e 159extern void arm_set_return_address (rtx, rtx);
841b213d 160extern int arm_eliminable_register (rtx);
25f905c2 161extern const char *arm_output_shift(rtx *, int);
06df6b17 162extern unsigned int arm_sync_loop_insns (rtx , rtx *);
08508cbf 163extern int arm_attr_length_push_multi(rtx, rtx);
e1b93706 164extern void arm_expand_compare_and_swap (rtx op[]);
165extern void arm_split_compare_and_swap (rtx op[]);
166extern void arm_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx, rtx);
cffb2a26 167
168#if defined TREE_CODE
ebd88a36 169extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
fb80456a 170extern bool arm_pad_arg_upward (enum machine_mode, const_tree);
46b5d878 171extern bool arm_pad_reg_upward (enum machine_mode, tree, int);
cffb2a26 172#endif
ccd90aaa 173extern int arm_apply_result_size (void);
cffb2a26 174
5d3f468b 175#endif /* RTX_CODE */
176
ebd88a36 177extern int arm_float_words_big_endian (void);
3d94d3fa 178
cffb2a26 179/* Thumb functions. */
ebd88a36 180extern void arm_init_expanders (void);
e7fd8dfa 181extern const char *thumb1_unexpanded_epilogue (void);
25f905c2 182extern void thumb1_expand_prologue (void);
183extern void thumb1_expand_epilogue (void);
7571d3f7 184extern const char *thumb1_output_interwork (void);
cffb2a26 185#ifdef TREE_CODE
ebd88a36 186extern int is_called_in_ARM_mode (tree);
cffb2a26 187#endif
ebd88a36 188extern int thumb_shiftable_const (unsigned HOST_WIDE_INT);
0bd59681 189#ifdef RTX_CODE
23628a13 190extern enum arm_cond_code maybe_get_arm_condition_code (rtx);
25f905c2 191extern void thumb1_final_prescan_insn (rtx);
192extern void thumb2_final_prescan_insn (rtx);
ebd88a36 193extern const char *thumb_load_double_from_address (rtx *);
194extern const char *thumb_output_move_mem_multiple (int, rtx *);
afe27f3b 195extern const char *thumb_call_via_reg (rtx);
008c057d 196extern void thumb_expand_movmemqi (rtx *);
ebd88a36 197extern rtx arm_return_addr (int, rtx);
198extern void thumb_reload_out_hi (rtx *);
199extern void thumb_reload_in_hi (rtx *);
4c44712e 200extern void thumb_set_return_address (rtx, rtx);
e6ac8414 201extern const char *thumb1_output_casesi (rtx *);
202extern const char *thumb2_output_casesi (rtx *);
cffb2a26 203#endif
204
205/* Defined in pe.c. */
ebd88a36 206extern int arm_dllexport_name_p (const char *);
207extern int arm_dllimport_name_p (const char *);
cffb2a26 208
209#ifdef TREE_CODE
ebd88a36 210extern void arm_pe_unique_section (tree, int);
211extern void arm_pe_encode_section_info (tree, rtx, int);
212extern int arm_dllexport_p (tree);
213extern int arm_dllimport_p (tree);
214extern void arm_mark_dllexport (tree);
215extern void arm_mark_dllimport (tree);
cffb2a26 216#endif
1fcd08b1 217
ebd88a36 218extern void arm_pr_long_calls (struct cpp_reader *);
219extern void arm_pr_no_long_calls (struct cpp_reader *);
220extern void arm_pr_long_calls_off (struct cpp_reader *);
1fcd08b1 221
baa1a726 222extern void arm_lang_object_attributes_init(void);
223
a9f1838b 224extern const char *arm_mangle_type (const_tree);
eddcdde1 225
dca1b68c 226extern void arm_order_regs_for_local_alloc (void);
227
647e1499 228#ifdef RTX_CODE
229/* This needs to be here because we need RTX_CODE and similar. */
230
231struct tune_params
232{
233 bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
4a139fee 234 bool (*sched_adjust_cost) (rtx, rtx, rtx, int *);
647e1499 235 int constant_limit;
290a6dcf 236 /* Maximum number of instructions to conditionalise in
237 arm_final_prescan_insn. */
238 int max_insns_skipped;
2b471f50 239 int num_prefetch_slots;
240 int l1_cache_size;
241 int l1_cache_line_size;
37565543 242 bool prefer_constant_pool;
285a01fc 243 int (*branch_cost) (bool, bool);
647e1499 244};
245
246extern const struct tune_params *current_tune;
4a62aafb 247extern int vfp3_const_double_for_fract_bits (rtx);
ffcc986d 248
249extern void arm_emit_coreregs_64bit_shift (enum rtx_code, rtx, rtx, rtx, rtx,
250 rtx);
647e1499 251#endif /* RTX_CODE */
252
47ddcd6b 253extern void arm_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
254extern bool arm_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
255
aa1572b5 256extern bool arm_autoinc_modes_ok_p (enum machine_mode, enum arm_auto_incmodes);
257
2a281353 258#endif /* ! GCC_ARM_PROTOS_H */