(root)/
gcc-13.2.0/
gcc/
config/
mips/
mips-protos.h
       1  /* Prototypes of target machine for GNU compiler.  MIPS version.
       2     Copyright (C) 1989-2023 Free Software Foundation, Inc.
       3     Contributed by A. Lichnewsky (lich@inria.inria.fr).
       4     Changed by Michael Meissner	(meissner@osf.org).
       5     64-bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
       6     Brendan Eich (brendan@microunity.com).
       7  
       8  This file is part of GCC.
       9  
      10  GCC is free software; you can redistribute it and/or modify
      11  it under the terms of the GNU General Public License as published by
      12  the Free Software Foundation; either version 3, or (at your option)
      13  any later version.
      14  
      15  GCC is distributed in the hope that it will be useful,
      16  but WITHOUT ANY WARRANTY; without even the implied warranty of
      17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      18  GNU General Public License for more details.
      19  
      20  You should have received a copy of the GNU General Public License
      21  along with GCC; see the file COPYING3.  If not see
      22  <http://www.gnu.org/licenses/>.  */
      23  
      24  #ifndef GCC_MIPS_PROTOS_H
      25  #define GCC_MIPS_PROTOS_H
      26  
      27  /* Describes how a symbol is used.
      28  
      29     SYMBOL_CONTEXT_CALL
      30         The symbol is used as the target of a call instruction.
      31  
      32     SYMBOL_CONTEXT_LEA
      33         The symbol is used in a load-address operation.
      34  
      35     SYMBOL_CONTEXT_MEM
      36         The symbol is used as the address in a MEM.  */
      37  enum mips_symbol_context {
      38    SYMBOL_CONTEXT_CALL,
      39    SYMBOL_CONTEXT_LEA,
      40    SYMBOL_CONTEXT_MEM
      41  };
      42  
      43  /* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
      44  
      45     SYMBOL_ABSOLUTE
      46         The symbol's value will be calculated using absolute relocations,
      47         such as %hi and %lo.
      48  
      49     SYMBOL_GP_RELATIVE
      50         The symbol's value will be calculated by adding a 16-bit offset
      51         from $gp.
      52  
      53     SYMBOL_PC_RELATIVE
      54         The symbol's value will be calculated using a MIPS16 PC-relative
      55         calculation.
      56  
      57     SYMBOL_GOT_PAGE_OFST
      58         The symbol's value will be calculated by loading an address
      59         from the GOT and then applying a 16-bit offset.
      60  
      61     SYMBOL_GOT_DISP
      62         The symbol's value will be loaded directly from the GOT.
      63  
      64     SYMBOL_GOTOFF_PAGE
      65         An UNSPEC wrapper around a SYMBOL_GOT_PAGE_OFST.  It represents the
      66         offset from _gp of the GOT entry.
      67  
      68     SYMBOL_GOTOFF_DISP
      69         An UNSPEC wrapper around a SYMBOL_GOT_DISP.  It represents the
      70         offset from _gp of the symbol's GOT entry.
      71  
      72     SYMBOL_GOTOFF_CALL
      73         Like SYMBOL_GOTOFF_DISP, but used when calling a global function.
      74         The GOT entry is allowed to point to a stub rather than to the
      75         function itself.
      76  
      77     SYMBOL_GOTOFF_LOADGP
      78         An UNSPEC wrapper around a function's address.  It represents the
      79         offset of _gp from the start of the function.
      80  
      81     SYMBOL_TLS
      82         A thread-local symbol.
      83  
      84     SYMBOL_TLSGD
      85     SYMBOL_TLSLDM
      86     SYMBOL_DTPREL
      87     SYMBOL_GOTTPREL
      88     SYMBOL_TPREL
      89         UNSPEC wrappers around SYMBOL_TLS, corresponding to the
      90         thread-local storage relocation operators.
      91  
      92     SYMBOL_64_HIGH
      93         For a 64-bit symbolic address X, this is the value of
      94         (%highest(X) << 16) + %higher(X).
      95  
      96     SYMBOL_64_MID
      97         For a 64-bit symbolic address X, this is the value of
      98         (%higher(X) << 16) + %hi(X).
      99  
     100     SYMBOL_64_LOW
     101         For a 64-bit symbolic address X, this is the value of
     102         (%hi(X) << 16) + %lo(X).
     103  
     104     SYMBOL_HALF
     105         An UNSPEC wrapper around any kind of address.  It represents the
     106         low 16 bits of that address.  */
     107  enum mips_symbol_type {
     108    SYMBOL_ABSOLUTE,
     109    SYMBOL_GP_RELATIVE,
     110    SYMBOL_PC_RELATIVE,
     111    SYMBOL_GOT_PAGE_OFST,
     112    SYMBOL_GOT_DISP,
     113    SYMBOL_GOTOFF_PAGE,
     114    SYMBOL_GOTOFF_DISP,
     115    SYMBOL_GOTOFF_CALL,
     116    SYMBOL_GOTOFF_LOADGP,
     117    SYMBOL_TLS,
     118    SYMBOL_TLSGD,
     119    SYMBOL_TLSLDM,
     120    SYMBOL_DTPREL,
     121    SYMBOL_GOTTPREL,
     122    SYMBOL_TPREL,
     123    SYMBOL_64_HIGH,
     124    SYMBOL_64_MID,
     125    SYMBOL_64_LOW,
     126    SYMBOL_HALF
     127  };
     128  #define NUM_SYMBOL_TYPES (SYMBOL_HALF + 1)
     129  
     130  /* Identifiers a style of $gp initialization sequence.
     131  
     132     LOADGP_NONE
     133  	No initialization sequence is needed.
     134  
     135     LOADGP_OLDABI
     136  	The o32 and o64 PIC sequence (the kind traditionally generated
     137  	by .cpload).
     138  
     139     LOADGP_NEWABI
     140  	The n32 and n64 PIC sequence (the kind traditionally generated
     141  	by .cpsetup).
     142  
     143     LOADGP_ABSOLUTE
     144  	The GNU absolute sequence, as generated by loadgp_absolute.
     145  
     146     LOADGP_RTP
     147  	The VxWorks RTP PIC sequence, as generated by loadgp_rtp.  */
     148  enum mips_loadgp_style {
     149    LOADGP_NONE,
     150    LOADGP_OLDABI,
     151    LOADGP_NEWABI,
     152    LOADGP_ABSOLUTE,
     153    LOADGP_RTP
     154  };
     155  
     156  struct mips16e_save_restore_info;
     157  
     158  /* Classifies a type of call.
     159  
     160     MIPS_CALL_NORMAL
     161  	A normal call or call_value pattern.
     162  
     163     MIPS_CALL_SIBCALL
     164  	A sibcall or sibcall_value pattern.
     165  
     166     MIPS_CALL_EPILOGUE
     167  	A call inserted in the epilogue.  */
     168  enum mips_call_type {
     169    MIPS_CALL_NORMAL,
     170    MIPS_CALL_SIBCALL,
     171    MIPS_CALL_EPILOGUE
     172  };
     173  
     174  /* Controls the conditions under which certain instructions are split.
     175  
     176     SPLIT_IF_NECESSARY
     177  	Only perform splits that are necessary for correctness
     178  	(because no unsplit version exists).
     179  
     180     SPLIT_FOR_SPEED
     181  	Perform splits that are necessary for correctness or
     182  	beneficial for code speed.
     183  
     184     SPLIT_FOR_SIZE
     185  	Perform splits that are necessary for correctness or
     186  	beneficial for code size.  */
     187  enum mips_split_type {
     188    SPLIT_IF_NECESSARY,
     189    SPLIT_FOR_SPEED,
     190    SPLIT_FOR_SIZE
     191  };
     192  
     193  extern bool mips_symbolic_constant_p (rtx, enum mips_symbol_context,
     194  				      enum mips_symbol_type *);
     195  extern int mips_regno_mode_ok_for_base_p (int, machine_mode, bool);
     196  extern bool mips_stack_address_p (rtx, machine_mode);
     197  extern int mips_address_insns (rtx, machine_mode, bool);
     198  extern int mips_const_insns (rtx);
     199  extern int mips_split_const_insns (rtx);
     200  extern int mips_split_128bit_const_insns (rtx);
     201  extern int mips_load_store_insns (rtx, rtx_insn *);
     202  extern int mips_idiv_insns (machine_mode);
     203  extern rtx_insn *mips_emit_move (rtx, rtx);
     204  #ifdef RTX_CODE
     205  extern void mips_emit_binary (enum rtx_code, rtx, rtx, rtx);
     206  #endif
     207  extern rtx mips_pic_base_register (rtx);
     208  extern rtx mips_got_load (rtx, rtx, enum mips_symbol_type);
     209  extern bool mips_split_symbol (rtx, rtx, machine_mode, rtx *);
     210  extern rtx mips_unspec_address (rtx, enum mips_symbol_type);
     211  extern rtx mips_strip_unspec_address (rtx);
     212  extern void mips_move_integer (rtx, rtx, unsigned HOST_WIDE_INT);
     213  extern bool mips_legitimize_move (machine_mode, rtx, rtx);
     214  
     215  extern rtx mips_subword (rtx, bool);
     216  extern bool mips_split_move_p (rtx, rtx, enum mips_split_type);
     217  extern void mips_split_move (rtx, rtx, enum mips_split_type, rtx);
     218  extern bool mips_split_move_insn_p (rtx, rtx, rtx);
     219  extern void mips_split_move_insn (rtx, rtx, rtx);
     220  extern void mips_split_128bit_move (rtx, rtx);
     221  extern bool mips_split_128bit_move_p (rtx, rtx);
     222  extern void mips_split_msa_copy_d (rtx, rtx, rtx, rtx (*)(rtx, rtx, rtx));
     223  extern void mips_split_msa_insert_d (rtx, rtx, rtx, rtx);
     224  extern void mips_split_msa_fill_d (rtx, rtx);
     225  extern const char *mips_output_move (rtx, rtx);
     226  extern bool mips_cfun_has_cprestore_slot_p (void);
     227  extern bool mips_cprestore_address_p (rtx, bool);
     228  extern void mips_save_gp_to_cprestore_slot (rtx, rtx, rtx, rtx);
     229  extern void mips_restore_gp_from_cprestore_slot (rtx);
     230  #ifdef RTX_CODE
     231  extern void mips_expand_scc (rtx *);
     232  extern void mips_expand_conditional_branch (rtx *);
     233  extern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx);
     234  extern void mips_expand_conditional_move (rtx *);
     235  extern void mips_expand_conditional_trap (rtx);
     236  #endif
     237  extern bool mips_use_pic_fn_addr_reg_p (const_rtx);
     238  extern rtx_insn *mips_expand_call (enum mips_call_type, rtx, rtx, rtx, rtx,
     239  				   bool);
     240  extern void mips_split_call (rtx, rtx);
     241  extern bool mips_get_pic_call_symbol (rtx *, int);
     242  extern void mips_set_return_address (rtx, rtx);
     243  extern bool mips_move_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
     244  extern bool mips_store_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
     245  extern bool mips_expand_block_move (rtx, rtx, rtx);
     246  extern void mips_expand_synci_loop (rtx, rtx);
     247  
     248  extern void mips_init_cumulative_args (CUMULATIVE_ARGS *, tree);
     249  extern bool mips_pad_reg_upward (machine_mode, tree);
     250  
     251  extern bool mips_expand_ext_as_unaligned_load (rtx, rtx, HOST_WIDE_INT,
     252  					       HOST_WIDE_INT, bool);
     253  extern bool mips_expand_ins_as_unaligned_store (rtx, rtx, HOST_WIDE_INT,
     254  						HOST_WIDE_INT);
     255  extern bool mips_mem_fits_mode_p (machine_mode mode, rtx x);
     256  extern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
     257  
     258  extern void mips_push_asm_switch (struct mips_asm_switch *);
     259  extern void mips_pop_asm_switch (struct mips_asm_switch *);
     260  extern void mips_output_external (FILE *, tree, const char *);
     261  extern void mips_output_ascii (FILE *, const char *, size_t);
     262  extern const char *mips_output_tls_reloc_directive (rtx *);
     263  extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
     264  					     unsigned HOST_WIDE_INT,
     265  					     unsigned int);
     266  extern void mips_declare_common_object (FILE *, const char *,
     267  					const char *, unsigned HOST_WIDE_INT,
     268  					unsigned int, bool);
     269  extern void mips_declare_object (FILE *, const char *, const char *,
     270  				 const char *, ...) ATTRIBUTE_PRINTF_4;
     271  extern void mips_declare_object_name (FILE *, const char *, tree);
     272  extern void mips_finish_declare_object (FILE *, tree, int, int);
     273  extern void mips_set_text_contents_type (FILE *, const char *,
     274  					 unsigned HOST_WIDE_INT, bool);
     275  
     276  extern bool mips_small_data_pattern_p (rtx);
     277  extern rtx mips_rewrite_small_data (rtx);
     278  extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
     279  extern rtx mips_return_addr (int, rtx);
     280  extern bool mips_must_initialize_gp_p (void);
     281  extern enum mips_loadgp_style mips_current_loadgp_style (void);
     282  extern void mips_emit_save_slot_move (rtx, rtx, rtx);
     283  extern void mips_expand_prologue (void);
     284  extern void mips_expand_before_return (void);
     285  extern void mips_expand_epilogue (bool);
     286  extern bool mips_can_use_return_insn (void);
     287  
     288  extern bool mips_const_vector_same_val_p (rtx, machine_mode);
     289  extern bool mips_const_vector_same_bytes_p (rtx, machine_mode);
     290  extern bool mips_const_vector_same_int_p (rtx, machine_mode, HOST_WIDE_INT,
     291  					  HOST_WIDE_INT);
     292  extern bool mips_const_vector_shuffle_set_p (rtx, machine_mode);
     293  extern bool mips_const_vector_bitimm_set_p (rtx, machine_mode);
     294  extern bool mips_const_vector_bitimm_clr_p (rtx, machine_mode);
     295  extern rtx mips_msa_vec_parallel_const_half (machine_mode, bool);
     296  extern rtx mips_gen_const_int_vector (machine_mode, HOST_WIDE_INT);
     297  extern bool mips_dangerous_for_la25_p (rtx);
     298  extern enum reg_class mips_secondary_reload_class (enum reg_class,
     299  						   machine_mode,
     300  						   rtx, bool);
     301  extern int mips_class_max_nregs (enum reg_class, machine_mode);
     302  
     303  extern machine_mode mips_hard_regno_caller_save_mode (unsigned int,
     304  						      unsigned int,
     305  						      machine_mode);
     306  extern int mips_adjust_insn_length (rtx_insn *, int);
     307  extern void mips_output_load_label (rtx);
     308  extern const char *mips_output_conditional_branch (rtx_insn *, rtx *,
     309  						   const char *, const char *);
     310  extern const char *mips_output_order_conditional_branch (rtx_insn *, rtx *,
     311  							 bool);
     312  extern const char *mips_output_equal_conditional_branch (rtx_insn *, rtx *,
     313  							 bool);
     314  extern const char *mips_output_jump (rtx *, int, int, bool);
     315  extern const char *mips_output_sync (void);
     316  extern const char *mips_output_sync_loop (rtx_insn *, rtx *);
     317  extern unsigned int mips_sync_loop_insns (rtx_insn *, rtx *);
     318  extern const char *mips_output_division (const char *, rtx *);
     319  extern const char *mips_msa_output_division (const char *, rtx *);
     320  extern const char *mips_msa_output_shift_immediate (const char *, rtx *);
     321  extern const char *mips_output_probe_stack_range (rtx, rtx);
     322  extern bool mips_hard_regno_rename_ok (unsigned int, unsigned int);
     323  extern bool mips_linked_madd_p (rtx_insn *, rtx_insn *);
     324  extern bool mips_store_data_bypass_p (rtx_insn *, rtx_insn *);
     325  extern int mips_dspalu_bypass_p (rtx, rtx);
     326  extern rtx mips_prefetch_cookie (rtx, rtx);
     327  extern rtx mips_loongson_ext2_prefetch_cookie (rtx, rtx);
     328  
     329  extern const char *current_section_name (void);
     330  extern unsigned int current_section_flags (void);
     331  extern bool mips_use_ins_ext_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
     332  
     333  extern const char *mips16e_output_save_restore (rtx, HOST_WIDE_INT);
     334  extern bool mips16e_save_restore_pattern_p (rtx, HOST_WIDE_INT,
     335  					    struct mips16e_save_restore_info *);
     336  
     337  extern bool mask_low_and_shift_p (machine_mode, rtx, rtx, int);
     338  extern int mask_low_and_shift_len (machine_mode, rtx, rtx);
     339  extern bool and_operands_ok (machine_mode, rtx, rtx);
     340  extern bool mips_fmadd_bypass (rtx_insn *, rtx_insn *);
     341  
     342  union mips_gen_fn_ptrs
     343  {
     344    rtx (*fn_6) (rtx, rtx, rtx, rtx, rtx, rtx);
     345    rtx (*fn_5) (rtx, rtx, rtx, rtx, rtx);
     346    rtx (*fn_4) (rtx, rtx, rtx, rtx);
     347  };
     348  
     349  extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
     350  				     rtx, rtx, rtx, rtx);
     351  
     352  extern void mips_expand_vector_init (rtx, rtx);
     353  extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
     354  extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
     355  extern void mips_expand_vec_minmax (rtx, rtx, rtx,
     356  				    rtx (*) (rtx, rtx, rtx), bool);
     357  
     358  extern int mips_ldst_scaled_shift (machine_mode);
     359  extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int);
     360  extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int);
     361  extern const char *umips_output_save_restore (bool, rtx);
     362  extern bool umips_save_restore_pattern_p (bool, rtx);
     363  extern bool umips_load_store_pair_p (bool, rtx *);
     364  extern void umips_output_load_store_pair (bool, rtx *);
     365  extern bool umips_movep_target_p (rtx, rtx);
     366  extern bool umips_12bit_offset_address_p (rtx, machine_mode);
     367  extern bool mips_9bit_offset_address_p (rtx, machine_mode);
     368  extern bool lwsp_swsp_address_p (rtx, machine_mode);
     369  extern bool m16_based_address_p (rtx, machine_mode,
     370  				 bool (*)(rtx_def*, machine_mode));
     371  extern rtx mips_expand_thread_pointer (rtx);
     372  extern void mips16_expand_get_fcsr (rtx);
     373  extern void mips16_expand_set_fcsr (rtx);
     374  
     375  extern bool mips_eh_uses (unsigned int);
     376  extern bool mips_epilogue_uses (unsigned int);
     377  extern void mips_final_prescan_insn (rtx_insn *, rtx *, int);
     378  extern int mips_trampoline_code_size (void);
     379  extern void mips_function_profiler (FILE *);
     380  extern bool mips_load_store_bonding_p (rtx *, machine_mode, bool);
     381  
     382  typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
     383  #ifdef RTX_CODE
     384  extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
     385  #endif
     386  
     387  extern void mips_register_frame_header_opt (void);
     388  extern void mips_expand_vec_cond_expr (machine_mode, machine_mode, rtx *);
     389  extern void mips_expand_vec_cmp_expr (rtx *);
     390  
     391  #endif /* ! GCC_MIPS_PROTOS_H */