]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/arm-protos.h
re PR target/43703 (Unexpected floating point precision loss due to ARM NEON autovect...
[thirdparty/gcc.git] / gcc / config / arm / arm-protos.h
CommitLineData
eb3921e8 1/* Prototypes for exported functions defined in arm.c and pe.c
bbbbb16a
ILT
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3 2009 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
e32bac5b 26extern void arm_override_options (void);
f67358da 27extern void arm_optimization_options (int, int);
a72d4945 28extern int use_return_insn (int, rtx);
bbbbb16a 29extern enum reg_class arm_regno_class (int);
e55ef7f4 30extern void arm_load_pic_register (unsigned long);
e32bac5b 31extern int arm_volatile_func (void);
a72d4945 32extern const char *arm_output_epilogue (rtx);
e32bac5b 33extern void arm_expand_prologue (void);
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
RE
49extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
50extern int const_ok_for_arm (HOST_WIDE_INT);
a406f566
MM
51extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
52 HOST_WIDE_INT, rtx, rtx, int);
a14b88bb
PB
53extern RTX_CODE arm_canonicalize_comparison (RTX_CODE, enum machine_mode,
54 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);
a132dad6
RE
60extern rtx thumb_legitimize_reload_address (rtx *, enum machine_mode, int, int,
61 int);
9b66ebb1 62extern int arm_const_double_rtx (rtx);
e32bac5b 63extern int neg_const_double_rtx_ok_for_fpa (rtx);
f1adb0a9 64extern int vfp3_const_double_rtx (rtx);
88f77cba
JB
65extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *);
66extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *,
67 int *);
68extern char *neon_output_logic_immediate (const char *, rtx *,
69 enum machine_mode, int, int);
70extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode,
71 rtx (*) (rtx, rtx, rtx));
814a4c3b 72extern rtx neon_make_constant (rtx);
88f77cba 73extern void neon_expand_vector_init (rtx, rtx);
b617fc71
JB
74extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
75extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
76extern HOST_WIDE_INT neon_element_bits (enum machine_mode);
88f77cba
JB
77extern void neon_reinterpret (rtx, rtx);
78extern void neon_emit_pair_result_insn (enum machine_mode,
79 rtx (*) (rtx, rtx, rtx, rtx),
80 rtx, rtx, rtx);
81extern void neon_disambiguate_copy (rtx *, rtx *, rtx *, unsigned int);
fe2d934b
PB
82extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx,
83 bool);
d3585b76 84extern bool arm_tls_referenced_p (rtx);
8426b956 85extern bool arm_cannot_force_const_mem (rtx);
d5b7b3ae 86
e32bac5b 87extern int cirrus_memory_offset (rtx);
fdd695fd 88extern int arm_coproc_mem_operand (rtx, bool);
dc34db56 89extern int neon_vector_mem_operand (rtx, int);
88f77cba 90extern int neon_struct_mem_operand (rtx);
9b66ebb1
PB
91extern int arm_no_early_store_addr_dep (rtx, rtx);
92extern int arm_no_early_alu_shift_dep (rtx, rtx);
93extern int arm_no_early_alu_shift_value_dep (rtx, rtx);
94extern int arm_no_early_mul_dep (rtx, rtx);
c956e102 95extern int arm_mac_accumulator_is_mul_result (rtx, rtx);
e32bac5b 96
d3585b76 97extern int tls_mentioned_p (rtx);
e32bac5b
RE
98extern int symbol_mentioned_p (rtx);
99extern int label_mentioned_p (rtx);
100extern RTX_CODE minmax_code (rtx);
101extern int adjacent_mem_locations (rtx, rtx);
102extern int load_multiple_sequence (rtx *, int, int *, int *, HOST_WIDE_INT *);
103extern const char *emit_ldm_seq (rtx *, int);
104extern int store_multiple_sequence (rtx *, int, int *, int *, HOST_WIDE_INT *);
105extern const char * emit_stm_seq (rtx *, int);
50ed9cea
RH
106extern rtx arm_gen_load_multiple (int, int, rtx, int, int,
107 rtx, HOST_WIDE_INT *);
108extern rtx arm_gen_store_multiple (int, int, rtx, int, int,
109 rtx, HOST_WIDE_INT *);
70128ad9 110extern int arm_gen_movmemqi (rtx *);
e32bac5b
RE
111extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
112extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx,
113 HOST_WIDE_INT);
114extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx);
115extern rtx arm_gen_return_addr_mask (void);
116extern void arm_reload_in_hi (rtx *);
117extern void arm_reload_out_hi (rtx *);
2075b05d 118extern int arm_const_double_inline_cost (rtx);
b4a58f80 119extern bool arm_const_double_by_parts (rtx);
e32bac5b 120extern const char *fp_immediate_constant (rtx);
9403b7f7 121extern void arm_emit_call_insn (rtx, rtx);
e32bac5b
RE
122extern const char *output_call (rtx *);
123extern const char *output_call_mem (rtx *);
571191af 124void arm_emit_movpair (rtx, rtx);
e32bac5b
RE
125extern const char *output_mov_long_double_fpa_from_arm (rtx *);
126extern const char *output_mov_long_double_arm_from_fpa (rtx *);
127extern const char *output_mov_long_double_arm_from_arm (rtx *);
128extern const char *output_mov_double_fpa_from_arm (rtx *);
129extern const char *output_mov_double_arm_from_fpa (rtx *);
130extern const char *output_move_double (rtx *);
88f77cba 131extern const char *output_move_quad (rtx *);
5b3e6663 132extern const char *output_move_vfp (rtx *operands);
88f77cba 133extern const char *output_move_neon (rtx *operands);
e32bac5b
RE
134extern const char *output_add_immediate (rtx *);
135extern const char *arithmetic_instr (rtx, int);
136extern void output_ascii_pseudo_op (FILE *, const unsigned char *, int);
137extern const char *output_return_instruction (rtx, int, int);
138extern void arm_poke_function_name (FILE *, const char *);
e32bac5b 139extern void arm_final_prescan_insn (rtx);
e32bac5b 140extern int arm_debugger_arg_offset (int, rtx);
25a65198 141extern bool arm_is_long_call_p (tree);
5a9335ef 142extern int arm_emit_vector_const (FILE *, rtx);
0fd8c3ad 143extern void arm_emit_fp16_const (rtx c);
5a9335ef 144extern const char * arm_output_load_gr (rtx *);
8edfc4cc 145extern const char *vfp_output_fstmd (rtx *);
c9ca9b88 146extern void arm_set_return_address (rtx, rtx);
6555b6bd 147extern int arm_eliminable_register (rtx);
5b3e6663 148extern const char *arm_output_shift(rtx *, int);
d5b7b3ae 149
d3585b76
DJ
150extern bool arm_output_addr_const_extra (FILE *, rtx);
151
d5b7b3ae 152#if defined TREE_CODE
e32bac5b 153extern rtx arm_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
390b17c2
RE
154extern void arm_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
155 tree, bool);
e32bac5b 156extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
586de218 157extern bool arm_pad_arg_upward (enum machine_mode, const_tree);
866af8a9 158extern bool arm_pad_reg_upward (enum machine_mode, tree, int);
5848830f 159extern bool arm_needs_doubleword_align (enum machine_mode, tree);
d5b7b3ae 160#endif
9f7bf991 161extern int arm_apply_result_size (void);
390b17c2 162extern rtx aapcs_libcall_value (enum machine_mode);
d5b7b3ae 163
eb3921e8
NC
164#endif /* RTX_CODE */
165
e32bac5b 166extern int arm_float_words_big_endian (void);
3717da94 167
d5b7b3ae 168/* Thumb functions. */
e32bac5b 169extern void arm_init_expanders (void);
e32bac5b 170extern const char *thumb_unexpanded_epilogue (void);
5b3e6663
PB
171extern void thumb1_expand_prologue (void);
172extern void thumb1_expand_epilogue (void);
d5b7b3ae 173#ifdef TREE_CODE
e32bac5b 174extern int is_called_in_ARM_mode (tree);
d5b7b3ae 175#endif
e32bac5b 176extern int thumb_shiftable_const (unsigned HOST_WIDE_INT);
cd2b33d0 177#ifdef RTX_CODE
5b3e6663
PB
178extern void thumb1_final_prescan_insn (rtx);
179extern void thumb2_final_prescan_insn (rtx);
e32bac5b
RE
180extern const char *thumb_load_double_from_address (rtx *);
181extern const char *thumb_output_move_mem_multiple (int, rtx *);
b12a00f1 182extern const char *thumb_call_via_reg (rtx);
70128ad9 183extern void thumb_expand_movmemqi (rtx *);
e32bac5b
RE
184extern rtx arm_return_addr (int, rtx);
185extern void thumb_reload_out_hi (rtx *);
186extern void thumb_reload_in_hi (rtx *);
c9ca9b88 187extern void thumb_set_return_address (rtx, rtx);
907dd0c7
RE
188extern const char *thumb1_output_casesi (rtx *);
189extern const char *thumb2_output_casesi (rtx *);
d5b7b3ae
RE
190#endif
191
192/* Defined in pe.c. */
e32bac5b
RE
193extern int arm_dllexport_name_p (const char *);
194extern int arm_dllimport_name_p (const char *);
d5b7b3ae
RE
195
196#ifdef TREE_CODE
e32bac5b
RE
197extern void arm_pe_unique_section (tree, int);
198extern void arm_pe_encode_section_info (tree, rtx, int);
199extern int arm_dllexport_p (tree);
200extern int arm_dllimport_p (tree);
201extern void arm_mark_dllexport (tree);
202extern void arm_mark_dllimport (tree);
d5b7b3ae 203#endif
8b97c5f8 204
e32bac5b
RE
205extern void arm_pr_long_calls (struct cpp_reader *);
206extern void arm_pr_no_long_calls (struct cpp_reader *);
207extern void arm_pr_long_calls_off (struct cpp_reader *);
8b97c5f8 208
b76c3c4b
PB
209extern void arm_lang_object_attributes_init(void);
210
3101faab 211extern const char *arm_mangle_type (const_tree);
608063c3 212
795dc4fc
PB
213extern void arm_order_regs_for_local_alloc (void);
214
1b78f575
RE
215#ifdef RTX_CODE
216/* This needs to be here because we need RTX_CODE and similar. */
217
218struct tune_params
219{
220 bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
221 int constant_limit;
222};
223
224extern const struct tune_params *current_tune;
225#endif /* RTX_CODE */
226
88657302 227#endif /* ! GCC_ARM_PROTOS_H */