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