i386-protos.h revision 132718
1169695Skan/* Definitions of target machine for GCC for IA-32.
2169695Skan   Copyright (C) 1988, 1992, 1994, 1995, 1996, 1996, 1997, 1998, 1999,
3169695Skan   2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4169695Skan
5169695SkanThis file is part of GCC.
6169695Skan
7169695SkanGCC is free software; you can redistribute it and/or modify
8169695Skanit under the terms of the GNU General Public License as published by
9169695Skanthe Free Software Foundation; either version 2, or (at your option)
10169695Skanany later version.
11169695Skan
12169695SkanGCC is distributed in the hope that it will be useful,
13169695Skanbut WITHOUT ANY WARRANTY; without even the implied warranty of
14169695SkanMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15169695SkanGNU General Public License for more details.
16169695Skan
17169695SkanYou should have received a copy of the GNU General Public License
18169695Skanalong with GCC; see the file COPYING.  If not, write to
19169695Skanthe Free Software Foundation, 59 Temple Place - Suite 330,
20169695SkanBoston, MA 02111-1307, USA.  */
21169695Skan
22169695Skan/* Functions in i386.c */
23169695Skanextern void override_options (void);
24169695Skanextern void optimization_options (int, int);
25169695Skan
26169695Skanextern int ix86_can_use_return_insn_p (void);
27169695Skanextern int ix86_frame_pointer_required (void);
28169695Skanextern void ix86_setup_frame_addresses (void);
29169695Skan
30169695Skanextern void ix86_file_end (void);
31169695Skanextern HOST_WIDE_INT ix86_initial_elimination_offset (int, int);
32169695Skanextern void ix86_expand_prologue (void);
33169695Skanextern void ix86_expand_epilogue (int);
34169695Skan
35169695Skanextern void ix86_output_addr_vec_elt (FILE *, int);
36169695Skanextern void ix86_output_addr_diff_elt (FILE *, int, int);
37169695Skan
38169695Skan#ifdef RTX_CODE
39169695Skanextern int ix86_aligned_p (rtx);
40169695Skan
41169695Skanextern int standard_80387_constant_p (rtx);
42169695Skanextern const char *standard_80387_constant_opcode (rtx);
43169695Skanextern rtx standard_80387_constant_rtx (int);
44169695Skanextern int standard_sse_constant_p (rtx);
45169695Skanextern int symbolic_reference_mentioned_p (rtx);
46169695Skanextern bool extended_reg_mentioned_p (rtx);
47169695Skanextern bool x86_extended_QIreg_mentioned_p (rtx);
48169695Skanextern bool x86_extended_reg_mentioned_p (rtx);
49169695Skan
50169695Skanextern int any_fp_register_operand (rtx, enum machine_mode);
51169695Skanextern int register_and_not_any_fp_reg_operand (rtx, enum machine_mode);
52169695Skan
53169695Skanextern int fp_register_operand (rtx, enum machine_mode);
54169695Skanextern int register_and_not_fp_reg_operand (rtx, enum machine_mode);
55169695Skan
56169695Skanextern int x86_64_general_operand (rtx, enum machine_mode);
57169695Skanextern int x86_64_szext_general_operand (rtx, enum machine_mode);
58169695Skanextern int x86_64_nonmemory_operand (rtx, enum machine_mode);
59169695Skanextern int x86_64_szext_nonmemory_operand (rtx, enum machine_mode);
60169695Skanextern int x86_64_immediate_operand (rtx, enum machine_mode);
61169695Skanextern int x86_64_zext_immediate_operand (rtx, enum machine_mode);
62169695Skanextern int symbolic_operand (rtx, enum machine_mode);
63169695Skanextern int tls_symbolic_operand (rtx, enum machine_mode);
64169695Skanextern int global_dynamic_symbolic_operand (rtx, enum machine_mode);
65169695Skanextern int local_dynamic_symbolic_operand (rtx, enum machine_mode);
66169695Skanextern int initial_exec_symbolic_operand (rtx, enum machine_mode);
67169695Skanextern int local_exec_symbolic_operand (rtx, enum machine_mode);
68169695Skanextern int pic_symbolic_operand (rtx, enum machine_mode);
69169695Skanextern int call_insn_operand (rtx, enum machine_mode);
70169695Skanextern int sibcall_insn_operand (rtx, enum machine_mode);
71169695Skanextern int constant_call_address_operand (rtx, enum machine_mode);
72169695Skanextern int const0_operand (rtx, enum machine_mode);
73169695Skanextern int const1_operand (rtx, enum machine_mode);
74169695Skanextern int const248_operand (rtx, enum machine_mode);
75169695Skanextern int incdec_operand (rtx, enum machine_mode);
76169695Skanextern int reg_no_sp_operand (rtx, enum machine_mode);
77169695Skanextern int mmx_reg_operand (rtx, enum machine_mode);
78169695Skanextern int general_no_elim_operand (rtx, enum machine_mode);
79169695Skanextern int nonmemory_no_elim_operand (rtx, enum machine_mode);
80169695Skanextern int q_regs_operand (rtx, enum machine_mode);
81169695Skanextern int non_q_regs_operand (rtx, enum machine_mode);
82169695Skanextern int sse_comparison_operator (rtx, enum machine_mode);
83169695Skanextern int fcmov_comparison_operator (rtx, enum machine_mode);
84169695Skanextern int cmp_fp_expander_operand (rtx, enum machine_mode);
85169695Skanextern int ix86_comparison_operator (rtx, enum machine_mode);
86169695Skanextern int ext_register_operand (rtx, enum machine_mode);
87169695Skanextern int binary_fp_operator (rtx, enum machine_mode);
88169695Skanextern int mult_operator (rtx, enum machine_mode);
89169695Skanextern int div_operator (rtx, enum machine_mode);
90169695Skanextern int arith_or_logical_operator (rtx, enum machine_mode);
91169695Skanextern int promotable_binary_operator (rtx, enum machine_mode);
92169695Skanextern int memory_displacement_operand (rtx, enum machine_mode);
93169695Skanextern int cmpsi_operand (rtx, enum machine_mode);
94169695Skanextern int long_memory_operand (rtx, enum machine_mode);
95169695Skanextern int aligned_operand (rtx, enum machine_mode);
96169695Skanextern enum machine_mode ix86_cc_mode (enum rtx_code, rtx, rtx);
97169695Skan
98169695Skanextern int ix86_expand_movstr (rtx, rtx, rtx, rtx);
99169695Skanextern int ix86_expand_clrstr (rtx, rtx, rtx);
100169695Skanextern int ix86_expand_strlen (rtx, rtx, rtx, rtx);
101169695Skan
102169695Skanextern bool legitimate_constant_p (rtx);
103169695Skanextern bool constant_address_p (rtx);
104169695Skanextern bool legitimate_pic_operand_p (rtx);
105169695Skanextern int legitimate_pic_address_disp_p (rtx);
106169695Skanextern int legitimate_address_p (enum machine_mode, rtx, int);
107169695Skanextern rtx legitimize_pic_address (rtx, rtx);
108169695Skanextern rtx legitimize_address (rtx, rtx, enum machine_mode);
109169695Skan
110169695Skanextern void print_reg (rtx, int, FILE*);
111169695Skanextern void print_operand (FILE*, rtx, int);
112169695Skanextern void print_operand_address (FILE*, rtx);
113169695Skanextern bool output_addr_const_extra (FILE*, rtx);
114169695Skan
115169695Skanextern void split_di (rtx[], int, rtx[], rtx[]);
116169695Skanextern void split_ti (rtx[], int, rtx[], rtx[]);
117169695Skan
118169695Skanextern const char *output_set_got (rtx);
119169695Skanextern const char *output_387_binary_op (rtx, rtx*);
120169695Skanextern const char *output_fix_trunc (rtx, rtx*);
121169695Skanextern const char *output_fp_compare (rtx, rtx*, int, int);
122169695Skan
123169695Skanextern void i386_dwarf_output_addr_const (FILE*, rtx);
124169695Skanextern void i386_output_dwarf_dtprel (FILE*, int, rtx);
125169695Skan
126169695Skanextern void ix86_expand_clear (rtx);
127169695Skanextern void ix86_expand_move (enum machine_mode, rtx[]);
128169695Skanextern void ix86_expand_vector_move (enum machine_mode, rtx[]);
129169695Skanextern void ix86_expand_binary_operator (enum rtx_code,
130169695Skan					 enum machine_mode, rtx[]);
131169695Skanextern int ix86_binary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
132169695Skanextern void ix86_expand_unary_operator (enum rtx_code, enum machine_mode,
133169695Skan					rtx[]);
134169695Skanextern int ix86_unary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
135169695Skanextern int ix86_match_ccmode (rtx, enum machine_mode);
136169695Skanextern rtx ix86_expand_compare (enum rtx_code, rtx *, rtx *);
137169695Skanextern int ix86_use_fcomi_compare (enum rtx_code);
138169695Skanextern void ix86_expand_branch (enum rtx_code, rtx);
139169695Skanextern int ix86_expand_setcc (enum rtx_code, rtx);
140169695Skanextern int ix86_expand_int_movcc (rtx[]);
141169695Skanextern int ix86_expand_fp_movcc (rtx[]);
142169695Skanextern int ix86_expand_int_addcc (rtx[]);
143169695Skanextern void ix86_expand_call (rtx, rtx, rtx, rtx, rtx, int);
144169695Skanextern void x86_initialize_trampoline (rtx, rtx, rtx);
145169695Skanextern rtx ix86_zero_extend_to_Pmode (rtx);
146169695Skanextern void ix86_split_long_move (rtx[]);
147169695Skanextern void ix86_split_ashldi (rtx *, rtx);
148169695Skanextern void ix86_split_ashrdi (rtx *, rtx);
149169695Skanextern void ix86_split_lshrdi (rtx *, rtx);
150169695Skanextern rtx ix86_find_base_term (rtx);
151169695Skanextern int ix86_check_movabs (rtx, int);
152169695Skan
153169695Skanextern rtx assign_386_stack_local (enum machine_mode, int);
154169695Skanextern int ix86_attr_length_immediate_default (rtx, int);
155169695Skanextern int ix86_attr_length_address_default (rtx);
156169695Skan
157169695Skanextern enum machine_mode ix86_fp_compare_mode (enum rtx_code);
158169695Skan
159169695Skanextern int x86_64_sign_extended_value (rtx);
160169695Skanextern int x86_64_zero_extended_value (rtx);
161169695Skanextern rtx ix86_libcall_value (enum machine_mode);
162169695Skanextern bool ix86_function_value_regno_p (int);
163169695Skanextern bool ix86_function_arg_regno_p (int);
164169695Skanextern int ix86_function_arg_boundary (enum machine_mode, tree);
165169695Skanextern int ix86_return_in_memory (tree);
166169695Skanextern void ix86_va_start (tree, rtx);
167169695Skanextern rtx ix86_va_arg (tree, tree);
168169695Skanextern void ix86_setup_incoming_varargs (CUMULATIVE_ARGS *,
169169695Skan					 enum machine_mode, tree, int *, int);
170169695Skan
171169695Skanextern rtx ix86_force_to_memory (enum machine_mode, rtx);
172169695Skanextern void ix86_free_from_memory (enum machine_mode);
173169695Skanextern void ix86_split_fp_branch (enum rtx_code code, rtx, rtx, rtx, rtx, rtx);
174169695Skanextern int ix86_hard_regno_mode_ok (int, enum machine_mode);
175169695Skanextern int ix86_register_move_cost (enum machine_mode, enum reg_class,
176169695Skan				    enum reg_class);
177169695Skanextern int ix86_secondary_memory_needed (enum reg_class, enum reg_class,
178169695Skan					 enum machine_mode, int);
179169695Skanextern enum reg_class ix86_preferred_reload_class (rtx, enum reg_class);
180169695Skanextern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
181169695Skanextern void emit_i387_cw_initialization (rtx, rtx);
182169695Skanextern bool ix86_fp_jump_nontrivial_p (enum rtx_code);
183169695Skanextern void x86_order_regs_for_local_alloc (void);
184169695Skanextern void x86_function_profiler (FILE *, int);
185169695Skanextern void x86_emit_floatuns (rtx [2]);
186169695Skan
187169695Skan
188169695Skan#ifdef TREE_CODE
189169695Skanextern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
190169695Skanextern rtx function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
191169695Skanextern int function_arg_pass_by_reference (CUMULATIVE_ARGS *,
192169695Skan					   enum machine_mode, tree, int);
193169695Skanextern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
194169695Skan				  tree, int);
195169695Skanextern rtx ix86_function_value (tree);
196169695Skanextern void ix86_init_builtins (void);
197169695Skanextern rtx ix86_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
198169695Skan#endif
199169695Skan
200169695Skan#endif
201169695Skan
202169695Skan#ifdef TREE_CODE
203169695Skanextern int ix86_return_pops_args (tree, tree, int);
204169695Skan
205169695Skanextern int ix86_data_alignment (tree, int);
206169695Skanextern int ix86_local_alignment (tree, int);
207169695Skanextern int ix86_constant_alignment (tree, int);
208169695Skanextern tree ix86_handle_dll_attribute (tree *, tree, tree, int, bool *);
209169695Skanextern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *);
210169695Skan
211169695Skanextern unsigned int i386_pe_section_type_flags (tree, const char *, int);
212169695Skanextern void i386_pe_asm_named_section (const char *, unsigned int);
213169695Skanextern int x86_field_alignment (tree, int);
214169695Skan#endif
215169695Skan
216169695Skanextern rtx ix86_tls_get_addr (void);
217169695Skanextern bool ix86_must_pass_in_stack (enum machine_mode mode, tree);
218169695Skan
219169695Skanextern void ix86_expand_vector_init (rtx, rtx);
220169695Skan/* In winnt.c  */
221169695Skanextern int i386_pe_dllexport_name_p (const char *);
222169695Skanextern int i386_pe_dllimport_name_p (const char *);
223169695Skanextern void i386_pe_unique_section (tree, int);
224169695Skanextern void i386_pe_declare_function_type (FILE *, const char *, int);
225169695Skanextern void i386_pe_record_external_function (const char *);
226169695Skanextern void i386_pe_record_exported_symbol (const char *, int);
227169695Skanextern void i386_pe_asm_file_end (FILE *);
228169695Skanextern void i386_pe_encode_section_info (tree, rtx, int);
229169695Skanextern const char *i386_pe_strip_name_encoding (const char *);
230169695Skanextern const char *i386_pe_strip_name_encoding_full (const char *);
231169695Skanextern void i386_pe_output_labelref (FILE *, const char *);
232169695Skan