1169689Skan/* Prototypes of target machine for GNU compiler. MIPS version. 2169689Skan Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 3169689Skan 1999, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 4169689Skan Contributed by A. Lichnewsky (lich@inria.inria.fr). 5169689Skan Changed by Michael Meissner (meissner@osf.org). 6169689Skan 64 bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and 7169689Skan Brendan Eich (brendan@microunity.com). 8169689Skan 9169689SkanThis file is part of GCC. 10169689Skan 11169689SkanGCC is free software; you can redistribute it and/or modify 12169689Skanit under the terms of the GNU General Public License as published by 13169689Skanthe Free Software Foundation; either version 2, or (at your option) 14169689Skanany later version. 15169689Skan 16169689SkanGCC is distributed in the hope that it will be useful, 17169689Skanbut WITHOUT ANY WARRANTY; without even the implied warranty of 18169689SkanMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19169689SkanGNU General Public License for more details. 20169689Skan 21169689SkanYou should have received a copy of the GNU General Public License 22169689Skanalong with GCC; see the file COPYING. If not, write to 23169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor, 24169689SkanBoston, MA 02110-1301, USA. */ 25169689Skan 26169689Skan#ifndef GCC_MIPS_PROTOS_H 27169689Skan#define GCC_MIPS_PROTOS_H 28169689Skan 29169689Skan/* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address. 30169689Skan 31169689Skan SYMBOL_GENERAL 32169689Skan Used when none of the below apply. 33169689Skan 34169689Skan SYMBOL_SMALL_DATA 35169689Skan The symbol refers to something in a small data section. 36169689Skan 37169689Skan SYMBOL_CONSTANT_POOL 38169689Skan The symbol refers to something in the mips16 constant pool. 39169689Skan 40169689Skan SYMBOL_GOT_LOCAL 41169689Skan The symbol refers to local data that will be found using 42169689Skan the global offset table. 43169689Skan 44169689Skan SYMBOL_GOT_GLOBAL 45169689Skan Likewise non-local data. 46169689Skan 47169689Skan SYMBOL_GOTOFF_PAGE 48169689Skan An UNSPEC wrapper around a SYMBOL_GOT_LOCAL. It represents the 49169689Skan offset from _gp of a GOT page entry. 50169689Skan 51169689Skan SYMBOL_GOTOFF_GLOBAL 52169689Skan An UNSPEC wrapper around a SYMBOL_GOT_GLOBAL. It represents the 53169689Skan the offset from _gp of the symbol's GOT entry. 54169689Skan 55169689Skan SYMBOL_GOTOFF_CALL 56169689Skan Like SYMBOL_GOTOFF_GLOBAL, but used when calling a global function. 57169689Skan The GOT entry is allowed to point to a stub rather than to the 58169689Skan function itself. 59169689Skan 60169689Skan SYMBOL_GOTOFF_LOADGP 61169689Skan An UNSPEC wrapper around a function's address. It represents the 62169689Skan offset of _gp from the start of the function. 63169689Skan 64169689Skan SYMBOL_TLS 65169689Skan A thread-local symbol. 66169689Skan 67169689Skan SYMBOL_TLSGD 68169689Skan SYMBOL_TLSLDM 69169689Skan SYMBOL_DTPREL 70169689Skan SYMBOL_GOTTPREL 71169689Skan SYMBOL_TPREL 72169689Skan UNSPEC wrappers around SYMBOL_TLS, corresponding to the 73169689Skan thread-local storage relocation operators. 74169689Skan 75169689Skan SYMBOL_64_HIGH 76169689Skan For a 64-bit symbolic address X, this is the value of 77169689Skan (%highest(X) << 16) + %higher(X). 78169689Skan 79169689Skan SYMBOL_64_MID 80169689Skan For a 64-bit symbolic address X, this is the value of 81169689Skan (%higher(X) << 16) + %hi(X). 82169689Skan 83169689Skan SYMBOL_64_LOW 84169689Skan For a 64-bit symbolic address X, this is the value of 85169689Skan (%hi(X) << 16) + %lo(X). */ 86169689Skanenum mips_symbol_type { 87169689Skan SYMBOL_GENERAL, 88169689Skan SYMBOL_SMALL_DATA, 89169689Skan SYMBOL_CONSTANT_POOL, 90169689Skan SYMBOL_GOT_LOCAL, 91169689Skan SYMBOL_GOT_GLOBAL, 92169689Skan SYMBOL_GOTOFF_PAGE, 93169689Skan SYMBOL_GOTOFF_GLOBAL, 94169689Skan SYMBOL_GOTOFF_CALL, 95169689Skan SYMBOL_GOTOFF_LOADGP, 96169689Skan SYMBOL_TLS, 97169689Skan SYMBOL_TLSGD, 98169689Skan SYMBOL_TLSLDM, 99169689Skan SYMBOL_DTPREL, 100169689Skan SYMBOL_GOTTPREL, 101169689Skan SYMBOL_TPREL, 102169689Skan SYMBOL_64_HIGH, 103169689Skan SYMBOL_64_MID, 104169689Skan SYMBOL_64_LOW 105169689Skan}; 106169689Skan#define NUM_SYMBOL_TYPES (SYMBOL_64_LOW + 1) 107169689Skan 108169689Skan/* Identifiers a style of $gp initialization sequence. 109169689Skan 110169689Skan LOADGP_NONE 111169689Skan No initialization sequence is needed. 112169689Skan 113169689Skan LOADGP_OLDABI 114169689Skan The o32 and o64 PIC sequence (the kind traditionally generated 115169689Skan by .cpload). 116169689Skan 117169689Skan LOADGP_NEWABI 118169689Skan The n32 and n64 PIC sequence (the kind traditionally generated 119169689Skan by .cpsetup). 120169689Skan 121169689Skan LOADGP_ABSOLUTE 122169689Skan The GNU absolute sequence, as generated by loadgp_noshared. */ 123169689Skanenum mips_loadgp_style { 124169689Skan LOADGP_NONE, 125169689Skan LOADGP_OLDABI, 126169689Skan LOADGP_NEWABI, 127169689Skan LOADGP_ABSOLUTE 128169689Skan}; 129169689Skan 130169689Skanextern bool mips_symbolic_constant_p (rtx, enum mips_symbol_type *); 131169689Skanextern int mips_regno_mode_ok_for_base_p (int, enum machine_mode, int); 132169689Skanextern bool mips_stack_address_p (rtx, enum machine_mode); 133169689Skanextern int mips_address_insns (rtx, enum machine_mode); 134169689Skanextern int mips_const_insns (rtx); 135169689Skanextern int mips_fetch_insns (rtx); 136169689Skanextern int mips_idiv_insns (void); 137169689Skanextern int fp_register_operand (rtx, enum machine_mode); 138169689Skanextern int lo_operand (rtx, enum machine_mode); 139169689Skanextern bool mips_legitimate_address_p (enum machine_mode, rtx, int); 140169689Skanextern rtx mips_split_symbol (rtx, rtx); 141169689Skanextern rtx mips_unspec_address (rtx, enum mips_symbol_type); 142169689Skanextern bool mips_legitimize_address (rtx *, enum machine_mode); 143169689Skanextern void mips_move_integer (rtx, rtx, unsigned HOST_WIDE_INT); 144169689Skanextern bool mips_legitimize_move (enum machine_mode, rtx, rtx); 145169689Skan 146169689Skanextern int m16_uimm3_b (rtx, enum machine_mode); 147169689Skanextern int m16_simm4_1 (rtx, enum machine_mode); 148169689Skanextern int m16_nsimm4_1 (rtx, enum machine_mode); 149169689Skanextern int m16_simm5_1 (rtx, enum machine_mode); 150169689Skanextern int m16_nsimm5_1 (rtx, enum machine_mode); 151169689Skanextern int m16_uimm5_4 (rtx, enum machine_mode); 152169689Skanextern int m16_nuimm5_4 (rtx, enum machine_mode); 153169689Skanextern int m16_simm8_1 (rtx, enum machine_mode); 154169689Skanextern int m16_nsimm8_1 (rtx, enum machine_mode); 155169689Skanextern int m16_uimm8_1 (rtx, enum machine_mode); 156169689Skanextern int m16_nuimm8_1 (rtx, enum machine_mode); 157169689Skanextern int m16_uimm8_m1_1 (rtx, enum machine_mode); 158169689Skanextern int m16_uimm8_4 (rtx, enum machine_mode); 159169689Skanextern int m16_nuimm8_4 (rtx, enum machine_mode); 160169689Skanextern int m16_simm8_8 (rtx, enum machine_mode); 161169689Skanextern int m16_nsimm8_8 (rtx, enum machine_mode); 162169689Skan 163169689Skanextern rtx mips_subword (rtx, int); 164169689Skanextern bool mips_split_64bit_move_p (rtx, rtx); 165169689Skanextern void mips_split_64bit_move (rtx, rtx); 166169689Skanextern const char *mips_output_move (rtx, rtx); 167169689Skanextern void mips_restore_gp (void); 168169689Skan#ifdef RTX_CODE 169169689Skanextern bool mips_emit_scc (enum rtx_code, rtx); 170169689Skanextern void gen_conditional_branch (rtx *, enum rtx_code); 171169689Skanextern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx); 172169689Skan#endif 173169689Skanextern void gen_conditional_move (rtx *); 174169689Skanextern void mips_gen_conditional_trap (rtx *); 175169689Skanextern void mips_expand_call (rtx, rtx, rtx, rtx, int); 176169689Skanextern void mips_emit_fcc_reload (rtx, rtx, rtx); 177169689Skanextern void mips_set_return_address (rtx, rtx); 178169689Skanextern bool mips_expand_block_move (rtx, rtx, rtx); 179169689Skan 180169689Skanextern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx); 181169689Skanextern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, 182169689Skan tree, int); 183169689Skanextern struct rtx_def *function_arg (const CUMULATIVE_ARGS *, 184169689Skan enum machine_mode, tree, int); 185169689Skanextern int function_arg_boundary (enum machine_mode, tree); 186169689Skanextern bool mips_pad_arg_upward (enum machine_mode, tree); 187169689Skanextern bool mips_pad_reg_upward (enum machine_mode, tree); 188169689Skanextern void mips_va_start (tree, rtx); 189169689Skan 190169689Skanextern bool mips_expand_unaligned_load (rtx, rtx, unsigned int, int); 191169689Skanextern bool mips_expand_unaligned_store (rtx, rtx, unsigned int, int); 192169689Skanextern bool mips_mem_fits_mode_p (enum machine_mode mode, rtx x); 193169689Skanextern void override_options (void); 194169689Skanextern void mips_conditional_register_usage (void); 195169689Skanextern void mips_order_regs_for_local_alloc (void); 196169689Skanextern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT); 197169689Skan 198169689Skanextern void print_operand (FILE *, rtx, int); 199169689Skanextern void print_operand_address (FILE *, rtx); 200169689Skanextern int mips_output_external (FILE *, tree, const char *); 201169689Skanextern void mips_output_filename (FILE *, const char *); 202169689Skanextern void mips_output_ascii (FILE *, const char *, size_t, const char *); 203169689Skanextern void mips_output_aligned_bss (FILE *, tree, const char *, 204169689Skan unsigned HOST_WIDE_INT, int); 205169689Skanextern void mips_output_aligned_decl_common (FILE *, tree, const char *, 206169689Skan unsigned HOST_WIDE_INT, 207169689Skan unsigned int); 208169689Skanextern void mips_declare_common_object (FILE *, const char *, 209169689Skan const char *, unsigned HOST_WIDE_INT, 210169689Skan unsigned int, bool); 211169689Skanextern void mips_declare_object (FILE *, const char *, const char *, 212169689Skan const char *, ...) ATTRIBUTE_PRINTF_4; 213169689Skanextern void mips_declare_object_name (FILE *, const char *, tree); 214169689Skanextern void mips_finish_declare_object (FILE *, tree, int, int); 215169689Skan 216169689Skanextern bool mips_small_data_pattern_p (rtx); 217169689Skanextern rtx mips_rewrite_small_data (rtx); 218169689Skanextern HOST_WIDE_INT compute_frame_size (HOST_WIDE_INT); 219169689Skanextern HOST_WIDE_INT mips_initial_elimination_offset (int, int); 220169689Skanextern rtx mips_return_addr (int, rtx); 221169689Skanextern enum mips_loadgp_style mips_current_loadgp_style (void); 222169689Skanextern void mips_expand_prologue (void); 223169689Skanextern void mips_expand_epilogue (int); 224169689Skanextern int mips_can_use_return_insn (void); 225169689Skanextern struct rtx_def *mips_function_value (tree, tree, enum machine_mode); 226169689Skan 227169689Skanextern bool mips_cannot_change_mode_class (enum machine_mode, 228169689Skan enum machine_mode, enum reg_class); 229169689Skanextern bool mips_dangerous_for_la25_p (rtx); 230169689Skanextern enum reg_class mips_preferred_reload_class (rtx, enum reg_class); 231169689Skanextern enum reg_class mips_secondary_reload_class (enum reg_class, 232169689Skan enum machine_mode, 233169689Skan rtx, int); 234169689Skanextern int mips_class_max_nregs (enum reg_class, enum machine_mode); 235169689Skanextern int build_mips16_call_stub (rtx, rtx, rtx, int); 236169689Skanextern int mips_register_move_cost (enum machine_mode, enum reg_class, 237169689Skan enum reg_class); 238169689Skan 239169689Skanextern int mips_adjust_insn_length (rtx, int); 240169689Skanextern const char *mips_output_load_label (void); 241169689Skanextern const char *mips_output_conditional_branch (rtx, rtx *, const char *, 242169689Skan const char *); 243169689Skanextern const char *mips_output_order_conditional_branch (rtx, rtx *, bool); 244169689Skanextern const char *mips_output_division (const char *, rtx *); 245169689Skanextern unsigned int mips_hard_regno_nregs (int, enum machine_mode); 246169689Skanextern bool mips_linked_madd_p (rtx, rtx); 247169689Skanextern int mips_store_data_bypass_p (rtx, rtx); 248169689Skanextern rtx mips_prefetch_cookie (rtx, rtx); 249169689Skan 250169689Skanextern void irix_asm_output_align (FILE *, unsigned); 251169689Skanextern const char *current_section_name (void); 252169689Skanextern unsigned int current_section_flags (void); 253169689Skanextern bool mips_use_ins_ext_p (rtx, rtx, rtx); 254169689Skan 255169689Skan#endif /* ! GCC_MIPS_PROTOS_H */ 256