1132718Skan/* Definitions of target machine for GCC for IA-32.
290075Sobrien   Copyright (C) 1988, 1992, 1994, 1995, 1996, 1996, 1997, 1998, 1999,
3169689Skan   2000, 2001, 2002, 2003, 2004, 2005, 2006
4169689Skan   Free Software Foundation, Inc.
590075Sobrien
6132718SkanThis file is part of GCC.
790075Sobrien
8132718SkanGCC is free software; you can redistribute it and/or modify
990075Sobrienit under the terms of the GNU General Public License as published by
1090075Sobrienthe Free Software Foundation; either version 2, or (at your option)
1190075Sobrienany later version.
1290075Sobrien
13132718SkanGCC is distributed in the hope that it will be useful,
1490075Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1590075SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1690075SobrienGNU General Public License for more details.
1790075Sobrien
1890075SobrienYou should have received a copy of the GNU General Public License
19132718Skanalong with GCC; see the file COPYING.  If not, write to
20169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
21169689SkanBoston, MA 02110-1301, USA.  */
2290075Sobrien
2390075Sobrien/* Functions in i386.c */
24132718Skanextern void override_options (void);
25132718Skanextern void optimization_options (int, int);
2690075Sobrien
27132718Skanextern int ix86_can_use_return_insn_p (void);
28132718Skanextern int ix86_frame_pointer_required (void);
29132718Skanextern void ix86_setup_frame_addresses (void);
3090075Sobrien
31132718Skanextern void ix86_file_end (void);
32132718Skanextern HOST_WIDE_INT ix86_initial_elimination_offset (int, int);
33132718Skanextern void ix86_expand_prologue (void);
34132718Skanextern void ix86_expand_epilogue (int);
3590075Sobrien
36132718Skanextern void ix86_output_addr_vec_elt (FILE *, int);
37132718Skanextern void ix86_output_addr_diff_elt (FILE *, int, int);
3890075Sobrien
3990075Sobrien#ifdef RTX_CODE
40132718Skanextern int ix86_aligned_p (rtx);
4190075Sobrien
42132718Skanextern int standard_80387_constant_p (rtx);
43132718Skanextern const char *standard_80387_constant_opcode (rtx);
44132718Skanextern rtx standard_80387_constant_rtx (int);
45132718Skanextern int standard_sse_constant_p (rtx);
46169689Skanextern const char *standard_sse_constant_opcode (rtx, rtx);
47132718Skanextern int symbolic_reference_mentioned_p (rtx);
48132718Skanextern bool extended_reg_mentioned_p (rtx);
49132718Skanextern bool x86_extended_QIreg_mentioned_p (rtx);
50132718Skanextern bool x86_extended_reg_mentioned_p (rtx);
51132718Skanextern enum machine_mode ix86_cc_mode (enum rtx_code, rtx, rtx);
5290075Sobrien
53169689Skanextern int ix86_expand_movmem (rtx, rtx, rtx, rtx);
54169689Skanextern int ix86_expand_clrmem (rtx, rtx, rtx);
55132718Skanextern int ix86_expand_strlen (rtx, rtx, rtx, rtx);
5690075Sobrien
57132718Skanextern bool legitimate_constant_p (rtx);
58132718Skanextern bool constant_address_p (rtx);
59132718Skanextern bool legitimate_pic_operand_p (rtx);
60132718Skanextern int legitimate_pic_address_disp_p (rtx);
61132718Skanextern int legitimate_address_p (enum machine_mode, rtx, int);
62132718Skanextern rtx legitimize_address (rtx, rtx, enum machine_mode);
6390075Sobrien
64132718Skanextern void print_reg (rtx, int, FILE*);
65132718Skanextern void print_operand (FILE*, rtx, int);
66132718Skanextern void print_operand_address (FILE*, rtx);
67132718Skanextern bool output_addr_const_extra (FILE*, rtx);
6890075Sobrien
69132718Skanextern void split_di (rtx[], int, rtx[], rtx[]);
70132718Skanextern void split_ti (rtx[], int, rtx[], rtx[]);
7190075Sobrien
72169689Skanextern const char *output_set_got (rtx, rtx);
73132718Skanextern const char *output_387_binary_op (rtx, rtx*);
74169689Skanextern const char *output_387_reg_move (rtx, rtx*);
75169689Skanextern const char *output_fix_trunc (rtx, rtx*, int);
76132718Skanextern const char *output_fp_compare (rtx, rtx*, int, int);
7790075Sobrien
78132718Skanextern void ix86_expand_clear (rtx);
79132718Skanextern void ix86_expand_move (enum machine_mode, rtx[]);
80132718Skanextern void ix86_expand_vector_move (enum machine_mode, rtx[]);
81169689Skanextern void ix86_expand_vector_move_misalign (enum machine_mode, rtx[]);
82169689Skanextern void ix86_expand_push (enum machine_mode, rtx);
83169689Skanextern rtx ix86_fixup_binary_operands (enum rtx_code,
84169689Skan				       enum machine_mode, rtx[]);
85169689Skanextern void ix86_fixup_binary_operands_no_copy (enum rtx_code,
86169689Skan						enum machine_mode, rtx[]);
87132718Skanextern void ix86_expand_binary_operator (enum rtx_code,
88132718Skan					 enum machine_mode, rtx[]);
89132718Skanextern int ix86_binary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
90132718Skanextern void ix86_expand_unary_operator (enum rtx_code, enum machine_mode,
91132718Skan					rtx[]);
92169689Skanextern rtx ix86_build_signbit_mask (enum machine_mode, bool, bool);
93169689Skanextern void ix86_expand_fp_absneg_operator (enum rtx_code, enum machine_mode,
94169689Skan					    rtx[]);
95169689Skanextern void ix86_expand_copysign (rtx []);
96169689Skanextern void ix86_split_copysign_const (rtx []);
97169689Skanextern void ix86_split_copysign_var (rtx []);
98132718Skanextern int ix86_unary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
99132718Skanextern int ix86_match_ccmode (rtx, enum machine_mode);
100132718Skanextern rtx ix86_expand_compare (enum rtx_code, rtx *, rtx *);
101132718Skanextern int ix86_use_fcomi_compare (enum rtx_code);
102132718Skanextern void ix86_expand_branch (enum rtx_code, rtx);
103132718Skanextern int ix86_expand_setcc (enum rtx_code, rtx);
104132718Skanextern int ix86_expand_int_movcc (rtx[]);
105132718Skanextern int ix86_expand_fp_movcc (rtx[]);
106169689Skanextern bool ix86_expand_fp_vcond (rtx[]);
107169689Skanextern bool ix86_expand_int_vcond (rtx[]);
108132718Skanextern int ix86_expand_int_addcc (rtx[]);
109132718Skanextern void ix86_expand_call (rtx, rtx, rtx, rtx, rtx, int);
110132718Skanextern void x86_initialize_trampoline (rtx, rtx, rtx);
111132718Skanextern rtx ix86_zero_extend_to_Pmode (rtx);
112132718Skanextern void ix86_split_long_move (rtx[]);
113169689Skanextern void ix86_split_ashl (rtx *, rtx, enum machine_mode);
114169689Skanextern void ix86_split_ashr (rtx *, rtx, enum machine_mode);
115169689Skanextern void ix86_split_lshr (rtx *, rtx, enum machine_mode);
116132718Skanextern rtx ix86_find_base_term (rtx);
117132718Skanextern int ix86_check_movabs (rtx, int);
11890075Sobrien
119169689Skanextern rtx assign_386_stack_local (enum machine_mode, enum ix86_stack_slot);
120132718Skanextern int ix86_attr_length_immediate_default (rtx, int);
121132718Skanextern int ix86_attr_length_address_default (rtx);
12290075Sobrien
123132718Skanextern enum machine_mode ix86_fp_compare_mode (enum rtx_code);
12490075Sobrien
125132718Skanextern rtx ix86_libcall_value (enum machine_mode);
126132718Skanextern bool ix86_function_value_regno_p (int);
127132718Skanextern bool ix86_function_arg_regno_p (int);
128132718Skanextern int ix86_function_arg_boundary (enum machine_mode, tree);
129132718Skanextern int ix86_return_in_memory (tree);
130132718Skanextern void ix86_va_start (tree, rtx);
131132718Skanextern rtx ix86_va_arg (tree, tree);
13290075Sobrien
133132718Skanextern rtx ix86_force_to_memory (enum machine_mode, rtx);
134132718Skanextern void ix86_free_from_memory (enum machine_mode);
135169689Skanextern void ix86_split_fp_branch (enum rtx_code code, rtx, rtx,
136169689Skan				  rtx, rtx, rtx, rtx);
137169689Skanextern bool ix86_hard_regno_mode_ok (int, enum machine_mode);
138169689Skanextern bool ix86_modes_tieable_p (enum machine_mode, enum machine_mode);
139132718Skanextern int ix86_register_move_cost (enum machine_mode, enum reg_class,
140132718Skan				    enum reg_class);
141132718Skanextern int ix86_secondary_memory_needed (enum reg_class, enum reg_class,
142132718Skan					 enum machine_mode, int);
143169689Skanextern bool ix86_cannot_change_mode_class (enum machine_mode,
144169689Skan					   enum machine_mode, enum reg_class);
145132718Skanextern enum reg_class ix86_preferred_reload_class (rtx, enum reg_class);
146169689Skanextern enum reg_class ix86_preferred_output_reload_class (rtx, enum reg_class);
147132718Skanextern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
148169689Skanextern int ix86_mode_needed (int, rtx);
149169689Skanextern void emit_i387_cw_initialization (int);
150132718Skanextern bool ix86_fp_jump_nontrivial_p (enum rtx_code);
151132718Skanextern void x86_order_regs_for_local_alloc (void);
152132718Skanextern void x86_function_profiler (FILE *, int);
153132718Skanextern void x86_emit_floatuns (rtx [2]);
154169689Skanextern void ix86_emit_fp_unordered_jump (rtx);
15590075Sobrien
156169689Skanextern void ix86_emit_i387_log1p (rtx, rtx);
15790075Sobrien
158169689Skanextern enum rtx_code ix86_reverse_condition (enum rtx_code, enum machine_mode);
159169689Skan
16090075Sobrien#ifdef TREE_CODE
161132718Skanextern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
162132718Skanextern rtx function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
163132718Skanextern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
164132718Skan				  tree, int);
165169689Skanextern rtx ix86_function_value (tree, tree, bool);
16690075Sobrien#endif
16790075Sobrien
16890075Sobrien#endif
16990075Sobrien
17090075Sobrien#ifdef TREE_CODE
171132718Skanextern int ix86_return_pops_args (tree, tree, int);
17290075Sobrien
173132718Skanextern int ix86_data_alignment (tree, int);
174132718Skanextern int ix86_local_alignment (tree, int);
175132718Skanextern int ix86_constant_alignment (tree, int);
176132718Skanextern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *);
177169689Skanextern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *);
17890075Sobrien
179132718Skanextern unsigned int i386_pe_section_type_flags (tree, const char *, int);
180169689Skanextern void i386_pe_asm_named_section (const char *, unsigned int, tree);
181132718Skanextern int x86_field_alignment (tree, int);
18290075Sobrien#endif
183117395Skan
184132718Skanextern rtx ix86_tls_get_addr (void);
185169689Skanextern rtx ix86_tls_module_base (void);
186117395Skan
187169689Skanextern void ix86_expand_vector_init (bool, rtx, rtx);
188169689Skanextern void ix86_expand_vector_set (bool, rtx, rtx, int);
189169689Skanextern void ix86_expand_vector_extract (bool, rtx, rtx, int);
190169689Skanextern void ix86_expand_reduc_v4sf (rtx (*)(rtx, rtx, rtx), rtx, rtx);
191169689Skan
192117395Skan/* In winnt.c  */
193132718Skanextern int i386_pe_dllexport_name_p (const char *);
194132718Skanextern int i386_pe_dllimport_name_p (const char *);
195132718Skanextern void i386_pe_unique_section (tree, int);
196132718Skanextern void i386_pe_declare_function_type (FILE *, const char *, int);
197169689Skanextern void i386_pe_record_external_function (tree, const char *);
198132718Skanextern void i386_pe_record_exported_symbol (const char *, int);
199132718Skanextern void i386_pe_asm_file_end (FILE *);
200132718Skanextern void i386_pe_encode_section_info (tree, rtx, int);
201132718Skanextern const char *i386_pe_strip_name_encoding (const char *);
202132718Skanextern const char *i386_pe_strip_name_encoding_full (const char *);
203132718Skanextern void i386_pe_output_labelref (FILE *, const char *);
204169689Skanextern bool i386_pe_valid_dllimport_attribute_p (tree);
205169689Skan
206169689Skan/* In winnt-cxx.c and winnt-stubs.c  */
207169689Skanextern void i386_pe_adjust_class_at_definition (tree);
208169689Skanextern bool i386_pe_type_dllimport_p (tree);
209169689Skanextern bool i386_pe_type_dllexport_p (tree);
210169689Skan
211169689Skanextern rtx maybe_get_pool_constant (rtx);
212169689Skan
213169689Skanextern char internal_label_prefix[16];
214169689Skanextern int internal_label_prefix_len;
215169689Skan
216169689Skanenum ix86_address_seg { SEG_DEFAULT, SEG_FS, SEG_GS };
217169689Skanstruct ix86_address
218169689Skan{
219169689Skan  rtx base, index, disp;
220169689Skan  HOST_WIDE_INT scale;
221169689Skan  enum ix86_address_seg seg;
222169689Skan};
223169689Skan
224169689Skanextern int ix86_decompose_address (rtx, struct ix86_address *);
225169689Skanextern int memory_address_length (rtx addr);
226169689Skanextern void x86_output_aligned_bss (FILE *, tree, const char *,
227169689Skan				    unsigned HOST_WIDE_INT, int);
228169689Skanextern void x86_elf_aligned_common (FILE *, const char *,
229169689Skan				    unsigned HOST_WIDE_INT, int);
230169689Skan
231169689Skan#ifdef RTX_CODE
232169689Skanextern void ix86_fp_comparison_codes (enum rtx_code code, enum rtx_code *,
233169689Skan				      enum rtx_code *, enum rtx_code *);
234169689Skanextern enum rtx_code ix86_fp_compare_code_to_integer (enum rtx_code);
235169689Skan#endif
236169689Skanextern int asm_preferred_eh_data_format (int, int);
237