i386-protos.h revision 132718
1132718Skan/* Definitions of target machine for GCC for IA-32.
290075Sobrien   Copyright (C) 1988, 1992, 1994, 1995, 1996, 1996, 1997, 1998, 1999,
3132718Skan   2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
490075Sobrien
5132718SkanThis file is part of GCC.
690075Sobrien
7132718SkanGCC is free software; you can redistribute it and/or modify
890075Sobrienit under the terms of the GNU General Public License as published by
990075Sobrienthe Free Software Foundation; either version 2, or (at your option)
1090075Sobrienany later version.
1190075Sobrien
12132718SkanGCC is distributed in the hope that it will be useful,
1390075Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1490075SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1590075SobrienGNU General Public License for more details.
1690075Sobrien
1790075SobrienYou should have received a copy of the GNU General Public License
18132718Skanalong with GCC; see the file COPYING.  If not, write to
1990075Sobrienthe Free Software Foundation, 59 Temple Place - Suite 330,
2090075SobrienBoston, MA 02111-1307, USA.  */
2190075Sobrien
2290075Sobrien/* Functions in i386.c */
23132718Skanextern void override_options (void);
24132718Skanextern void optimization_options (int, int);
2590075Sobrien
26132718Skanextern int ix86_can_use_return_insn_p (void);
27132718Skanextern int ix86_frame_pointer_required (void);
28132718Skanextern void ix86_setup_frame_addresses (void);
2990075Sobrien
30132718Skanextern void ix86_file_end (void);
31132718Skanextern HOST_WIDE_INT ix86_initial_elimination_offset (int, int);
32132718Skanextern void ix86_expand_prologue (void);
33132718Skanextern void ix86_expand_epilogue (int);
3490075Sobrien
35132718Skanextern void ix86_output_addr_vec_elt (FILE *, int);
36132718Skanextern void ix86_output_addr_diff_elt (FILE *, int, int);
3790075Sobrien
3890075Sobrien#ifdef RTX_CODE
39132718Skanextern int ix86_aligned_p (rtx);
4090075Sobrien
41132718Skanextern int standard_80387_constant_p (rtx);
42132718Skanextern const char *standard_80387_constant_opcode (rtx);
43132718Skanextern rtx standard_80387_constant_rtx (int);
44132718Skanextern int standard_sse_constant_p (rtx);
45132718Skanextern int symbolic_reference_mentioned_p (rtx);
46132718Skanextern bool extended_reg_mentioned_p (rtx);
47132718Skanextern bool x86_extended_QIreg_mentioned_p (rtx);
48132718Skanextern bool x86_extended_reg_mentioned_p (rtx);
4990075Sobrien
50132718Skanextern int any_fp_register_operand (rtx, enum machine_mode);
51132718Skanextern int register_and_not_any_fp_reg_operand (rtx, enum machine_mode);
52117395Skan
53132718Skanextern int fp_register_operand (rtx, enum machine_mode);
54132718Skanextern int register_and_not_fp_reg_operand (rtx, enum machine_mode);
55117395Skan
56132718Skanextern int x86_64_general_operand (rtx, enum machine_mode);
57132718Skanextern int x86_64_szext_general_operand (rtx, enum machine_mode);
58132718Skanextern int x86_64_nonmemory_operand (rtx, enum machine_mode);
59132718Skanextern int x86_64_szext_nonmemory_operand (rtx, enum machine_mode);
60132718Skanextern int x86_64_immediate_operand (rtx, enum machine_mode);
61132718Skanextern int x86_64_zext_immediate_operand (rtx, enum machine_mode);
62132718Skanextern int symbolic_operand (rtx, enum machine_mode);
63132718Skanextern int tls_symbolic_operand (rtx, enum machine_mode);
64132718Skanextern int global_dynamic_symbolic_operand (rtx, enum machine_mode);
65132718Skanextern int local_dynamic_symbolic_operand (rtx, enum machine_mode);
66132718Skanextern int initial_exec_symbolic_operand (rtx, enum machine_mode);
67132718Skanextern int local_exec_symbolic_operand (rtx, enum machine_mode);
68132718Skanextern int pic_symbolic_operand (rtx, enum machine_mode);
69132718Skanextern int call_insn_operand (rtx, enum machine_mode);
70132718Skanextern int sibcall_insn_operand (rtx, enum machine_mode);
71132718Skanextern int constant_call_address_operand (rtx, enum machine_mode);
72132718Skanextern int const0_operand (rtx, enum machine_mode);
73132718Skanextern int const1_operand (rtx, enum machine_mode);
74132718Skanextern int const248_operand (rtx, enum machine_mode);
75132718Skanextern int incdec_operand (rtx, enum machine_mode);
76132718Skanextern int reg_no_sp_operand (rtx, enum machine_mode);
77132718Skanextern int mmx_reg_operand (rtx, enum machine_mode);
78132718Skanextern int general_no_elim_operand (rtx, enum machine_mode);
79132718Skanextern int nonmemory_no_elim_operand (rtx, enum machine_mode);
80132718Skanextern int q_regs_operand (rtx, enum machine_mode);
81132718Skanextern int non_q_regs_operand (rtx, enum machine_mode);
82132718Skanextern int sse_comparison_operator (rtx, enum machine_mode);
83132718Skanextern int fcmov_comparison_operator (rtx, enum machine_mode);
84132718Skanextern int cmp_fp_expander_operand (rtx, enum machine_mode);
85132718Skanextern int ix86_comparison_operator (rtx, enum machine_mode);
86132718Skanextern int ext_register_operand (rtx, enum machine_mode);
87132718Skanextern int binary_fp_operator (rtx, enum machine_mode);
88132718Skanextern int mult_operator (rtx, enum machine_mode);
89132718Skanextern int div_operator (rtx, enum machine_mode);
90132718Skanextern int arith_or_logical_operator (rtx, enum machine_mode);
91132718Skanextern int promotable_binary_operator (rtx, enum machine_mode);
92132718Skanextern int memory_displacement_operand (rtx, enum machine_mode);
93132718Skanextern int cmpsi_operand (rtx, enum machine_mode);
94132718Skanextern int long_memory_operand (rtx, enum machine_mode);
95132718Skanextern int aligned_operand (rtx, enum machine_mode);
96132718Skanextern enum machine_mode ix86_cc_mode (enum rtx_code, rtx, rtx);
9790075Sobrien
98132718Skanextern int ix86_expand_movstr (rtx, rtx, rtx, rtx);
99132718Skanextern int ix86_expand_clrstr (rtx, rtx, rtx);
100132718Skanextern int ix86_expand_strlen (rtx, rtx, rtx, rtx);
10190075Sobrien
102132718Skanextern bool legitimate_constant_p (rtx);
103132718Skanextern bool constant_address_p (rtx);
104132718Skanextern bool legitimate_pic_operand_p (rtx);
105132718Skanextern int legitimate_pic_address_disp_p (rtx);
106132718Skanextern int legitimate_address_p (enum machine_mode, rtx, int);
107132718Skanextern rtx legitimize_pic_address (rtx, rtx);
108132718Skanextern rtx legitimize_address (rtx, rtx, enum machine_mode);
10990075Sobrien
110132718Skanextern void print_reg (rtx, int, FILE*);
111132718Skanextern void print_operand (FILE*, rtx, int);
112132718Skanextern void print_operand_address (FILE*, rtx);
113132718Skanextern bool output_addr_const_extra (FILE*, rtx);
11490075Sobrien
115132718Skanextern void split_di (rtx[], int, rtx[], rtx[]);
116132718Skanextern void split_ti (rtx[], int, rtx[], rtx[]);
11790075Sobrien
118132718Skanextern const char *output_set_got (rtx);
119132718Skanextern const char *output_387_binary_op (rtx, rtx*);
120132718Skanextern const char *output_fix_trunc (rtx, rtx*);
121132718Skanextern const char *output_fp_compare (rtx, rtx*, int, int);
12290075Sobrien
123132718Skanextern void i386_dwarf_output_addr_const (FILE*, rtx);
124132718Skanextern void i386_output_dwarf_dtprel (FILE*, int, rtx);
12590075Sobrien
126132718Skanextern void ix86_expand_clear (rtx);
127132718Skanextern void ix86_expand_move (enum machine_mode, rtx[]);
128132718Skanextern void ix86_expand_vector_move (enum machine_mode, rtx[]);
129132718Skanextern void ix86_expand_binary_operator (enum rtx_code,
130132718Skan					 enum machine_mode, rtx[]);
131132718Skanextern int ix86_binary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
132132718Skanextern void ix86_expand_unary_operator (enum rtx_code, enum machine_mode,
133132718Skan					rtx[]);
134132718Skanextern int ix86_unary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
135132718Skanextern int ix86_match_ccmode (rtx, enum machine_mode);
136132718Skanextern rtx ix86_expand_compare (enum rtx_code, rtx *, rtx *);
137132718Skanextern int ix86_use_fcomi_compare (enum rtx_code);
138132718Skanextern void ix86_expand_branch (enum rtx_code, rtx);
139132718Skanextern int ix86_expand_setcc (enum rtx_code, rtx);
140132718Skanextern int ix86_expand_int_movcc (rtx[]);
141132718Skanextern int ix86_expand_fp_movcc (rtx[]);
142132718Skanextern int ix86_expand_int_addcc (rtx[]);
143132718Skanextern void ix86_expand_call (rtx, rtx, rtx, rtx, rtx, int);
144132718Skanextern void x86_initialize_trampoline (rtx, rtx, rtx);
145132718Skanextern rtx ix86_zero_extend_to_Pmode (rtx);
146132718Skanextern void ix86_split_long_move (rtx[]);
147132718Skanextern void ix86_split_ashldi (rtx *, rtx);
148132718Skanextern void ix86_split_ashrdi (rtx *, rtx);
149132718Skanextern void ix86_split_lshrdi (rtx *, rtx);
150132718Skanextern rtx ix86_find_base_term (rtx);
151132718Skanextern int ix86_check_movabs (rtx, int);
15290075Sobrien
153132718Skanextern rtx assign_386_stack_local (enum machine_mode, int);
154132718Skanextern int ix86_attr_length_immediate_default (rtx, int);
155132718Skanextern int ix86_attr_length_address_default (rtx);
15690075Sobrien
157132718Skanextern enum machine_mode ix86_fp_compare_mode (enum rtx_code);
15890075Sobrien
159132718Skanextern int x86_64_sign_extended_value (rtx);
160132718Skanextern int x86_64_zero_extended_value (rtx);
161132718Skanextern rtx ix86_libcall_value (enum machine_mode);
162132718Skanextern bool ix86_function_value_regno_p (int);
163132718Skanextern bool ix86_function_arg_regno_p (int);
164132718Skanextern int ix86_function_arg_boundary (enum machine_mode, tree);
165132718Skanextern int ix86_return_in_memory (tree);
166132718Skanextern void ix86_va_start (tree, rtx);
167132718Skanextern rtx ix86_va_arg (tree, tree);
168132718Skanextern void ix86_setup_incoming_varargs (CUMULATIVE_ARGS *,
169132718Skan					 enum machine_mode, tree, int *, int);
17090075Sobrien
171132718Skanextern rtx ix86_force_to_memory (enum machine_mode, rtx);
172132718Skanextern void ix86_free_from_memory (enum machine_mode);
173132718Skanextern void ix86_split_fp_branch (enum rtx_code code, rtx, rtx, rtx, rtx, rtx);
174132718Skanextern int ix86_hard_regno_mode_ok (int, enum machine_mode);
175132718Skanextern int ix86_register_move_cost (enum machine_mode, enum reg_class,
176132718Skan				    enum reg_class);
177132718Skanextern int ix86_secondary_memory_needed (enum reg_class, enum reg_class,
178132718Skan					 enum machine_mode, int);
179132718Skanextern enum reg_class ix86_preferred_reload_class (rtx, enum reg_class);
180132718Skanextern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
181132718Skanextern void emit_i387_cw_initialization (rtx, rtx);
182132718Skanextern bool ix86_fp_jump_nontrivial_p (enum rtx_code);
183132718Skanextern void x86_order_regs_for_local_alloc (void);
184132718Skanextern void x86_function_profiler (FILE *, int);
185132718Skanextern void x86_emit_floatuns (rtx [2]);
18690075Sobrien
18790075Sobrien
18890075Sobrien#ifdef TREE_CODE
189132718Skanextern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
190132718Skanextern rtx function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
191132718Skanextern int function_arg_pass_by_reference (CUMULATIVE_ARGS *,
192132718Skan					   enum machine_mode, tree, int);
193132718Skanextern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
194132718Skan				  tree, int);
195132718Skanextern rtx ix86_function_value (tree);
196132718Skanextern void ix86_init_builtins (void);
197132718Skanextern rtx ix86_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
19890075Sobrien#endif
19990075Sobrien
20090075Sobrien#endif
20190075Sobrien
20290075Sobrien#ifdef TREE_CODE
203132718Skanextern int ix86_return_pops_args (tree, tree, int);
20490075Sobrien
205132718Skanextern int ix86_data_alignment (tree, int);
206132718Skanextern int ix86_local_alignment (tree, int);
207132718Skanextern int ix86_constant_alignment (tree, int);
208132718Skanextern tree ix86_handle_dll_attribute (tree *, tree, tree, int, bool *);
209132718Skanextern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *);
21090075Sobrien
211132718Skanextern unsigned int i386_pe_section_type_flags (tree, const char *, int);
212132718Skanextern void i386_pe_asm_named_section (const char *, unsigned int);
213132718Skanextern int x86_field_alignment (tree, int);
21490075Sobrien#endif
215117395Skan
216132718Skanextern rtx ix86_tls_get_addr (void);
217132718Skanextern bool ix86_must_pass_in_stack (enum machine_mode mode, tree);
218117395Skan
219132718Skanextern void ix86_expand_vector_init (rtx, rtx);
220117395Skan/* In winnt.c  */
221132718Skanextern int i386_pe_dllexport_name_p (const char *);
222132718Skanextern int i386_pe_dllimport_name_p (const char *);
223132718Skanextern void i386_pe_unique_section (tree, int);
224132718Skanextern void i386_pe_declare_function_type (FILE *, const char *, int);
225132718Skanextern void i386_pe_record_external_function (const char *);
226132718Skanextern void i386_pe_record_exported_symbol (const char *, int);
227132718Skanextern void i386_pe_asm_file_end (FILE *);
228132718Skanextern void i386_pe_encode_section_info (tree, rtx, int);
229132718Skanextern const char *i386_pe_strip_name_encoding (const char *);
230132718Skanextern const char *i386_pe_strip_name_encoding_full (const char *);
231132718Skanextern void i386_pe_output_labelref (FILE *, const char *);
232