]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/arm-protos.h
re PR target/46716 (wrong code generated with -mno-sse2 -m64)
[thirdparty/gcc.git] / gcc / config / arm / arm-protos.h
CommitLineData
eb3921e8 1/* Prototypes for exported functions defined in arm.c and pe.c
bbbbb16a 2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
18f0fe6b 3 2009, 2010, 2012 Free Software Foundation, Inc.
eb3921e8
NC
4 Contributed by Richard Earnshaw (rearnsha@arm.com)
5 Minor hacks by Nick Clifton (nickc@cygnus.com)
6
4f448245 7 This file is part of GCC.
eb3921e8 8
4f448245
NC
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
2f83c7d6 11 the Free Software Foundation; either version 3, or (at your option)
4f448245 12 any later version.
eb3921e8 13
4f448245
NC
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.
eb3921e8 18
4f448245 19 You should have received a copy of the GNU General Public License
2f83c7d6
NC
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
eb3921e8 22
8b97c5f8
ZW
23#ifndef GCC_ARM_PROTOS_H
24#define GCC_ARM_PROTOS_H
25
677f3fa8 26extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
a72d4945 27extern int use_return_insn (int, rtx);
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);
a72d4945 31extern const char *arm_output_epilogue (rtx);
e32bac5b 32extern void arm_expand_prologue (void);
e32bac5b
RE
33extern const char *arm_strip_name_encoding (const char *);
34extern void arm_asm_output_labelref (FILE *, const char *);
5b3e6663 35extern void thumb2_asm_output_opcode (FILE *);
e32bac5b 36extern unsigned long arm_current_func_type (void);
b3f8d95d
MM
37extern HOST_WIDE_INT arm_compute_initial_elimination_offset (unsigned int,
38 unsigned int);
5848830f
PB
39extern HOST_WIDE_INT thumb_compute_initial_elimination_offset (unsigned int,
40 unsigned int);
2fa330b2 41extern unsigned int arm_dbx_register_number (unsigned int);
617a1b71
PB
42extern void arm_output_fn_unwind (FILE *, bool);
43
eb3921e8 44
eb3921e8 45#ifdef RTX_CODE
f676971a 46extern bool arm_vector_mode_supported_p (enum machine_mode);
42db504c 47extern bool arm_small_register_classes_for_mode_p (enum machine_mode);
e32bac5b 48extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
2af8e257 49extern bool arm_modes_tieable_p (enum machine_mode, enum machine_mode);
e32bac5b 50extern int const_ok_for_arm (HOST_WIDE_INT);
c2b640a7 51extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
a406f566
MM
52extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
53 HOST_WIDE_INT, rtx, rtx, int);
73160ba9 54extern RTX_CODE arm_canonicalize_comparison (RTX_CODE, rtx *, rtx *);
e32bac5b
RE
55extern int legitimate_pic_operand_p (rtx);
56extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
d3585b76 57extern rtx legitimize_tls_address (rtx, rtx);
c6c3dba9 58extern int arm_legitimate_address_outer_p (enum machine_mode, rtx, RTX_CODE, int);
e32bac5b 59extern int thumb_legitimate_offset_p (enum machine_mode, HOST_WIDE_INT);
0cd98787
JZ
60extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int,
61 int);
a132dad6
RE
62extern rtx thumb_legitimize_reload_address (rtx *, enum machine_mode, int, int,
63 int);
363ee90e 64extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int);
9b66ebb1 65extern int arm_const_double_rtx (rtx);
e32bac5b 66extern int neg_const_double_rtx_ok_for_fpa (rtx);
f1adb0a9 67extern int vfp3_const_double_rtx (rtx);
88f77cba
JB
68extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *);
69extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *,
70 int *);
31a0c825
DP
71extern int neon_immediate_valid_for_shift (rtx, enum machine_mode, rtx *,
72 int *, bool);
88f77cba
JB
73extern char *neon_output_logic_immediate (const char *, rtx *,
74 enum machine_mode, int, int);
31a0c825
DP
75extern char *neon_output_shift_immediate (const char *, char, rtx *,
76 enum machine_mode, int, bool);
88f77cba
JB
77extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode,
78 rtx (*) (rtx, rtx, rtx));
814a4c3b 79extern rtx neon_make_constant (rtx);
88f77cba 80extern void neon_expand_vector_init (rtx, rtx);
b617fc71
JB
81extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
82extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
83extern HOST_WIDE_INT neon_element_bits (enum machine_mode);
88f77cba
JB
84extern void neon_reinterpret (rtx, rtx);
85extern void neon_emit_pair_result_insn (enum machine_mode,
86 rtx (*) (rtx, rtx, rtx, rtx),
87 rtx, rtx, rtx);
88extern void neon_disambiguate_copy (rtx *, rtx *, rtx *, unsigned int);
b440f324 89extern void neon_split_vcombine (rtx op[3]);
fe2d934b
PB
90extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx,
91 bool);
d3585b76 92extern bool arm_tls_referenced_p (rtx);
d5b7b3ae 93
e32bac5b 94extern int cirrus_memory_offset (rtx);
fdd695fd 95extern int arm_coproc_mem_operand (rtx, bool);
dc34db56 96extern int neon_vector_mem_operand (rtx, int);
88f77cba 97extern int neon_struct_mem_operand (rtx);
9b66ebb1 98extern int arm_no_early_store_addr_dep (rtx, rtx);
47d8f18d
JZ
99extern int arm_early_store_addr_dep (rtx, rtx);
100extern int arm_early_load_addr_dep (rtx, rtx);
9b66ebb1
PB
101extern int arm_no_early_alu_shift_dep (rtx, rtx);
102extern int arm_no_early_alu_shift_value_dep (rtx, rtx);
103extern int arm_no_early_mul_dep (rtx, rtx);
c956e102 104extern int arm_mac_accumulator_is_mul_result (rtx, rtx);
e32bac5b 105
d3585b76 106extern int tls_mentioned_p (rtx);
e32bac5b
RE
107extern int symbol_mentioned_p (rtx);
108extern int label_mentioned_p (rtx);
109extern RTX_CODE minmax_code (rtx);
110extern int adjacent_mem_locations (rtx, rtx);
37119410
BS
111extern bool gen_ldm_seq (rtx *, int, bool);
112extern bool gen_stm_seq (rtx *, int);
113extern bool gen_const_stm_seq (rtx *, int);
114extern rtx arm_gen_load_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
115extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
70128ad9 116extern int arm_gen_movmemqi (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
RE
132extern const char *output_mov_long_double_fpa_from_arm (rtx *);
133extern const char *output_mov_long_double_arm_from_fpa (rtx *);
134extern const char *output_mov_long_double_arm_from_arm (rtx *);
135extern const char *output_mov_double_fpa_from_arm (rtx *);
136extern const char *output_mov_double_arm_from_fpa (rtx *);
3598da80 137extern const char *output_move_double (rtx *, bool, int *count);
88f77cba 138extern const char *output_move_quad (rtx *);
3598da80 139extern int arm_count_output_move_double_insns (rtx *);
5b3e6663 140extern const char *output_move_vfp (rtx *operands);
88f77cba 141extern const char *output_move_neon (rtx *operands);
7c4f0041 142extern int arm_attr_length_move_neon (rtx);
47d8f18d 143extern int arm_address_offset_is_imm (rtx);
e32bac5b
RE
144extern const char *output_add_immediate (rtx *);
145extern const char *arithmetic_instr (rtx, int);
146extern void output_ascii_pseudo_op (FILE *, const unsigned char *, int);
147extern const char *output_return_instruction (rtx, int, int);
148extern void arm_poke_function_name (FILE *, const char *);
e32bac5b 149extern void arm_final_prescan_insn (rtx);
e32bac5b 150extern int arm_debugger_arg_offset (int, rtx);
25a65198 151extern bool arm_is_long_call_p (tree);
5a9335ef 152extern int arm_emit_vector_const (FILE *, rtx);
0fd8c3ad 153extern void arm_emit_fp16_const (rtx c);
5a9335ef 154extern const char * arm_output_load_gr (rtx *);
8edfc4cc 155extern const char *vfp_output_fstmd (rtx *);
c9ca9b88 156extern void arm_set_return_address (rtx, rtx);
6555b6bd 157extern int arm_eliminable_register (rtx);
5b3e6663 158extern const char *arm_output_shift(rtx *, int);
029e79eb 159extern unsigned int arm_sync_loop_insns (rtx , rtx *);
0c27e2d8 160extern int arm_attr_length_push_multi(rtx, rtx);
18f0fe6b
RH
161extern void arm_expand_compare_and_swap (rtx op[]);
162extern void arm_split_compare_and_swap (rtx op[]);
163extern void arm_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx, 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
e32bac5b 174extern int arm_float_words_big_endian (void);
3717da94 175
d5b7b3ae 176/* Thumb functions. */
e32bac5b 177extern void arm_init_expanders (void);
e32bac5b 178extern const char *thumb_unexpanded_epilogue (void);
5b3e6663
PB
179extern void thumb1_expand_prologue (void);
180extern void thumb1_expand_epilogue (void);
d018b46e 181extern const char *thumb1_output_interwork (void);
d5b7b3ae 182#ifdef TREE_CODE
e32bac5b 183extern int is_called_in_ARM_mode (tree);
d5b7b3ae 184#endif
e32bac5b 185extern int thumb_shiftable_const (unsigned HOST_WIDE_INT);
cd2b33d0 186#ifdef RTX_CODE
723d95fe 187extern enum arm_cond_code maybe_get_arm_condition_code (rtx);
5b3e6663
PB
188extern void thumb1_final_prescan_insn (rtx);
189extern void thumb2_final_prescan_insn (rtx);
e32bac5b
RE
190extern const char *thumb_load_double_from_address (rtx *);
191extern const char *thumb_output_move_mem_multiple (int, rtx *);
b12a00f1 192extern const char *thumb_call_via_reg (rtx);
70128ad9 193extern void thumb_expand_movmemqi (rtx *);
e32bac5b
RE
194extern rtx arm_return_addr (int, rtx);
195extern void thumb_reload_out_hi (rtx *);
196extern void thumb_reload_in_hi (rtx *);
c9ca9b88 197extern void thumb_set_return_address (rtx, rtx);
907dd0c7
RE
198extern const char *thumb1_output_casesi (rtx *);
199extern const char *thumb2_output_casesi (rtx *);
d5b7b3ae
RE
200#endif
201
202/* Defined in pe.c. */
e32bac5b
RE
203extern int arm_dllexport_name_p (const char *);
204extern int arm_dllimport_name_p (const char *);
d5b7b3ae
RE
205
206#ifdef TREE_CODE
e32bac5b
RE
207extern void arm_pe_unique_section (tree, int);
208extern void arm_pe_encode_section_info (tree, rtx, int);
209extern int arm_dllexport_p (tree);
210extern int arm_dllimport_p (tree);
211extern void arm_mark_dllexport (tree);
212extern void arm_mark_dllimport (tree);
d5b7b3ae 213#endif
8b97c5f8 214
e32bac5b
RE
215extern void arm_pr_long_calls (struct cpp_reader *);
216extern void arm_pr_no_long_calls (struct cpp_reader *);
217extern void arm_pr_long_calls_off (struct cpp_reader *);
8b97c5f8 218
b76c3c4b
PB
219extern void arm_lang_object_attributes_init(void);
220
3101faab 221extern const char *arm_mangle_type (const_tree);
608063c3 222
795dc4fc
PB
223extern void arm_order_regs_for_local_alloc (void);
224
1b78f575
RE
225#ifdef RTX_CODE
226/* This needs to be here because we need RTX_CODE and similar. */
227
228struct tune_params
229{
230 bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
b0c13111 231 bool (*sched_adjust_cost) (rtx, rtx, rtx, int *);
1b78f575 232 int constant_limit;
16868d84
JB
233 /* Maximum number of instructions to conditionalise in
234 arm_final_prescan_insn. */
235 int max_insns_skipped;
911de8a3
IB
236 int num_prefetch_slots;
237 int l1_cache_size;
238 int l1_cache_line_size;
7ec70105 239 bool prefer_constant_pool;
153668ec 240 int (*branch_cost) (bool, bool);
1b78f575
RE
241};
242
243extern const struct tune_params *current_tune;
7f3d8f56 244extern int vfp3_const_double_for_fract_bits (rtx);
1b78f575
RE
245#endif /* RTX_CODE */
246
b440f324
RH
247extern void arm_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
248extern bool arm_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
249
88657302 250#endif /* ! GCC_ARM_PROTOS_H */